🚀 代碼模式MCP服務器
本項目實現了MCP服務器“代碼模式”工作流的本地版本。相較於繁瑣的多工具調用,大語言模型(LLMs)可以編寫TypeScript/JavaScript代碼,通過調用簡單的HTTP代理來訪問你的MCP服務器。
⚠️ 重要提示
我已停止維護此倉庫,新項目地址為:https://github.com/jx-codes/lootbox 。新項目對代碼模式有更周全的設計。
🚀 快速開始
本項目的核心在於,大語言模型編寫代碼的能力遠強於調用工具的能力。與其向大語言模型直接暴露眾多工具(這會讓它難以應對),本服務器僅為大語言模型提供一個工具:execute_code。大語言模型編寫代碼,通過HTTP請求來訪問其他MCP服務器。
具體工作流程如下:
- 大語言模型獲得一個工具:
execute_code - 用於執行TypeScript/JavaScript代碼。
- 大語言模型編寫代碼:使用
fetch()方法調用http://localhost:3001/mcp/*端點。
- HTTP代理轉發請求:將請求透明地轉發到實際的MCP服務器。
- 結果返回:通過代碼執行結果反饋給大語言模型。
這種方式結合了複雜工具編排的優勢,同時發揮了大語言模型編寫代碼的特長。
✨ 主要特性
- 代碼驅動:利用大語言模型編寫代碼的能力,替代複雜的工具調用。
- 簡單代理:提供單一的
execute_code工具,簡化與MCP服務器的交互。
- 安全執行:代碼在Deno沙箱中運行,僅具有網絡訪問權限。
📦 安裝指南
前提條件
- Bun(最新版本)
- Deno(用於代碼執行沙箱)
- 兼容MCP的客戶端(如Claude Desktop、Cursor、支持Copilot的VS Code等)
安裝步驟
- 克隆倉庫
git clone https://github.com/jx-codes/codemode-mcp.git
cd codemode-mcp
- 安裝依賴
bun install
- 配置服務器(可選)
創建
codemode-config.json文件,自定義服務器設置:
{
"proxyPort": 3001,
"configDirectories": [
"~/.config/mcp/servers",
"./mcp-servers",
"./"
]
}
- 配置MCP服務器
在上述指定的任意目錄下創建
.mcp.json文件,配置MCP服務器:
{
"mcpServers": {
"fs": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"],
"env": {}
}
}
}
💻 使用示例
基礎用法
以下是調用單個MCP服務器的示例:
const servers = await fetch("http://localhost:3001/mcp/servers").then((r) =>
r.json()
);
console.log("可用的服務器:", servers);
const result = await fetch("http://localhost:3001/mcp/call", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
server: "fs",
tool: "read_file",
args: { path: "/tmp/example.txt" },
}),
}).then((r) => r.json());
console.log("文件內容:", result);
高級用法
以下示例展示瞭如何鏈式調用多個操作:
const files = await fetch("http://localhost:3001/mcp/call", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
server: "fs",
tool: "list_directory",
args: { path: "/tmp" },
}),
}).then((r) => r.json());
for (const file of files.content[0].text.split("\n")) {
if (file.endsWith(".txt")) {
const content = await fetch("http://localhost:3001/mcp/call", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
server: "fs",
tool: "read_file",
args: { path: `/tmp/${file}` },
}),
}).then((r) => r.json());
console.log(`${file}: ${content.content[0].text.length} 個字符`);
}
}
📚 詳細文檔
工具說明
execute_code
執行具有訪問MCP代理網絡權限的TypeScript/JavaScript代碼。
參數:
code(字符串):要執行的代碼。
typescript(布爾值):是否為TypeScript模式(默認:true)。
代理端點:
GET /mcp/servers - 列出可用的MCP服務器。
GET /mcp/{server}/tools - 列出指定服務器的工具。
POST /mcp/call - 調用工具(請求體:{server, tool, args})。
check_deno_version
檢查Deno的安裝狀態。
list_servers_with_tools
獲取所有可用MCP服務器及其工具的詳細信息。返回結構化的JSON數據,包含完整的工具模式和服務器狀態信息,便於大語言模型處理。
JSON輸出結構:
{
"summary": {
"totalServers": 2,
"successfulServers": 2,
"totalTools": 4
},
"servers": [
{
"server": "filesystem",
"status": "success",
"toolCount": 3,
"tools": [
{
"name": "read_file",
"description": "讀取文件內容",
"inputSchema": {
"type": "object",
"properties": {
"path": {
"type": "string",
"description": "要讀取的文件路徑"
}
},
"required": ["path"]
}
}
]
},
{
"server": "database",
"status": "success",
"toolCount": 1,
"tools": [
{
"name": "query",
"description": "執行SQL查詢",
"inputSchema": {
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "要執行的SQL查詢"
}
},
"required": ["query"]
}
}
]
}
]
}
配置說明
創建codemode-config.json文件進行服務器配置:
{
"proxyPort": 3001,
"configDirectories": ["~/.config/mcp/servers", "./mcp-servers", "./"]
}
在指定目錄下的.mcp.json文件中添加MCP服務器配置:
{
"mcpServers": {
"fs": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"],
"env": {}
}
}
}
優勢對比
傳統MCP工作流
大語言模型 → 工具調用 → MCP服務器 → 結果 → 大語言模型 → 工具調用 → ...
- 大語言模型難以處理工具語法。
- 每次調用都要經過神經網絡。
- 操作鏈式調用困難。
- 受限於合成工具示例的訓練。
代碼模式工作流
大語言模型 → 編寫代碼 → 代碼調用代理 → 代理轉發到MCP服務器 → 結果
- 大語言模型擅長編寫代碼(訓練數據包含數百萬個真實示例)。
- 代碼可以自然地鏈式調用操作。
- 結果通過代碼邏輯返回,而非神經網絡。
- 支持自然的組合和數據處理。
🔧 技術細節
安全機制
- 代碼在Deno沙箱中運行,僅具有網絡訪問權限。
- 無文件系統、環境或系統訪問權限。
- 執行超時時間為30秒。
- 通過受控代理訪問MCP服務器。
- 臨時文件自動清理。
故障排除
- “Deno未安裝”:安裝Deno並重啟。
- “權限被拒絕”:代碼嘗試訪問受限資源。
- “模塊未找到”:使用
https:// URL進行導入。
- “執行超時”:優化代碼或拆分為更小的操作。
📄 許可證
文檔中未提及許可證相關信息。
待辦事項(可能)
- 為MCP代理提供更簡單的API層,例如
mcp.tool('name', args);。
- 可以通過在運行用戶代碼之前將自定義TypeScript文件注入Deno作用域來實現。
- 增加更多配置選項。
- 以某種方式過濾工具。
- 在實際工作流中更多地測試並查看結果。
參考說明
本項目的Deno代碼改編自:https://github.com/Timtech4u/deno-mcp-server