freee-mcp@0.37.12
CAUTION· startup onlyPublisher claims: "Model Context Protocol (MCP) server for freee API integration" Observed in sandbox: no network, touches nothing outside the project, writes no memory.
Coverage
Startup only; authenticated tool behavior not tested.- Tested
- server startup over stdio (initialize sent) · every file read, file written and host contacted by what ran
- Not tested
- the tool list (the server exited before answering) · what the tools do when called with real credentials
What this means for the label: Caution here covers what ran. The server's tools were not exercised with a real credential, so nothing about their behavior is asserted; the credential summary below says what to do with that.
Before you give it your token
- It will ask for
FREEE_AUTHORIZATION_ENDPOINTFREEE_CLIENT_SECRETFREEE_SIGN_CLIENT_SECRETFREEE_TOKEN_ENDPOINTJWT_SECRETOPENAI_APPS_CHALLENGE_TOKENSIGN_AUTHORIZATION_ENDPOINTSIGN_JWT_SECRETSIGN_TOKEN_ENDPOINTConfiguration, not credentials: CORS_ALLOWED_ORIGINS, FREEE_API_BASE_URL, FREEE_CALLBACK_PORT, FREEE_CLIENT_ID, FREEE_SCOPE, FREEE_SIGN_API_URL, FREEE_SIGN_CLIENT_ID, HTTP_HEADERS_TIMEOUT_MS, HTTP_KEEP_ALIVE_TIMEOUT_MS, HTTP_REQUEST_TIMEOUT_MS, ISSUER_URL, KUBERNETES_SERVICE_HOST, MCP_JWT_AUDIENCE, MCP_JWT_AUDIENCE_ENFORCE, MCP_PUBLIC_BASE_URL, OTEL_DEPLOYMENT_ENVIRONMENT, OTEL_ENABLED, OTEL_EXPORTER_OTLP_ENDPOINT, OTEL_METRICS_EXPORTER, OTEL_SERVICE_NAME, OTEL_TRACES_SAMPLER_ARG, OTEL_TRACES_SAMPLER_RULES, RATE_LIMIT_ENABLED, REDIS_URL, SIGN_CORS_ALLOWED_ORIGINS, SIGN_ISSUER_URL, SIGN_LOG_LEVEL, SIGN_PORT, SIGN_RATE_LIMIT_ENABLED, SIGN_REDIS_URL, SIGN_SCOPE- Where it talks to
- freee.co.jp (its own)Also ninja-sign.com — not the publisher's domain; check what for before connecting.
- What the honeypot saw
- no credential files read · no network
- What we could not test
- the tool list (the server exited before answering) · what the tools do when called with real credentials
Connect it with a scoped credential, under the guard, and read the third-party hosts first. The code names ninja-sign.com as well as its own vendor. The guard injects FREEE_AUTHORIZATION_ENDPOINT, FREEE_CLIENT_SECRET, FREEE_SIGN_CLIENT_SECRET, FREEE_TOKEN_ENDPOINT, JWT_SECRET, OPENAI_APPS_CHALLENGE_TOKEN, SIGN_AUTHORIZATION_ENDPOINT, SIGN_JWT_SECRET, SIGN_TOKEN_ENDPOINT only into requests to freee.co.jp (and its subdomains) and refuses the rest.
Never paste a credential into a chat, a ticket or a report, including ours. How the guard holds it.
Is [email protected] safe to install?
KillerSkills ran it in the KillerSkills honeypot sandbox (2 scenarios; startup only; authenticated tool behavior not tested) on 2026-11-11 and scored it 77/100 (Caution). It is not known to be malicious, but it has behaviour or code a security policy should decide on before install. Notable findings: README links to an external installer. Summary: no network, touches nothing outside the project, writes no memory.
Behavior trace
Honeypot run · 39 s · 2 scenariosStatic findings
…n: ${H} - transport: ${r}`))}var $r=m(()=>{br();I();nt();D();Mr();ve()});import{McpServer as es}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as Uc}from"@modelcontextprotocol/sdk/server/stdio.js";function Gr(e){…Fix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them.…Error(`Sign token exchange failed: ${s.status} ${c.slice(0,200)}`)}let i=await s.json(),a=K.safeParse(i);if(!a.success)throw Error(`Invalid Sign token response: ${a.error.message}`);return{accessToken:a.data.access_token,refreshToken:a.dat…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…・マイ印鑑・チーム管理をサポート。詳細ガイドはfreee-api-skill skillのSIGN-GUIDE.mdを参照。skillが未インストールの場合は npx skills add freee/freee-mcp で追加",Pr,H=null,Or,In;var P=R(()=>{J();m();j=process.env.FRE…Fix: Pin versions and sources; vendor anything fetched at install time.…l,Tr,Ot;var J=R(()=>{Pe();m();Sr=_r(import.meta.url),{version:yt}=Sr("../package.json");Tr=["fatal","error","warn","info","debug","trace","silent"];Ot=f.object({ISSUER_URL:f.string({required_error:"ISSUER_URL is required for serve mode."})…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…管理・業務委託管理・サーベイ・開業・人事評価APIをサポート。詳細ガイドはfreee-api-skill skillを参照。skillが未インストールの場合は npx skills add freee/freee-mcp で追加",rt=7776000,ce="/oauth/freee-callback",nt="freee-mcp:oa…Fix: Pin versions and sources; vendor anything fetched at install time.….enum(Mo).optional()})});async function $o(e){try{return{success:!0,data:await e.json()}}catch{return{success:!1,error:"Response body was not valid JSON"}}}function _(e,t){return{content:[{type:"text",text:e}],...t?.isError?{isError:!0}:{}…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…ry{return(await ut.readdir(e)).filter((r)=>r.startsWith("tokens-")&&r.endsWith(".json"))}catch{return[]}}async function Wr(e){let t=ae();try{let r=await Gr();if(r.length>0){let n=Dt.join(t,r[0]),o=await ut.readFile(n,"utf8"),i=JSON.parse(o…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…romises";import Xe from"node:path";function Se(){return Xe.join(k(),"sign-tokens.json")}async function Te(e){let r=Se(),t=Xe.dirname(r);try{await se.mkdir(t,{recursive:!0}),await se.writeFile(r,JSON.stringify(e,null,2),{mode:w})}catch(n){t…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…\n <a href=\"https://support.freee.co.jp/hc/ja/articles/213726523--%E5%80%8B%E4%BA%BA-freee%E4%BC%9A%E8%A8%88%E3%81%AE%E3%83%97%E3%83%A9%E3%83%B3%E3%81%AB%E3%81%A4%E…Fix: Put hosts, commands and strings in plain source. Decoding at runtime looks identical to malware and costs points on its own.…l>\n <li><a href=\\\"https://support.freee.co.jp/hc/ja/articles/900004490226-%E5%8B%A4%E6%80%A0%E5%9F%BA%E6%9C%AC%E8%A8%AD%E5%AE%9A%E3%82%92%E8%A1%8C%E3%81%86#h_01EYPYTR9HZ7YB8V5F18VMD1BT\"target=\\\"_blank\\\">『退勤を自動打刻する』</a>の設定を使用している場合…Fix: Put hosts, commands and strings in plain source. Decoding at runtime looks identical to malware and costs points on its own.…ry{return(await Oe.readdir(e)).filter((r)=>r.startsWith("tokens-")&&r.endsWith(".json"))}catch{return[]}}async function jt(e){let t=U();try{let r=await Ft();if(r.length>0){let n=Ye.join(t,r[0]),o=await Oe.readFile(n,"utf8"),i=JSON.parse(o)…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".csv":"text/csv",".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}});import{z as re}from"zod";function Ln(e){O(e,"freee_file_upload"…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.`),console.log(` npx add-skill freee/freee-mcpFix: Pin versions and sources; vendor anything fetched at install time.…=>"");throw Error(`freee token exchange failed: ${s.status} ${l}`)}let c=await s.json(),a=De.safeParse(c);if(!a.success)throw Error(`Invalid freee token response: ${a.error.message}`);return{accessToken:a.data.access_token,refreshToken:a.d…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.`),console.log(` npx skills add freee/freee-mcpFix: Pin versions and sources; vendor anything fetched at install time.…・マイ印鑑・チーム管理をサポート。詳細ガイドはfreee-api-skill skillのSIGN-GUIDE.mdを参照。skillが未インストールの場合は npx skills add freee/freee-mcp で追加",xo,me=null,X="/oauth/sign-callback",Mo,Fo;var D=m(()=>…Fix: Pin versions and sources; vendor anything fetched at install time.https://github.com/freee/freee-mcp/releases/latest/download/freee-api-skill.zipFix: Pin versions and sources; vendor anything fetched at install time.…管理・業務委託管理・サーベイ・開業・人事評価APIをサポート。詳細ガイドはfreee-api-skill skillを参照。skillが未インストールの場合は npx skills add freee/freee-mcp で追加",vt=1e4,bt=30000,xt=120000;var M=()=>{};import Ge from"…Fix: Pin versions and sources; vendor anything fetched at install time.…ema file ${e}: ${o.error.message}`);return o.data}var io={accounting:"accounting.json",hr:"hr.json",invoice:"invoice.json",pm:"pm.json",sm:"sm.json",it_management:"it-management.json",fixed_asset_management:"fixed-asset-management.json",pa…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…ional(),display_name:ie.string().nullable().optional()})).optional()})});import{McpServer as _s}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as Tu}from"@modelcontextprotocol/sdk/server/stdio.js";function Xn(e,t…Fix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them.Cost to the agent
Tokens estimated at four characters each. The tool list is re-read by the agent on every turn, so it is the number to compare between servers that do the same job: ranked across the index.
Known vulnerabilities
No advisories in OSV for freee-mcp@0.37.12 as of 4d ago. This is the package itself, not its dependencies.
What would make this Verified
3 points to 80 · weights: behavior 45%, static 25%, prompt 15%, publisher 15%- Reads credential files≈ +27 on the totalThe sandbox saw reads under ~/.ssh, ~/.aws, ~/.npmrc, ~/.config or similar. Read only files inside the project, and only the ones the task needs. Seen: ~/.config/freee-mcp/config.json, ~/.config/freee-mcp/config.json.
- Unclaimed publisher≈ +8 on the totalClaim freee: a verified publisher gets +50 on publisher trust. It is free and usually instant with GitHub sign-in.
- Touches files outside the project≈ +7 on the totalKeep reads and writes inside the working directory, or declare the exact paths in `filesystem:` and explain why in the README.
- README links to an external installer≈ +4 on the totalPin versions and sources; vendor anything fetched at install time.
- MCP server using network transport (SSE/HTTP)≈ +2 on the totalNamespace tool names and keep tool descriptions literal; no instructions to the agent inside them.
- File type combined with upload action≈ +2 on the totalRemove the call, or declare the host in frontmatter and explain in the README what is sent and why.