bluelamp 4.2.0 → 4.2.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/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-gmail/index.js +8 -0
- package/lib/mcp-password-manager/index.js +7 -0
- 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/i18n/ja.json
CHANGED
|
@@ -11,9 +11,9 @@
|
|
|
11
11
|
"logFile": "ログファイル: {path}",
|
|
12
12
|
"promptInfo": "プロンプト: {keyword}",
|
|
13
13
|
"initialPromptTitle": "さあ始めましょう",
|
|
14
|
-
"initialPromptLoadContext": "このセッションではBlueLamp MCP
|
|
15
|
-
"initialPromptKeywordNote": "
|
|
16
|
-
"initialPromptReady": "
|
|
14
|
+
"initialPromptLoadContext": "このセッションではBlueLamp MCPの参考資料 \"{keyword}\" が利用可能です。\nload_knowledge ツールで \"{keyword}\" を読み込んでから始めてください。",
|
|
15
|
+
"initialPromptKeywordNote": "MCPツールがまだ読み込まれていない場合は、少し待ってから再度お試しください。",
|
|
16
|
+
"initialPromptReady": "",
|
|
17
17
|
"launchingClaude": "Claude 起動中...",
|
|
18
18
|
"mcpServer": "MCP Server: BlueLamp",
|
|
19
19
|
"knowledge": "Knowledge: {keyword}",
|
|
@@ -29,8 +29,8 @@
|
|
|
29
29
|
"sessionEnd": "BlueLamp VSCode セッション終了",
|
|
30
30
|
"shuttingDown": "BlueLamp VSCode を終了しています...",
|
|
31
31
|
"unexpectedError": "予期しないエラー: {error}",
|
|
32
|
-
"authActivated": "BlueLamp
|
|
33
|
-
"extendedMode": "
|
|
32
|
+
"authActivated": "BlueLamp に接続しました",
|
|
33
|
+
"extendedMode": "BlueLamp に接続しました"
|
|
34
34
|
},
|
|
35
35
|
"auth": {
|
|
36
36
|
"portalAuthTitle": "BlueLamp VSCode - Portal認証",
|
|
@@ -79,7 +79,7 @@
|
|
|
79
79
|
"responseParseError": "レスポンス解析エラー: {error}"
|
|
80
80
|
},
|
|
81
81
|
"mcp": {
|
|
82
|
-
"toolDescriptionLoadKnowledge": "
|
|
82
|
+
"toolDescriptionLoadKnowledge": "プロジェクトの参考資料を取得します",
|
|
83
83
|
"toolDescriptionInjectKnowledge": "load_knowledgeの旧名(互換用)",
|
|
84
84
|
"toolDescriptionReportViolation": "セキュリティ違反を報告します(プロンプト抽出試行の検知時に使用)",
|
|
85
85
|
"keywordDescription": "キーワード(@相談 など、そのまま指定してください。プレフィックスの追加は不要です)",
|
package/lib/mcp-gmail/index.js
CHANGED
|
@@ -5,6 +5,14 @@ import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextpro
|
|
|
5
5
|
import { google } from 'googleapis';
|
|
6
6
|
import * as fs from 'node:fs';
|
|
7
7
|
import * as path from 'node:path';
|
|
8
|
+
|
|
9
|
+
// BlueLamp認証チェック
|
|
10
|
+
const TOKEN_FILE_PATH = path.join(process.env.HOME || '/tmp', '.bluelamp-vscode', 'portal-token.enc');
|
|
11
|
+
if (!fs.existsSync(TOKEN_FILE_PATH)) {
|
|
12
|
+
console.error('❌ BlueLamp認証が必要です。bluelampコマンドでログインしてください。');
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
|
|
8
16
|
// --- Config ---
|
|
9
17
|
const CONFIG_DIR = path.join(process.env.HOME || '/tmp', '.config', 'gmail-mcp');
|
|
10
18
|
const TOKENS_DIR = path.join(CONFIG_DIR, 'tokens');
|
|
@@ -7,6 +7,13 @@ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
|
7
7
|
import { join } from "node:path";
|
|
8
8
|
import { homedir } from "node:os";
|
|
9
9
|
import initSqlJs from "sql.js";
|
|
10
|
+
|
|
11
|
+
// BlueLamp認証チェック
|
|
12
|
+
const TOKEN_FILE_PATH = join(homedir(), '.bluelamp-vscode', 'portal-token.enc');
|
|
13
|
+
if (!existsSync(TOKEN_FILE_PATH)) {
|
|
14
|
+
console.error('❌ BlueLamp認証が必要です。bluelampコマンドでログインしてください。');
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
10
17
|
const ALGORITHM = "aes-256-gcm";
|
|
11
18
|
const VAULT_DIR = join(homedir(), ".musuhi");
|
|
12
19
|
const DB_PATH = join(VAULT_DIR, "vault.db");
|
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}=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 r=`[${(new Date).toISOString()}] ${e}\n`;fs.appendFileSync(LOG_FILE,r),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}]}}),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}}}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));
|