bluelamp 4.1.0 → 4.1.2

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/lib/i18n/ja.json CHANGED
@@ -11,9 +11,9 @@
11
11
  "logFile": "ログファイル: {path}",
12
12
  "promptInfo": "プロンプト: {keyword}",
13
13
  "initialPromptTitle": "さあ始めましょう",
14
- "initialPromptLoadContext": "**最初に必ず専門コンテキストを読み込んでください**\nbluelampのMCPで \"{keyword}\" を読み込んでから開始してください。(初回必須)",
15
- "initialPromptKeywordNote": "重要:キーワードは \"{keyword}\" をそのまま使用してください。変換や推測は不要です。",
16
- "initialPromptReady": "準備完了です。\"{keyword}\"エージェントとしてタスクを開始してください。",
14
+ "initialPromptLoadContext": "このセッションではBlueLamp MCPの参考情報 \"{keyword}\" が利用可能です。\nまず最初に load_knowledge ツールで \"{keyword}\" の参考情報を確認してください。",
15
+ "initialPromptKeywordNote": "キーワードは \"{keyword}\" をそのまま使用してください。変換や推測は不要です。",
16
+ "initialPromptReady": "\"{keyword}\" の参考情報を確認後、ご要望をお聞かせください。",
17
17
  "launchingClaude": "Claude 起動中...",
18
18
  "mcpServer": "MCP Server: BlueLamp",
19
19
  "knowledge": "Knowledge: {keyword}",
@@ -90,7 +90,7 @@
90
90
  "portalApiFailed": "Portal APIから知識を取得できませんでした: {error}",
91
91
  "knowledgeLoadError": "知識の読み込み中にエラーが発生しました: {error}",
92
92
  "knowledgeLoadSuccess": "BlueLamp 専門コンテキスト読み込み完了",
93
- "knowledgeApplied": "専門コンテキストを適用しました。このロールで支援を開始します。",
93
+ "knowledgeApplied": "参考情報の読み込みが完了しました。上記の内容を参考にしてご支援ください。",
94
94
  "violationReportFailed": "違反報告に失敗しました: {error}",
95
95
  "violationReportError": "違反報告中にエラーが発生しました: {error}",
96
96
  "noAuthToken": "認証トークンが設定されていません。bluelamp login コマンドでログインしてください。",
@@ -100,6 +100,37 @@
100
100
  "portalCommunicationError": "Portal API通信エラー: {error}",
101
101
  "violationNoToken": "認証トークンが設定されていません",
102
102
  "violationApiError": "違反報告エラー (HTTP {status})",
103
- "violationCommunicationError": "違反報告通信エラー: {error}"
103
+ "violationCommunicationError": "違反報告通信エラー: {error}",
104
+ "toolDescriptionListMcps": "利用可能なMCP一覧を取得します。カテゴリやキーワードでフィルタ可能。",
105
+ "listMcpsCategoryDescription": "カテゴリでフィルタ",
106
+ "listMcpsSearchDescription": "検索キーワード(名前、説明にマッチ)",
107
+ "listMcpsTitle": "利用可能なMCP一覧",
108
+ "listMcpsEmpty": "条件に一致するMCPが見つかりませんでした",
109
+ "listMcpsFailed": "MCP一覧の取得に失敗しました: {error}",
110
+ "toolDescriptionGetMcpInfo": "特定MCPの詳細情報を取得します。ツール一覧も含まれます。",
111
+ "getMcpInfoIdDescription": "MCP ID(例: dataforseo, gmail, backlog)",
112
+ "getMcpInfoFailed": "MCP情報の取得に失敗しました: {error}",
113
+ "toolDescriptionCallTool": "MCPのツールをプロキシ経由で実行します。get_mcp_infoでツール一覧を確認してから使用してください。",
114
+ "callToolMcpIdDescription": "MCP ID(例: dataforseo, gmail, backlog)",
115
+ "callToolNameDescription": "実行するツール名(例: search_knowledge, send_email)",
116
+ "callToolArgsDescription": "ツールに渡す引数(各ツールの入力スキーマに従う)",
117
+ "callToolFailed": "ツール実行に失敗しました: {error}",
118
+ "toolDescriptionCreateUserMcp": "ユーザー独自のMCPを作成・デプロイします。コードのセキュリティスキャン→Cloudflare Workersデプロイ→自動有効化まで一括実行。",
119
+ "toolDescriptionListUserMcps": "自分が作成したMCP一覧を取得します。",
120
+ "toolDescriptionDeleteUserMcp": "自分が作成したMCPを削除します(Cloudflare Worker + DB)。",
121
+ "createMcpNameDescription": "MCP名(例: my-weather-mcp)",
122
+ "createMcpDescDescription": "MCPの説明",
123
+ "createMcpToolsDescription": "ツール定義のJSON配列(例: [{\"name\":\"get_weather\",\"description\":\"天気取得\",\"inputSchema\":{...}}])",
124
+ "createMcpCodeDescription": "Cloudflare Worker形式のMCPコード(ES Module、export default { async fetch() {...} })",
125
+ "createMcpCategoryDescription": "カテゴリ(productivity/development/communication/data/media/custom)",
126
+ "createMcpEnvVarsDescription": "環境変数定義のJSON(例: {\"API_KEY\":\"外部APIのキー\"})",
127
+ "createMcpSuccess": "MCPの作成・デプロイが完了しました",
128
+ "createMcpFailed": "MCPの作成に失敗しました: {error}",
129
+ "createMcpScanFailed": "セキュリティスキャンに失敗しました。以下の問題を修正してください:",
130
+ "listUserMcpsTitle": "作成済みMCP一覧",
131
+ "listUserMcpsEmpty": "作成済みのMCPはありません",
132
+ "deleteUserMcpSuccess": "MCP「{mcpId}」を削除しました",
133
+ "deleteUserMcpFailed": "MCPの削除に失敗しました: {error}",
134
+ "deleteUserMcpIdDescription": "削除するMCPのID"
104
135
  }
105
136
  }
@@ -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}=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"]}}]}}),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}}return{content:[{type:"text",text:`✅ ${t("mcp.knowledgeLoadSuccess")}\n\n${e.knowledge}\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}}}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,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));