这是使用AI构建的
模拟MCP服务器
一个用Go编写的基于HTTP的流式模型上下文协议(MCP)服务器,用于模拟工具调用以进行测试和开发。
特性
- HTTP/HTTPS支持:MCP协议的标准HTTP POST请求
- 流媒体支持:用于流式响应的服务器发送事件(SSE)
- WebSocket支持:完全支持WebSocket双向通信
- 模拟工具:用于测试的预配置模拟工具
- 动态工具管理:通过编辑YAML文件在运行时添加/删除工具
- 热重新加载:当YAML配置文件更改时自动重新加载工具
- 可扩展:通过YAML配置轻松添加自定义模拟工具
安装
go mod download运行服务器
go run ./cmd/mock-mcp/main.go或者构建并运行:
go build -o bin/mock-mcp-server ./cmd/mock-mcp
./bin/mock-mcp-server默认情况下,服务器将在端口8080上启动。
配置文件
服务器使用YAML配置文件(config/tools.yaml 默认情况下)来管理工具。您可以使用以下命令指定自定义路径 TOOLS_CONFIG 环境变量:
TOOLS_CONFIG=/path/to/custom-tools.yaml go run ./cmd/mock-mcp/main.go服务器会自动监视配置文件,并在检测到更改时重新加载工具。无需重新启动!
GitHub存储库同步
您可以填充 config/ 和 testcases/ 通过设置GitHub存储库中的目录 GITHUB_REPO_URL 环境变量。服务器将在启动时自动克隆或从存储库中提取最新更改。
用途:
GITHUB_REPO_URL=https://github.com/Jimbo4794/mcp-testcases go run ./cmd/mock-mcp/main.go或者用更短的格式:
GITHUB_REPO_URL=Jimbo4794/mcp-testcases go run ./cmd/mock-mcp/main.go私有存储库访问:
要从私有GitHub存储库同步,请提供您的GitHub用户名和个人访问令牌:
GITHUB_REPO_URL=https://github.com/user/private-repo \
GITHUB_USERNAME=your-username \
GITHUB_TOKEN=ghp_your_personal_access_token \
go run ./cmd/mock-mcp/main.go注: 令牌应该是具有适当存储库访问权限的GitHub个人访问令牌(PAT)。令牌从不记录,仅用于git操作期间的身份验证。
它是如何工作的:
- 启动时,如果
GITHUB_REPO_URL设置后,服务器将:
- 克隆存储库(如果尚未缓存)或提取最新更改 - 寻找 tools.yaml 在指定的路径上 GITHUB_TOOLS_CONFIG_PATH (默认值: config/tools.yaml) - 在指定的路径中查找测试用例 GITHUB_TESTCASES_PATH (默认值: testcases) - 复制 tools.yaml 文件从存储库到本地缓存 - 复制 testcases/ 从仓库到本地缓存的目录 - 将同步文件用于配置和测试用例
- 存储库在本地缓存在系统临时目录中,因此后续运行将拉取更新,而不是克隆新的。
- 存储库必须具有
tools.yaml文件位于指定的路径GITHUB_TOOLS_CONFIG_PATH(默认值:config/tools.yaml)和/或位于指定路径的testcases目录GITHUB_TESTCASES_PATH(默认值:testcases).
Docker示例:
对于公共存储库:
docker run -d \
--name mock-mcp-server \
-p 8080:8080 \
-e GITHUB_REPO_URL=https://github.com/Jimbo4794/mcp-testcases \
mock-mcp-server:latest对于私有存储库:
docker run -d \
--name mock-mcp-server \
-p 8080:8080 \
-e GITHUB_REPO_URL=https://github.com/user/private-repo \
-e GITHUB_USERNAME=your-username \
-e GITHUB_TOKEN=ghp_your_personal_access_token \
mock-mcp-server:latest注: Docker镜像包括 git 支持GitHub同步功能。
GitHub Webhook集成
启用GitHub同步后,服务器会自动公开一个可以接收GitHub推送事件的webhook端点。当更改被推送到 config/ 或 testcases/ 在存储库中的目录中,服务器将自动同步最新更改。
设置GitHub Webhooks:
- 在您的GitHub存储库中,转到 设置 → 网络钩子 → 添加webhook
- 设置 有效载荷URL 致:
http://your-server:8080/webhook/github - 集 内容类型 致:
application/json - 选择 只是推送事件 (或个别事件→ push)
- (可选)设置 秘密 并将其配置为
GITHUB_WEBHOOK_SECRET环境变量 - 点击 添加webhook
Webhook安全:
对于生产使用,建议启用webhook签名验证:
GITHUB_REPO_URL=https://github.com/Jimbo4794/mcp-testcases \
GITHUB_WEBHOOK_SECRET=your-secret-here \
go run ./cmd/mock-mcp/main.gowebhook密钥应与GitHub webhook设置中配置的密钥相匹配。如果 GITHUB_WEBHOOK_SECRET 未设置,webhook签名验证已禁用(对开发/测试有用)。
它是如何工作的:
- 当收到推送事件时,webhook处理程序会检查中是否有任何文件
config/或testcases/已修改 - 如果检测到相关更改,则会触发存储库同步
- 服务器提取最新更改并更新本地缓存
- 如果发生以下情况,工具管理器会自动重新加载工具
tools.yaml已修改(通过文件监视)
使用Webhook的Docker示例:
docker run -d \
--name mock-mcp-server \
-p 8080:8080 \
-e GITHUB_REPO_URL=https://github.com/Jimbo4794/mcp-testcases \
-e GITHUB_WEBHOOK_SECRET=your-secret-here \
mock-mcp-server:latest注: 确保您的服务器可以从GitHub的webhook服务器访问。对于本地开发,您可能需要使用以下服务 吸烟 暴露您的本地服务器。
码头工人
构建Docker镜像
docker build -t mock-mcp-server:latest .使用Docker运行
使用Docker运行
docker run -d \
--name mock-mcp-server \
-p 8080:8080 \
-v $(pwd)/config:/app/config:ro \
-v $(pwd)/testcases:/app/testcases:ro \
-e TOOLS_CONFIG=/app/config/tools.yaml \
mock-mcp-server:latest使用Docker Compose(推荐)
docker-compose up -d这将:
- 如果需要,构建图像
- 用适当的容量支架启动容器
- 安装
./config到/app/config(只读) - 安装
./testcases到/app/testcases(只读) - 暴露端口8080
停止:
docker-compose down卷装载
Docker安装程序装载两个卷:
- 配置卷:
./config→/app/config
- 包含 tools.yaml 带有工具定义 - 为安全起见,以只读方式安装 - 更改为 tools.yaml 自动检测并重新加载
- 测试用例数量:
./testcases→/app/testcases
- 包含所有测试用例YAML文件 - 以只读方式安装 - 测试用例从该目录加载
自定义卷路径
您可以在中自定义卷路径 docker-compose.yml:
volumes:
- /path/to/your/config:/app/config:ro
- /path/to/your/testcases:/app/testcases:ro环境变量
TOOLS_CONFIG:工具配置文件的路径(默认:/app/config/tools.yaml)GITHUB_REPO_URL:GitHub存储库URL,用于同步配置和测试用例(例如。,https://github.com/user/repo或user/repo)GITHUB_USERNAME:(可选)用于访问私有存储库的GitHub用户名GITHUB_TOKEN:(可选)用于访问私有存储库的GitHub个人访问令牌(PAT)。需要时GITHUB_USERNAME已设置。GITHUB_TOOLS_CONFIG_PATH:(可选)相对于GitHub存储库根目录的tools.yaml文件的路径(默认值:config/tools.yaml)GITHUB_TESTCASES_PATH:(可选)相对于GitHub存储库根目录的testcases目录路径(默认:testcases)GITHUB_WEBHOOK_SECRET:(可选)用于验证GitHub webhook签名的密钥。如果未设置,则禁用签名验证。
健康检查
该容器包括一个健康检查,用于监控 /health 终点。您可以检查容器状态:
docker ps项目结构
mock-mcp/
├── cmd/
│ └── mock-mcp/ # Application entry point
│ └── main.go
├── internal/
│ └── mcp/ # Internal MCP server package
│ ├── types.go # Type definitions
│ ├── server.go # HTTP server and MCP protocol handlers
│ ├── tools.go # Tool management and YAML loading
│ ├── testcases.go # Test case loading and matching
│ ├── github_sync.go # GitHub repository sync functionality
│ └── webhook.go # GitHub webhook handler for auto-sync
├── config/
│ └── tools.yaml # Tool definitions
├── testcases/ # Test case YAML files
│ ├── mock_echo-test-case-1.yaml
│ ├── mock_calculator-test-case-1.yaml
│ └── ...
├── scripts/ # Utility scripts
│ └── example.sh # Example test script
├── bin/ # Build output (gitignored)
├── Dockerfile # Docker build configuration
├── docker-compose.yml # Docker Compose configuration
├── Makefile # Build automation
├── go.mod
├── go.sum
└── README.md端点
POST /mcp-标准MCP协议端点GET /mcp?stream=true-流式MCP端点(服务器发送事件)WS /mcp-WebSocket MCP端点GET /health-健康检查端点POST /webhook/github-GitHub webhook端点(仅在以下情况下可用GITHUB_REPO_URL已设置)
用法示例
初始化MCP连接
curl -X POST http://localhost:8080/mcp \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2024-11-05",
"capabilities": {},
"clientInfo": {
"name": "test-client",
"version": "1.0.0"
}
}
}'列出可用工具
curl -X POST http://localhost:8080/mcp \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/list"
}'调用模拟工具
curl -X POST http://localhost:8080/mcp \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "mock_echo",
"arguments": {
"message": "Hello, MCP!"
}
}
}'流媒体工具调用
curl -X POST http://localhost:8080/mcp?stream=true \
-H "Content-Type: application/json" \
-H "Accept: text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 4,
"method": "tools/call",
"params": {
"name": "mock_calculator",
"arguments": {
"operation": "add",
"a": 10,
"b": 5
}
}
}'可用的模拟工具
mock_echo
回显输入消息。
参数:
message(string,必填):要回显的消息
例子:
{
"name": "mock_echo",
"arguments": {
"message": "Hello, World!"
}
}模拟计算器
执行基本算术运算。
参数:
operation(string,必填):要执行的操作(加、减、乘、除)a(数字,必填):第一个数字b(数字,必填):第二个数字
例子:
{
"name": "mock_calculator",
"arguments": {
"operation": "multiply",
"a": 6,
"b": 7
}
}mock_delay
模拟延迟操作。
参数:
seconds(number,必填):延迟秒数
例子:
{
"name": "mock_delay",
"arguments": {
"seconds": 2
}
}mock_greeter
用多种语言直呼某人的名字。
参数:
name(string,必填):要问候的人的名字language(string,可选):问候语的语言(en,es,fr,de)。默认为“en”
例子:
{
"name": "mock_greeter",
"arguments": {
"name": "Alice",
"language": "es"
}
}YAML配置
可以通过编辑来动态添加、删除或修改工具 tools.yaml 文件。服务器会自动监视更改并重新加载工具,而无需重新启动。
配置文件格式
tools:
- name: my_tool
description: "Description of my tool"
defaultTestCase: 1 # Optional: Use test-case-1.yaml as default if no match found (0 = no default, omit to disable)
inputSchema:
type: object
properties:
param1:
type: string
description: "Parameter description"
required:
- param1默认测试用例配置
通过设置,您可以配置在找不到匹配的测试用例时使用哪个测试用例作为回退 defaultTestCase 在工具定义中:
defaultTestCase: 0或省略-无默认值,如果找不到匹配项,则返回错误defaultTestCase: 1-使用tool-name-test-case-1.yaml默认defaultTestCase: 2-使用tool-name-test-case-2.yaml默认- 等等
例子:
tools:
- name: mock_calculator
description: "Performs basic arithmetic operations"
defaultTestCase: 1 # Use test-case-1.yaml as default for unmatched inputs
inputSchema:
# ... schema definition当您想为不匹配任何特定测试用例的输入提供通用响应时,这很有用。
配置示例
看 config/tools.yaml 查看所有可用工具的完整示例。
添加新工具
- 编辑
tools.yaml并添加您的工具定义:
tools:
- name: my_new_tool
description: "My new tool"
inputSchema:
type: object
properties:
input:
type: string
description: "Input parameter"
required:
- input- 保存文件-服务器将自动重新加载工具。
- 在中添加执行逻辑
executeMockTool()功能在main.go:
case "my_new_tool":
input, _ := args["input"].(string)
return ToolResult{
Content: []ContentBlock{
{
Type: "text",
Text: fmt.Sprintf("Processed: %s", input),
},
},
}- 重建服务器(仅在执行逻辑更改时需要):
go build -o mock-mcp-server main.go移除工具
只需从中删除工具条目 tools.yaml 并保存。该工具将自动从服务器中删除。
测试用例
服务器使用YAML测试用例文件为工具调用提供预先录制的响应。工具不是执行代码,而是返回来自匹配测试用例文件的响应。
测试用例文件格式
测试用例文件已命名 -test-case-X.yaml 哪里 X 是一个数字(1、2、3等)。例如:
mock_echo-test-case-1.yamlmock_calculator-test-case-2.yamlmock_greeter-test-case-3.yaml
每个测试用例文件包含:
input:
param1: "value1"
param2: 42
response:
content:
- type: text
text: "Response text here"
isError: false如何匹配测试用例
- 服务器在中搜索测试用例文件
testcases/目录(相对于配置文件位置) - 它按顺序(1、2、3、…)尝试测试用例,最多100个
- 对于每个测试用例,它比较
input带有实际工具调用参数的部分 - 使用第一个匹配测试用例
- 如果没有找到匹配项,则返回到
test-case-1.yaml默认值(如果存在) - 如果不存在测试用例,则返回错误
示例测试用例
文件: mock_echo-test-case-1.yaml
input:
message: "Hello, World!"
response:
content:
- type: text
text: "Echo: Hello, World!"
isError: false当调用工具时 {"message": "Hello, World!"},此测试用例将匹配并返回预先录制的响应。
创建测试用例
- 创建一个名为的YAML文件
-test-case-X.yaml在testcases/目录 - 定义
input带有预期论点的部分 - 定义
response具有所需输出的部分 - 保存文件-无需重新启动!
多个测试用例
您可以为同一工具创建多个测试用例来处理不同的输入场景:
mock_calculator-test-case-1.yaml-用于添加mock_calculator-test-case-2.yaml-用于乘法mock_calculator-test-case-3.yaml-除以零误差
服务器将根据输入参数自动匹配适当的测试用例。
协议
此服务器实现了模型上下文协议(MCP)规范。所有请求和响应都遵循JSON-RPC 2.0格式。
请求格式
{
"jsonrpc": "2.0",
"id": ,
"method": "",
"params": { ... }
}响应格式
{
"jsonrpc": "2.0",
"id": ,
"result": { ... }
}或者,如果出现错误:
{
"jsonrpc": "2.0",
"id": ,
"error": {
"code": ,
"message": ""
}
}发展
添加自定义模拟工具
推荐方法(YAML配置):
注: 服务器不再执行工具的代码。所有工具响应都来自YAML测试用例文件。这使得以下操作变得容易:
- 在不更改代码的情况下测试不同的场景
- 版本控制测试用例
- 跨环境共享测试用例
- 修改响应而不重建
工作流摘要
- 定义工具 在
tools.yaml-指定工具名称、描述和输入模式 - 创建测试用例 作为
-test-case-X.yaml文件-定义输入/输出对 - 呼叫工具 通过MCP API-服务器自动匹配测试用例的输入,并返回预先确定的响应
添加新工具或测试用例时不需要更改代码或重建代码!
许可证
麻省理工学院
