@him0/freee-mcp 0.6.7 → 0.7.0

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 +44 -37
  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 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 T(){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.7",$=`freee-mcp/${St} (MCP Server; +https://github.com/him0/freee-mcp)`});var Ue={};Me(Ue,{CompanyConfigSchema:()=>je,FullConfigSchema:()=>Ne,getCompanyInfo:()=>U,getCurrentCompanyId:()=>x,getDownloadDir:()=>de,loadFullConfig:()=>I,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(T(),"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 I(){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 x(){return(await I()).currentCompanyId}async function me(t,e,r){let n=await I();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 I()).companies[t]||null}async function de(){return(await I()).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 I(),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,S=pe(()=>{"use strict";F();w();O=null});S();import{McpServer as Kt}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as Wt}from"@modelcontextprotocol/sdk/server/stdio.js";S();import Lt from"crypto";import{z as P}from"zod";S();S();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=T();try{return(await Z.readdir(t)).filter(r=>r.startsWith("tokens-")&&r.endsWith(".json"))}catch{return[]}}async function He(t){let e=T();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 Be(){let t=T();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(T(),"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 He(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 Be()}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 x(),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
3
+ var At=Object.defineProperty;var pe=(t,e)=>()=>(t&&(e=t(t=0)),e);var Me=(t,e)=>{for(var n in e)At(t,n,{get:e[n],enumerable:!0})};import Fe from"path";import St from"os";function S(){return process.env.XDG_CONFIG_HOME?Fe.join(process.env.XDG_CONFIG_HOME,Oe):Fe.join(St.homedir(),".config",Oe)}var Oe,U,R,X,Q,Tt,$,w=pe(()=>{"use strict";Oe="freee-mcp";U=54321,R=300*1e3,X=384,Q="https://api.freee.co.jp",Tt="0.7.0",$=`freee-mcp/${Tt} (MCP Server; +https://github.com/him0/freee-mcp)`});var Ne={};Me(Ne,{CompanyConfigSchema:()=>je,FullConfigSchema:()=>Ue,getCompanyInfo:()=>N,getCurrentCompanyId:()=>x,getDownloadDir:()=>de,loadFullConfig:()=>I,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(S(),"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 I(){let t=fe();try{let e=await ue.readFile(t,"utf8"),n=JSON.parse(e);if(bt(n)){let o=It(n);return await M(o),o}let r=Ue.safeParse(n);if(!r.success)throw new Error(`Invalid config file: ${r.error.message}`);return r.data}catch(e){if(e.code==="ENOENT"){let n={clientId:void 0,clientSecret:void 0,callbackPort:void 0,defaultCompanyId:"0",currentCompanyId:"0",companies:{}};return await M(n),n}throw e}}async function M(t){await vt();let e=fe();await ue.writeFile(e,JSON.stringify(t,null,2),{mode:X})}async function x(){return(await I()).currentCompanyId}async function me(t,e,n){let r=await I();r.companies[t]?(e||n)&&(e&&(r.companies[t].name=e),n&&(r.companies[t].description=n)):r.companies[t]={id:t,name:e||`Company ${t}`,description:n||void 0,addedAt:Date.now()},r.companies[t].lastUsed=Date.now(),r.currentCompanyId=t,await M(r)}async function N(t){return(await I()).companies[t]||null}async function de(){return(await I()).downloadDir||Pt.tmpdir()}var je,Ue,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()}),Ue=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 I(),e,n,r;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||"",n=process.env.FREEE_CLIENT_SECRET||"",r=process.env.FREEE_CALLBACK_PORT?parseInt(process.env.FREEE_CALLBACK_PORT,10):U;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,n=t.clientSecret,r=t.callbackPort||U}return O={freee:{clientId:e,clientSecret:n,companyId:"0",apiUrl:Q},oauth:{callbackPort:r,redirectUri:`http://127.0.0.1:${r}/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 P}from"zod";T();T();w();import ee from"fs/promises";import Ve from"path";import{z as C}from"zod";async function k(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 _(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=S();try{return(await Z.readdir(t)).filter(n=>n.startsWith("tokens-")&&n.endsWith(".json"))}catch{return[]}}async function He(t){let e=S();try{let n=await Je();if(n.length>0){let r=he.join(e,n[0]),o=await Z.readFile(r,"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(n.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(n){console.error("[warn] Error during legacy token migration attempt:",n)}return null}async function Be(){let t=S();try{let e=await Je();await Promise.all(e.map(n=>Z.unlink(he.join(t,n)).catch(r=>{console.error(`[warn] Failed to clear legacy token file ${n}:`,r)}))),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(S(),"tokens.json")}async function te(t){let e=we(),n=Ve.dirname(e);try{console.error(`[info] Creating directory: ${n}`),await ee.mkdir(n,{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(r){throw console.error("[error] Failed to save tokens:",r),r}}async function ke(){let t=we();try{let e=await ee.readFile(t,"utf8"),n=JSON.parse(e),r=ye.safeParse(n);return r.success?r.data:(console.error("[error] Invalid token file:",r.error.message),null)}catch(e){if(e.code==="ENOENT"){let n=await He(te);return n||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(),n=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(!n.ok){let i=await k(n),s=i.success?JSON.stringify(i.data):`(JSON parse failed: ${i.error})`;throw new Error(`Token refresh failed: ${n.status} ${s}`)}let r=await n.json(),o=Ce.safeParse(r);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 Be()}async function Ge(){let t=await ke();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(n=>t.includes(n))}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[n,r]of Object.entries(e))if(t.includes(n))return r;return t.includes("image/"),".bin"}async function L(t,e,n,r,o){let a=o||h().freee.apiUrl,i=await x(),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,E=new URL(u,p);r&&Object.entries(r).forEach(([m,f])=>{f!==void 0&&E.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(E.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
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,E=new URL(u,p);n&&Object.entries(n).forEach(([m,f])=>{f!==void 0&&E.searchParams.append(m,String(f))});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\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=r?.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(E.toString(),{method:t,headers:{Authorization:`Bearer ${s}`,"Content-Type":"application/json","User-Agent":$},body:r?JSON.stringify(typeof r=="string"?JSON.parse(r):r):void 0});if(y.status===401){let m=await k(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
 
@@ -13,11 +13,11 @@ freee_set_current_company \u3067\u4E8B\u696D\u6240\u3092\u5207\u308A\u66FF\u3048
13
13
  1. FREEE_CLIENT_ID\u74B0\u5883\u5909\u6570\u304C\u6B63\u3057\u304F\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u308B\u304B
14
14
  2. freee\u5074\u3067\u30A2\u30D7\u30EA\u30B1\u30FC\u30B7\u30E7\u30F3\u8A2D\u5B9A\u304C\u6B63\u3057\u3044\u304B\uFF08\u30EA\u30C0\u30A4\u30EC\u30AF\u30C8URI\u7B49\uFF09
15
15
  3. \u30C8\u30FC\u30AF\u30F3\u306E\u6709\u52B9\u671F\u9650\u304C\u5207\u308C\u3066\u3044\u306A\u3044\u304B
16
- 4. \u4E8B\u696D\u6240ID\u304C\u6B63\u3057\u3044\u304B\uFF08freee_get_current_company \u3067\u78BA\u8A8D\uFF09`)}if(y.status===403){let m=await _(y),f=m.success?JSON.stringify(m.data):`(JSON parse failed: ${m.error})`;throw new Error(`\u30A2\u30AF\u30BB\u30B9\u62D2\u5426 (403): ${f}
16
+ 4. \u4E8B\u696D\u6240ID\u304C\u6B63\u3057\u3044\u304B\uFF08freee_get_current_company \u3067\u78BA\u8A8D\uFF09`)}if(y.status===403){let m=await k(y),f=m.success?JSON.stringify(m.data):`(JSON parse failed: ${m.error})`;throw new Error(`\u30A2\u30AF\u30BB\u30B9\u62D2\u5426 (403): ${f}
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 b=m.data;if(b&&b.errors&&Array.isArray(b.errors)){let j=[];for(let A of b.errors)A&&typeof A=="object"&&"messages"in A&&Array.isArray(A.messages)&&j.push(...A.messages);j.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 k(y),f=`API request failed: ${y.status}`;if(m.success){let b=m.data;if(b&&b.errors&&Array.isArray(b.errors)){let j=[];for(let A of b.errors)A&&typeof A=="object"&&"messages"in A&&Array.isArray(A.messages)&&j.push(...A.messages);j.length>0&&(f+=`
21
21
 
22
22
  \u30A8\u30E9\u30FC\u8A73\u7D30:
23
23
  ${j.join(`
@@ -29,66 +29,73 @@ ${j.join(`
29
29
 
30
30
  \u8A73\u7D30: ${JSON.stringify(b)}`)}else f+=`
31
31
 
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}`,A=Ft.join(m,j),$e=await y.arrayBuffer();return await Mt.writeFile(A,Buffer.from($e)),{type:"binary",filePath:A,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)}`)}}S();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}S();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
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}`,A=Ft.join(m,j),$e=await y.arrayBuffer();return await Mt.writeFile(A,Buffer.from($e)),{type:"binary",filePath:A,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 ne(t,e,n){let r=h(),o=new URLSearchParams({response_type:"code",client_id:r.freee.clientId,redirect_uri:n,scope:r.oauth.scope,state:e,code_challenge:t,code_challenge_method:"S256"});return`${r.oauth.authorizationEndpoint}?${o.toString()}`}async function re(t,e,n){let r=h(),o=await fetch(r.oauth.tokenEndpoint,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded","User-Agent":$},body:new URLSearchParams({grant_type:"authorization_code",client_id:r.freee.clientId,client_secret:r.freee.clientSecret,code:t,redirect_uri:n,code_verifier:e})});if(!o.ok){let p=await k(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:r.oauth.scope});return await te(s),s}T();import jt from"http";import{URL as Ut}from"url";import Nt from"net";var _e=class{pendingAuthentications=new Map;cliAuthHandlers=new Map;registerAuthentication(e,n){console.error(`Registering authentication request with state: ${e.substring(0,10)}...`),console.error(`Code verifier: ${n.substring(0,10)}...`);let r=setTimeout(()=>{this.pendingAuthentications.delete(e),console.error(`Authentication timeout for state: ${e.substring(0,10)}...`)},h().auth.timeoutMs);this.pendingAuthentications.set(e,{codeVerifier:n,resolve:o=>{console.error("Authentication completed successfully!")},reject:o=>{console.error("Authentication failed:",o)},timeout:r}),console.error(`Registration complete. Total pending: ${this.pendingAuthentications.size}`)}getPendingAuthentication(e){return this.pendingAuthentications.get(e)}removePendingAuthentication(e){let n=this.pendingAuthentications.get(e);n&&(clearTimeout(n.timeout),this.pendingAuthentications.delete(e))}clearAllPending(){for(let[e,n]of this.pendingAuthentications)clearTimeout(n.timeout),n.reject(new Error("Server shutdown"));this.pendingAuthentications.clear()}get pendingCount(){return this.pendingAuthentications.size}registerCliAuthHandler(e,n){this.cliAuthHandlers.set(e,n)}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 r=`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
- 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
34
+ freee \u30A2\u30D7\u30EA\u306B\u30B3\u30FC\u30EB\u30D0\u30C3\u30AFURL (${r}) \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
 
36
36
  \u89E3\u6C7A\u65B9\u6CD5:
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)})})}async 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 E=this.authManager.getPendingAuthentication(o);E&&(clearTimeout(E.timeout),E.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...");try{let u=await ne(n,p.codeVerifier,this.getRedirectUri());console.error("Token exchange successful!"),p.resolve(u),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>")}catch(u){console.error("Token exchange failed:",u),p.reject(u);let E=u instanceof Error?u.message:String(u);r.writeHead(500,{"Content-Type":"text/html; charset=utf-8"}),r.end(`<h1>\u8A8D\u8A3C\u30A8\u30E9\u30FC</h1><p>\u30C8\u30FC\u30AF\u30F3\u4EA4\u63DB\u306B\u5931\u6557\u3057\u307E\u3057\u305F: ${E}</p>`)}finally{this.authManager.removePendingAuthentication(o)}}},Ae=new ke,J=new Ee(Ae);function H(){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 x(),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:
40
+ (freee-mcp configure \u3092\u5B9F\u884C\u3057\u3066\u518D\u8A2D\u5B9A)`)}return this.port=e,new Promise((r,o)=>{this.server=jt.createServer((a,i)=>{console.error(`Callback request: ${a.method} ${a.url}`);let s=new Ut(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} (callback URL: http://127.0.0.1:${e}/callback)`),r()})})}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(n=>{let r=Nt.createServer();r.listen(e,"127.0.0.1",()=>{r.close(()=>{n(!0)})}),r.on("error",()=>{n(!1)})})}async handleCallback(e,n){let r=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:r?`${r.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}`),n.writeHead(400,{"Content-Type":"text/html; charset=utf-8"}),n.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 E=this.authManager.getPendingAuthentication(o);E&&(clearTimeout(E.timeout),E.reject(new Error(`OAuth error: ${a} - ${i}`)),this.authManager.removePendingAuthentication(o))}return}if(!r||!o){console.error("Missing code or state"),n.writeHead(400,{"Content-Type":"text/html; charset=utf-8"}),n.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"),n.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),n.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(r);return}let p=this.authManager.getPendingAuthentication(o);if(!p){console.error(`Unknown state: ${o}`),n.writeHead(400,{"Content-Type":"text/html; charset=utf-8"}),n.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...");try{let u=await re(r,p.codeVerifier,this.getRedirectUri());console.error("Token exchange successful!"),p.resolve(u),n.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),n.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>")}catch(u){console.error("Token exchange failed:",u),p.reject(u);let E=u instanceof Error?u.message:String(u);n.writeHead(500,{"Content-Type":"text/html; charset=utf-8"}),n.end(`<h1>\u8A8D\u8A3C\u30A8\u30E9\u30FC</h1><p>\u30C8\u30FC\u30AF\u30F3\u4EA4\u63DB\u306B\u5931\u6557\u3057\u307E\u3057\u305F: ${E}</p>`)}finally{this.authManager.removePendingAuthentication(o)}}},Ae=new _e,J=new Ee(Ae);function H(){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 x(),n=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 r=await L("GET","/api/1/users/me");return l(`\u73FE\u5728\u306E\u30E6\u30FC\u30B6\u30FC\u60C5\u5831:
41
41
  \u4F1A\u793EID: ${e}
42
- \u4F1A\u793E\u540D: ${r?.name||"Unknown"}
42
+ \u4F1A\u793E\u540D: ${n?.name||"Unknown"}
43
43
  \u30E6\u30FC\u30B6\u30FC\u8A73\u7D30:
44
- ${JSON.stringify(n,null,2)}`)}catch(e){return l(`\u30E6\u30FC\u30B6\u30FC\u60C5\u5831\u306E\u53D6\u5F97\u306B\u5931\u6557: ${k(e)}`)}}),t.tool("freee_authenticate","OAuth\u8A8D\u8A3C\u3092\u958B\u59CB\u3002\u521D\u56DE\u306E\u307F\u5FC5\u8981\u3002",{},async()=>{try{if(!h().freee.clientId)return l(`FREEE_CLIENT_ID\u74B0\u5883\u5909\u6570\u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002
44
+ ${JSON.stringify(r,null,2)}`)}catch(e){return l(`\u30E6\u30FC\u30B6\u30FC\u60C5\u5831\u306E\u53D6\u5F97\u306B\u5931\u6557: ${_(e)}`)}}),t.tool("freee_authenticate","OAuth\u8A8D\u8A3C\u3092\u958B\u59CB\u3002\u521D\u56DE\u306E\u307F\u5FC5\u8981\u3002",{},async()=>{try{if(!h().freee.clientId)return l(`FREEE_CLIENT_ID\u74B0\u5883\u5909\u6570\u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002
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=re(r,n,H());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:n}=We(),r=Lt.randomBytes(16).toString("hex"),o=ne(n,r,H());return Ye(r,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 _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
- \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 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 x(),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=P.object({companies:P.array(P.object({id:P.number(),name:P.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 x();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(`
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: ${_(e)}`)}}),t.tool("freee_auth_status","\u8A8D\u8A3C\u72B6\u614B\u3092\u78BA\u8A8D\u3002",{},async()=>{try{let e=await ke();if(!e)return l("\u672A\u8A8D\u8A3C\u3002freee_authenticate \u3067\u8A8D\u8A3C\u3057\u3066\u304F\u3060\u3055\u3044\u3002");let n=Date.now()<e.expires_at,r=new Date(e.expires_at).toLocaleString();return l(`\u8A8D\u8A3C\u72B6\u614B: ${n?"\u6709\u52B9":"\u671F\u9650\u5207\u308C"}
51
+ \u6709\u52B9\u671F\u9650: ${r}`+(n?"":`
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: ${_(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: ${_(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:n,name:r,description:o}=e;await me(n,r,o);let a=await N(n);return l(`\u4E8B\u696D\u6240\u3092\u8A2D\u5B9A: ${a?.name||n}`)}catch(n){return l(`\u4E8B\u696D\u6240\u306E\u8A2D\u5B9A\u306B\u5931\u6557: ${_(n)}`)}}),t.tool("freee_get_current_company","\u73FE\u5728\u306E\u4E8B\u696D\u6240\u60C5\u5831\u3092\u8868\u793A\u3002",{},async()=>{try{let e=await x(),n=await N(e);return n?l(`\u4E8B\u696D\u6240: ${n.name} (ID: ${n.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: ${_(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()}),n=await L("GET","/api/1/companies"),r=e.safeParse(n);if(!r.success)return{content:[{type:"text",text:`API\u30EC\u30B9\u30DD\u30F3\u30B9\u306E\u5F62\u5F0F\u304C\u4E0D\u6B63\u3067\u3059: ${r.error.message}`}]};let o=r.data,a=await x();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 V from"node:path";import{fileURLToPath as Bt}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()}),Ht=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(),Ht)});var Te=V.dirname(Bt(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:
54
+ ${i}`)}catch(e){return l(`\u4E8B\u696D\u6240\u4E00\u89A7\u306E\u53D6\u5F97\u306B\u5931\u6557: ${_(e)}`)}})}import{z as c}from"zod";import it from"node:fs";import V from"node:path";import{fileURLToPath as Bt}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()}),Ht=g.object({get:B.optional(),post:B.optional(),put:B.optional(),delete:B.optional(),patch:B.optional()}),nt=g.object({paths:g.record(g.string(),Ht)});var Se=V.dirname(Bt(import.meta.url));function Vt(){let t=[V.resolve(Se,"./openapi/minimal"),V.resolve(Se,"../dist/openapi/minimal"),V.resolve(Se,"../../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 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(`
56
+ `)}`)}var zt=Vt();function Gt(t){let e=V.join(zt,t),n=it.readFileSync(e,"utf-8"),r=JSON.parse(n),o=nt.safeParse(r);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"}},Te={};function rt(t){if(!Te[t]){let e=oe[t];Te[t]={schema:Gt(e.schemaFile),baseUrl:e.baseUrl,prefix:e.prefix,name:e.name}}return Te[t]}var Pe=new Proxy({},{get(t,e){if(e in oe)return rt(e)},ownKeys(){return Object.keys(oe)},getOwnPropertyDescriptor(t,e){if(e in oe)return{enumerable:!0,configurable:!0,value:rt(e)}}});function ot(t,e,n,r){let o=r.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:n,baseUrl:r.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:n,baseUrl:r.baseUrl}}}return null}function at(t,e,n){let r=t.toLowerCase();if(n!==void 0){let o=Pe[n],a=ot(r,e,n,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(r,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 n=e.schema.paths,r=[];Object.entries(n).forEach(([o,a])=>{let i=Object.keys(a).filter(s=>["get","post","put","delete","patch"].includes(s)).map(s=>s.toUpperCase());i.length>0&&r.push(` ${i.join("|")} ${o}`)}),r.length>0&&t.push(`
57
57
  ## ${e.name} (${e.baseUrl})
58
- ${n.sort().join(`
58
+ ${r.sort().join(`
59
59
  `)}`)}return t.join(`
60
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 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}
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:n,path:r,query:o,body:a}=e,i=at(t,r,n);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 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}
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(n){return l(`API\u30EA\u30AF\u30A8\u30B9\u30C8\u30A8\u30E9\u30FC: ${_(n)}`)}}}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 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 v}from"zod";var Qt=v.object({id:v.number(),name:v.string().nullable(),name_kana:v.string().nullable().optional(),display_name:v.string(),role:v.string()}),gt=v.object({companies:v.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
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 n=new Wt;await e.connect(n),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 n=process.env.APPDATA||D.join(K.homedir(),"AppData","Roaming");return D.join(n,"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 n=D.dirname(t);await ie.mkdir(n,{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 n=await be(e);return{path:e,exists:!0,hasFreeeConfig:n?.mcpServers?.[ae]!==void 0}}catch{return{path:e,exists:!1,hasFreeeConfig:!1}}}async function mt(t){let e=ve(t),n=await be(e);n||(n={}),n.mcpServers||(n.mcpServers={}),n.mcpServers[ae]={...Xt},await ut(e,n)}async function dt(t){let e=ve(t),n=await be(e);n?.mcpServers?.[ae]&&(delete n.mcpServers[ae],Object.keys(n.mcpServers).length===0&&delete n.mcpServers,await ut(e,n))}w();w();import{z as v}from"zod";var Qt=v.object({id:v.number(),name:v.string().nullable(),name_kana:v.string().nullable().optional(),display_name:v.string(),role:v.string()}),gt=v.object({companies:v.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 k(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 n=await e.json(),r=gt.safeParse(n);if(!r.success)throw new Error(`Invalid companies response format: ${r.error.message}`);return r.data.companies||[]}async function Ct(){let t=await Promise.resolve().then(()=>(F(),Ne)).then(s=>s.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 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(`
74
+ `);let n=t.callbackPort||U;console.log(`freee \u30A2\u30D7\u30EA\u306E\u30B3\u30FC\u30EB\u30D0\u30C3\u30AFURL\u306B\u306F http://127.0.0.1:${n}/callback \u3092\u8A2D\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002
75
+ `);let r=await se([{type:"text",name:"clientId",message:"FREEE_CLIENT_ID:",initial:t.clientId||void 0,validate:s=>s.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:s=>e&&!s.trim()||s.trim()?!0:"CLIENT_SECRET \u306F\u5FC5\u9808\u3067\u3059"},{type:"text",name:"callbackPort",message:"\u30B3\u30FC\u30EB\u30D0\u30C3\u30AF\u30DD\u30FC\u30C8 (\u30B3\u30FC\u30EB\u30D0\u30C3\u30AFURL: http://127.0.0.1:<port>/callback):",initial:String(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 o=r.clientId.trim(),a=r.clientSecret.trim()||t.clientSecret,i=parseInt(r.callbackPort.trim(),10);if(!a)throw new Error("CLIENT_SECRET \u306F\u5FC5\u9808\u3067\u3059\u3002");return process.env.FREEE_CLIENT_ID=o,process.env.FREEE_CLIENT_SECRET=a,process.env.FREEE_CALLBACK_PORT=String(i),console.log(`
75
76
  \u8A8D\u8A3C\u60C5\u5831\u3092\u53D7\u3051\u53D6\u308A\u307E\u3057\u305F\u3002
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 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
- ${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 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 ===
77
+ `),{clientId:o,clientSecret:a,callbackPort:i}}async function wt(t){console.log(`\u30B9\u30C6\u30C3\u30D7 3/3: \u30C7\u30D5\u30A9\u30EB\u30C8\u4E8B\u696D\u6240\u306E\u9078\u629E
78
+ `),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 n=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(!n.companyId)throw new Error("\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u304C\u30AD\u30E3\u30F3\u30BB\u30EB\u3055\u308C\u307E\u3057\u305F\u3002");let r=e.find(o=>o.id===n.companyId);if(!r)throw new Error(`\u9078\u629E\u3057\u305F\u4E8B\u696D\u6240\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093: ID ${n.companyId}`);return console.log(`
79
+ ${r.display_name||r.name} \u3092\u9078\u629E\u3057\u307E\u3057\u305F\u3002
80
+ `),{selected:{id:r.id,name:r.name,displayName:r.display_name||r.name||"",role:r.role},all:e}}async function yt(t){let e=pt(t),n=await ft(t);if(n.hasFreeeConfig){let{action:r}=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});return r==="remove"?(await dt(t),console.log(` \u2713 ${e} \u304B\u3089 freee-mcp \u3092\u524A\u9664\u3057\u307E\u3057\u305F\u3002`),!1):(console.log(` - ${e} \u306E\u8A2D\u5B9A\u306F\u5909\u66F4\u3057\u307E\u305B\u3093\u3002`),!0)}else{let{shouldAdd:r}=await se({type:"confirm",name:"shouldAdd",message:`${e} \u306B freee-mcp \u3092\u8FFD\u52A0\u3057\u307E\u3059\u304B?`,initial:!0});return r?(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: ${n.path}`),!0):(console.log(` - ${e} \u3078\u306E\u8FFD\u52A0\u3092\u30B9\u30AD\u30C3\u30D7\u3057\u307E\u3057\u305F\u3002`),!1)}}var Yt="https://github.com/him0/freee-mcp/releases/latest";function Zt(t,e){!t&&!e||(console.log(`=== Skill (API \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9) \u306E\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB ===
81
+ `),console.log(`MCP \u30B5\u30FC\u30D0\u30FC\u3068\u5408\u308F\u305B\u3066 Skill \u3092\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u3059\u308B\u3068\u3001API \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9\u304C\u5229\u7528\u53EF\u80FD\u306B\u306A\u308A\u307E\u3059\u3002
82
+ `),t&&(console.log("[Claude Code]"),console.log(` \u4EE5\u4E0B\u306E\u30B3\u30DE\u30F3\u30C9\u3067 freee API \u30B9\u30AD\u30EB\u3092\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u3067\u304D\u307E\u3059:
83
+ `),console.log(` npx add-skill him0/freee-mcp
84
+ `)),e&&(console.log("[Claude Desktop]"),console.log(" 1. \u4EE5\u4E0B\u306E URL \u304B\u3089 freee-skill.zip \u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9:"),console.log(` ${Yt}
85
+ `),console.log(" 2. Claude Desktop \u3067\u30B9\u30AD\u30EB\u3092\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9:"),console.log(` Settings > Features > Skills > \u300CUpload skill\u300D\u304B\u3089 zip \u30D5\u30A1\u30A4\u30EB\u3092\u9078\u629E
86
+ `)))}async function kt(){console.log(`=== MCP\u8A2D\u5B9A ===
80
87
  `),console.log(`Claude Code / Claude Desktop \u306B freee-mcp \u3092\u8A2D\u5B9A\u3067\u304D\u307E\u3059\u3002
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 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(()=>(S(),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,H());console.log(`
84
- \u8A8D\u8A3CURL: ${n}
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 ne(i,t,H());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||void 0,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
+ `);let t=await yt("claude-code");console.log("");let e=await yt("claude-desktop");console.log(""),Zt(t,e),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
89
+ `)}import Ie from"node:crypto";import en from"open";w();async function _t(){console.log(`\u30B9\u30C6\u30C3\u30D7 2/3: OAuth\u8A8D\u8A3C
90
+ `),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"),n=Ie.randomBytes(16).toString("base64url"),r=ne(e,n,H());console.log(`
91
+ \u8A8D\u8A3CURL: ${r}
92
+ `),await en(r),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
93
+ `);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(n,{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,H());return console.log(`\u30C8\u30FC\u30AF\u30F3\u3092\u53D6\u5F97\u3057\u307E\u3057\u305F\u3002
94
+ `),{accessToken:s.access_token,refreshToken:s.refresh_token}}finally{o.removeCliAuthHandler(n)}}F();async function Et(t,e,n){let r={clientId:t.clientId,clientSecret:t.clientSecret,callbackPort:t.callbackPort,defaultCompanyId:String(e.id),currentCompanyId:String(e.id),companies:{}};n.forEach(o=>{r.companies[String(o.id)]={id:String(o.id),name:o.display_name||o.name||void 0,description:`Role: ${o.role}`,addedAt:Date.now(),lastUsed:o.id===e.id?Date.now():void 0}}),await M(r),console.log(`\u8A2D\u5B9A\u60C5\u5831\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002
88
95
  `),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
96
  `)}async function xe(){console.log(`
90
97
  === freee-mcp Configuration Setup ===
91
98
  `),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
- `);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(`
99
+ `);try{let t=await Ct(),e=await _t(),{selected:n,all:r}=await wt(e.accessToken);await Et(t,n,r),await kt()}catch(t){t instanceof Error?console.error(`
93
100
  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 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)});
101
+ \u8A2D\u5B9A\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F:`,t),process.exit(1)}finally{Ze()}}var tn=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()};tn().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.7",
4
+ "version": "0.7.0",
5
5
  "bin": {
6
6
  "freee-mcp": "./bin/cli.js"
7
7
  },