简单MCP服务器(HTTP和Stdio)
使用从头开始构建的轻量级模型上下文协议(MCP)服务器实现 包子该项目演示了如何在不依赖大量外部SDK的情况下构建MCP服务器,重点是理解核心协议流。
它支持两者 超文本传输协议 (通过POST实现类似SSE的行为)和 工作室 (标准输入/输出)传输,使其适用于使用以下工具进行测试 curl 或者与Claude Desktop等AI客户端集成。
🌟 主要特点
- 从头开始: 在没有官方MCP SDK的情况下构建,以演示协议在幕后的实际工作方式。
- 双重运输:
- HTTP: 简单 POST 端点,便于测试。 - 音乐节目 : 用于与MCP客户端集成的标准输入/输出(例如,Claude Desktop、IDE扩展)。
- 快速: 由Bun的原生高性能HTTP服务器提供支持。
- 简单: 最小的依赖关系,干净的架构。
📁 项目结构
.
├── index.ts # HTTP Server entry point (Bun.serve)
├── index-stdio.ts # Stdio Server entry point (Stdin/Stdout)
├── src/
│ ├── handler.ts # Core Protocol Logic (Router)
│ ├── jsonrpc.ts # JSON-RPC 2.0 Utilities
│ ├── types.ts # TypeScript Interfaces
│ └── tools/
│ ├── functions.ts # Actual Business Logic
│ └── tools.ts # Tool Definitions & Registry🚀 快速开始
1.先决条件
确保你有 包子 安装。
bun install2.在HTTP模式下运行
这将启动一个在端口3000上侦听的web服务器。
bun run index.ts卷曲测试:
# List tools
curl -X POST http://localhost:3000/mcp \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
# Call the greeting tool
curl -X POST http://localhost:3000/mcp \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"greeting_hello","arguments":{"username":"World"}}}'3.在标准模式下运行
此模式监听标准输入并写入标准输出,适用于管道或AI代理集成。
bun run index-stdio.ts手动测试: 键入此JSON并按Enter键:
{ "jsonrpc": "2.0", "id": 1, "method": "tools/list" }🧠 运作原理
服务器遵循一个简单的单向流:
- 传输层(
index.ts/index-stdio.ts): 接收原始消息(HTTP正文或Stdin行)。 - JSON解析: 将字符串转换为JSON对象。
- 协议处理程序(
src/handler.ts): 标识MCP方法(例如。,initialize,tools/call). - 工具注册表(
src/tools/tools.ts): 如果请求了工具调用,则查找相应的函数。 - 执行(
src/tools/functions.ts): 运行实际的业务逻辑。 - 答复(
src/jsonrpc.ts): 将结果格式化为标准化的JSON-RPC 2.0响应。
📚 文件分解
入口点
index.ts:设置Bun HTTP服务器。它处理CORS,一种健康检查(/healthz),以及主要/mcp终点。它将输入/输出记录到temp.txt用于调试。index-stdio.ts:设置用于收听的读线接口stdin。这对于客户端直接生成服务器进程的本地集成至关重要。
来源(src/)
src/handler.ts:手术的大脑。它出口handleMCPRequest其打开请求方法:
- initialize:与客户握手。 - tools/list:返回可用的工具定义。 - tools/call:执行特定工具。
src/tools/tools.ts:登记处。它将工具名称(字符串)映射到它们的可执行函数,并定义用于验证的Zod模式。src/tools/functions.ts:包含逻辑的纯函数。例如,getGreeting只返回一个格式化的字符串对象。src/jsonrpc.ts:帮助工厂确保所有响应严格遵循JSON-RPC 2.0格式({ jsonrpc: "2.0", result: ... }或错误对象)。src/types.ts:请求和响应的TypeScript定义,确保整个应用程序的类型安全。
🛠️ 可用工具
| 工具名称 | 描述 | 参数 |
|---|---|---|
greeting_hello | 返回问候信息。 | username (字符串) |
1.与人工智能客户端(Claude Desktop、IDE)集成
大多数符合MCP的客户端(如Claude Desktop)通过以下方式进行通信 工作室.
本地Stdio服务器(克劳德桌面)的配置: 将此添加到您的 claude_desktop_config.json:
{
"mcpServers": {
"my-bun-server": {
"command": "bun",
"args": ["run", "/ABSOLUTE/PATH/TO/PROJECT/index-stdio.ts"]
}
}
}_注:更换 /ABSOLUTE/PATH/TO/PROJECT 根据您的实际项目路径。_
远程HTTP MCP服务器的配置(Claude Desktop通过 mcp-remote): 如果您已将MCP服务器部署到远程HTTP端点(例如,无服务器功能),则可以使用 mcp-remote 将其连接到Claude Desktop。
将此添加到您的 claude_desktop_config.json:
{
"mcpServers": {
"serverless_lambda_mcp_server": {
"command": "npx",
"args": ["mcp-remote", "http://localhost:3200/mcp"]
}
}
}_确保 mcp-remote 全局安装或可在PATH中访问。_
