一个简单的工具,它将来自MCP客户端的输入代理到MCP服务器,并将输出返回给客户端。同时,该工具会逐行记录输入和输出到文件中,并使用前缀"in:"和"out:"来指示数据的方向,从而生成一个通常有效的YAML文件。
在每个"in:"之前,工具会打印---并换行,使得文件成为多文档YAML,因此通常每个请求/响应组合都会成为一个单独的文档。
这对于测试和排查MCP客户端和服务器的问题非常有用。
npm install -g @strowk/mcptee
从发布页面下载预构建的二进制文件,并将其放入你的PATH中。
go install github.com/strowk/mcptee@latest
mcptee <out-file> <command> [args...]
一些示例:
mcptee ./server_log.yaml mcp-k8s-go
mcptee ./server_log.yaml npx @strowk/mcp-k8s
你可能需要根据相应的客户端进行配置。例如,与Claude配合使用:
{
"mcpServers": {
"my_server": {
"command": "mcptee",
"args": ["/path/to/log_file.yaml", "npx", "my_mcp_server"]
}
}
}
如果你有一个正在Docker中运行的PostgreSQL服务器:
docker run --rm --name postgres-mcp-test -e POSTGRES_PASSWORD=thesecret -p 7777:5432 postgres:latest
并且你想用mcp-server-postgres来测试它(在另一个终端运行):
mcptee log.yaml npx @modelcontextprotocol/server-postgres postgres://postgres:thesecret@localhost:7777
现在依次发送这些内容:
{"jsonrpc":"2.0","id":0,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"testing","version":"0.0.1"}}}
{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}
{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"query", "arguments": {"sql": "SELECT datname FROM pg_database"} }}
你应该能在log.yaml文件中看到如下输出:
---
in: {"jsonrpc":"2.0","id":0,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"testing","version":"0.0.1"}}}
out: {"result":{"protocolVersion":"2024-11-05","capabilities":{"resources":{},"tools":{}},"serverInfo":{"name":"example-servers/postgres","version":"0.1.0"}},"jsonrpc":"2.0","id":0}
---
in: {"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}
out: {"result":{"tools":[{"name":"query","description":"Run a read-only SQL query","inputSchema":{"type":"object","properties":{"sql":{"type":"string"}}}}]},"jsonrpc":"2.0","id":1}
---
in: {"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"query", "arguments": {"sql": "SELECT datname FROM pg_database"} }}
out: {"result":{"content":[{"type":"text","text":"[\n {\n \"datname\": \"postgres\"\n },\n {\n \"datname\": \"template1\"\n },\n {\n \"datname\": \"template0\"\n }\n]"}],"isError":false},"jsonrpc":"2.0","id":1}