多传输协议MCP服务器

一个纯Go实现的多传输协议MCP服务器,用于学习MCP协议核心概念和不同传输机制(STDIO、HTTP、SSE)的实现细节。

  • by beiyu
  • Go
  • 本地部署
  • 更新于
在 GitHub 查看 beiyu/mcp_demo

使用说明

MCP演示-多传输协议支持

本项目演示了如何使用纯Go实现具有多种传输协议的模型上下文协议(MCP)服务器。 主要目的是通过在没有任何外部框架的情况下从头开始实现协议来理解MCP原理和交互细节。

🎯 项目目的

这是一个 以学习为导向的实施 设计用于:

  • 了解MCP协议:学习模型上下文协议的核心概念和消息流
  • 主协议详细信息:从头开始实现JSON-RPC 2.0和MCP规范
  • 探索运输机制:比较不同的传输协议(STDIO、HTTP、SSE)
  • 纯Go实现:无需外部依赖即可构建,以了解每一个细节

备注:这是一个专注于协议理解而非生产使用的教育项目。

📁 项目结构

mcp_demo/
├── cmd/                    # Different transport protocol entry points
│   ├── stdio/             # Standard Input/Output implementation
│   ├── http/              # HTTP transport implementation
│   └── sse/               # Server-Sent Events implementation
├── internal/mcp/          # Custom MCP protocol implementation
│   ├── types.go           # MCP protocol type definitions
│   └── server.go          # MCP server implementation
├── bin/                   # Compiled output directory
├── Makefile              # Build system
├── README.md             # English documentation
├── README-CN.md          # Chinese documentation
└── go.mod                # Go module definition

🚀 支持的传输协议

1.STDIO(标准输入/输出)

  • 目的:本地MCP服务器,命令行界面通信
  • 特性:实施最简单,适合本地工具集成
  • 端口:无(使用stdin/stdout)

2.HTTP(简单HTTP JSON-RPC)

  • 目的:基本远程访问,RESTful API风格
  • 特性:简单的请求-响应模式,易于测试和调试
  • 端口: 8080

3.SSE(服务器发送事件)

  • 目的:实时双向通信,服务器推送支持
  • 特性:基于HTTP的流式通信,持久连接
  • 端口: 8081

🛠️ 快速开始

构建所有版本

make all

构建特定版本

# Build STDIO version
make stdio

# Build HTTP version
make http

# Build SSE version
make sse

运行服务器

# Run STDIO server
make run-stdio

# Run HTTP server
make run-http

# Run SSE server
make run-sse

🧪 测试指导

STDIO测试

# Start server
./bin/mcp-stdio

# Send initialization message (via stdin)
{"jsonrpc":"2.0","method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test-client","version":"1.0.0"}},"id":1}

# Send calculator request
{"jsonrpc":"2.0","method":"tools/call","params":{"name":"calculate","arguments":{"operation":"add","x":5,"y":3}},"id":2}

HTTP测试

# Start server
./bin/mcp-http

# Test initialization
curl -X POST http://localhost:8080 \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test-client","version":"1.0.0"}},"id":1}'

# Test tool list
curl -X POST http://localhost:8080 \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","method":"tools/list","id":2}'

# Test calculator tool
curl -X POST http://localhost:8080 \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","method":"tools/call","params":{"name":"calculate","arguments":{"operation":"add","x":5,"y":3}},"id":3}'

SSE测试

# Start server
./bin/mcp-sse

# Open test page in browser
open http://localhost:8081

# Or test SSE connection with curl
curl -N -H "Accept: text/event-stream" http://localhost:8081/sse

📖 MCP协议概述

模型上下文协议(MCP)是一种开放协议,用于LLM应用程序与外部数据源和工具之间的无缝集成。

核心概念

  • JSON-RPC 2.0:所有消息都遵循JSON-RPC 2.0规范
  • 工具:AI模型执行的功能
  • 资源:供用户或人工智能模型使用的上下文和数据
  • 提示:模板消息和工作流

传输机制比较

功能 STDIO HTTP SSE
复杂性 低 中 高
实时 高 低 高
远程访问 否 是 是
双向 是 否 是
调试便利性 低 高 中
生产使用 本地工具 API服务 实时应用程序

🔧 开发指南

添加新工具

  1. 在适当的位置定义新工具 cmd/*/main.go 文件
  2. 使用 mcp.NewTool() 创建工具定义
  3. 使用 server.AddTool() 注册工具处理程序

扩展协议支持

  • 在 cmd/ 目录
  • 更新 Makefile 添加新的构建目标
  • 更新此README文档

💡 学习亮点

此实现有助于您理解:

  • JSON-RPC 2.0协议:如何实现请求/响应和通知模式
  • MCP消息流:初始化、能力协商、工具调用
  • 运输摘要:不同的协议如何携带相同的消息
  • 去并发:在SSE实施中处理多个连接
  • 协议设计:传输和应用程序逻辑之间的清晰分离

🛠️ 技术栈

  • 去:1.21+(纯标准库)
  • 协议版本:药品监督管理委员会2024-11-05
  • 依赖项:无(纯教育实施)

📝 许可证

MIT许可证

📚 参考文献