MCP(Model Context Protocol)是 Anthropic 推出的一种标准化协议,用于让 AI 模型(如 Copilot Agent)安全、高效地调用外部工具和服务。通过 MCP,你可以将数据库查询、API 调用、文件操作等能力暴露给 AI,使其具备"行动力"。
今日,随着MCP官方发布了Go SDK,AI的风终于吹到的go。本文将带你从零开始 ,使用官方 mcp Go SDK 编写一个简单的 MCP 服务器,实现 "获取当前时间" 和 "读取本地文件" 两个工具,并在 VS Code 中测试调用。
一、什么是 MCP?
MCP 是一种基于 JSON-RPC 2.0 的双向通信协议,运行在 stdio(标准输入输出) 或 HTTP 上。其核心概念包括:
- Tool(工具) :AI 可调用的函数,如
readFile
、listIssues
- Resource(资源):可被引用的数据,如文件内容、数据库记录
- Prompt(提示):提供上下文的文本片段
MCP 服务器启动后,会向客户端(如 VS Code)注册自己支持的工具,客户端在需要时发起调用。
二、准备工作
1. 创建项目
bash
mkdir mcp-demo && cd mcp-demo
go mod init mcp-demo
2. 安装官方 SDK
bash
go get github.com/modelcontextprotocol/go-sdk@latest
三、编写 MCP 服务器代码
创建 main.go
:
go
// main.go
package main
import (
"context"
"fmt"
"os"
"time"
"github.com/modelcontextprotocol/go-sdk/mcp"
"github.com/modelcontextprotocol/go-sdk/mcp/transport"
)
func main() {
// 创建 MCP 服务器
server := mcp.NewServer("mcp-demo", "1.0.0")
// 注册 "getCurrentTime" 工具
server.AddTool(mcp.Tool{
Name: "getCurrentTime",
Description: "获取当前时间(支持时区)",
InputSchema: map[string]interface{}{
"type": "object",
"properties": map[string]interface{}{
"timezone": map[string]interface{}{
"type": "string",
"description": "时区,如 'Asia/Shanghai',默认为本地时区",
"default": "Local",
},
},
"required": []string{},
},
Handler: func(ctx context.Context, args map[string]interface{}) (interface{}, error) {
tzName, _ := args["timezone"].(string)
loc := time.Local
if tzName != "" && tzName != "Local" {
var err error
loc, err = time.LoadLocation(tzName)
if err != nil {
return nil, fmt.Errorf("无效时区: %v", err)
}
}
now := time.Now().In(loc).Format("2006-01-02 15:04:05 MST")
return map[string]string{"time": now}, nil
},
})
// 注册 "readFile" 工具
server.AddTool(mcp.Tool{
Name: "readFile",
Description: "读取本地文本文件内容",
InputSchema: map[string]interface{}{
"type": "object",
"properties": map[string]interface{}{
"path": map[string]interface{}{
"type": "string",
"description": "文件路径(相对或绝对)",
},
},
"required": []string{"path"},
},
Handler: func(ctx context.Context, args map[string]interface{}) (interface{}, error) {
path, ok := args["path"].(string)
if !ok {
return nil, fmt.Errorf("缺少 path 参数")
}
// 安全限制:只允许读取当前目录及子目录
if !mcp.IsSubPath(".", path) {
return nil, fmt.Errorf("禁止访问上级目录")
}
content, err := os.ReadFile(path)
if err != nil {
return nil, fmt.Errorf("读取文件失败: %v", err)
}
return map[string]string{
"content": string(content),
"path": path,
}, nil
},
})
// 启动 stdio 传输(VS Code 默认通过 stdio 通信)
if err := transport.RunStdio(server); err != nil {
fmt.Fprintf(os.Stderr, "MCP 服务器启动失败: %v\n", err)
os.Exit(1)
}
}
代码说明:
mcp.NewServer
:创建服务器实例,指定名称和版本。AddTool
:注册工具,包含:Name
:工具唯一标识Description
:AI 理解用途的描述InputSchema
:JSON Schema 定义输入参数Handler
:实际执行逻辑
- 安全限制 :
readFile
使用mcp.IsSubPath
防止路径穿越(如../../../etc/passwd
)
transport.RunStdio
:通过标准输入输出与 VS Code 通信(最常用方式)
四、构建可执行文件
bash
go build -o mcp-demo .
生成 mcp-demo
(Linux/macOS)或 mcp-demo.exe
(Windows)。
五、在 VS Code 中注册 MCP 服务器
1. 创建 MCP 配置文件
在任意目录创建 mcp.json
(推荐放在项目根目录):
json
{
"servers": {
"mcp-demo": {
"command": "./mcp-demo"
}
}
}
💡 Windows 用户请写
"command": ".\\mcp-demo.exe"
2. 加载 MCP 服务器
- 打开 VS Code
- 按
Ctrl+Shift+P
(Windows/Linux)或Cmd+Shift+P
(Mac) - 输入
MCP: Open User Configuration
- 将上述
mcp.json
内容粘贴保存
VS Code 会自动启动你的 MCP 服务器,并在聊天工具列表中显示 getCurrentTime
和 readFile
。
六、测试调用
在 VS Code 的 Copilot Chat 中输入:
text
使用 getCurrentTime 工具获取上海当前时间
或
text
使用 readFile 工具读取 README.md 的内容
你将看到 AI 自动调用你的工具,并返回结构化结果!
总结
通过本文,你已掌握:
✅ 使用 Go SDK 创建 MCP 服务器
✅ 定义安全的工具(Tool)
✅ 在 VS Code 中注册并调用
✅ 防范路径穿越等安全风险
MCP 是连接 AI 与现实世界的桥梁。你可以用它集成:
-
内部 API 网关
-
数据库查询
-
企业知识库
现在,就去构建属于你自己的 AI 工具吧!🚀