@him0/freee-mcp 0.6.4 → 0.6.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/bin/cli.js +30 -30
  2. package/package.json +1 -1
package/bin/cli.js CHANGED
@@ -1,11 +1,11 @@
1
1
  #! /usr/bin/env node
2
2
 
3
- var At=Object.defineProperty;var le=(t,e)=>()=>(t&&(e=t(t=0)),e);var $e=(t,e)=>{for(var r in e)At(t,r,{get:e[r],enumerable:!0})};import Me from"path";import Tt from"os";function A(){return process.env.XDG_CONFIG_HOME?Me.join(process.env.XDG_CONFIG_HOME,Fe):Me.join(Tt.homedir(),".config",Fe)}var Fe,j,R,W,X,Pt,Oe,w=le(()=>{"use strict";Fe="freee-mcp";j=54321,R=300*1e3,W=384,X="https://api.freee.co.jp",Pt="0.6.4",Oe=`freee-mcp/${Pt} (MCP Server; +https://github.com/him0/freee-mcp)`});var Ue={};$e(Ue,{CompanyConfigSchema:()=>je,FullConfigSchema:()=>Ne,getCompanyInfo:()=>N,getCurrentCompanyId:()=>b,getDownloadDir:()=>me,loadFullConfig:()=>v,saveFullConfig:()=>$,setCurrentCompany:()=>fe});import pe from"fs/promises";import De from"path";import St from"os";import{z as d}from"zod";function ue(){return De.join(A(),"config.json")}async function vt(){let t=De.dirname(ue());await pe.mkdir(t,{recursive:!0})}function bt(t){return t!=null&&typeof t=="object"&&"defaultCompanyId"in t&&"currentCompanyId"in t&&"companies"in t&&!("clientId"in t)}function It(t){return console.error("\u{1F4E6} \u53E4\u3044\u8A2D\u5B9A\u5F62\u5F0F\u3092\u691C\u51FA\u3057\u307E\u3057\u305F\u3002\u65B0\u3057\u3044\u5F62\u5F0F\u306B\u79FB\u884C\u3057\u307E\u3059..."),{clientId:void 0,clientSecret:void 0,callbackPort:void 0,defaultCompanyId:t.defaultCompanyId,currentCompanyId:t.currentCompanyId,companies:t.companies}}async function v(){let t=ue();try{let e=await pe.readFile(t,"utf8"),r=JSON.parse(e);if(bt(r)){let o=It(r);return await $(o),o}let n=Ne.safeParse(r);if(!n.success)throw new Error(`Invalid config file: ${n.error.message}`);return n.data}catch(e){if(e.code==="ENOENT"){let r={clientId:void 0,clientSecret:void 0,callbackPort:void 0,defaultCompanyId:"0",currentCompanyId:"0",companies:{}};return await $(r),r}throw e}}async function $(t){await vt();let e=ue();await pe.writeFile(e,JSON.stringify(t,null,2),{mode:W})}async function b(){return(await v()).currentCompanyId}async function fe(t,e,r){let n=await v();n.companies[t]?(e||r)&&(e&&(n.companies[t].name=e),r&&(n.companies[t].description=r)):n.companies[t]={id:t,name:e||`Company ${t}`,description:r||void 0,addedAt:Date.now()},n.companies[t].lastUsed=Date.now(),n.currentCompanyId=t,await $(n)}async function N(t){return(await v()).companies[t]||null}async function me(){return(await v()).downloadDir||St.tmpdir()}var je,Ne,M=le(()=>{"use strict";w();je=d.object({id:d.string(),name:d.string().optional(),description:d.string().optional(),addedAt:d.number(),lastUsed:d.number().optional()}),Ne=d.object({clientId:d.string().optional(),clientSecret:d.string().optional(),callbackPort:d.number().optional(),defaultCompanyId:d.string(),currentCompanyId:d.string(),companies:d.record(d.string(),je),downloadDir:d.string().optional()})});var Le={};$e(Le,{getConfig:()=>h,loadConfig:()=>de});function xt(){return!!(process.env.FREEE_CLIENT_ID||process.env.FREEE_CLIENT_SECRET)}async function de(){if(F)return F;let t=await v(),e,r,n;if(xt())console.error("Warning: \u74B0\u5883\u5909\u6570\u3067\u306E\u8A8D\u8A3C\u60C5\u5831\u8A2D\u5B9A\u306F\u975E\u63A8\u5968\u3067\u3059\u3002"),console.error(" `freee-mcp configure` \u3092\u5B9F\u884C\u3057\u3066\u8A2D\u5B9A\u30D5\u30A1\u30A4\u30EB\u306B\u79FB\u884C\u3057\u3066\u304F\u3060\u3055\u3044\u3002"),console.error(` \u74B0\u5883\u5909\u6570\u8A2D\u5B9A\u306F\u5C06\u6765\u306E\u30D0\u30FC\u30B8\u30E7\u30F3\u3067\u524A\u9664\u3055\u308C\u308B\u4E88\u5B9A\u3067\u3059\u3002
4
- `),e=process.env.FREEE_CLIENT_ID||"",r=process.env.FREEE_CLIENT_SECRET||"",n=process.env.FREEE_CALLBACK_PORT?parseInt(process.env.FREEE_CALLBACK_PORT,10):j;else{if(!t.clientId||!t.clientSecret)throw new Error("\u8A8D\u8A3C\u60C5\u5831\u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002\n`freee-mcp configure` \u3092\u5B9F\u884C\u3057\u3066\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u3057\u3066\u304F\u3060\u3055\u3044\u3002");e=t.clientId,r=t.clientSecret,n=t.callbackPort||j}return F={freee:{clientId:e,clientSecret:r,companyId:"0",apiUrl:X},oauth:{callbackPort:n,redirectUri:`http://127.0.0.1:${n}/callback`,authorizationEndpoint:"https://accounts.secure.freee.co.jp/public_api/authorize",tokenEndpoint:"https://accounts.secure.freee.co.jp/public_api/token",scope:"read write"},server:{name:"freee",version:"1.0.0"},auth:{timeoutMs:R}},F}function h(){if(!F)throw new Error("Config not loaded. Call loadConfig() first in async context.");return F}var F,T=le(()=>{"use strict";M();w();F=null});T();import{McpServer as Kt}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as Wt}from"@modelcontextprotocol/sdk/server/stdio.js";T();import Lt from"crypto";import{z as P}from"zod";T();T();w();import Z from"fs/promises";import Ve from"path";import{z as C}from"zod";async function _(t){try{return{success:!0,data:await t.json()}}catch(e){return{success:!1,error:e instanceof Error?e.message:String(e)}}}function l(t){return{content:[{type:"text",text:t}]}}function k(t){return t instanceof Error?t.message:String(t)}function Q(t,e){return{access_token:t.access_token,refresh_token:t.refresh_token||e.refreshToken||"",expires_at:Date.now()+t.expires_in*1e3,token_type:t.token_type||"Bearer",scope:t.scope||e.scope}}w();import Y from"fs/promises";import ge from"path";async function Je(){let t=A();try{return(await Y.readdir(t)).filter(r=>r.startsWith("tokens-")&&r.endsWith(".json"))}catch{return[]}}async function Be(t){let e=A();try{let r=await Je();if(r.length>0){let n=ge.join(e,r[0]),o=await Y.readFile(n,"utf8"),a=JSON.parse(o),i=he.safeParse(a);if(!i.success)return console.error("[error] Invalid legacy token file:",i.error.message),null;let s=i.data;return await t(s),await Promise.all(r.map(p=>Y.unlink(ge.join(e,p)).catch(u=>{console.error(`[warn] Failed to clean up legacy token file ${p}:`,u)}))),console.error("[info] Migrated legacy company-specific tokens to user-based tokens"),s}}catch(r){console.error("[warn] Error during legacy token migration attempt:",r)}return null}async function He(){let t=A();try{let e=await Je();await Promise.all(e.map(r=>Y.unlink(ge.join(t,r)).catch(n=>{console.error(`[warn] Failed to clear legacy token file ${r}:`,n)}))),e.length>0&&console.error("[info] Cleared legacy company-specific token files")}catch(e){console.error("[warn] Error during legacy token cleanup:",e)}}var he=C.object({access_token:C.string(),refresh_token:C.string(),expires_at:C.number(),token_type:C.string(),scope:C.string()}),ye=C.object({access_token:C.string(),refresh_token:C.string().optional(),expires_in:C.number(),token_type:C.string().optional(),scope:C.string().optional()});function Ce(){return Ve.join(A(),"tokens.json")}async function ee(t){let e=Ce(),r=Ve.dirname(e);try{console.error(`[info] Creating directory: ${r}`),await Z.mkdir(r,{recursive:!0}),console.error(`[info] Writing tokens to: ${e}`),await Z.writeFile(e,JSON.stringify(t,null,2),{mode:W}),console.error("[info] Tokens saved successfully")}catch(n){throw console.error("[error] Failed to save tokens:",n),n}}async function we(){let t=Ce();try{let e=await Z.readFile(t,"utf8"),r=JSON.parse(e),n=he.safeParse(r);return n.success?n.data:(console.error("[error] Invalid token file:",n.error.message),null)}catch(e){if(e.code==="ENOENT"){let r=await Be(ee);return r||null}throw console.error("[error] Failed to load tokens:",e),e}}function Rt(t){return Date.now()<t.expires_at}async function $t(t){let e=h(),r=await fetch(e.oauth.tokenEndpoint,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({grant_type:"refresh_token",refresh_token:t,client_id:e.freee.clientId,client_secret:e.freee.clientSecret})});if(!r.ok){let i=await _(r),s=i.success?JSON.stringify(i.data):`(JSON parse failed: ${i.error})`;throw new Error(`Token refresh failed: ${r.status} ${s}`)}let n=await r.json(),o=ye.safeParse(n);if(!o.success)throw new Error(`Invalid token response format: ${o.error.message}`);let a=Q(o.data,{refreshToken:t,scope:e.oauth.scope});return await ee(a),a}async function ze(){let t=Ce();try{await Z.unlink(t),console.error("[info] Tokens cleared successfully")}catch(e){if(e.code==="ENOENT"){console.error("[info] No tokens to clear (file does not exist)");return}throw console.error("[error] Failed to clear tokens:",e),e}await He()}async function qe(){let t=await we();return t?Rt(t)?t.access_token:(await $t(t.refresh_token)).access_token:null}M();w();import Mt from"fs/promises";import Ft from"path";function Ge(t){return typeof t=="object"&&t!==null&&"type"in t&&t.type==="binary"}function Ot(t){return["application/pdf","application/octet-stream","image/"].some(r=>t.includes(r))}function Dt(t){let e={"application/pdf":".pdf","image/png":".png","image/jpeg":".jpg","image/gif":".gif","image/webp":".webp","text/csv":".csv"};for(let[r,n]of Object.entries(e))if(t.includes(r))return n;return t.includes("image/"),".bin"}async function U(t,e,r,n,o){let a=o||h().freee.apiUrl,i=await b(),s=await qe();if(!s)throw new Error(`\u8A8D\u8A3C\u304C\u5FC5\u8981\u3067\u3059\u3002freee_authenticate \u30C4\u30FC\u30EB\u3092\u4F7F\u7528\u3057\u3066\u8A8D\u8A3C\u3092\u884C\u3063\u3066\u304F\u3060\u3055\u3044\u3002
3
+ var At=Object.defineProperty;var pe=(t,e)=>()=>(t&&(e=t(t=0)),e);var Me=(t,e)=>{for(var r in e)At(t,r,{get:e[r],enumerable:!0})};import Fe from"path";import Tt from"os";function A(){return process.env.XDG_CONFIG_HOME?Fe.join(process.env.XDG_CONFIG_HOME,Oe):Fe.join(Tt.homedir(),".config",Oe)}var Oe,N,R,X,Q,St,$,w=pe(()=>{"use strict";Oe="freee-mcp";N=54321,R=300*1e3,X=384,Q="https://api.freee.co.jp",St="0.6.5",$=`freee-mcp/${St} (MCP Server; +https://github.com/him0/freee-mcp)`});var Ue={};Me(Ue,{CompanyConfigSchema:()=>je,FullConfigSchema:()=>Ne,getCompanyInfo:()=>U,getCurrentCompanyId:()=>b,getDownloadDir:()=>de,loadFullConfig:()=>v,saveFullConfig:()=>M,setCurrentCompany:()=>me});import ue from"fs/promises";import De from"path";import Pt from"os";import{z as d}from"zod";function fe(){return De.join(A(),"config.json")}async function vt(){let t=De.dirname(fe());await ue.mkdir(t,{recursive:!0})}function bt(t){return t!=null&&typeof t=="object"&&"defaultCompanyId"in t&&"currentCompanyId"in t&&"companies"in t&&!("clientId"in t)}function It(t){return console.error("\u{1F4E6} \u53E4\u3044\u8A2D\u5B9A\u5F62\u5F0F\u3092\u691C\u51FA\u3057\u307E\u3057\u305F\u3002\u65B0\u3057\u3044\u5F62\u5F0F\u306B\u79FB\u884C\u3057\u307E\u3059..."),{clientId:void 0,clientSecret:void 0,callbackPort:void 0,defaultCompanyId:t.defaultCompanyId,currentCompanyId:t.currentCompanyId,companies:t.companies}}async function v(){let t=fe();try{let e=await ue.readFile(t,"utf8"),r=JSON.parse(e);if(bt(r)){let o=It(r);return await M(o),o}let n=Ne.safeParse(r);if(!n.success)throw new Error(`Invalid config file: ${n.error.message}`);return n.data}catch(e){if(e.code==="ENOENT"){let r={clientId:void 0,clientSecret:void 0,callbackPort:void 0,defaultCompanyId:"0",currentCompanyId:"0",companies:{}};return await M(r),r}throw e}}async function M(t){await vt();let e=fe();await ue.writeFile(e,JSON.stringify(t,null,2),{mode:X})}async function b(){return(await v()).currentCompanyId}async function me(t,e,r){let n=await v();n.companies[t]?(e||r)&&(e&&(n.companies[t].name=e),r&&(n.companies[t].description=r)):n.companies[t]={id:t,name:e||`Company ${t}`,description:r||void 0,addedAt:Date.now()},n.companies[t].lastUsed=Date.now(),n.currentCompanyId=t,await M(n)}async function U(t){return(await v()).companies[t]||null}async function de(){return(await v()).downloadDir||Pt.tmpdir()}var je,Ne,F=pe(()=>{"use strict";w();je=d.object({id:d.string(),name:d.string().optional(),description:d.string().optional(),addedAt:d.number(),lastUsed:d.number().optional()}),Ne=d.object({clientId:d.string().optional(),clientSecret:d.string().optional(),callbackPort:d.number().optional(),defaultCompanyId:d.string(),currentCompanyId:d.string(),companies:d.record(d.string(),je),downloadDir:d.string().optional()})});var Le={};Me(Le,{getConfig:()=>h,loadConfig:()=>ge});function xt(){return!!(process.env.FREEE_CLIENT_ID||process.env.FREEE_CLIENT_SECRET)}async function ge(){if(O)return O;let t=await v(),e,r,n;if(xt())console.error("Warning: \u74B0\u5883\u5909\u6570\u3067\u306E\u8A8D\u8A3C\u60C5\u5831\u8A2D\u5B9A\u306F\u975E\u63A8\u5968\u3067\u3059\u3002"),console.error(" `freee-mcp configure` \u3092\u5B9F\u884C\u3057\u3066\u8A2D\u5B9A\u30D5\u30A1\u30A4\u30EB\u306B\u79FB\u884C\u3057\u3066\u304F\u3060\u3055\u3044\u3002"),console.error(` \u74B0\u5883\u5909\u6570\u8A2D\u5B9A\u306F\u5C06\u6765\u306E\u30D0\u30FC\u30B8\u30E7\u30F3\u3067\u524A\u9664\u3055\u308C\u308B\u4E88\u5B9A\u3067\u3059\u3002
4
+ `),e=process.env.FREEE_CLIENT_ID||"",r=process.env.FREEE_CLIENT_SECRET||"",n=process.env.FREEE_CALLBACK_PORT?parseInt(process.env.FREEE_CALLBACK_PORT,10):N;else{if(!t.clientId||!t.clientSecret)throw new Error("\u8A8D\u8A3C\u60C5\u5831\u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002\n`freee-mcp configure` \u3092\u5B9F\u884C\u3057\u3066\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u3057\u3066\u304F\u3060\u3055\u3044\u3002");e=t.clientId,r=t.clientSecret,n=t.callbackPort||N}return O={freee:{clientId:e,clientSecret:r,companyId:"0",apiUrl:Q},oauth:{callbackPort:n,redirectUri:`http://127.0.0.1:${n}/callback`,authorizationEndpoint:"https://accounts.secure.freee.co.jp/public_api/authorize",tokenEndpoint:"https://accounts.secure.freee.co.jp/public_api/token",scope:"read write"},server:{name:"freee",version:"1.0.0"},auth:{timeoutMs:R}},O}function h(){if(!O)throw new Error("Config not loaded. Call loadConfig() first in async context.");return O}var O,T=pe(()=>{"use strict";F();w();O=null});T();import{McpServer as Kt}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as Wt}from"@modelcontextprotocol/sdk/server/stdio.js";T();import Lt from"crypto";import{z as S}from"zod";T();T();w();import ee from"fs/promises";import Ve from"path";import{z as C}from"zod";async function _(t){try{return{success:!0,data:await t.json()}}catch(e){return{success:!1,error:e instanceof Error?e.message:String(e)}}}function l(t){return{content:[{type:"text",text:t}]}}function k(t){return t instanceof Error?t.message:String(t)}function Y(t,e){return{access_token:t.access_token,refresh_token:t.refresh_token||e.refreshToken||"",expires_at:Date.now()+t.expires_in*1e3,token_type:t.token_type||"Bearer",scope:t.scope||e.scope}}w();import Z from"fs/promises";import he from"path";async function Je(){let t=A();try{return(await Z.readdir(t)).filter(r=>r.startsWith("tokens-")&&r.endsWith(".json"))}catch{return[]}}async function Be(t){let e=A();try{let r=await Je();if(r.length>0){let n=he.join(e,r[0]),o=await Z.readFile(n,"utf8"),a=JSON.parse(o),i=ye.safeParse(a);if(!i.success)return console.error("[error] Invalid legacy token file:",i.error.message),null;let s=i.data;return await t(s),await Promise.all(r.map(p=>Z.unlink(he.join(e,p)).catch(u=>{console.error(`[warn] Failed to clean up legacy token file ${p}:`,u)}))),console.error("[info] Migrated legacy company-specific tokens to user-based tokens"),s}}catch(r){console.error("[warn] Error during legacy token migration attempt:",r)}return null}async function He(){let t=A();try{let e=await Je();await Promise.all(e.map(r=>Z.unlink(he.join(t,r)).catch(n=>{console.error(`[warn] Failed to clear legacy token file ${r}:`,n)}))),e.length>0&&console.error("[info] Cleared legacy company-specific token files")}catch(e){console.error("[warn] Error during legacy token cleanup:",e)}}var ye=C.object({access_token:C.string(),refresh_token:C.string(),expires_at:C.number(),token_type:C.string(),scope:C.string()}),Ce=C.object({access_token:C.string(),refresh_token:C.string().optional(),expires_in:C.number(),token_type:C.string().optional(),scope:C.string().optional()});function we(){return Ve.join(A(),"tokens.json")}async function te(t){let e=we(),r=Ve.dirname(e);try{console.error(`[info] Creating directory: ${r}`),await ee.mkdir(r,{recursive:!0}),console.error(`[info] Writing tokens to: ${e}`),await ee.writeFile(e,JSON.stringify(t,null,2),{mode:X}),console.error("[info] Tokens saved successfully")}catch(n){throw console.error("[error] Failed to save tokens:",n),n}}async function _e(){let t=we();try{let e=await ee.readFile(t,"utf8"),r=JSON.parse(e),n=ye.safeParse(r);return n.success?n.data:(console.error("[error] Invalid token file:",n.error.message),null)}catch(e){if(e.code==="ENOENT"){let r=await Be(te);return r||null}throw console.error("[error] Failed to load tokens:",e),e}}function Rt(t){return Date.now()<t.expires_at}async function $t(t){let e=h(),r=await fetch(e.oauth.tokenEndpoint,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded","User-Agent":$},body:new URLSearchParams({grant_type:"refresh_token",refresh_token:t,client_id:e.freee.clientId,client_secret:e.freee.clientSecret})});if(!r.ok){let i=await _(r),s=i.success?JSON.stringify(i.data):`(JSON parse failed: ${i.error})`;throw new Error(`Token refresh failed: ${r.status} ${s}`)}let n=await r.json(),o=Ce.safeParse(n);if(!o.success)throw new Error(`Invalid token response format: ${o.error.message}`);let a=Y(o.data,{refreshToken:t,scope:e.oauth.scope});return await te(a),a}async function ze(){let t=we();try{await ee.unlink(t),console.error("[info] Tokens cleared successfully")}catch(e){if(e.code==="ENOENT"){console.error("[info] No tokens to clear (file does not exist)");return}throw console.error("[error] Failed to clear tokens:",e),e}await He()}async function Ge(){let t=await _e();return t?Rt(t)?t.access_token:(await $t(t.refresh_token)).access_token:null}F();w();import Mt from"fs/promises";import Ft from"path";function qe(t){return typeof t=="object"&&t!==null&&"type"in t&&t.type==="binary"}function Ot(t){return["application/pdf","application/octet-stream","image/"].some(r=>t.includes(r))}function Dt(t){let e={"application/pdf":".pdf","image/png":".png","image/jpeg":".jpg","image/gif":".gif","image/webp":".webp","text/csv":".csv"};for(let[r,n]of Object.entries(e))if(t.includes(r))return n;return t.includes("image/"),".bin"}async function L(t,e,r,n,o){let a=o||h().freee.apiUrl,i=await b(),s=await Ge();if(!s)throw new Error(`\u8A8D\u8A3C\u304C\u5FC5\u8981\u3067\u3059\u3002freee_authenticate \u30C4\u30FC\u30EB\u3092\u4F7F\u7528\u3057\u3066\u8A8D\u8A3C\u3092\u884C\u3063\u3066\u304F\u3060\u3055\u3044\u3002
5
5
  \u73FE\u5728\u306E\u4E8B\u696D\u6240ID: ${i}
6
- \u307E\u305F\u306F\u3001FREEE_CLIENT_ID\u74B0\u5883\u5909\u6570\u304C\u6B63\u3057\u304F\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u308B\u304B\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`);let p=a.endsWith("/")?a:a+"/",u=e.startsWith("/")?e.slice(1):e,x=new URL(u,p);r&&Object.entries(r).forEach(([m,f])=>{f!==void 0&&x.searchParams.append(m,String(f))});let se=r?.company_id;if(se!==void 0&&String(se)!==String(i))throw new Error(`company_id \u306E\u4E0D\u6574\u5408: \u30EA\u30AF\u30A8\u30B9\u30C8\u306E company_id (${se}) \u3068\u73FE\u5728\u306E\u4E8B\u696D\u6240 (${i}) \u304C\u7570\u306A\u308A\u307E\u3059\u3002
7
- freee_set_current_company \u3067\u4E8B\u696D\u6240\u3092\u5207\u308A\u66FF\u3048\u308B\u304B\u3001\u30EA\u30AF\u30A8\u30B9\u30C8\u306E company_id \u3092\u4FEE\u6B63\u3057\u3066\u304F\u3060\u3055\u3044\u3002`);let ce=n?.company_id;if(ce!==void 0&&String(ce)!==String(i))throw new Error(`company_id \u306E\u4E0D\u6574\u5408: \u30EA\u30AF\u30A8\u30B9\u30C8\u30DC\u30C7\u30A3\u306E company_id (${ce}) \u3068\u73FE\u5728\u306E\u4E8B\u696D\u6240 (${i}) \u304C\u7570\u306A\u308A\u307E\u3059\u3002
8
- freee_set_current_company \u3067\u4E8B\u696D\u6240\u3092\u5207\u308A\u66FF\u3048\u308B\u304B\u3001\u30EA\u30AF\u30A8\u30B9\u30C8\u306E company_id \u3092\u4FEE\u6B63\u3057\u3066\u304F\u3060\u3055\u3044\u3002`);let y=await fetch(x.toString(),{method:t,headers:{Authorization:`Bearer ${s}`,"Content-Type":"application/json","User-Agent":Oe},body:n?JSON.stringify(typeof n=="string"?JSON.parse(n):n):void 0});if(y.status===401){let m=await _(y),f=m.success?JSON.stringify(m.data):`(JSON parse failed: ${m.error})`;throw new Error(`\u8A8D\u8A3C\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002freee_authenticate \u30C4\u30FC\u30EB\u3092\u4F7F\u7528\u3057\u3066\u518D\u8A8D\u8A3C\u3092\u884C\u3063\u3066\u304F\u3060\u3055\u3044\u3002
6
+ \u307E\u305F\u306F\u3001FREEE_CLIENT_ID\u74B0\u5883\u5909\u6570\u304C\u6B63\u3057\u304F\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u308B\u304B\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`);let p=a.endsWith("/")?a:a+"/",u=e.startsWith("/")?e.slice(1):e,x=new URL(u,p);r&&Object.entries(r).forEach(([m,f])=>{f!==void 0&&x.searchParams.append(m,String(f))});let ce=r?.company_id;if(ce!==void 0&&String(ce)!==String(i))throw new Error(`company_id \u306E\u4E0D\u6574\u5408: \u30EA\u30AF\u30A8\u30B9\u30C8\u306E company_id (${ce}) \u3068\u73FE\u5728\u306E\u4E8B\u696D\u6240 (${i}) \u304C\u7570\u306A\u308A\u307E\u3059\u3002
7
+ freee_set_current_company \u3067\u4E8B\u696D\u6240\u3092\u5207\u308A\u66FF\u3048\u308B\u304B\u3001\u30EA\u30AF\u30A8\u30B9\u30C8\u306E company_id \u3092\u4FEE\u6B63\u3057\u3066\u304F\u3060\u3055\u3044\u3002`);let le=n?.company_id;if(le!==void 0&&String(le)!==String(i))throw new Error(`company_id \u306E\u4E0D\u6574\u5408: \u30EA\u30AF\u30A8\u30B9\u30C8\u30DC\u30C7\u30A3\u306E company_id (${le}) \u3068\u73FE\u5728\u306E\u4E8B\u696D\u6240 (${i}) \u304C\u7570\u306A\u308A\u307E\u3059\u3002
8
+ freee_set_current_company \u3067\u4E8B\u696D\u6240\u3092\u5207\u308A\u66FF\u3048\u308B\u304B\u3001\u30EA\u30AF\u30A8\u30B9\u30C8\u306E company_id \u3092\u4FEE\u6B63\u3057\u3066\u304F\u3060\u3055\u3044\u3002`);let y=await fetch(x.toString(),{method:t,headers:{Authorization:`Bearer ${s}`,"Content-Type":"application/json","User-Agent":$},body:n?JSON.stringify(typeof n=="string"?JSON.parse(n):n):void 0});if(y.status===401){let m=await _(y),f=m.success?JSON.stringify(m.data):`(JSON parse failed: ${m.error})`;throw new Error(`\u8A8D\u8A3C\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002freee_authenticate \u30C4\u30FC\u30EB\u3092\u4F7F\u7528\u3057\u3066\u518D\u8A8D\u8A3C\u3092\u884C\u3063\u3066\u304F\u3060\u3055\u3044\u3002
9
9
  \u73FE\u5728\u306E\u4E8B\u696D\u6240ID: ${i}
10
10
  \u30A8\u30E9\u30FC\u8A73\u7D30: ${y.status} ${f}
11
11
 
@@ -17,19 +17,19 @@ freee_set_current_company \u3067\u4E8B\u696D\u6240\u3092\u5207\u308A\u66FF\u3048
17
17
  \u4E8B\u696D\u6240ID: ${i}
18
18
 
19
19
  \u30EC\u30FC\u30C8\u30EA\u30DF\u30C3\u30C8\u306E\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002\u6570\u5206\u5F85\u3063\u3066\u304B\u3089\u518D\u8A66\u884C\u3057\u3066\u304F\u3060\u3055\u3044\u3002
20
- \u305D\u308C\u3067\u3082\u89E3\u6C7A\u3057\u306A\u3044\u5834\u5408\u306F\u3001\u30A2\u30D7\u30EA\u306E\u6A29\u9650\u8A2D\u5B9A\u3092\u78BA\u8A8D\u3059\u308B\u304B\u3001freee_authenticate \u3067\u518D\u8A8D\u8A3C\u3057\u3066\u304F\u3060\u3055\u3044\u3002`)}if(!y.ok){let m=await _(y),f=`API request failed: ${y.status}`;if(m.success){let S=m.data;if(S&&S.errors&&Array.isArray(S.errors)){let D=[];for(let E of S.errors)E&&typeof E=="object"&&"messages"in E&&Array.isArray(E.messages)&&D.push(...E.messages);D.length>0&&(f+=`
20
+ \u305D\u308C\u3067\u3082\u89E3\u6C7A\u3057\u306A\u3044\u5834\u5408\u306F\u3001\u30A2\u30D7\u30EA\u306E\u6A29\u9650\u8A2D\u5B9A\u3092\u78BA\u8A8D\u3059\u308B\u304B\u3001freee_authenticate \u3067\u518D\u8A8D\u8A3C\u3057\u3066\u304F\u3060\u3055\u3044\u3002`)}if(!y.ok){let m=await _(y),f=`API request failed: ${y.status}`;if(m.success){let P=m.data;if(P&&P.errors&&Array.isArray(P.errors)){let j=[];for(let E of P.errors)E&&typeof E=="object"&&"messages"in E&&Array.isArray(E.messages)&&j.push(...E.messages);j.length>0&&(f+=`
21
21
 
22
22
  \u30A8\u30E9\u30FC\u8A73\u7D30:
23
- ${D.join(`
23
+ ${j.join(`
24
24
  `)}`,y.status===400&&(f+=`
25
25
 
26
26
  \u30D2\u30F3\u30C8: \u4E0D\u6B63\u306A\u30EA\u30AF\u30A8\u30B9\u30C8\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002`,f+=`
27
27
  \u65E2\u5B58\u306E\u30C7\u30FC\u30BF\u3092\u53D6\u5F97\u3057\u3066\u6B63\u3057\u3044\u69CB\u9020\u3092\u78BA\u8A8D\u3059\u308B\u3053\u3068\u3092\u304A\u52E7\u3081\u3057\u307E\u3059\u3002`,f+=`
28
- \u4F8B: freee_api_get \u3067\u65E2\u5B58\u30C7\u30FC\u30BF\u3092\u53D6\u5F97\u3057\u3001\u6B63\u3057\u3044\u69CB\u9020\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`))}S?.errors||(f+=`
28
+ \u4F8B: freee_api_get \u3067\u65E2\u5B58\u30C7\u30FC\u30BF\u3092\u53D6\u5F97\u3057\u3001\u6B63\u3057\u3044\u69CB\u9020\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`))}P?.errors||(f+=`
29
29
 
30
- \u8A73\u7D30: ${JSON.stringify(S)}`)}else f+=`
30
+ \u8A73\u7D30: ${JSON.stringify(P)}`)}else f+=`
31
31
 
32
- \u8A73\u7D30: (JSON parse failed: ${m.error})`;throw new Error(f)}let K=y.headers.get("content-type")||"";if(Ot(K)){let m=await me(),f=Dt(K),D=`freee_download_${Date.now()}${f}`,E=Ft.join(m,D),Re=await y.arrayBuffer();return await Mt.writeFile(E,Buffer.from(Re)),{type:"binary",filePath:E,mimeType:K,size:Re.byteLength}}let xe=await y.text();try{return JSON.parse(xe)}catch{throw new Error(`Failed to parse API response as JSON. Status: ${y.status}, Content-Type: ${K}, Body preview: ${xe.slice(0,200)}`)}}T();import Ke from"crypto";function We(){let t=Ke.randomBytes(32).toString("base64url"),e=Ke.createHash("sha256").update(t).digest("base64url");return{codeVerifier:t,codeChallenge:e}}function te(t,e,r){let n=h(),o=new URLSearchParams({response_type:"code",client_id:n.freee.clientId,redirect_uri:r,scope:n.oauth.scope,state:e,code_challenge:t,code_challenge_method:"S256"});return`${n.oauth.authorizationEndpoint}?${o.toString()}`}async function re(t,e,r){let n=h(),o=await fetch(n.oauth.tokenEndpoint,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({grant_type:"authorization_code",client_id:n.freee.clientId,client_secret:n.freee.clientSecret,code:t,redirect_uri:r,code_verifier:e})});if(!o.ok){let p=await _(o),u=p.success?JSON.stringify(p.data):`(JSON parse failed: ${p.error})`;throw new Error(`Token exchange failed: ${o.status} ${u}`)}let a=await o.json(),i=ye.safeParse(a);if(!i.success)throw new Error(`Invalid token response format: ${i.error.message}`);let s=Q(i.data,{scope:n.oauth.scope});return await ee(s),s}T();import jt from"http";import{URL as Nt}from"url";import Ut from"net";var _e=class{pendingAuthentications=new Map;cliAuthHandlers=new Map;registerAuthentication(e,r){console.error(`Registering authentication request with state: ${e.substring(0,10)}...`),console.error(`Code verifier: ${r.substring(0,10)}...`);let n=setTimeout(()=>{this.pendingAuthentications.delete(e),console.error(`Authentication timeout for state: ${e.substring(0,10)}...`)},h().auth.timeoutMs);this.pendingAuthentications.set(e,{codeVerifier:r,resolve:o=>{console.error("Authentication completed successfully!")},reject:o=>{console.error("Authentication failed:",o)},timeout:n}),console.error(`Registration complete. Total pending: ${this.pendingAuthentications.size}`)}getPendingAuthentication(e){return this.pendingAuthentications.get(e)}removePendingAuthentication(e){let r=this.pendingAuthentications.get(e);r&&(clearTimeout(r.timeout),this.pendingAuthentications.delete(e))}clearAllPending(){for(let[e,r]of this.pendingAuthentications)clearTimeout(r.timeout),r.reject(new Error("Server shutdown"));this.pendingAuthentications.clear()}get pendingCount(){return this.pendingAuthentications.size}registerCliAuthHandler(e,r){this.cliAuthHandlers.set(e,r)}getCliAuthHandler(e){return this.cliAuthHandlers.get(e)}removeCliAuthHandler(e){this.cliAuthHandlers.delete(e)}},ke=class{server=null;port=null;authManager;autoStopTimeout=null;constructor(e){this.authManager=e}clearAutoStopTimeout(){this.autoStopTimeout&&(clearTimeout(this.autoStopTimeout),this.autoStopTimeout=null)}scheduleAutoStop(e){this.clearAutoStopTimeout(),this.autoStopTimeout=setTimeout(()=>{console.error("OAuth callback server auto-stopping after timeout"),this.stop()},e)}getRedirectUri(){if(this.port===null)throw new Error("Callback server not started. Call start() first.");return`http://127.0.0.1:${this.port}/callback`}getPort(){return this.port}isRunning(){return this.server!==null}async start(){if(this.server){console.error("OAuth callback server is already running. If authentication is not working, try restarting the MCP server.");return}let e=h().oauth.callbackPort;if(!await this.checkPortAvailable(e)){let n=`http://127.0.0.1:${e}/callback`;throw new Error(`\u30DD\u30FC\u30C8 ${e} \u306F\u65E2\u306B\u4F7F\u7528\u3055\u308C\u3066\u3044\u307E\u3059\u3002
32
+ \u8A73\u7D30: (JSON parse failed: ${m.error})`;throw new Error(f)}let W=y.headers.get("content-type")||"";if(Ot(W)){let m=await de(),f=Dt(W),j=`freee_download_${Date.now()}${f}`,E=Ft.join(m,j),$e=await y.arrayBuffer();return await Mt.writeFile(E,Buffer.from($e)),{type:"binary",filePath:E,mimeType:W,size:$e.byteLength}}let Re=await y.text();try{return JSON.parse(Re)}catch{throw new Error(`Failed to parse API response as JSON. Status: ${y.status}, Content-Type: ${W}, Body preview: ${Re.slice(0,200)}`)}}T();import Ke from"crypto";w();function We(){let t=Ke.randomBytes(32).toString("base64url"),e=Ke.createHash("sha256").update(t).digest("base64url");return{codeVerifier:t,codeChallenge:e}}function re(t,e,r){let n=h(),o=new URLSearchParams({response_type:"code",client_id:n.freee.clientId,redirect_uri:r,scope:n.oauth.scope,state:e,code_challenge:t,code_challenge_method:"S256"});return`${n.oauth.authorizationEndpoint}?${o.toString()}`}async function ne(t,e,r){let n=h(),o=await fetch(n.oauth.tokenEndpoint,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded","User-Agent":$},body:new URLSearchParams({grant_type:"authorization_code",client_id:n.freee.clientId,client_secret:n.freee.clientSecret,code:t,redirect_uri:r,code_verifier:e})});if(!o.ok){let p=await _(o),u=p.success?JSON.stringify(p.data):`(JSON parse failed: ${p.error})`;throw new Error(`Token exchange failed: ${o.status} ${u}`)}let a=await o.json(),i=Ce.safeParse(a);if(!i.success)throw new Error(`Invalid token response format: ${i.error.message}`);let s=Y(i.data,{scope:n.oauth.scope});return await te(s),s}T();import jt from"http";import{URL as Nt}from"url";import Ut from"net";var ke=class{pendingAuthentications=new Map;cliAuthHandlers=new Map;registerAuthentication(e,r){console.error(`Registering authentication request with state: ${e.substring(0,10)}...`),console.error(`Code verifier: ${r.substring(0,10)}...`);let n=setTimeout(()=>{this.pendingAuthentications.delete(e),console.error(`Authentication timeout for state: ${e.substring(0,10)}...`)},h().auth.timeoutMs);this.pendingAuthentications.set(e,{codeVerifier:r,resolve:o=>{console.error("Authentication completed successfully!")},reject:o=>{console.error("Authentication failed:",o)},timeout:n}),console.error(`Registration complete. Total pending: ${this.pendingAuthentications.size}`)}getPendingAuthentication(e){return this.pendingAuthentications.get(e)}removePendingAuthentication(e){let r=this.pendingAuthentications.get(e);r&&(clearTimeout(r.timeout),this.pendingAuthentications.delete(e))}clearAllPending(){for(let[e,r]of this.pendingAuthentications)clearTimeout(r.timeout),r.reject(new Error("Server shutdown"));this.pendingAuthentications.clear()}get pendingCount(){return this.pendingAuthentications.size}registerCliAuthHandler(e,r){this.cliAuthHandlers.set(e,r)}getCliAuthHandler(e){return this.cliAuthHandlers.get(e)}removeCliAuthHandler(e){this.cliAuthHandlers.delete(e)}},Ee=class{server=null;port=null;authManager;autoStopTimeout=null;constructor(e){this.authManager=e}clearAutoStopTimeout(){this.autoStopTimeout&&(clearTimeout(this.autoStopTimeout),this.autoStopTimeout=null)}scheduleAutoStop(e){this.clearAutoStopTimeout(),this.autoStopTimeout=setTimeout(()=>{console.error("OAuth callback server auto-stopping after timeout"),this.stop()},e)}getRedirectUri(){if(this.port===null)throw new Error("Callback server not started. Call start() first.");return`http://127.0.0.1:${this.port}/callback`}getPort(){return this.port}isRunning(){return this.server!==null}async start(){if(this.server){console.error("OAuth callback server is already running. If authentication is not working, try restarting the MCP server.");return}let e=h().oauth.callbackPort;if(!await this.checkPortAvailable(e)){let n=`http://127.0.0.1:${e}/callback`;throw new Error(`\u30DD\u30FC\u30C8 ${e} \u306F\u65E2\u306B\u4F7F\u7528\u3055\u308C\u3066\u3044\u307E\u3059\u3002
33
33
 
34
34
  freee \u30A2\u30D7\u30EA\u306B\u30B3\u30FC\u30EB\u30D0\u30C3\u30AFURL (${n}) \u3092\u767B\u9332\u3057\u3066\u3044\u308B\u5834\u5408\u3001\u30DD\u30FC\u30C8\u3092\u5909\u66F4\u3059\u308B\u3068\u8A8D\u8A3C\u304C\u5931\u6557\u3057\u307E\u3059\u3002
35
35
 
@@ -37,7 +37,7 @@ freee \u30A2\u30D7\u30EA\u306B\u30B3\u30FC\u30EB\u30D0\u30C3\u30AFURL (${n}) \u3
37
37
  1. \u30DD\u30FC\u30C8 ${e} \u3092\u4F7F\u7528\u3057\u3066\u3044\u308B\u30D7\u30ED\u30BB\u30B9\u3092\u7D42\u4E86\u3059\u308B
38
38
  (\u4F8B: lsof -i :${e} \u3067\u30D7\u30ED\u30BB\u30B9\u3092\u78BA\u8A8D)
39
39
  2. \u307E\u305F\u306F\u3001\u8A2D\u5B9A\u3067\u30DD\u30FC\u30C8\u3092\u5909\u66F4\u3057\u3001freee \u30A2\u30D7\u30EA\u306E\u30B3\u30FC\u30EB\u30D0\u30C3\u30AFURL\u3082\u66F4\u65B0\u3059\u308B
40
- (freee-mcp configure \u3092\u5B9F\u884C\u3057\u3066\u518D\u8A2D\u5B9A)`)}return this.port=e,new Promise((n,o)=>{this.server=jt.createServer((a,i)=>{console.error(`Callback request: ${a.method} ${a.url}`);let s=new Nt(a.url,`http://127.0.0.1:${e}`);s.pathname==="/callback"?this.handleCallback(s,i):s.pathname==="/"?(i.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),i.end("<h1>freee MCP OAuth Server</h1><p>\u30B3\u30FC\u30EB\u30D0\u30C3\u30AF\u30B5\u30FC\u30D0\u30FC\u304C\u7A3C\u50CD\u4E2D\u3067\u3059\u3002</p>")):(i.writeHead(404,{"Content-Type":"text/html; charset=utf-8"}),i.end("<h1>404 Not Found</h1><p>\u3053\u306E\u30D1\u30B9\u306F\u5B58\u5728\u3057\u307E\u305B\u3093\u3002</p>"))}),this.server.on("error",a=>{let i=a instanceof Error?a.message:String(a);console.error(`OAuth callback server failed to start: ${i}`),this.server=null,this.port=null,o(new Error(`Failed to start OAuth callback server: ${i}`))}),this.server.listen(e,"127.0.0.1",()=>{console.error(`OAuth callback server listening on http://127.0.0.1:${e}`),n()})})}stop(){this.clearAutoStopTimeout(),this.server&&(this.authManager.clearAllPending(),this.server.close(()=>{console.error("OAuth callback server stopped")}),this.server=null,this.port=null)}async checkPortAvailable(e){return new Promise(r=>{let n=Ut.createServer();n.listen(e,"127.0.0.1",()=>{n.close(()=>{r(!0)})}),n.on("error",()=>{r(!1)})})}handleCallback(e,r){let n=e.searchParams.get("code"),o=e.searchParams.get("state"),a=e.searchParams.get("error"),i=e.searchParams.get("error_description");console.error(`Callback received - URL: ${e.toString()}`),console.error("Callback parameters:",{code:n?`${n.substring(0,10)}...`:null,state:o?`${o.substring(0,10)}...`:null,error:a,errorDescription:i}),console.error(`Pending authentications count: ${this.authManager.pendingCount}`);let s=o?this.authManager.getCliAuthHandler(o):void 0;if(a){let u=i||a;if(console.error(`OAuth error: ${a} - ${i}`),r.writeHead(400,{"Content-Type":"text/html; charset=utf-8"}),r.end(`<h1>\u8A8D\u8A3C\u30A8\u30E9\u30FC</h1><p>\u8A8D\u8A3C\u306B\u5931\u6557\u3057\u307E\u3057\u305F: ${u}</p>`),s)s.reject(new Error(`OAuth error: ${a} - ${i}`));else if(o){let x=this.authManager.getPendingAuthentication(o);x&&(clearTimeout(x.timeout),x.reject(new Error(`OAuth error: ${a} - ${i}`)),this.authManager.removePendingAuthentication(o))}return}if(!n||!o){console.error("Missing code or state"),r.writeHead(400,{"Content-Type":"text/html; charset=utf-8"}),r.end("<h1>\u8A8D\u8A3C\u30A8\u30E9\u30FC</h1><p>\u8A8D\u8A3C\u30B3\u30FC\u30C9\u307E\u305F\u306F\u72B6\u614B\u30D1\u30E9\u30E1\u30FC\u30BF\u304C\u4E0D\u8DB3\u3057\u3066\u3044\u307E\u3059\u3002</p>");return}if(s){console.error("Valid CLI callback received"),r.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),r.end("<h1>\u8A8D\u8A3C\u5B8C\u4E86</h1><p>\u8A8D\u8A3C\u304C\u5B8C\u4E86\u3057\u307E\u3057\u305F\u3002\u3053\u306E\u30DA\u30FC\u30B8\u3092\u9589\u3058\u3066\u30BF\u30FC\u30DF\u30CA\u30EB\u306B\u623B\u3063\u3066\u304F\u3060\u3055\u3044\u3002</p>"),s.resolve(n);return}let p=this.authManager.getPendingAuthentication(o);if(!p){console.error(`Unknown state: ${o}`),r.writeHead(400,{"Content-Type":"text/html; charset=utf-8"}),r.end("<h1>\u8A8D\u8A3C\u30A8\u30E9\u30FC</h1><p>\u4E0D\u660E\u306A\u8A8D\u8A3C\u72B6\u614B\u3067\u3059\u3002\u8A8D\u8A3C\u3092\u518D\u958B\u3057\u3066\u304F\u3060\u3055\u3044\u3002</p>");return}console.error("Valid callback received, exchanging code for tokens..."),r.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),r.end("<h1>\u8A8D\u8A3C\u5B8C\u4E86</h1><p>\u8A8D\u8A3C\u304C\u5B8C\u4E86\u3057\u307E\u3057\u305F\u3002\u3053\u306E\u30DA\u30FC\u30B8\u3092\u9589\u3058\u3066\u304F\u3060\u3055\u3044\u3002</p>"),this.authManager.removePendingAuthentication(o),re(n,p.codeVerifier,this.getRedirectUri()).then(u=>{console.error("Token exchange successful!"),p.resolve(u)}).catch(u=>{console.error("Token exchange failed:",u),p.reject(u)})}},Ee=new _e,L=new ke(Ee);function J(){return L.getRedirectUri()}async function Xe(){return L.start()}async function Qe(t){await L.start(),L.scheduleAutoStop(t)}function Ye(t,e){Ee.registerAuthentication(t,e)}function Ze(){L.stop()}function et(){return Ee}M();w();function tt(t){t.tool("freee_current_user","\u73FE\u5728\u306E\u30E6\u30FC\u30B6\u30FC\u60C5\u5831\u3092\u53D6\u5F97\u3002\u8A73\u7D30\u30AC\u30A4\u30C9\u306Ffreee-mcp skill\u3092\u53C2\u7167\u3002",{},async()=>{try{let e=await b(),r=await N(e);if(!e)return l("\u4F1A\u793EID\u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002freee_set_current_company \u3067\u8A2D\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002");let n=await U("GET","/api/1/users/me");return l(`\u73FE\u5728\u306E\u30E6\u30FC\u30B6\u30FC\u60C5\u5831:
40
+ (freee-mcp configure \u3092\u5B9F\u884C\u3057\u3066\u518D\u8A2D\u5B9A)`)}return this.port=e,new Promise((n,o)=>{this.server=jt.createServer((a,i)=>{console.error(`Callback request: ${a.method} ${a.url}`);let s=new Nt(a.url,`http://127.0.0.1:${e}`);s.pathname==="/callback"?this.handleCallback(s,i):s.pathname==="/"?(i.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),i.end("<h1>freee MCP OAuth Server</h1><p>\u30B3\u30FC\u30EB\u30D0\u30C3\u30AF\u30B5\u30FC\u30D0\u30FC\u304C\u7A3C\u50CD\u4E2D\u3067\u3059\u3002</p>")):(i.writeHead(404,{"Content-Type":"text/html; charset=utf-8"}),i.end("<h1>404 Not Found</h1><p>\u3053\u306E\u30D1\u30B9\u306F\u5B58\u5728\u3057\u307E\u305B\u3093\u3002</p>"))}),this.server.on("error",a=>{let i=a instanceof Error?a.message:String(a);console.error(`OAuth callback server failed to start: ${i}`),this.server=null,this.port=null,o(new Error(`Failed to start OAuth callback server: ${i}`))}),this.server.listen(e,"127.0.0.1",()=>{console.error(`OAuth callback server listening on http://127.0.0.1:${e}`),n()})})}stop(){this.clearAutoStopTimeout(),this.server&&(this.authManager.clearAllPending(),this.server.close(()=>{console.error("OAuth callback server stopped")}),this.server=null,this.port=null)}async checkPortAvailable(e){return new Promise(r=>{let n=Ut.createServer();n.listen(e,"127.0.0.1",()=>{n.close(()=>{r(!0)})}),n.on("error",()=>{r(!1)})})}handleCallback(e,r){let n=e.searchParams.get("code"),o=e.searchParams.get("state"),a=e.searchParams.get("error"),i=e.searchParams.get("error_description");console.error(`Callback received - URL: ${e.toString()}`),console.error("Callback parameters:",{code:n?`${n.substring(0,10)}...`:null,state:o?`${o.substring(0,10)}...`:null,error:a,errorDescription:i}),console.error(`Pending authentications count: ${this.authManager.pendingCount}`);let s=o?this.authManager.getCliAuthHandler(o):void 0;if(a){let u=i||a;if(console.error(`OAuth error: ${a} - ${i}`),r.writeHead(400,{"Content-Type":"text/html; charset=utf-8"}),r.end(`<h1>\u8A8D\u8A3C\u30A8\u30E9\u30FC</h1><p>\u8A8D\u8A3C\u306B\u5931\u6557\u3057\u307E\u3057\u305F: ${u}</p>`),s)s.reject(new Error(`OAuth error: ${a} - ${i}`));else if(o){let x=this.authManager.getPendingAuthentication(o);x&&(clearTimeout(x.timeout),x.reject(new Error(`OAuth error: ${a} - ${i}`)),this.authManager.removePendingAuthentication(o))}return}if(!n||!o){console.error("Missing code or state"),r.writeHead(400,{"Content-Type":"text/html; charset=utf-8"}),r.end("<h1>\u8A8D\u8A3C\u30A8\u30E9\u30FC</h1><p>\u8A8D\u8A3C\u30B3\u30FC\u30C9\u307E\u305F\u306F\u72B6\u614B\u30D1\u30E9\u30E1\u30FC\u30BF\u304C\u4E0D\u8DB3\u3057\u3066\u3044\u307E\u3059\u3002</p>");return}if(s){console.error("Valid CLI callback received"),r.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),r.end("<h1>\u8A8D\u8A3C\u5B8C\u4E86</h1><p>\u8A8D\u8A3C\u304C\u5B8C\u4E86\u3057\u307E\u3057\u305F\u3002\u3053\u306E\u30DA\u30FC\u30B8\u3092\u9589\u3058\u3066\u30BF\u30FC\u30DF\u30CA\u30EB\u306B\u623B\u3063\u3066\u304F\u3060\u3055\u3044\u3002</p>"),s.resolve(n);return}let p=this.authManager.getPendingAuthentication(o);if(!p){console.error(`Unknown state: ${o}`),r.writeHead(400,{"Content-Type":"text/html; charset=utf-8"}),r.end("<h1>\u8A8D\u8A3C\u30A8\u30E9\u30FC</h1><p>\u4E0D\u660E\u306A\u8A8D\u8A3C\u72B6\u614B\u3067\u3059\u3002\u8A8D\u8A3C\u3092\u518D\u958B\u3057\u3066\u304F\u3060\u3055\u3044\u3002</p>");return}console.error("Valid callback received, exchanging code for tokens..."),r.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),r.end("<h1>\u8A8D\u8A3C\u5B8C\u4E86</h1><p>\u8A8D\u8A3C\u304C\u5B8C\u4E86\u3057\u307E\u3057\u305F\u3002\u3053\u306E\u30DA\u30FC\u30B8\u3092\u9589\u3058\u3066\u304F\u3060\u3055\u3044\u3002</p>"),this.authManager.removePendingAuthentication(o),ne(n,p.codeVerifier,this.getRedirectUri()).then(u=>{console.error("Token exchange successful!"),p.resolve(u)}).catch(u=>{console.error("Token exchange failed:",u),p.reject(u)})}},Ae=new ke,J=new Ee(Ae);function B(){return J.getRedirectUri()}async function Xe(){return J.start()}async function Qe(t){await J.start(),J.scheduleAutoStop(t)}function Ye(t,e){Ae.registerAuthentication(t,e)}function Ze(){J.stop()}function et(){return Ae}F();w();function tt(t){t.tool("freee_current_user","\u73FE\u5728\u306E\u30E6\u30FC\u30B6\u30FC\u60C5\u5831\u3092\u53D6\u5F97\u3002\u8A73\u7D30\u30AC\u30A4\u30C9\u306Ffreee-mcp skill\u3092\u53C2\u7167\u3002",{},async()=>{try{let e=await b(),r=await U(e);if(!e)return l("\u4F1A\u793EID\u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002freee_set_current_company \u3067\u8A2D\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002");let n=await L("GET","/api/1/users/me");return l(`\u73FE\u5728\u306E\u30E6\u30FC\u30B6\u30FC\u60C5\u5831:
41
41
  \u4F1A\u793EID: ${e}
42
42
  \u4F1A\u793E\u540D: ${r?.name||"Unknown"}
43
43
  \u30E6\u30FC\u30B6\u30FC\u8A73\u7D30:
@@ -45,50 +45,50 @@ ${JSON.stringify(n,null,2)}`)}catch(e){return l(`\u30E6\u30FC\u30B6\u30FC\u60C5\
45
45
  OAuth\u8A8D\u8A3C\u3092\u884C\u3046\u306B\u306F\u3001freee developers\u3067\u30A2\u30D7\u30EA\u30B1\u30FC\u30B7\u30E7\u30F3\u3092\u4F5C\u6210\u3057\u3001
46
46
  \u30AF\u30E9\u30A4\u30A2\u30F3\u30C8ID\u3092\u74B0\u5883\u5909\u6570\u306B\u8A2D\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002`);if(!h().freee.clientSecret)return l(`FREEE_CLIENT_SECRET\u74B0\u5883\u5909\u6570\u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002
47
47
  OAuth\u8A8D\u8A3C\u3092\u884C\u3046\u306B\u306F\u3001freee developers\u3067\u30A2\u30D7\u30EA\u30B1\u30FC\u30B7\u30E7\u30F3\u3092\u4F5C\u6210\u3057\u3001
48
- \u30AF\u30E9\u30A4\u30A2\u30F3\u30C8\u30B7\u30FC\u30AF\u30EC\u30C3\u30C8\u3092\u74B0\u5883\u5909\u6570\u306B\u8A2D\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002`);await Qe(R);let{codeVerifier:e,codeChallenge:r}=We(),n=Lt.randomBytes(16).toString("hex"),o=te(r,n,J());return Ye(n,e),console.error(`Authentication URL: ${o}`),l(`\u8A8D\u8A3CURL: ${o}
48
+ \u30AF\u30E9\u30A4\u30A2\u30F3\u30C8\u30B7\u30FC\u30AF\u30EC\u30C3\u30C8\u3092\u74B0\u5883\u5909\u6570\u306B\u8A2D\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002`);await Qe(R);let{codeVerifier:e,codeChallenge:r}=We(),n=Lt.randomBytes(16).toString("hex"),o=re(r,n,B());return Ye(n,e),console.error(`Authentication URL: ${o}`),l(`\u8A8D\u8A3CURL: ${o}
49
49
 
50
- \u30D6\u30E9\u30A6\u30B6\u3067\u958B\u3044\u3066\u8A8D\u8A3C\u3057\u3066\u304F\u3060\u3055\u3044\u30025\u5206\u3067\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\u3057\u307E\u3059\u3002`)}catch(e){return l(`\u8A8D\u8A3C\u958B\u59CB\u306B\u5931\u6557: ${k(e)}`)}}),t.tool("freee_auth_status","\u8A8D\u8A3C\u72B6\u614B\u3092\u78BA\u8A8D\u3002",{},async()=>{try{let e=await we();if(!e)return l("\u672A\u8A8D\u8A3C\u3002freee_authenticate \u3067\u8A8D\u8A3C\u3057\u3066\u304F\u3060\u3055\u3044\u3002");let r=Date.now()<e.expires_at,n=new Date(e.expires_at).toLocaleString();return l(`\u8A8D\u8A3C\u72B6\u614B: ${r?"\u6709\u52B9":"\u671F\u9650\u5207\u308C"}
50
+ \u30D6\u30E9\u30A6\u30B6\u3067\u958B\u3044\u3066\u8A8D\u8A3C\u3057\u3066\u304F\u3060\u3055\u3044\u30025\u5206\u3067\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\u3057\u307E\u3059\u3002`)}catch(e){return l(`\u8A8D\u8A3C\u958B\u59CB\u306B\u5931\u6557: ${k(e)}`)}}),t.tool("freee_auth_status","\u8A8D\u8A3C\u72B6\u614B\u3092\u78BA\u8A8D\u3002",{},async()=>{try{let e=await _e();if(!e)return l("\u672A\u8A8D\u8A3C\u3002freee_authenticate \u3067\u8A8D\u8A3C\u3057\u3066\u304F\u3060\u3055\u3044\u3002");let r=Date.now()<e.expires_at,n=new Date(e.expires_at).toLocaleString();return l(`\u8A8D\u8A3C\u72B6\u614B: ${r?"\u6709\u52B9":"\u671F\u9650\u5207\u308C"}
51
51
  \u6709\u52B9\u671F\u9650: ${n}`+(r?"":`
52
- \u6B21\u56DEAPI\u4F7F\u7528\u6642\u306B\u81EA\u52D5\u66F4\u65B0\u3055\u308C\u307E\u3059\u3002`))}catch(e){return l(`\u8A8D\u8A3C\u72B6\u614B\u306E\u78BA\u8A8D\u306B\u5931\u6557: ${k(e)}`)}}),t.tool("freee_clear_auth","\u8A8D\u8A3C\u60C5\u5831\u3092\u30AF\u30EA\u30A2\u3002",{},async()=>{try{return await ze(),l("\u8A8D\u8A3C\u60C5\u5831\u3092\u30AF\u30EA\u30A2\u3057\u307E\u3057\u305F\u3002\u518D\u8A8D\u8A3C\u3059\u308B\u306B\u306F freee_authenticate \u3092\u4F7F\u7528\u3002")}catch(e){return l(`\u8A8D\u8A3C\u60C5\u5831\u306E\u30AF\u30EA\u30A2\u306B\u5931\u6557: ${k(e)}`)}}),t.tool("freee_set_current_company","\u4E8B\u696D\u6240\u3092\u8A2D\u5B9A\u30FB\u5207\u308A\u66FF\u3048\u3002",{company_id:P.string().describe("\u4E8B\u696D\u6240ID"),name:P.string().optional().describe("\u4E8B\u696D\u6240\u540D"),description:P.string().optional().describe("\u8AAC\u660E")},async e=>{try{let{company_id:r,name:n,description:o}=e;await fe(r,n,o);let a=await N(r);return l(`\u4E8B\u696D\u6240\u3092\u8A2D\u5B9A: ${a?.name||r}`)}catch(r){return l(`\u4E8B\u696D\u6240\u306E\u8A2D\u5B9A\u306B\u5931\u6557: ${k(r)}`)}}),t.tool("freee_get_current_company","\u73FE\u5728\u306E\u4E8B\u696D\u6240\u60C5\u5831\u3092\u8868\u793A\u3002",{},async()=>{try{let e=await b(),r=await N(e);return r?l(`\u4E8B\u696D\u6240: ${r.name} (ID: ${r.id})`):l(`\u4E8B\u696D\u6240ID: ${e} (\u8A73\u7D30\u60C5\u5831\u306A\u3057)`)}catch(e){return l(`\u4E8B\u696D\u6240\u60C5\u5831\u306E\u53D6\u5F97\u306B\u5931\u6557: ${k(e)}`)}}),t.tool("freee_list_companies","\u4E8B\u696D\u6240\u4E00\u89A7\u3092\u8868\u793A\u3002",{},async()=>{try{let e=P.object({companies:P.array(P.object({id:P.number(),name:P.string()})).optional()}),r=await U("GET","/api/1/companies"),n=e.safeParse(r);if(!n.success)return{content:[{type:"text",text:`API\u30EC\u30B9\u30DD\u30F3\u30B9\u306E\u5F62\u5F0F\u304C\u4E0D\u6B63\u3067\u3059: ${n.error.message}`}]};let o=n.data,a=await b();if(!o?.companies?.length)return l("\u4E8B\u696D\u6240\u60C5\u5831\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002");let i=o.companies.map(s=>{let p=s.id===parseInt(a)?" *":"";return`${s.name} (${s.id})${p}`}).join(`
52
+ \u6B21\u56DEAPI\u4F7F\u7528\u6642\u306B\u81EA\u52D5\u66F4\u65B0\u3055\u308C\u307E\u3059\u3002`))}catch(e){return l(`\u8A8D\u8A3C\u72B6\u614B\u306E\u78BA\u8A8D\u306B\u5931\u6557: ${k(e)}`)}}),t.tool("freee_clear_auth","\u8A8D\u8A3C\u60C5\u5831\u3092\u30AF\u30EA\u30A2\u3002",{},async()=>{try{return await ze(),l("\u8A8D\u8A3C\u60C5\u5831\u3092\u30AF\u30EA\u30A2\u3057\u307E\u3057\u305F\u3002\u518D\u8A8D\u8A3C\u3059\u308B\u306B\u306F freee_authenticate \u3092\u4F7F\u7528\u3002")}catch(e){return l(`\u8A8D\u8A3C\u60C5\u5831\u306E\u30AF\u30EA\u30A2\u306B\u5931\u6557: ${k(e)}`)}}),t.tool("freee_set_current_company","\u4E8B\u696D\u6240\u3092\u8A2D\u5B9A\u30FB\u5207\u308A\u66FF\u3048\u3002",{company_id:S.string().describe("\u4E8B\u696D\u6240ID"),name:S.string().optional().describe("\u4E8B\u696D\u6240\u540D"),description:S.string().optional().describe("\u8AAC\u660E")},async e=>{try{let{company_id:r,name:n,description:o}=e;await me(r,n,o);let a=await U(r);return l(`\u4E8B\u696D\u6240\u3092\u8A2D\u5B9A: ${a?.name||r}`)}catch(r){return l(`\u4E8B\u696D\u6240\u306E\u8A2D\u5B9A\u306B\u5931\u6557: ${k(r)}`)}}),t.tool("freee_get_current_company","\u73FE\u5728\u306E\u4E8B\u696D\u6240\u60C5\u5831\u3092\u8868\u793A\u3002",{},async()=>{try{let e=await b(),r=await U(e);return r?l(`\u4E8B\u696D\u6240: ${r.name} (ID: ${r.id})`):l(`\u4E8B\u696D\u6240ID: ${e} (\u8A73\u7D30\u60C5\u5831\u306A\u3057)`)}catch(e){return l(`\u4E8B\u696D\u6240\u60C5\u5831\u306E\u53D6\u5F97\u306B\u5931\u6557: ${k(e)}`)}}),t.tool("freee_list_companies","\u4E8B\u696D\u6240\u4E00\u89A7\u3092\u8868\u793A\u3002",{},async()=>{try{let e=S.object({companies:S.array(S.object({id:S.number(),name:S.string()})).optional()}),r=await L("GET","/api/1/companies"),n=e.safeParse(r);if(!n.success)return{content:[{type:"text",text:`API\u30EC\u30B9\u30DD\u30F3\u30B9\u306E\u5F62\u5F0F\u304C\u4E0D\u6B63\u3067\u3059: ${n.error.message}`}]};let o=n.data,a=await b();if(!o?.companies?.length)return l("\u4E8B\u696D\u6240\u60C5\u5831\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002");let i=o.companies.map(s=>{let p=s.id===parseInt(a)?" *":"";return`${s.name} (${s.id})${p}`}).join(`
53
53
  `);return l(`\u4E8B\u696D\u6240\u4E00\u89A7:
54
- ${i}`)}catch(e){return l(`\u4E8B\u696D\u6240\u4E00\u89A7\u306E\u53D6\u5F97\u306B\u5931\u6557: ${k(e)}`)}})}import{z as c}from"zod";import it from"node:fs";import H from"node:path";import{fileURLToPath as Ht}from"node:url";import{z as g}from"zod";var Jt=g.object({name:g.string(),in:g.enum(["path","query"]),required:g.boolean().optional(),description:g.string().optional(),type:g.string()}),B=g.object({summary:g.string().optional(),description:g.string().optional(),parameters:g.array(Jt).optional(),hasJsonBody:g.boolean().optional()}),Bt=g.object({get:B.optional(),post:B.optional(),put:B.optional(),delete:B.optional(),patch:B.optional()}),rt=g.object({paths:g.record(g.string(),Bt)});var Ae=H.dirname(Ht(import.meta.url));function Vt(){let t=[H.resolve(Ae,"./openapi/minimal"),H.resolve(Ae,"../dist/openapi/minimal"),H.resolve(Ae,"../../openapi/minimal")];for(let e of t)if(it.existsSync(e))return e;throw new Error(`Could not find minimal schema directory. Searched paths:
54
+ ${i}`)}catch(e){return l(`\u4E8B\u696D\u6240\u4E00\u89A7\u306E\u53D6\u5F97\u306B\u5931\u6557: ${k(e)}`)}})}import{z as c}from"zod";import it from"node:fs";import V from"node:path";import{fileURLToPath as Ht}from"node:url";import{z as g}from"zod";var Jt=g.object({name:g.string(),in:g.enum(["path","query"]),required:g.boolean().optional(),description:g.string().optional(),type:g.string()}),H=g.object({summary:g.string().optional(),description:g.string().optional(),parameters:g.array(Jt).optional(),hasJsonBody:g.boolean().optional()}),Bt=g.object({get:H.optional(),post:H.optional(),put:H.optional(),delete:H.optional(),patch:H.optional()}),rt=g.object({paths:g.record(g.string(),Bt)});var Te=V.dirname(Ht(import.meta.url));function Vt(){let t=[V.resolve(Te,"./openapi/minimal"),V.resolve(Te,"../dist/openapi/minimal"),V.resolve(Te,"../../openapi/minimal")];for(let e of t)if(it.existsSync(e))return e;throw new Error(`Could not find minimal schema directory. Searched paths:
55
55
  ${t.join(`
56
- `)}`)}var zt=Vt();function qt(t){let e=H.join(zt,t),r=it.readFileSync(e,"utf-8"),n=JSON.parse(r),o=rt.safeParse(n);if(!o.success)throw new Error(`Invalid schema file ${t}: ${o.error.message}`);return o.data}var ne={accounting:{schemaFile:"accounting.json",baseUrl:"https://api.freee.co.jp",prefix:"accounting",name:"freee\u4F1A\u8A08 API"},hr:{schemaFile:"hr.json",baseUrl:"https://api.freee.co.jp/hr",prefix:"hr",name:"freee\u4EBA\u4E8B\u52B4\u52D9 API"},invoice:{schemaFile:"invoice.json",baseUrl:"https://api.freee.co.jp/iv",prefix:"invoice",name:"freee\u8ACB\u6C42\u66F8 API"},pm:{schemaFile:"pm.json",baseUrl:"https://api.freee.co.jp/pm",prefix:"pm",name:"freee\u5DE5\u6570\u7BA1\u7406 API"},sm:{schemaFile:"sm.json",baseUrl:"https://api.freee.co.jp/sm",prefix:"sm",name:"freee\u8CA9\u58F2 API"}},Te={};function nt(t){if(!Te[t]){let e=ne[t];Te[t]={schema:qt(e.schemaFile),baseUrl:e.baseUrl,prefix:e.prefix,name:e.name}}return Te[t]}var Pe=new Proxy({},{get(t,e){if(e in ne)return nt(e)},ownKeys(){return Object.keys(ne)},getOwnPropertyDescriptor(t,e){if(e in ne)return{enumerable:!0,configurable:!0,value:nt(e)}}});function ot(t,e,r,n){let o=n.schema.paths;if(e in o){let a=o[e];if(t in a)return{isValid:!0,message:"Valid path and method",operation:a[t],actualPath:e,apiType:r,baseUrl:n.baseUrl}}for(let a of Object.keys(o)){let i=a.replace(/\{[^}]+\}/g,"[^/]+");if(new RegExp(`^${i}$`).test(e)){let p=o[a];if(t in p)return{isValid:!0,message:"Valid path and method",operation:p[t],actualPath:e,apiType:r,baseUrl:n.baseUrl}}}return null}function at(t,e,r){let n=t.toLowerCase();if(r!==void 0){let o=Pe[r],a=ot(n,e,r,o);return a||{isValid:!1,message:`Path '${e}' not found in ${o.name} schema. Please check the path format or use freee_api_list_paths to see available endpoints.`}}for(let[o,a]of Object.entries(Pe)){let i=ot(n,e,o,a);if(i)return i}return{isValid:!1,message:`Path '${e}' not found in any freee API schema. Please check the path format or use freee_api_list_paths to see available endpoints.`}}function st(){let t=[];for(let[,e]of Object.entries(Pe)){let r=e.schema.paths,n=[];Object.entries(r).forEach(([o,a])=>{let i=Object.keys(a).filter(s=>["get","post","put","delete","patch"].includes(s)).map(s=>s.toUpperCase());i.length>0&&n.push(` ${i.join("|")} ${o}`)}),n.length>0&&t.push(`
56
+ `)}`)}var zt=Vt();function Gt(t){let e=V.join(zt,t),r=it.readFileSync(e,"utf-8"),n=JSON.parse(r),o=rt.safeParse(n);if(!o.success)throw new Error(`Invalid schema file ${t}: ${o.error.message}`);return o.data}var oe={accounting:{schemaFile:"accounting.json",baseUrl:"https://api.freee.co.jp",prefix:"accounting",name:"freee\u4F1A\u8A08 API"},hr:{schemaFile:"hr.json",baseUrl:"https://api.freee.co.jp/hr",prefix:"hr",name:"freee\u4EBA\u4E8B\u52B4\u52D9 API"},invoice:{schemaFile:"invoice.json",baseUrl:"https://api.freee.co.jp/iv",prefix:"invoice",name:"freee\u8ACB\u6C42\u66F8 API"},pm:{schemaFile:"pm.json",baseUrl:"https://api.freee.co.jp/pm",prefix:"pm",name:"freee\u5DE5\u6570\u7BA1\u7406 API"},sm:{schemaFile:"sm.json",baseUrl:"https://api.freee.co.jp/sm",prefix:"sm",name:"freee\u8CA9\u58F2 API"}},Se={};function nt(t){if(!Se[t]){let e=oe[t];Se[t]={schema:Gt(e.schemaFile),baseUrl:e.baseUrl,prefix:e.prefix,name:e.name}}return Se[t]}var Pe=new Proxy({},{get(t,e){if(e in oe)return nt(e)},ownKeys(){return Object.keys(oe)},getOwnPropertyDescriptor(t,e){if(e in oe)return{enumerable:!0,configurable:!0,value:nt(e)}}});function ot(t,e,r,n){let o=n.schema.paths;if(e in o){let a=o[e];if(t in a)return{isValid:!0,message:"Valid path and method",operation:a[t],actualPath:e,apiType:r,baseUrl:n.baseUrl}}for(let a of Object.keys(o)){let i=a.replace(/\{[^}]+\}/g,"[^/]+");if(new RegExp(`^${i}$`).test(e)){let p=o[a];if(t in p)return{isValid:!0,message:"Valid path and method",operation:p[t],actualPath:e,apiType:r,baseUrl:n.baseUrl}}}return null}function at(t,e,r){let n=t.toLowerCase();if(r!==void 0){let o=Pe[r],a=ot(n,e,r,o);return a||{isValid:!1,message:`Path '${e}' not found in ${o.name} schema. Please check the path format or use freee_api_list_paths to see available endpoints.`}}for(let[o,a]of Object.entries(Pe)){let i=ot(n,e,o,a);if(i)return i}return{isValid:!1,message:`Path '${e}' not found in any freee API schema. Please check the path format or use freee_api_list_paths to see available endpoints.`}}function st(){let t=[];for(let[,e]of Object.entries(Pe)){let r=e.schema.paths,n=[];Object.entries(r).forEach(([o,a])=>{let i=Object.keys(a).filter(s=>["get","post","put","delete","patch"].includes(s)).map(s=>s.toUpperCase());i.length>0&&n.push(` ${i.join("|")} ${o}`)}),n.length>0&&t.push(`
57
57
  ## ${e.name} (${e.baseUrl})
58
58
  ${n.sort().join(`
59
59
  `)}`)}return t.join(`
60
- `)}function Gt(t){let e=(t.size/1024).toFixed(2);return`\u30D5\u30A1\u30A4\u30EB\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3057\u307E\u3057\u305F
60
+ `)}function qt(t){let e=(t.size/1024).toFixed(2);return`\u30D5\u30A1\u30A4\u30EB\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3057\u307E\u3057\u305F
61
61
 
62
62
  \u4FDD\u5B58\u5834\u6240: ${t.filePath}
63
63
  MIME\u30BF\u30A4\u30D7: ${t.mimeType}
64
- \u30B5\u30A4\u30BA: ${e} KB`}var V="service: accounting/hr/invoice/pm/sm",z=c.enum(["accounting","hr","invoice","pm","sm"]).describe("\u5BFE\u8C61\u306Efreee\u30B5\u30FC\u30D3\u30B9");function q(t){return async e=>{try{let{service:r,path:n,query:o,body:a}=e,i=at(t,n,r);if(!i.isValid)return l(`\u30D1\u30B9\u691C\u8A3C\u30A8\u30E9\u30FC: ${i.message}
64
+ \u30B5\u30A4\u30BA: ${e} KB`}var z="service: accounting/hr/invoice/pm/sm",G=c.enum(["accounting","hr","invoice","pm","sm"]).describe("\u5BFE\u8C61\u306Efreee\u30B5\u30FC\u30D3\u30B9");function q(t){return async e=>{try{let{service:r,path:n,query:o,body:a}=e,i=at(t,n,r);if(!i.isValid)return l(`\u30D1\u30B9\u691C\u8A3C\u30A8\u30E9\u30FC: ${i.message}
65
65
 
66
- \u5229\u7528\u53EF\u80FD\u306A\u30D1\u30B9\u3092\u78BA\u8A8D\u3059\u308B\u306B\u306F freee_api_list_paths \u30C4\u30FC\u30EB\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002`);let s=await U(t,i.actualPath,o,a,i.baseUrl);return Ge(s)?l(Gt(s)):l(JSON.stringify(s,null,2))}catch(r){return l(`API\u30EA\u30AF\u30A8\u30B9\u30C8\u30A8\u30E9\u30FC: ${k(r)}`)}}}function ct(t){t.tool("freee_api_get",`freee API GET\u3002${V}`,{service:z,path:c.string().describe("API\u30D1\u30B9 (\u4F8B: /api/1/deals, /invoices)"),query:c.record(c.string(),c.unknown()).optional().describe("\u30AF\u30A8\u30EA\u30D1\u30E9\u30E1\u30FC\u30BF (\u30AA\u30D7\u30B7\u30E7\u30F3)")},q("GET")),t.tool("freee_api_post",`freee API POST\u3002${V}`,{service:z,path:c.string().describe("API\u30D1\u30B9 (\u4F8B: /api/1/deals, /invoices)"),body:c.record(c.string(),c.unknown()).describe("\u30EA\u30AF\u30A8\u30B9\u30C8\u30DC\u30C7\u30A3"),query:c.record(c.string(),c.unknown()).optional().describe("\u30AF\u30A8\u30EA\u30D1\u30E9\u30E1\u30FC\u30BF (\u30AA\u30D7\u30B7\u30E7\u30F3)")},q("POST")),t.tool("freee_api_put",`freee API PUT\u3002${V}`,{service:z,path:c.string().describe("API\u30D1\u30B9 (\u4F8B: /api/1/deals/123, /invoices/123)"),body:c.record(c.string(),c.unknown()).describe("\u30EA\u30AF\u30A8\u30B9\u30C8\u30DC\u30C7\u30A3"),query:c.record(c.string(),c.unknown()).optional().describe("\u30AF\u30A8\u30EA\u30D1\u30E9\u30E1\u30FC\u30BF (\u30AA\u30D7\u30B7\u30E7\u30F3)")},q("PUT")),t.tool("freee_api_delete",`freee API DELETE\u3002${V}`,{service:z,path:c.string().describe("API\u30D1\u30B9 (\u4F8B: /api/1/deals/123)"),query:c.record(c.string(),c.unknown()).optional().describe("\u30AF\u30A8\u30EA\u30D1\u30E9\u30E1\u30FC\u30BF (\u30AA\u30D7\u30B7\u30E7\u30F3)")},q("DELETE")),t.tool("freee_api_patch",`freee API PATCH\u3002${V}`,{service:z,path:c.string().describe("API\u30D1\u30B9 (\u4F8B: /api/1/deals/123)"),body:c.record(c.string(),c.unknown()).describe("\u30EA\u30AF\u30A8\u30B9\u30C8\u30DC\u30C7\u30A3"),query:c.record(c.string(),c.unknown()).optional().describe("\u30AF\u30A8\u30EA\u30D1\u30E9\u30E1\u30FC\u30BF (\u30AA\u30D7\u30B7\u30E7\u30F3)")},q("PATCH")),t.tool("freee_api_list_paths","freee API \u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u4E00\u89A7\u3002\u8A73\u7D30\u306A\u30AC\u30A4\u30C9\u306Ffreee-mcp skill\u3092\u53C2\u7167\u3002",{},async()=>{let e=st();return l(`# freee API \u5229\u7528\u53EF\u80FD\u306A\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u4E00\u89A7${e}
66
+ \u5229\u7528\u53EF\u80FD\u306A\u30D1\u30B9\u3092\u78BA\u8A8D\u3059\u308B\u306B\u306F freee_api_list_paths \u30C4\u30FC\u30EB\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002`);let s=await L(t,i.actualPath,o,a,i.baseUrl);return qe(s)?l(qt(s)):l(JSON.stringify(s,null,2))}catch(r){return l(`API\u30EA\u30AF\u30A8\u30B9\u30C8\u30A8\u30E9\u30FC: ${k(r)}`)}}}function ct(t){t.tool("freee_api_get",`freee API GET\u3002${z}`,{service:G,path:c.string().describe("API\u30D1\u30B9 (\u4F8B: /api/1/deals, /invoices)"),query:c.record(c.string(),c.unknown()).optional().describe("\u30AF\u30A8\u30EA\u30D1\u30E9\u30E1\u30FC\u30BF (\u30AA\u30D7\u30B7\u30E7\u30F3)")},q("GET")),t.tool("freee_api_post",`freee API POST\u3002${z}`,{service:G,path:c.string().describe("API\u30D1\u30B9 (\u4F8B: /api/1/deals, /invoices)"),body:c.record(c.string(),c.unknown()).describe("\u30EA\u30AF\u30A8\u30B9\u30C8\u30DC\u30C7\u30A3"),query:c.record(c.string(),c.unknown()).optional().describe("\u30AF\u30A8\u30EA\u30D1\u30E9\u30E1\u30FC\u30BF (\u30AA\u30D7\u30B7\u30E7\u30F3)")},q("POST")),t.tool("freee_api_put",`freee API PUT\u3002${z}`,{service:G,path:c.string().describe("API\u30D1\u30B9 (\u4F8B: /api/1/deals/123, /invoices/123)"),body:c.record(c.string(),c.unknown()).describe("\u30EA\u30AF\u30A8\u30B9\u30C8\u30DC\u30C7\u30A3"),query:c.record(c.string(),c.unknown()).optional().describe("\u30AF\u30A8\u30EA\u30D1\u30E9\u30E1\u30FC\u30BF (\u30AA\u30D7\u30B7\u30E7\u30F3)")},q("PUT")),t.tool("freee_api_delete",`freee API DELETE\u3002${z}`,{service:G,path:c.string().describe("API\u30D1\u30B9 (\u4F8B: /api/1/deals/123)"),query:c.record(c.string(),c.unknown()).optional().describe("\u30AF\u30A8\u30EA\u30D1\u30E9\u30E1\u30FC\u30BF (\u30AA\u30D7\u30B7\u30E7\u30F3)")},q("DELETE")),t.tool("freee_api_patch",`freee API PATCH\u3002${z}`,{service:G,path:c.string().describe("API\u30D1\u30B9 (\u4F8B: /api/1/deals/123)"),body:c.record(c.string(),c.unknown()).describe("\u30EA\u30AF\u30A8\u30B9\u30C8\u30DC\u30C7\u30A3"),query:c.record(c.string(),c.unknown()).optional().describe("\u30AF\u30A8\u30EA\u30D1\u30E9\u30E1\u30FC\u30BF (\u30AA\u30D7\u30B7\u30E7\u30F3)")},q("PATCH")),t.tool("freee_api_list_paths","freee API \u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u4E00\u89A7\u3002\u8A73\u7D30\u306A\u30AC\u30A4\u30C9\u306Ffreee-mcp skill\u3092\u53C2\u7167\u3002",{},async()=>{let e=st();return l(`# freee API \u5229\u7528\u53EF\u80FD\u306A\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u4E00\u89A7${e}
67
67
 
68
68
  \u4F7F\u7528\u4F8B:
69
69
  freee_api_get { "service": "accounting", "path": "/api/1/deals", "query": { "limit": 10 } }
70
70
  freee_api_get { "service": "invoice", "path": "/invoices" }
71
- freee_api_post { "service": "accounting", "path": "/api/1/deals", "body": { "issue_date": "2024-01-01", ... } }`)})}async function lt(){let t=await de(),e=new Kt({name:t.server.name,version:t.server.version});tt(e),ct(e);let r=new Wt;await e.connect(r),console.error("Freee MCP Server running on stdio")}import ae from"prompts";import oe from"node:fs/promises";import O from"node:path";import G from"node:os";var ie="freee-mcp",Xt={command:"npx",args:["@him0/freee-mcp"]};function Se(t){let e=G.platform();if(t==="claude-code")return O.join(G.homedir(),".claude.json");if(e==="darwin")return O.join(G.homedir(),"Library","Application Support","Claude","claude_desktop_config.json");if(e==="win32"){let r=process.env.APPDATA||O.join(G.homedir(),"AppData","Roaming");return O.join(r,"Claude","claude_desktop_config.json")}else return O.join(G.homedir(),".config","Claude","claude_desktop_config.json")}function pt(t){return t==="claude-code"?"Claude Code":"Claude Desktop"}async function ve(t){try{let e=await oe.readFile(t,"utf-8");return JSON.parse(e)}catch{return null}}async function ut(t,e){let r=O.dirname(t);await oe.mkdir(r,{recursive:!0}),await oe.writeFile(t,JSON.stringify(e,null,2)+`
72
- `,"utf-8")}async function ft(t){let e=Se(t);try{await oe.access(e);let r=await ve(e);return{path:e,exists:!0,hasFreeeConfig:r?.mcpServers?.[ie]!==void 0}}catch{return{path:e,exists:!1,hasFreeeConfig:!1}}}async function mt(t){let e=Se(t),r=await ve(e);r||(r={}),r.mcpServers||(r.mcpServers={}),r.mcpServers[ie]={...Xt},await ut(e,r)}async function dt(t){let e=Se(t),r=await ve(e);r?.mcpServers?.[ie]&&(delete r.mcpServers[ie],Object.keys(r.mcpServers).length===0&&delete r.mcpServers,await ut(e,r))}w();w();import{z as I}from"zod";var Qt=I.object({id:I.number(),name:I.string(),display_name:I.string(),role:I.string()}),gt=I.object({companies:I.array(Qt).optional()});async function ht(t){let e=await fetch(`${X}/api/1/companies`,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}});if(!e.ok){let o=await _(e),a=o.success?JSON.stringify(o.data):`(JSON parse failed: ${o.error})`;throw new Error(`\u4E8B\u696D\u6240\u4E00\u89A7\u306E\u53D6\u5F97\u306B\u5931\u6557\u3057\u307E\u3057\u305F: ${e.status} ${a}`)}let r=await e.json(),n=gt.safeParse(r);if(!n.success)throw new Error(`Invalid companies response format: ${n.error.message}`);return n.data.companies||[]}async function Ct(){let t=await Promise.resolve().then(()=>(M(),Ue)).then(i=>i.loadFullConfig()),e=!!(t.clientId&&t.clientSecret);e&&(console.log("\u65E2\u5B58\u306E\u8A2D\u5B9A\u304C\u898B\u3064\u304B\u308A\u307E\u3057\u305F\u3002"),console.log(` \u5909\u66F4\u3057\u306A\u3044\u9805\u76EE\u306F\u305D\u306E\u307E\u307E Enter \u3092\u62BC\u3057\u3066\u304F\u3060\u3055\u3044\u3002
71
+ freee_api_post { "service": "accounting", "path": "/api/1/deals", "body": { "issue_date": "2024-01-01", ... } }`)})}async function lt(){let t=await ge(),e=new Kt({name:t.server.name,version:t.server.version});tt(e),ct(e);let r=new Wt;await e.connect(r),console.error("Freee MCP Server running on stdio")}import se from"prompts";import ie from"node:fs/promises";import D from"node:path";import K from"node:os";var ae="freee-mcp",Xt={command:"npx",args:["@him0/freee-mcp"]};function ve(t){let e=K.platform();if(t==="claude-code")return D.join(K.homedir(),".claude.json");if(e==="darwin")return D.join(K.homedir(),"Library","Application Support","Claude","claude_desktop_config.json");if(e==="win32"){let r=process.env.APPDATA||D.join(K.homedir(),"AppData","Roaming");return D.join(r,"Claude","claude_desktop_config.json")}else return D.join(K.homedir(),".config","Claude","claude_desktop_config.json")}function pt(t){return t==="claude-code"?"Claude Code":"Claude Desktop"}async function be(t){try{let e=await ie.readFile(t,"utf-8");return JSON.parse(e)}catch{return null}}async function ut(t,e){let r=D.dirname(t);await ie.mkdir(r,{recursive:!0}),await ie.writeFile(t,JSON.stringify(e,null,2)+`
72
+ `,"utf-8")}async function ft(t){let e=ve(t);try{await ie.access(e);let r=await be(e);return{path:e,exists:!0,hasFreeeConfig:r?.mcpServers?.[ae]!==void 0}}catch{return{path:e,exists:!1,hasFreeeConfig:!1}}}async function mt(t){let e=ve(t),r=await be(e);r||(r={}),r.mcpServers||(r.mcpServers={}),r.mcpServers[ae]={...Xt},await ut(e,r)}async function dt(t){let e=ve(t),r=await be(e);r?.mcpServers?.[ae]&&(delete r.mcpServers[ae],Object.keys(r.mcpServers).length===0&&delete r.mcpServers,await ut(e,r))}w();w();import{z as I}from"zod";var Qt=I.object({id:I.number(),name:I.string(),display_name:I.string(),role:I.string()}),gt=I.object({companies:I.array(Qt).optional()});async function ht(t){let e=await fetch(`${Q}/api/1/companies`,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}});if(!e.ok){let o=await _(e),a=o.success?JSON.stringify(o.data):`(JSON parse failed: ${o.error})`;throw new Error(`\u4E8B\u696D\u6240\u4E00\u89A7\u306E\u53D6\u5F97\u306B\u5931\u6557\u3057\u307E\u3057\u305F: ${e.status} ${a}`)}let r=await e.json(),n=gt.safeParse(r);if(!n.success)throw new Error(`Invalid companies response format: ${n.error.message}`);return n.data.companies||[]}async function Ct(){let t=await Promise.resolve().then(()=>(F(),Ue)).then(i=>i.loadFullConfig()),e=!!(t.clientId&&t.clientSecret);e&&(console.log("\u65E2\u5B58\u306E\u8A2D\u5B9A\u304C\u898B\u3064\u304B\u308A\u307E\u3057\u305F\u3002"),console.log(` \u5909\u66F4\u3057\u306A\u3044\u9805\u76EE\u306F\u305D\u306E\u307E\u307E Enter \u3092\u62BC\u3057\u3066\u304F\u3060\u3055\u3044\u3002
73
73
  `)),console.log(`\u30B9\u30C6\u30C3\u30D7 1/3: OAuth\u8A8D\u8A3C\u60C5\u5831\u306E\u5165\u529B
74
- `);let r=await ae([{type:"text",name:"clientId",message:"FREEE_CLIENT_ID:",initial:t.clientId||void 0,validate:i=>i.trim()?!0:"CLIENT_ID \u306F\u5FC5\u9808\u3067\u3059"},{type:"password",name:"clientSecret",message:e?"FREEE_CLIENT_SECRET (\u5909\u66F4\u3057\u306A\u3044\u5834\u5408\u306F\u7A7A\u6B04):":"FREEE_CLIENT_SECRET:",validate:i=>e&&!i.trim()||i.trim()?!0:"CLIENT_SECRET \u306F\u5FC5\u9808\u3067\u3059"},{type:"text",name:"callbackPort",message:"FREEE_CALLBACK_PORT:",initial:String(t.callbackPort||j)}]);if(!r.clientId)throw new Error("\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u304C\u30AD\u30E3\u30F3\u30BB\u30EB\u3055\u308C\u307E\u3057\u305F\u3002");let n=r.clientId.trim(),o=r.clientSecret.trim()||t.clientSecret,a=parseInt(r.callbackPort.trim(),10);if(!o)throw new Error("CLIENT_SECRET \u306F\u5FC5\u9808\u3067\u3059\u3002");return process.env.FREEE_CLIENT_ID=n,process.env.FREEE_CLIENT_SECRET=o,process.env.FREEE_CALLBACK_PORT=String(a),console.log(`
74
+ `);let r=await se([{type:"text",name:"clientId",message:"FREEE_CLIENT_ID:",initial:t.clientId||void 0,validate:i=>i.trim()?!0:"CLIENT_ID \u306F\u5FC5\u9808\u3067\u3059"},{type:"password",name:"clientSecret",message:e?"FREEE_CLIENT_SECRET (\u5909\u66F4\u3057\u306A\u3044\u5834\u5408\u306F\u7A7A\u6B04):":"FREEE_CLIENT_SECRET:",validate:i=>e&&!i.trim()||i.trim()?!0:"CLIENT_SECRET \u306F\u5FC5\u9808\u3067\u3059"},{type:"text",name:"callbackPort",message:"FREEE_CALLBACK_PORT:",initial:String(t.callbackPort||N)}]);if(!r.clientId)throw new Error("\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u304C\u30AD\u30E3\u30F3\u30BB\u30EB\u3055\u308C\u307E\u3057\u305F\u3002");let n=r.clientId.trim(),o=r.clientSecret.trim()||t.clientSecret,a=parseInt(r.callbackPort.trim(),10);if(!o)throw new Error("CLIENT_SECRET \u306F\u5FC5\u9808\u3067\u3059\u3002");return process.env.FREEE_CLIENT_ID=n,process.env.FREEE_CLIENT_SECRET=o,process.env.FREEE_CALLBACK_PORT=String(a),console.log(`
75
75
  \u8A8D\u8A3C\u60C5\u5831\u3092\u53D7\u3051\u53D6\u308A\u307E\u3057\u305F\u3002
76
76
  `),{clientId:n,clientSecret:o,callbackPort:a}}async function wt(t){console.log(`\u30B9\u30C6\u30C3\u30D7 3/3: \u30C7\u30D5\u30A9\u30EB\u30C8\u4E8B\u696D\u6240\u306E\u9078\u629E
77
- `),console.log("\u4E8B\u696D\u6240\u4E00\u89A7\u3092\u53D6\u5F97\u4E2D...");let e=await ht(t);if(e.length===0)throw new Error("\u5229\u7528\u53EF\u80FD\u306A\u4E8B\u696D\u6240\u304C\u3042\u308A\u307E\u305B\u3093\u3002");let r=await ae({type:"select",name:"companyId",message:"\u30C7\u30D5\u30A9\u30EB\u30C8\u306E\u4E8B\u696D\u6240\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044:",choices:e.map(o=>({title:`${o.display_name||o.name} (ID: ${o.id}) - ${o.role}`,value:o.id}))});if(!r.companyId)throw new Error("\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u304C\u30AD\u30E3\u30F3\u30BB\u30EB\u3055\u308C\u307E\u3057\u305F\u3002");let n=e.find(o=>o.id===r.companyId);if(!n)throw new Error(`\u9078\u629E\u3057\u305F\u4E8B\u696D\u6240\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093: ID ${r.companyId}`);return console.log(`
77
+ `),console.log("\u4E8B\u696D\u6240\u4E00\u89A7\u3092\u53D6\u5F97\u4E2D...");let e=await ht(t);if(e.length===0)throw new Error("\u5229\u7528\u53EF\u80FD\u306A\u4E8B\u696D\u6240\u304C\u3042\u308A\u307E\u305B\u3093\u3002");let r=await se({type:"select",name:"companyId",message:"\u30C7\u30D5\u30A9\u30EB\u30C8\u306E\u4E8B\u696D\u6240\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044:",choices:e.map(o=>({title:`${o.display_name||o.name} (ID: ${o.id}) - ${o.role}`,value:o.id}))});if(!r.companyId)throw new Error("\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u304C\u30AD\u30E3\u30F3\u30BB\u30EB\u3055\u308C\u307E\u3057\u305F\u3002");let n=e.find(o=>o.id===r.companyId);if(!n)throw new Error(`\u9078\u629E\u3057\u305F\u4E8B\u696D\u6240\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093: ID ${r.companyId}`);return console.log(`
78
78
  ${n.display_name||n.name} \u3092\u9078\u629E\u3057\u307E\u3057\u305F\u3002
79
- `),{selected:{id:n.id,name:n.name,displayName:n.display_name||n.name,role:n.role},all:e}}async function yt(t){let e=pt(t),r=await ft(t);if(r.hasFreeeConfig){let{action:n}=await ae({type:"select",name:"action",message:`${e} \u306B freee-mcp \u304C\u8A2D\u5B9A\u6E08\u307F\u3067\u3059\u3002\u3069\u3046\u3057\u307E\u3059\u304B?`,choices:[{title:"\u305D\u306E\u307E\u307E (\u5909\u66F4\u306A\u3057)",value:"keep"},{title:"\u524A\u9664\u3059\u308B",value:"remove"}],initial:0});n==="remove"?(await dt(t),console.log(` \u2713 ${e} \u304B\u3089 freee-mcp \u3092\u524A\u9664\u3057\u307E\u3057\u305F\u3002`)):console.log(` - ${e} \u306E\u8A2D\u5B9A\u306F\u5909\u66F4\u3057\u307E\u305B\u3093\u3002`)}else{let{shouldAdd:n}=await ae({type:"confirm",name:"shouldAdd",message:`${e} \u306B freee-mcp \u3092\u8FFD\u52A0\u3057\u307E\u3059\u304B?`,initial:!0});n?(await mt(t),console.log(` \u2713 ${e} \u306B freee-mcp \u3092\u8FFD\u52A0\u3057\u307E\u3057\u305F\u3002`),console.log(` \u8A2D\u5B9A\u30D5\u30A1\u30A4\u30EB: ${r.path}`)):console.log(` - ${e} \u3078\u306E\u8FFD\u52A0\u3092\u30B9\u30AD\u30C3\u30D7\u3057\u307E\u3057\u305F\u3002`)}}async function _t(){console.log(`=== MCP\u8A2D\u5B9A ===
79
+ `),{selected:{id:n.id,name:n.name,displayName:n.display_name||n.name,role:n.role},all:e}}async function yt(t){let e=pt(t),r=await ft(t);if(r.hasFreeeConfig){let{action:n}=await se({type:"select",name:"action",message:`${e} \u306B freee-mcp \u304C\u8A2D\u5B9A\u6E08\u307F\u3067\u3059\u3002\u3069\u3046\u3057\u307E\u3059\u304B?`,choices:[{title:"\u305D\u306E\u307E\u307E (\u5909\u66F4\u306A\u3057)",value:"keep"},{title:"\u524A\u9664\u3059\u308B",value:"remove"}],initial:0});n==="remove"?(await dt(t),console.log(` \u2713 ${e} \u304B\u3089 freee-mcp \u3092\u524A\u9664\u3057\u307E\u3057\u305F\u3002`)):console.log(` - ${e} \u306E\u8A2D\u5B9A\u306F\u5909\u66F4\u3057\u307E\u305B\u3093\u3002`)}else{let{shouldAdd:n}=await se({type:"confirm",name:"shouldAdd",message:`${e} \u306B freee-mcp \u3092\u8FFD\u52A0\u3057\u307E\u3059\u304B?`,initial:!0});n?(await mt(t),console.log(` \u2713 ${e} \u306B freee-mcp \u3092\u8FFD\u52A0\u3057\u307E\u3057\u305F\u3002`),console.log(` \u8A2D\u5B9A\u30D5\u30A1\u30A4\u30EB: ${r.path}`)):console.log(` - ${e} \u3078\u306E\u8FFD\u52A0\u3092\u30B9\u30AD\u30C3\u30D7\u3057\u307E\u3057\u305F\u3002`)}}async function _t(){console.log(`=== MCP\u8A2D\u5B9A ===
80
80
  `),console.log(`Claude Code / Claude Desktop \u306B freee-mcp \u3092\u8A2D\u5B9A\u3067\u304D\u307E\u3059\u3002
81
81
  `),await yt("claude-code"),console.log(""),await yt("claude-desktop"),console.log(""),console.log("\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u5B8C\u4E86!"),console.log(`\u5909\u66F4\u3092\u53CD\u6620\u3059\u308B\u306B\u306F\u3001Claude Code / Claude Desktop \u3092\u518D\u8D77\u52D5\u3057\u3066\u304F\u3060\u3055\u3044\u3002
82
- `)}import be from"node:crypto";import Yt from"open";w();async function kt(){console.log(`\u30B9\u30C6\u30C3\u30D7 2/3: OAuth\u8A8D\u8A3C
83
- `),console.log("\u30D6\u30E9\u30A6\u30B6\u3067\u8A8D\u8A3C\u30DA\u30FC\u30B8\u3092\u958B\u304D\u307E\u3059..."),await Promise.resolve().then(()=>(T(),Le)).then(i=>i.loadConfig()),await Xe();let t=be.randomBytes(32).toString("base64url"),e=be.createHash("sha256").update(t).digest("base64url"),r=be.randomBytes(16).toString("base64url"),n=te(e,r,J());console.log(`
82
+ `)}import Ie from"node:crypto";import Yt from"open";w();async function kt(){console.log(`\u30B9\u30C6\u30C3\u30D7 2/3: OAuth\u8A8D\u8A3C
83
+ `),console.log("\u30D6\u30E9\u30A6\u30B6\u3067\u8A8D\u8A3C\u30DA\u30FC\u30B8\u3092\u958B\u304D\u307E\u3059..."),await Promise.resolve().then(()=>(T(),Le)).then(i=>i.loadConfig()),await Xe();let t=Ie.randomBytes(32).toString("base64url"),e=Ie.createHash("sha256").update(t).digest("base64url"),r=Ie.randomBytes(16).toString("base64url"),n=re(e,r,B());console.log(`
84
84
  \u8A8D\u8A3CURL: ${n}
85
85
  `),await Yt(n),console.log("\u30D6\u30E9\u30A6\u30B6\u3067\u8A8D\u8A3C\u3092\u5B8C\u4E86\u3057\u3066\u304F\u3060\u3055\u3044..."),console.log(`\u8A8D\u8A3C\u304C\u5B8C\u4E86\u3059\u308B\u3068\u81EA\u52D5\u7684\u306B\u6B21\u306E\u30B9\u30C6\u30C3\u30D7\u306B\u9032\u307F\u307E\u3059\u3002
86
- `);let o=et(),a=new Promise((i,s)=>{let p=setTimeout(()=>{s(new Error("\u8A8D\u8A3C\u304C\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\u3057\u307E\u3057\u305F\uFF085\u5206\uFF09"))},R);o.registerCliAuthHandler(r,{resolve:u=>{clearTimeout(p),i(u)},reject:u=>{clearTimeout(p),s(u)},codeVerifier:t})});try{let i=await a;console.log("\u8A8D\u8A3C\u30B3\u30FC\u30C9\u3092\u53D7\u3051\u53D6\u308A\u307E\u3057\u305F\u3002"),console.log("\u30C8\u30FC\u30AF\u30F3\u3092\u53D6\u5F97\u4E2D...");let s=await re(i,t,J());return console.log(`\u30C8\u30FC\u30AF\u30F3\u3092\u53D6\u5F97\u3057\u307E\u3057\u305F\u3002
87
- `),{accessToken:s.access_token,refreshToken:s.refresh_token}}finally{o.removeCliAuthHandler(r)}}M();async function Et(t,e,r){let n={clientId:t.clientId,clientSecret:t.clientSecret,callbackPort:t.callbackPort,defaultCompanyId:String(e.id),currentCompanyId:String(e.id),companies:{}};r.forEach(o=>{n.companies[String(o.id)]={id:String(o.id),name:o.display_name||o.name,description:`Role: ${o.role}`,addedAt:Date.now(),lastUsed:o.id===e.id?Date.now():void 0}}),await $(n),console.log(`\u8A2D\u5B9A\u60C5\u5831\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002
86
+ `);let o=et(),a=new Promise((i,s)=>{let p=setTimeout(()=>{s(new Error("\u8A8D\u8A3C\u304C\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\u3057\u307E\u3057\u305F\uFF085\u5206\uFF09"))},R);o.registerCliAuthHandler(r,{resolve:u=>{clearTimeout(p),i(u)},reject:u=>{clearTimeout(p),s(u)},codeVerifier:t})});try{let i=await a;console.log("\u8A8D\u8A3C\u30B3\u30FC\u30C9\u3092\u53D7\u3051\u53D6\u308A\u307E\u3057\u305F\u3002"),console.log("\u30C8\u30FC\u30AF\u30F3\u3092\u53D6\u5F97\u4E2D...");let s=await ne(i,t,B());return console.log(`\u30C8\u30FC\u30AF\u30F3\u3092\u53D6\u5F97\u3057\u307E\u3057\u305F\u3002
87
+ `),{accessToken:s.access_token,refreshToken:s.refresh_token}}finally{o.removeCliAuthHandler(r)}}F();async function Et(t,e,r){let n={clientId:t.clientId,clientSecret:t.clientSecret,callbackPort:t.callbackPort,defaultCompanyId:String(e.id),currentCompanyId:String(e.id),companies:{}};r.forEach(o=>{n.companies[String(o.id)]={id:String(o.id),name:o.display_name||o.name,description:`Role: ${o.role}`,addedAt:Date.now(),lastUsed:o.id===e.id?Date.now():void 0}}),await M(n),console.log(`\u8A2D\u5B9A\u60C5\u5831\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002
88
88
  `),console.log("\u8A8D\u8A3C\u60C5\u5831\u306F ~/.config/freee-mcp/config.json \u306B\u4FDD\u5B58\u3055\u308C\u307E\u3057\u305F\u3002"),console.log(`\u30C8\u30FC\u30AF\u30F3\u306F ~/.config/freee-mcp/tokens.json \u306B\u4FDD\u5B58\u3055\u308C\u307E\u3057\u305F\u3002
89
- `)}async function Ie(){console.log(`
89
+ `)}async function xe(){console.log(`
90
90
  === freee-mcp Configuration Setup ===
91
91
  `),console.log("\u3053\u306E\u30A6\u30A3\u30B6\u30FC\u30C9\u3067\u306F\u3001freee-mcp\u306E\u8A2D\u5B9A\u3068\u8A8D\u8A3C\u3092\u5BFE\u8A71\u5F0F\u3067\u884C\u3044\u307E\u3059\u3002"),console.log(`freee OAuth\u8A8D\u8A3C\u60C5\u5831\u304C\u5FC5\u8981\u3067\u3059\u3002
92
92
  `);try{let t=await Ct(),e=await kt(),{selected:r,all:n}=await wt(e.accessToken);await Et(t,r,n),await _t()}catch(t){t instanceof Error?console.error(`
93
93
  Error: ${t.message}`):console.error(`
94
- \u8A2D\u5B9A\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F:`,t),process.exit(1)}finally{Ze()}}var Zt=async()=>{let e=process.argv.slice(2)[0];if(e==="configure"){await Ie();return}e&&e!=="client"&&(console.error(`Unknown subcommand: ${e}`),console.error("Usage: freee-mcp [configure]"),console.error(" configure - Interactive configuration setup"),process.exit(1)),console.error("Starting freee MCP server"),await lt()};Zt().catch(t=>{console.error("Fatal error:",t),process.exit(1)});
94
+ \u8A2D\u5B9A\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F:`,t),process.exit(1)}finally{Ze()}}var Zt=async()=>{let e=process.argv.slice(2)[0];if(e==="configure"){await xe();return}e&&e!=="client"&&(console.error(`Unknown subcommand: ${e}`),console.error("Usage: freee-mcp [configure]"),console.error(" configure - Interactive configuration setup"),process.exit(1)),console.error("Starting freee MCP server"),await lt()};Zt().catch(t=>{console.error("Fatal error:",t),process.exit(1)});
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@him0/freee-mcp",
4
- "version": "0.6.4",
4
+ "version": "0.6.5",
5
5
  "bin": {
6
6
  "freee-mcp": "./bin/cli.js"
7
7
  },