使用MCP官方 Go SDK实现自己的MCP server

简介: MCP(Model Context Protocol)是Anthropic推出的标准化协议,让AI安全调用外部工具。本文带你用官方Go SDK从零实现MCP服务器,支持“获取当前时间”和“读取本地文件”两个工具,并在VS Code中快速测试调用。(239字)

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. 创建项目

mkdir mcp-demo && cd mcp-demo
go mod init mcp-demo

2. 安装官方 SDK

go get github.com/modelcontextprotocol/go-sdk@latest

三、编写 MCP 服务器代码

创建 main.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)
    }
}

代码说明:

  1. mcp.NewServer:创建服务器实例,指定名称和版本。
  2. AddTool:注册工具,包含:
    • Name:工具唯一标识
    • Description:AI 理解用途的描述
    • InputSchema:JSON Schema 定义输入参数
    • Handler:实际执行逻辑
  3. 安全限制:
    • readFile 使用 mcp.IsSubPath 防止路径穿越(如 ../../../etc/passwd)
  4. transport.RunStdio:通过标准输入输出与 VS Code 通信(最常用方式)

四、构建可执行文件

go build -o mcp-demo .

生成 mcp-demo(Linux/macOS)或 mcp-demo.exe(Windows)。


五、在 VS Code 中注册 MCP 服务器

1. 创建 MCP 配置文件

在任意目录创建 mcp.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 中输入:

使用 getCurrentTime 工具获取上海当前时间

或

使用 readFile 工具读取 README.md 的内容

你将看到 AI 自动调用你的工具,并返回结构化结果!


总结

通过本文,你已掌握:

✅ 使用 Go SDK 创建 MCP 服务器
✅ 定义安全的工具(Tool)
✅ 在 VS Code 中注册并调用
✅ 防范路径穿越等安全风险

MCP 是连接 AI 与现实世界的桥梁。你可以用它集成:

  • 内部 API 网关
  • 数据库查询
  • 企业知识库

现在,就去构建属于你自己的 AI 工具吧!🚀

相关文章
|
8月前
|
存储 API 数据库
投稿 | Zvec: 开箱即用、高性能的嵌入式向量数据库
Zvec 是一款开源(Apache 2.0)轻量级嵌入式向量数据库,专为终端侧设计,具备开箱即用、资源可控、极致性能与完整向量能力四大优势,支持标量-向量混合查询、CRUD、崩溃恢复等生产级特性,让端侧RAG如SQLite般简单可靠。(239字)
1405 7
|
7月前
|
人工智能 JavaScript 编译器
AI工具的“超级外挂”:从零手把手教你搭建私人 MCP 服务器
本文手把手教你用Node.js从零搭建私人MCP(模型上下文协议)服务器,解决AI无法直接访问本地文件、数据库等痛点。含环境配置、TypeScript编译避坑、Hello World工具开发及Inspector调试全流程,助你赋予AI真实行动力!
1968 1
AI工具的“超级外挂”:从零手把手教你搭建私人 MCP 服务器
|
6月前
|
人工智能 自然语言处理 安全
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
本文介绍了Claude Code终端AI助手的使用指南,主要内容包括:1)常用命令如版本查看、项目启动和更新;2)三种工作模式切换及界面说明;3)核心功能指令速查表,包含初始化、压缩对话、清除历史等操作;4)详细解析了/init、/help、/clear、/compact、/memory等关键命令的使用场景和语法。文章通过丰富的界面截图和场景示例,帮助开发者快速掌握如何通过命令行和交互界面高效使用Claude Code进行项目开发,特别强调了CLAUDE.md文件作为项目知识库的核心作用。
51395 73
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
|
6月前
|
人工智能 JSON Java
上下文协议(MCP)Java SDK 使用指南
到目前为止,我们已经具备了测试 MCP 交互和核心概念所需的全部组件。
727 0
|
人工智能 JavaScript 前端开发
用 Go 语言轻松构建 MCP 服务器
本文介绍了使用 Go 语言构建 MCP 服务器的完整过程,涵盖创建服务器实例、注册工具、资源和提示词,以及通过 stdio 和 sse 模式启动服务的方法,帮助开发者快速集成 LLM 应用与外部系统。
|
8月前
|
人工智能 运维 自然语言处理
2026年阿里云上OpenClaw(Clawdbot)零基础一键部署及接入skills简易教程
在AI智能体技术飞速普及的2026年,OpenClaw(原Clawdbot、Moltbot)凭借“开源可控、轻量化部署、全场景适配”的核心优势,成为个人与轻量团队打造专属AI助手的首选工具。它的核心价值的在于打破传统AI“只会对话不会执行”的局限——通过标准化的Skills(技能)生态,赋予AI“动手能力”,使其能够完成网页浏览、信息检索、邮件管理、文件处理等具象化任务,真正实现“聊天框里办大事”。
1109 3

热门文章

最新文章