🤖 Deno Model Context Protocol (MCP) Agent Template Repository
好的,这是用 Deno 实现的模板 Model Context Protocol (MCP) 服务器: ```typescript import { serve } from "https://deno.land/std@0.177.1/http/server.ts"; import { acceptWebSocket, isWebSocketCloseEvent, WebSocket, } from "https://deno.land/std@0.177.1/ws/mod.ts"; // 定义 MCP 消息类型 interface MCPMessage { type: string; data: any; } // 处理 WebSocket 连接 async function handleWebSocket(ws: WebSocket) { console.log("WebSocket connected"); try { for await (const event of ws) { if (typeof event === "string") { // 处理文本消息 try { const message: MCPMessage = JSON.parse(event); console.log("Received message:", message); // 根据消息类型进行处理 switch (message.type) { case "ping": // 响应 ping 消息 ws.send(JSON.stringify({ type: "pong" })); break; case "model_request": // 处理模型请求 const modelResponse = await processModelRequest(message.data); ws.send(JSON.stringify({ type: "model_response", data: modelResponse })); break; default: console.warn("Unknown message type:", message.type); ws.send(JSON.stringify({ type: "error", data: "Unknown message type" })); } } catch (error) { console.error("Error parsing message:", error); ws.send(JSON.stringify({ type: "error", data: "Invalid message format" })); } } else if (isWebSocketCloseEvent(event)) { // 处理 WebSocket 关闭事件 const { code, reason } = event; console.log("WebSocket closed:", code, reason); } } } catch (error) { console.error("Error handling WebSocket:", error); try { ws.close(1011, "Internal Server Error"); // 1011 表示服务器遇到了意外情况,阻止其完成请求。 } catch (_ignore) { // 忽略关闭错误,因为连接可能已经关闭 } } } // 模拟模型请求处理函数 async function processModelRequest(requestData: any): Promise<any> { // 在这里实现你的模型处理逻辑 console.log("Processing model request:", requestData); // 模拟延迟 await new Promise((resolve) => setTimeout(resolve, 500)); // 模拟模型响应 return { result: "Model processing successful", data: { input: requestData, output: "This is a simulated model output.", }, }; } // HTTP 请求处理函数 async function handleHttpRequest(request: Request): Promise<Response> { if (request.headers.get("upgrade") === "websocket") { // 处理 WebSocket 连接 const { socket, response } = Deno.upgradeWebSocket(request); handleWebSocket(socket); return response; } else { // 处理 HTTP 请求 return new Response("Hello, Deno! This is a Model Context Protocol server.", { headers: { "content-type": "text/plain" }, }); } } // 启动服务器 const port = 8080; console.log(`Server listening on port ${port}`); await serve(handleHttpRequest, { port }); ``` **代码解释:** 1. **导入必要的模块:** - `serve` 来自 `https://deno.land/std@0.177.1/http/server.ts` 用于启动 HTTP 服务器。 - `acceptWebSocket`, `isWebSocketCloseEvent`, `WebSocket` 来自 `https://deno.land/std@0.177.1/ws/mod.ts` 用于处理 WebSocket 连接。 2. **定义 `MCPMessage` 接口:** - 定义了 MCP 消息的结构,包含 `type` (字符串类型) 和 `data` (任意类型) 两个字段。 3. **`handleWebSocket(ws: WebSocket)` 函数:** - 处理 WebSocket 连接的逻辑。 - 使用 `for await (const event of ws)` 循环监听 WebSocket 事件。 - **处理文本消息 (`typeof event === "string"`):** - 使用 `JSON.parse(event)` 将文本消息解析为 `MCPMessage` 对象。 - 使用 `switch` 语句根据 `message.type` 进行不同的处理: - `ping`: 响应 `pong` 消息。 - `model_request`: 调用 `processModelRequest` 函数处理模型请求,并将响应发送回客户端。 - `default`: 处理未知消息类型,并发送错误消息。 - 使用 `try...catch` 块捕获 JSON 解析错误。 - **处理 WebSocket 关闭事件 (`isWebSocketCloseEvent(event)`):** - 记录关闭代码和原因。 - 使用 `try...catch` 块捕获 WebSocket 处理过程中的错误,并尝试关闭连接。 4. **`processModelRequest(requestData: any): Promise<any>` 函数:** - **模拟** 模型请求处理逻辑。 - 接受 `requestData` 作为输入。 - 使用 `await new Promise((resolve) => setTimeout(resolve, 500))` 模拟延迟。 - 返回一个包含 `result` 和 `data` 的模拟响应。 - **你需要根据你的实际模型处理逻辑替换此函数的内容。** 5. **`handleHttpRequest(request: Request): Promise<Response>` 函数:** - 处理 HTTP 请求的逻辑。 - **WebSocket 升级:** - 检查请求头中是否包含 `upgrade: websocket`。 - 如果是,则使用 `Deno.upgradeWebSocket(request)` 将 HTTP 连接升级为 WebSocket 连接。 - 调用 `handleWebSocket(socket)` 处理 WebSocket 连接。 - 返回 `response` 对象。 - **HTTP 请求处理:** - 如果不是 WebSocket 升级请求,则返回一个简单的 "Hello, Deno!" 响应。 6. **启动服务器:** - 定义服务器监听的端口号 `port = 8080`。 - 使用 `console.log` 打印服务器启动信息。 - 使用 `await serve(handleHttpRequest, { port })` 启动服务器,并传入 HTTP 请求处理函数和端口号。 **如何运行:** 1. **保存代码:** 将代码保存为 `mcp_server.ts` 文件。 2. **运行命令:** 在终端中运行以下命令: ```bash deno run --allow-net mcp_server.ts ``` - `--allow-net` 标志允许 Deno 程序访问网络。 **如何测试:** 你可以使用 WebSocket 客户端(例如 wscat 或 Postman)连接到服务器,并发送 MCP 消息进行测试。 **示例 WebSocket 客户端交互:** 1. **连接:** 连接到 `ws://localhost:8080`。 2. **发送 ping 消息:** ```json {"type": "ping"} ``` 3. **接收 pong 消息:** ```json {"type": "pong"} ``` 4. **发送模型请求消息:** ```json {"type": "model_request", "data": {"input_data": "example input"}} ``` 5. **接收模型响应消息:** ```json {"type": "model_response", "data": {"result": "Model processing successful", "data": {"input": {"input_data": "example input"}, "output": "This is a simulated model output."}}} ``` **重要提示:** - **替换 `processModelRequest` 函数:** 你需要根据你的实际模型处理逻辑替换 `processModelRequest` 函数的内容。 - **错误处理:** 在实际应用中,你需要添加更完善的错误处理机制。 - **安全性:** 在生产环境中,你需要考虑安全性问题,例如身份验证和授权。 - **依赖管理:** Deno 使用 URL 作为依赖项,因此你需要确保你的依赖项 URL 是正确的。 **中文翻译:** 好的,这是一个用 Deno 实现的模板模型上下文协议 (MCP) 服务器: ```typescript import { serve } from "https://deno.land/std@0.177.1/http/server.ts"; import { acceptWebSocket, isWebSocketCloseEvent, WebSocket, } from "https://deno.land/std@0.177.1/ws/mod.ts"; // 定义 MCP 消息类型 interface MCPMessage { type: string; data: any; } // 处理 WebSocket 连接 async function handleWebSocket(ws: WebSocket) { console.log("WebSocket 已连接"); try { for await (const event of ws) { if (typeof event === "string") { // 处理文本消息 try { const message: MCPMessage = JSON.parse(event); console.log("接收到的消息:", message); // 根据消息类型进行处理 switch (message.type) { case "ping": // 响应 ping 消息 ws.send(JSON.stringify({ type: "pong" })); break; case "model_request": // 处理模型请求 const modelResponse = await processModelRequest(message.data); ws.send(JSON.stringify({ type: "model_response", data: modelResponse })); break; default: console.warn("未知消息类型:", message.type); ws.send(JSON.stringify({ type: "error", data: "未知消息类型" })); } } catch (error) { console.error("解析消息时出错:", error); ws.send(JSON.stringify({ type: "error", data: "无效的消息格式" })); } } else if (isWebSocketCloseEvent(event)) { // 处理 WebSocket 关闭事件 const { code, reason } = event; console.log("WebSocket 已关闭:", code, reason); } } } catch (error) { console.error("处理 WebSocket 时出错:", error); try { ws.close(1011, "Internal Server Error"); // 1011 表示服务器遇到了意外情况,阻止其完成请求。 } catch (_ignore) { // 忽略关闭错误,因为连接可能已经关闭 } } } // 模拟模型请求处理函数 async function processModelRequest(requestData: any): Promise<any> { // 在这里实现你的模型处理逻辑 console.log("正在处理模型请求:", requestData); // 模拟延迟 await new Promise((resolve) => setTimeout(resolve, 500)); // 模拟模型响应 return { result: "模型处理成功", data: { input: requestData, output: "这是一个模拟的模型输出。", }, }; } // HTTP 请求处理函数 async function handleHttpRequest(request: Request): Promise<Response> { if (request.headers.get("upgrade") === "websocket") { // 处理 WebSocket 连接 const { socket, response } = Deno.upgradeWebSocket(request); handleWebSocket(socket); return response; } else { // 处理 HTTP 请求 return new Response("你好,Deno!这是一个模型上下文协议服务器。", { headers: { "content-type": "text/plain" }, }); } } // 启动服务器 const port = 8080; console.log(`服务器监听端口 ${port}`); await serve(handleHttpRequest, { port }); ``` **代码解释:** 1. **导入必要的模块:** - `serve` 来自 `https://deno.land/std@0.177.1/http/server.ts` 用于启动 HTTP 服务器。 - `acceptWebSocket`, `isWebSocketCloseEvent`, `WebSocket` 来自 `https://deno.land/std@0.177.1/ws/mod.ts` 用于处理 WebSocket 连接。 2. **定义 `MCPMessage` 接口:** - 定义了 MCP 消息的结构,包含 `type` (字符串类型) 和 `data` (任意类型) 两个字段。 3. **`handleWebSocket(ws: WebSocket)` 函数:** - 处理 WebSocket 连接的逻辑。 - 使用 `for await (const event of ws)` 循环监听 WebSocket 事件。 - **处理文本消息 (`typeof event === "string"`):** - 使用 `JSON.parse(event)` 将文本消息解析为 `MCPMessage` 对象。 - 使用 `switch` 语句根据 `message.type` 进行不同的处理: - `ping`: 响应 `pong` 消息。 - `model_request`: 调用 `processModelRequest` 函数处理模型请求,并将响应发送回客户端。 - `default`: 处理未知消息类型,并发送错误消息。 - 使用 `try...catch` 块捕获 JSON 解析错误。 - **处理 WebSocket 关闭事件 (`isWebSocketCloseEvent(event)`):** - 记录关闭代码和原因。 - 使用 `try...catch` 块捕获 WebSocket 处理过程中的错误,并尝试关闭连接。 4. **`processModelRequest(requestData: any): Promise<any>` 函数:** - **模拟** 模型请求处理逻辑。 - 接受 `requestData` 作为输入。 - 使用 `await new Promise((resolve) => setTimeout(resolve, 500))` 模拟延迟。 - 返回一个包含 `result` 和 `data` 的模拟响应。 - **你需要根据你的实际模型处理逻辑替换此函数的内容。** 5. **`handleHttpRequest(request: Request): Promise<Response>` 函数:** - 处理 HTTP 请求的逻辑。 - **WebSocket 升级:** - 检查请求头中是否包含 `upgrade: websocket`。 - 如果是,则使用 `Deno.upgradeWebSocket(request)` 将 HTTP 连接升级为 WebSocket 连接。 - 调用 `handleWebSocket(socket)` 处理 WebSocket 连接。 - 返回 `response` 对象。 - **HTTP 请求处理:** - 如果不是 WebSocket 升级请求,则返回一个简单的 "你好,Deno!" 响应。 6. **启动服务器:** - 定义服务器监听的端口号 `port = 8080`。 - 使用 `console.log` 打印服务器启动信息。 - 使用 `await serve(handleHttpRequest, { port })` 启动服务器,并传入 HTTP 请求处理函数和端口号。 **如何运行:** 1. **保存代码:** 将代码保存为 `mcp_server.ts` 文件。 2. **运行命令:** 在终端中运行以下命令: ```bash deno run --allow-net mcp_server.ts ``` - `--allow-net` 标志允许 Deno 程序访问网络。 **如何测试:** 你可以使用 WebSocket 客户端(例如 wscat 或 Postman)连接到服务器,并发送 MCP 消息进行测试。 **示例 WebSocket 客户端交互:** 1. **连接:** 连接到 `ws://localhost:8080`。 2. **发送 ping 消息:** ```json {"type": "ping"} ``` 3. **接收 pong 消息:** ```json {"type": "pong"} ``` 4. **发送模型请求消息:** ```json {"type": "model_request", "data": {"input_data": "example input"}} ``` 5. **接收模型响应消息:** ```json {"type": "model_response", "data": {"result": "模型处理成功", "data": {"input": {"input_data": "example input"}, "output": "这是一个模拟的模型输出。"}}} ``` **重要提示:** - **替换 `processModelRequest` 函数:** 你需要根据你的实际模型处理逻辑替换 `processModelRequest` 函数的内容。 - **错误处理:** 在实际应用中,你需要添加更完善的错误处理机制。 - **安全性:** 在生产环境中,你需要考虑安全性问题,例如身份验证和授权。 - **依赖管理:** Deno 使用 URL 作为依赖项,因此你需要确保你的依赖项 URL 是正确的。 This provides a basic template. Remember to replace the placeholder `processModelRequest` function with your actual model processing logic. Also, consider adding more robust error handling and security measures for production use.
phughesmcr
README
推荐服务器
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
MCP Package Docs Server
促进大型语言模型高效访问和获取 Go、Python 和 NPM 包的结构化文档,通过多语言支持和性能优化来增强软件开发。
Claude Code MCP
一个实现了 Claude Code 作为模型上下文协议(Model Context Protocol, MCP)服务器的方案,它可以通过标准化的 MCP 接口来使用 Claude 的软件工程能力(代码生成、编辑、审查和文件操作)。
@kazuph/mcp-taskmanager
用于任务管理的模型上下文协议服务器。它允许 Claude Desktop(或任何 MCP 客户端)在基于队列的系统中管理和执行任务。
mermaid-mcp-server
一个模型上下文协议 (MCP) 服务器,用于将 Mermaid 图表转换为 PNG 图像。
Jira-Context-MCP
MCP 服务器向 AI 编码助手(如 Cursor)提供 Jira 工单信息。

Linear MCP Server
一个模型上下文协议(Model Context Protocol)服务器,它与 Linear 的问题跟踪系统集成,允许大型语言模型(LLM)通过自然语言交互来创建、更新、搜索和评论 Linear 问题。

Sequential Thinking MCP Server
这个服务器通过将复杂问题分解为顺序步骤来促进结构化的问题解决,支持修订,并通过完整的 MCP 集成来实现多条解决方案路径。
Curri MCP Server
通过管理文本笔记、提供笔记创建工具以及使用结构化提示生成摘要,从而实现与 Curri API 的交互。