Inside MCP: 开发者指南 —— 开发第一个 MCP 服务器
引言
前面几篇文章,我们聊过 MCP 是什么、它如何连接系统,以及它怎样让智能体具备执行工作流的能力。今天我们不再停留在概念层面,而是动手实践。
这篇文章会带你从零开始,构建一个最简单的 MCP Server,并学会如何测试和调试它。
构建你的第一个 MCP Server
MCP Server 的作用,就是把一个系统(数据库、API 或其他服务)“包装”起来,让智能体能通过统一的协议访问它。大致可以分三步:
- 确定功能:服务器应该提供什么能力?(比如列出文件、读取数据)
- 实现接口:用 MCP 协议把这些能力暴露出来。
- 运行并测试:确认智能体或者工具能够真正调用到。
示例项目:用 Go 实现的文件系统 MCP Server
我在 GitHub 上放了一个完整示例:
👉 inside-mcp/cmd/first/main.go
你可以这样运行它:
# 克隆项目
git clone https://github.com/tendant/inside-mcp.git
cd inside-mcp/cmd/first
# 启动服务器(默认使用当前目录作为根目录)
go run .
# 或者指定一个自定义目录
MCP_FS_ROOT=/path/to/folder go run .
这样,一个最基础的文件浏览服务就跑起来了。
测试与调试 MCP Server
MCP 基于 JSON-RPC 协议,通过 stdio 与客户端通信。下面介绍几种常用的测试方法。
1. 编译服务器
go build cmd/first/main.go -o first
2. 安装测试工具 mcptools
go install github.com/f/mcptools/cmd/mcptools@latest
3. 探索服务器提供的工具
mcptools tools ./first
mcptools call list_resources ./first
你会看到服务器暴露出的工具,并且可以直接调用它们。
4. 直接发送 JSON(可选)
如果你想更底层地测试,可以直接发送 JSON 请求:
echo '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "list_roots",
"arguments": {}
}
}' | ./first
5. 写单元测试(Go 代码)
func TestListResources(t *testing.T) {
args := ResourceParams{Path: "."}
res, data, err := listResources(context.Background(), nil, args)
if err != nil {
t.Fatal(err)
}
if len(data.([]string)) == 0 {
t.Fatal("expected files, got none")
}
}
这样可以直接验证逻辑是否正常工作。
6. 在 Claude Desktop 中使用
Claude Desktop 原生支持 MCP。只需要配置一下:
-
打开配置文件:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%AppData%/Claude/claude_desktop_config.json
- macOS:
-
添加一段配置:
{ "mcpServers": { "filesystem": { "command": "/absolute/path/to/first" } } }把
/absolute/path/to/first替换成你刚才编译好的二进制文件路径。 -
重启 Claude Desktop。
然后你就可以直接和 Claude 说:
“把我 home 目录下的文件列出来。”
Claude 会通过 MCP 调用 list_resources,并把结果展示给你。
总结
搭建 MCP 集成其实并不复杂:
- 用 Go + MCP SDK 写一个最简单的服务器。
- 跑起来,让它暴露出一个系统。
- 用
mcptools、JSON 或者单元测试验证功能。 - 接入 Claude Desktop,看看真实的智能体如何使用它。
有了这个起点,你就能逐步扩展自己的 MCP Server,接入更多系统,支持更复杂的工作流。