bluelamp 4.2.0 → 4.2.1
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.
- package/bin/bluelamp-vscode-base +1 -1
- package/lib/auth/InteractiveLogin.js +1 -1
- package/lib/auth/PortalAuthClient.js +1 -1
- package/lib/auth/TokenManager.js +1 -1
- package/lib/i18n/en.json +6 -6
- package/lib/i18n/ja.json +6 -6
- package/lib/mcp-server/index.cjs +1 -1
- package/lib/mcp-server/portal-api-client.cjs +1 -1
- package/package.json +1 -1
- package/scripts/playwright-launch.js +1 -1
package/lib/mcp-server/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
const{Server:Server}=require("@modelcontextprotocol/sdk/server/index.js"),{StdioServerTransport:StdioServerTransport}=require("@modelcontextprotocol/sdk/server/stdio.js"),{CallToolRequestSchema:CallToolRequestSchema,ListToolsRequestSchema:ListToolsRequestSchema}=require("@modelcontextprotocol/sdk/types.js"),{getPromptFromPortal:getPromptFromPortal,reportViolation:reportViolation,listAvailableMcps:listAvailableMcps,getMcpInfo:getMcpInfo,callMcpTool:callMcpTool,deployUserMcp:deployUserMcp,listUserCreatedMcps:listUserCreatedMcps,deleteUserMcp:deleteUserMcp}=require("./portal-api-client.cjs"),{logger:logger}=require("../utils/logger"),{t:t,setLanguage:setLanguage}=require("../i18n"),path=require("path"),fs=require("fs"),os=require("os"),dotenvLocalPath=path.join(__dirname,"../../.env.local"),dotenvPath=path.join(__dirname,"../../.env");fs.existsSync(dotenvLocalPath)?(require("dotenv").config({path:dotenvLocalPath}),logger.debug("[MCP Server] Loaded .env.local")):fs.existsSync(dotenvPath)&&(require("dotenv").config({path:dotenvPath}),logger.debug("[MCP Server] Loaded .env"));const KEYWORD=process.env.BLUELAMP_KEYWORD||"BL-要件定義",TOKEN=process.env.BLUELAMP_TOKEN,PORTAL_URL=process.env.PORTAL_URL||"https://bluelamp-6clpzmy5pa-an.a.run.app",LANGUAGE=process.env.BLUELAMP_LANGUAGE||"ja";setLanguage(LANGUAGE);const LOG_DIR=path.join(os.homedir(),".bluelamp-vscode","logs"),LOG_FILE=path.join(LOG_DIR,"mcp.log");function log(e){const t=`[${(new Date).toISOString()}] ${e}\n`;fs.appendFileSync(LOG_FILE,t),logger.info(`[MCP Server] ${e}`)}fs.existsSync(LOG_DIR)||fs.mkdirSync(LOG_DIR,{recursive:!0}),log(`MCP Server started - Log file: ${LOG_FILE}`),log("Environment variables:"),log(` KEYWORD: ${KEYWORD}`),log(" TOKEN: "+(TOKEN?TOKEN.substring(0,20)+"...":"NOT SET")),log(` PORTAL_URL: ${PORTAL_URL}`),log(` LANGUAGE: ${LANGUAGE}`),log(` .env file exists: ${fs.existsSync(dotenvPath)}`);class BlueLampVSCodeServer{constructor(){this.server=new Server({name:"bluelamp",version:"1.0.0"},{capabilities:{tools:{}}}),this.setupHandlers()}setupHandlers(){this.server.setRequestHandler(ListToolsRequestSchema,async()=>{log("[MCP Server] ListTools request received");const e={type:"object",properties:{keyword:{type:"string",description:t("mcp.keywordDescription")}},required:["keyword"]},r={readOnlyHint:!0,idempotentHint:!0};return{tools:[{name:"load_knowledge",description:t("mcp.toolDescriptionLoadKnowledge"),annotations:r,inputSchema:e},{name:"inject_knowledge",description:t("mcp.toolDescriptionInjectKnowledge"),annotations:r,inputSchema:e},{name:"report_violation",description:t("mcp.toolDescriptionReportViolation"),annotations:{readOnlyHint:!1,idempotentHint:!1},inputSchema:{type:"object",properties:{reason:{type:"string",description:t("mcp.violationReasonDescription")},severity:{type:"string",enum:["warning","serious","critical"],description:t("mcp.violationSeverityDescription")},userMessage:{type:"string",description:t("mcp.violationUserMessageDescription")}},required:["reason","severity"]}},{name:"list_available_mcps",description:t("mcp.toolDescriptionListMcps"),annotations:{readOnlyHint:!0,idempotentHint:!0},inputSchema:{type:"object",properties:{category:{type:"string",enum:["productivity","development","communication","data","media","custom"],description:t("mcp.listMcpsCategoryDescription")},search:{type:"string",description:t("mcp.listMcpsSearchDescription")}},required:[]}},{name:"get_mcp_info",description:t("mcp.toolDescriptionGetMcpInfo"),annotations:{readOnlyHint:!0,idempotentHint:!0},inputSchema:{type:"object",properties:{mcp_id:{type:"string",description:t("mcp.getMcpInfoIdDescription")}},required:["mcp_id"]}},{name:"call_tool",description:t("mcp.toolDescriptionCallTool"),annotations:{readOnlyHint:!1,idempotentHint:!1},inputSchema:{type:"object",properties:{mcp_id:{type:"string",description:t("mcp.callToolMcpIdDescription")},tool_name:{type:"string",description:t("mcp.callToolNameDescription")},arguments:{type:"object",description:t("mcp.callToolArgsDescription")}},required:["mcp_id","tool_name"]}},{name:"create_user_mcp",description:t("mcp.toolDescriptionCreateUserMcp"),annotations:{readOnlyHint:!1,idempotentHint:!1},inputSchema:{type:"object",properties:{name:{type:"string",description:t("mcp.createMcpNameDescription")},description:{type:"string",description:t("mcp.createMcpDescDescription")},tools:{type:"string",description:t("mcp.createMcpToolsDescription")},code:{type:"string",description:t("mcp.createMcpCodeDescription")},category:{type:"string",enum:["productivity","development","communication","data","media","custom"],description:t("mcp.createMcpCategoryDescription")},envVars:{type:"string",description:t("mcp.createMcpEnvVarsDescription")}},required:["name","description","code"]}},{name:"list_user_mcps",description:t("mcp.toolDescriptionListUserMcps"),annotations:{readOnlyHint:!0,idempotentHint:!0},inputSchema:{type:"object",properties:{},required:[]}},{name:"delete_user_mcp",description:t("mcp.toolDescriptionDeleteUserMcp"),annotations:{readOnlyHint:!1,idempotentHint:!1},inputSchema:{type:"object",properties:{mcp_id:{type:"string",description:t("mcp.deleteUserMcpIdDescription")}},required:["mcp_id"]}}]}}),this.server.setRequestHandler(CallToolRequestSchema,async e=>{const{name:r}=e.params;if("load_knowledge"===r||"inject_knowledge"===r){const{keyword:r}=e.params.arguments;log(`[MCP Server] load_knowledge called with keyword: ${r}`),log("[MCP Server] TOKEN: "+(TOKEN?TOKEN.substring(0,20)+"...":"missing")),log(`[MCP Server] PORTAL_URL: ${PORTAL_URL}`),log(`[MCP Server] LANGUAGE: ${LANGUAGE}`);try{const e=await getPromptFromPortal(r,TOKEN,LANGUAGE);if(!e||!e.success){const o=e?.error||t("mcp.knowledgeNotFound",{keyword:r});return log(`[MCP Server] Knowledge loading failed: ${o}`),{content:[{type:"text",text:`❌ ${t("mcp.portalApiFailed",{error:o})}`}],isError:!0}}const o="ja"!==LANGUAGE?"\n\n[Note] The user's preferred language is English.":"";return{content:[{type:"text",text:`✅ ${t("mcp.knowledgeLoadSuccess")}\n\n${e.knowledge}${o}\n\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n${t("mcp.knowledgeApplied")}`}]}}catch(e){return log(`[MCP Server] Exception in load_knowledge: ${e.message}`),{content:[{type:"text",text:`❌ ${t("mcp.knowledgeLoadError",{error:e.message})}`}],isError:!0}}}if("report_violation"===r){const{reason:r,severity:o,userMessage:n}=e.params.arguments;log(`[MCP Server] report_violation called: severity=${o}, reason=${r}`);try{const e=await reportViolation(r,o,TOKEN,n);return e&&e.success?{content:[{type:"text",text:`🔒 ${e.message}`}]}:{content:[{type:"text",text:`❌ ${t("mcp.violationReportFailed",{error:e?.error||"Unknown"})}`}],isError:!0}}catch(e){return log(`[MCP Server] report_violation error: ${e.message}`),{content:[{type:"text",text:`❌ ${t("mcp.violationReportError",{error:e.message})}`}],isError:!0}}}if("list_available_mcps"===r){const{category:r,search:o}=e.params.arguments||{};log(`[MCP Server] list_available_mcps called: category=${r}, search=${o}`);try{const e=await listAvailableMcps({category:r,search:o},TOKEN,LANGUAGE);if(!e||!e.success)return{content:[{type:"text",text:`❌ ${t("mcp.listMcpsFailed",{error:e?.error||"Unknown"})}`}],isError:!0};const n=e.data||[];let s=`📋 ${t("mcp.listMcpsTitle")}\n\n`;return 0===n.length?s+=t("mcp.listMcpsEmpty"):n.forEach(e=>{const t=e.tools?.length||0;s+=`**${e.name}** (${e.mcpId})\n`,s+=` ${e.description}\n`,s+=` カテゴリ: ${e.category} | ツール数: ${t} | アクセス: ${e.hasAccess?"✅":"❌"}\n\n`}),{content:[{type:"text",text:s}]}}catch(e){return log(`[MCP Server] list_available_mcps error: ${e.message}`),{content:[{type:"text",text:`❌ ${e.message}`}],isError:!0}}}if("get_mcp_info"===r){const{mcp_id:r}=e.params.arguments;log(`[MCP Server] get_mcp_info called: mcpId=${r}`);try{const e=await getMcpInfo(r,TOKEN,LANGUAGE);if(!e||!e.success)return{content:[{type:"text",text:`❌ ${t("mcp.getMcpInfoFailed",{error:e?.error||"Unknown"})}`}],isError:!0};const o=e.data;let n=`🔧 **${o.name}** (${o.mcpId})\n\n`;return n+=`${o.description}\n\n`,n+=`カテゴリ: ${o.category}\n`,n+=`アクセス: ${o.hasAccess?"利用可能":"利用不可"}\n`,n+=`ステータス: ${o.status}\n\n`,o.tools&&o.tools.length>0&&(n+=`### ツール一覧 (${o.tools.length})\n\n`,o.tools.forEach(e=>{n+=`- **${e.name}**: ${e.description}\n`,e.inputSchema?.properties&&Object.entries(e.inputSchema.properties).forEach(([e,t])=>{n+=` - \`${e}\` (${t.type||"any"}): ${t.description||""}\n`})})),o.requiredCredentials&&o.requiredCredentials.length>0&&(n+="\n### 必要な認証情報\n",o.requiredCredentials.forEach(e=>{n+=`- **${e.displayName}** (${e.key}): ${e.required?"必須":"任意"}\n`})),{content:[{type:"text",text:n}]}}catch(e){return log(`[MCP Server] get_mcp_info error: ${e.message}`),{content:[{type:"text",text:`❌ ${e.message}`}],isError:!0}}}if("call_tool"===r){const{mcp_id:r,tool_name:o,arguments:n}=e.params.arguments;log(`[MCP Server] call_tool called: mcpId=${r}, tool=${o}`);try{const e=await callMcpTool(r,o,n||{},TOKEN);if(!e||!e.success)return{content:[{type:"text",text:`❌ ${t("mcp.callToolFailed",{error:e?.error||"Unknown"})}`}],isError:!0};const s=e.data;return"string"==typeof s?{content:[{type:"text",text:s}]}:{content:[{type:"text",text:JSON.stringify(s,null,2)}]}}catch(e){return log(`[MCP Server] call_tool error: ${e.message}`),{content:[{type:"text",text:`❌ ${e.message}`}],isError:!0}}}if("create_user_mcp"===r){const r=e.params.arguments;log(`[MCP Server] create_user_mcp called: name=${r.name}`);try{let e=r.tools;if("string"==typeof e)try{e=JSON.parse(e)}catch(t){e=[]}let o=r.envVars;if("string"==typeof o)try{o=JSON.parse(o)}catch(e){o=void 0}const n={code:r.code,name:r.name,description:r.description||"",tools:e||[],category:r.category||"custom",envVars:o},s=await deployUserMcp(n,TOKEN);if(!s||!s.success)return{content:[{type:"text",text:`❌ ${s?.details?`${t("mcp.createMcpScanFailed")}\n${JSON.stringify(s.details,null,2)}`:t("mcp.createMcpFailed",{error:s?.error||"Unknown"})}`}],isError:!0};const i=s.data;return{content:[{type:"text",text:`✅ ${t("mcp.createMcpSuccess")}\n\n**MCP ID**: ${i.mcpId}\n**Endpoint**: ${i.endpoint}\n**有効化**: ${i.enabled?"自動有効化済み":"未有効化"}`}]}}catch(e){return log(`[MCP Server] create_user_mcp error: ${e.message}`),{content:[{type:"text",text:`❌ ${e.message}`}],isError:!0}}}if("list_user_mcps"===r){log("[MCP Server] list_user_mcps called");try{const e=await listUserCreatedMcps(TOKEN);if(!e||!e.success)return{content:[{type:"text",text:`❌ ${e?.error||"Unknown"}`}],isError:!0};const r=e.data?.mcps||[];let o=`📋 ${t("mcp.listUserMcpsTitle")}\n\n`;return 0===r.length?o+=t("mcp.listUserMcpsEmpty"):r.forEach(e=>{o+=`**${e.name}** (${e.mcpId})\n`,o+=` ${e.description||""}\n`,o+=` カテゴリ: ${e.category} | ツール数: ${e.toolCount||0} | ステータス: ${e.status}\n`,e.endpoint&&(o+=` エンドポイント: ${e.endpoint}\n`),o+="\n"}),{content:[{type:"text",text:o}]}}catch(e){return log(`[MCP Server] list_user_mcps error: ${e.message}`),{content:[{type:"text",text:`❌ ${e.message}`}],isError:!0}}}if("delete_user_mcp"===r){const{mcp_id:r}=e.params.arguments;log(`[MCP Server] delete_user_mcp called: mcpId=${r}`);try{const e=await deleteUserMcp(r,TOKEN);return e&&e.success?{content:[{type:"text",text:`✅ ${t("mcp.deleteUserMcpSuccess",{mcpId:r})}`}]}:{content:[{type:"text",text:`❌ ${t("mcp.deleteUserMcpFailed",{error:e?.error||"Unknown"})}`}],isError:!0}}catch(e){return log(`[MCP Server] delete_user_mcp error: ${e.message}`),{content:[{type:"text",text:`❌ ${e.message}`}],isError:!0}}}return{content:[{type:"text",text:`Unknown tool: ${e.params.name}`}],isError:!0}})}async run(){const e=new StdioServerTransport;if(await this.server.connect(e),logger.info("BlueLamp VSCode MCP server started"),KEYWORD&&TOKEN){log(`[MCP Server] Auto-loading knowledge for keyword: ${KEYWORD} (lang: ${LANGUAGE})`);const e=await getPromptFromPortal(KEYWORD,TOKEN,LANGUAGE);e&&e.success?log(`[MCP Server] Auto-load successful: ${e.title}`):log(`[MCP Server] Auto-load failed for keyword: ${KEYWORD}`)}}}const server=new BlueLampVSCodeServer;server.run().catch(e=>logger.error(e.message));
|
|
2
|
+
const{Server:Server}=require("@modelcontextprotocol/sdk/server/index.js"),{StdioServerTransport:StdioServerTransport}=require("@modelcontextprotocol/sdk/server/stdio.js"),{CallToolRequestSchema:CallToolRequestSchema,ListToolsRequestSchema:ListToolsRequestSchema}=require("@modelcontextprotocol/sdk/types.js"),{getPromptFromPortal:getPromptFromPortal,listAvailableMcps:listAvailableMcps,getMcpInfo:getMcpInfo,callMcpTool:callMcpTool,deployUserMcp:deployUserMcp,listUserCreatedMcps:listUserCreatedMcps,deleteUserMcp:deleteUserMcp}=require("./portal-api-client.cjs"),{logger:logger}=require("../utils/logger"),{t:t,setLanguage:setLanguage}=require("../i18n"),path=require("path"),fs=require("fs"),os=require("os"),dotenvLocalPath=path.join(__dirname,"../../.env.local"),dotenvPath=path.join(__dirname,"../../.env");fs.existsSync(dotenvLocalPath)?(require("dotenv").config({path:dotenvLocalPath}),logger.debug("[MCP Server] Loaded .env.local")):fs.existsSync(dotenvPath)&&(require("dotenv").config({path:dotenvPath}),logger.debug("[MCP Server] Loaded .env"));const KEYWORD=process.env.BLUELAMP_KEYWORD||"BL-要件定義",TOKEN=process.env.BLUELAMP_TOKEN,PORTAL_URL=process.env.PORTAL_URL||"https://bluelamp-6clpzmy5pa-an.a.run.app",LANGUAGE=process.env.BLUELAMP_LANGUAGE||"ja";setLanguage(LANGUAGE);const LOG_DIR=path.join(os.homedir(),".bluelamp-vscode","logs"),LOG_FILE=path.join(LOG_DIR,"mcp.log");function log(e){const t=`[${(new Date).toISOString()}] ${e}\n`;fs.appendFileSync(LOG_FILE,t),logger.info(`[MCP Server] ${e}`)}fs.existsSync(LOG_DIR)||fs.mkdirSync(LOG_DIR,{recursive:!0}),log(`MCP Server started - Log file: ${LOG_FILE}`),log("Environment variables:"),log(` KEYWORD: ${KEYWORD}`),log(" TOKEN: "+(TOKEN?TOKEN.substring(0,20)+"...":"NOT SET")),log(` PORTAL_URL: ${PORTAL_URL}`),log(` LANGUAGE: ${LANGUAGE}`),log(` .env file exists: ${fs.existsSync(dotenvPath)}`);class BlueLampVSCodeServer{constructor(){this.server=new Server({name:"bluelamp",version:"1.0.0"},{capabilities:{tools:{}}}),this.setupHandlers()}setupHandlers(){this.server.setRequestHandler(ListToolsRequestSchema,async()=>{log("[MCP Server] ListTools request received");const e={type:"object",properties:{keyword:{type:"string",description:t("mcp.keywordDescription")}},required:["keyword"]};return{tools:[{name:"load_knowledge",description:t("mcp.toolDescriptionLoadKnowledge"),annotations:{readOnlyHint:!0,idempotentHint:!0},inputSchema:e},{name:"list_available_mcps",description:t("mcp.toolDescriptionListMcps"),annotations:{readOnlyHint:!0,idempotentHint:!0},inputSchema:{type:"object",properties:{category:{type:"string",enum:["productivity","development","communication","data","media","custom"],description:t("mcp.listMcpsCategoryDescription")},search:{type:"string",description:t("mcp.listMcpsSearchDescription")}},required:[]}},{name:"get_mcp_info",description:t("mcp.toolDescriptionGetMcpInfo"),annotations:{readOnlyHint:!0,idempotentHint:!0},inputSchema:{type:"object",properties:{mcp_id:{type:"string",description:t("mcp.getMcpInfoIdDescription")}},required:["mcp_id"]}},{name:"call_tool",description:t("mcp.toolDescriptionCallTool"),annotations:{readOnlyHint:!1,idempotentHint:!1},inputSchema:{type:"object",properties:{mcp_id:{type:"string",description:t("mcp.callToolMcpIdDescription")},tool_name:{type:"string",description:t("mcp.callToolNameDescription")},arguments:{type:"object",description:t("mcp.callToolArgsDescription")}},required:["mcp_id","tool_name"]}},{name:"create_user_mcp",description:t("mcp.toolDescriptionCreateUserMcp"),annotations:{readOnlyHint:!1,idempotentHint:!1},inputSchema:{type:"object",properties:{name:{type:"string",description:t("mcp.createMcpNameDescription")},description:{type:"string",description:t("mcp.createMcpDescDescription")},tools:{type:"string",description:t("mcp.createMcpToolsDescription")},code:{type:"string",description:t("mcp.createMcpCodeDescription")},category:{type:"string",enum:["productivity","development","communication","data","media","custom"],description:t("mcp.createMcpCategoryDescription")},envVars:{type:"string",description:t("mcp.createMcpEnvVarsDescription")}},required:["name","description","code"]}},{name:"list_user_mcps",description:t("mcp.toolDescriptionListUserMcps"),annotations:{readOnlyHint:!0,idempotentHint:!0},inputSchema:{type:"object",properties:{},required:[]}},{name:"delete_user_mcp",description:t("mcp.toolDescriptionDeleteUserMcp"),annotations:{readOnlyHint:!1,idempotentHint:!1},inputSchema:{type:"object",properties:{mcp_id:{type:"string",description:t("mcp.deleteUserMcpIdDescription")}},required:["mcp_id"]}}]}}),this.server.setRequestHandler(CallToolRequestSchema,async e=>{const{name:r}=e.params;if("load_knowledge"===r){const{keyword:r}=e.params.arguments;log(`[MCP Server] load_knowledge called with keyword: ${r}`),log("[MCP Server] TOKEN: "+(TOKEN?TOKEN.substring(0,20)+"...":"missing")),log(`[MCP Server] PORTAL_URL: ${PORTAL_URL}`),log(`[MCP Server] LANGUAGE: ${LANGUAGE}`);try{const e=await getPromptFromPortal(r,TOKEN,LANGUAGE);if(!e||!e.success){const o=e?.error||t("mcp.knowledgeNotFound",{keyword:r});return log(`[MCP Server] Knowledge loading failed: ${o}`),{content:[{type:"text",text:`❌ ${t("mcp.portalApiFailed",{error:o})}`}],isError:!0}}const o="ja"!==LANGUAGE?"\n\n[Note] The user's preferred language is English.":"";return{content:[{type:"text",text:`✅ ${t("mcp.knowledgeLoadSuccess")}\n\n${e.knowledge}${o}\n\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n${t("mcp.knowledgeApplied")}`}]}}catch(e){return log(`[MCP Server] Exception in load_knowledge: ${e.message}`),{content:[{type:"text",text:`❌ ${t("mcp.knowledgeLoadError",{error:e.message})}`}],isError:!0}}}if("list_available_mcps"===r){const{category:r,search:o}=e.params.arguments||{};log(`[MCP Server] list_available_mcps called: category=${r}, search=${o}`);try{const e=await listAvailableMcps({category:r,search:o},TOKEN,LANGUAGE);if(!e||!e.success)return{content:[{type:"text",text:`❌ ${t("mcp.listMcpsFailed",{error:e?.error||"Unknown"})}`}],isError:!0};const n=e.data||[];let s=`📋 ${t("mcp.listMcpsTitle")}\n\n`;return 0===n.length?s+=t("mcp.listMcpsEmpty"):n.forEach(e=>{const t=e.tools?.length||0;s+=`**${e.name}** (${e.mcpId})\n`,s+=` ${e.description}\n`,s+=` カテゴリ: ${e.category} | ツール数: ${t} | アクセス: ${e.hasAccess?"✅":"❌"}\n\n`}),{content:[{type:"text",text:s}]}}catch(e){return log(`[MCP Server] list_available_mcps error: ${e.message}`),{content:[{type:"text",text:`❌ ${e.message}`}],isError:!0}}}if("get_mcp_info"===r){const{mcp_id:r}=e.params.arguments;log(`[MCP Server] get_mcp_info called: mcpId=${r}`);try{const e=await getMcpInfo(r,TOKEN,LANGUAGE);if(!e||!e.success)return{content:[{type:"text",text:`❌ ${t("mcp.getMcpInfoFailed",{error:e?.error||"Unknown"})}`}],isError:!0};const o=e.data;let n=`🔧 **${o.name}** (${o.mcpId})\n\n`;return n+=`${o.description}\n\n`,n+=`カテゴリ: ${o.category}\n`,n+=`アクセス: ${o.hasAccess?"利用可能":"利用不可"}\n`,n+=`ステータス: ${o.status}\n\n`,o.tools&&o.tools.length>0&&(n+=`### ツール一覧 (${o.tools.length})\n\n`,o.tools.forEach(e=>{n+=`- **${e.name}**: ${e.description}\n`,e.inputSchema?.properties&&Object.entries(e.inputSchema.properties).forEach(([e,t])=>{n+=` - \`${e}\` (${t.type||"any"}): ${t.description||""}\n`})})),o.requiredCredentials&&o.requiredCredentials.length>0&&(n+="\n### 必要な認証情報\n",o.requiredCredentials.forEach(e=>{n+=`- **${e.displayName}** (${e.key}): ${e.required?"必須":"任意"}\n`})),{content:[{type:"text",text:n}]}}catch(e){return log(`[MCP Server] get_mcp_info error: ${e.message}`),{content:[{type:"text",text:`❌ ${e.message}`}],isError:!0}}}if("call_tool"===r){const{mcp_id:r,tool_name:o,arguments:n}=e.params.arguments;log(`[MCP Server] call_tool called: mcpId=${r}, tool=${o}`);try{const e=await callMcpTool(r,o,n||{},TOKEN);if(!e||!e.success)return{content:[{type:"text",text:`❌ ${t("mcp.callToolFailed",{error:e?.error||"Unknown"})}`}],isError:!0};const s=e.data;return"string"==typeof s?{content:[{type:"text",text:s}]}:{content:[{type:"text",text:JSON.stringify(s,null,2)}]}}catch(e){return log(`[MCP Server] call_tool error: ${e.message}`),{content:[{type:"text",text:`❌ ${e.message}`}],isError:!0}}}if("create_user_mcp"===r){const r=e.params.arguments;log(`[MCP Server] create_user_mcp called: name=${r.name}`);try{let e=r.tools;if("string"==typeof e)try{e=JSON.parse(e)}catch(t){e=[]}let o=r.envVars;if("string"==typeof o)try{o=JSON.parse(o)}catch(e){o=void 0}const n={code:r.code,name:r.name,description:r.description||"",tools:e||[],category:r.category||"custom",envVars:o},s=await deployUserMcp(n,TOKEN);if(!s||!s.success)return{content:[{type:"text",text:`❌ ${s?.details?`${t("mcp.createMcpScanFailed")}\n${JSON.stringify(s.details,null,2)}`:t("mcp.createMcpFailed",{error:s?.error||"Unknown"})}`}],isError:!0};const c=s.data;return{content:[{type:"text",text:`✅ ${t("mcp.createMcpSuccess")}\n\n**MCP ID**: ${c.mcpId}\n**Endpoint**: ${c.endpoint}\n**有効化**: ${c.enabled?"自動有効化済み":"未有効化"}`}]}}catch(e){return log(`[MCP Server] create_user_mcp error: ${e.message}`),{content:[{type:"text",text:`❌ ${e.message}`}],isError:!0}}}if("list_user_mcps"===r){log("[MCP Server] list_user_mcps called");try{const e=await listUserCreatedMcps(TOKEN);if(!e||!e.success)return{content:[{type:"text",text:`❌ ${e?.error||"Unknown"}`}],isError:!0};const r=e.data?.mcps||[];let o=`📋 ${t("mcp.listUserMcpsTitle")}\n\n`;return 0===r.length?o+=t("mcp.listUserMcpsEmpty"):r.forEach(e=>{o+=`**${e.name}** (${e.mcpId})\n`,o+=` ${e.description||""}\n`,o+=` カテゴリ: ${e.category} | ツール数: ${e.toolCount||0} | ステータス: ${e.status}\n`,e.endpoint&&(o+=` エンドポイント: ${e.endpoint}\n`),o+="\n"}),{content:[{type:"text",text:o}]}}catch(e){return log(`[MCP Server] list_user_mcps error: ${e.message}`),{content:[{type:"text",text:`❌ ${e.message}`}],isError:!0}}}if("delete_user_mcp"===r){const{mcp_id:r}=e.params.arguments;log(`[MCP Server] delete_user_mcp called: mcpId=${r}`);try{const e=await deleteUserMcp(r,TOKEN);return e&&e.success?{content:[{type:"text",text:`✅ ${t("mcp.deleteUserMcpSuccess",{mcpId:r})}`}]}:{content:[{type:"text",text:`❌ ${t("mcp.deleteUserMcpFailed",{error:e?.error||"Unknown"})}`}],isError:!0}}catch(e){return log(`[MCP Server] delete_user_mcp error: ${e.message}`),{content:[{type:"text",text:`❌ ${e.message}`}],isError:!0}}}return{content:[{type:"text",text:`Unknown tool: ${e.params.name}`}],isError:!0}})}async run(){const e=new StdioServerTransport;if(await this.server.connect(e),logger.info("BlueLamp VSCode MCP server started"),KEYWORD&&TOKEN){log(`[MCP Server] Auto-loading knowledge for keyword: ${KEYWORD} (lang: ${LANGUAGE})`);const e=await getPromptFromPortal(KEYWORD,TOKEN,LANGUAGE);e&&e.success?log(`[MCP Server] Auto-load successful: ${e.title}`):log(`[MCP Server] Auto-load failed for keyword: ${KEYWORD}`)}}}const server=new BlueLampVSCodeServer;server.run().catch(e=>logger.error(e.message));
|