使用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 可调用的函数,如 readFilelistIssues
  • 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 服务器,并在聊天工具列表中显示 getCurrentTimereadFile


六、测试调用

在 VS Code 的 Copilot Chat 中输入:

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

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

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


总结

通过本文,你已掌握:

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

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

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

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

相关文章
|
2月前
|
人工智能 运维 自然语言处理
2026年阿里云上OpenClaw(Clawdbot)零基础一键部署及接入skills简易教程
在AI智能体技术飞速普及的2026年,OpenClaw(原Clawdbot、Moltbot)凭借“开源可控、轻量化部署、全场景适配”的核心优势,成为个人与轻量团队打造专属AI助手的首选工具。它的核心价值的在于打破传统AI“只会对话不会执行”的局限——通过标准化的Skills(技能)生态,赋予AI“动手能力”,使其能够完成网页浏览、信息检索、邮件管理、文件处理等具象化任务,真正实现“聊天框里办大事”。
793 3
|
1月前
|
Shell C++ iOS开发
VS Code 如何更改默认终端?4种方法详解
本文详解VS Code中切换默认终端的4种方法:命令面板快速设置、启动配置文件图标直观操作、终端内命令即时切换、设置UI持久化配置,并附常见问题解答,助你高效定制开发环境。(239字)
568 1
|
1月前
|
机器学习/深度学习 存储 人工智能
横扫11项榜单SOTA:高性能、全尺寸、超高效的多语嵌入模型F2LLM-v2来了
F2LLM-v2问世,支持超200种语言,问鼎11项MTEB榜单,以全尺寸、全透明、全开源的姿态推动AI技术走向全球普惠。
301 0
|
2月前
|
人工智能 自然语言处理 前端开发
AI Agent系列|深入解析Function Calling、MCP和Skills的本质差异与最佳实践
本系列文章基于 Lynxe 作者沈询的实战经验,深入浅出解析 ReAct Agent 的核心原理与工程价值,帮助开发者快速掌握从“写流程”到“造智能体”的关键跃迁。
|
20天前
|
数据采集 人工智能 IDE
阿里云Coding Plan详解、订阅价格、售罄解决方法及常见问题解答FAQ,你关心的问题都在这!
阿里云Coding Plan是百炼推出的AI编程套餐,CodingPlan官网:https://t.aliyun.com/U/G7pldC 月付200元(首月39.9元),含9万次API调用额度,支持Qwen、GLM、Kimi等主流模型及Cursor、Claude Code等工具。仅Pro套餐开放,固定月费、用完即停、不转按量计费。严禁共享Key、自动化调用或非编程用途。
|
2月前
|
缓存 Rust JavaScript
更快、更安全、更现代:用 uvx 替代 npx 执行临时 CLI 工具
`uvx` 是超快、安全、跨语言的 CLI 工具运行器(来自 Rust 编写的 `uv`),支持 Python/Node.js/Rust/Go 等生态,无需预装环境,自动隔离缓存,速度比 `npx` 快 3–5 倍,真正实现“Just run it”。
615 1
|
2月前
|
人工智能 开发框架 数据可视化
谷歌推出新一代AI开发框架Genkit: Go 入门指南:用 Go 轻松构建 AI 应用
Genkit 是 Google Firebase 推出的开源 AI 应用框架,支持 Go、JS、Python。Genkit Go 为纯 Go 实现,统一接入 Gemini/OpenAI/Vertex AI,内置可视化调试、类型安全结构化生成,专为生产环境设计,5 分钟即可启动首个 AI 应用。
586 3
|
2月前
|
IDE API 数据库
FastAPI + SQLModel 实战:标准项目结构下,一个模型搞定数据库与 API
SQLModel 实现“一模型双用”:单个类同时作为数据库表与 Pydantic API 模型,天然支持字段校验、类型提示、OpenAPI 文档生成,彻底消除重复定义,提升开发效率与一致性。(239字)
354 4
|
2月前
|
JSON 编解码 Go
Go 新一代网络请求resty!,比net/http好用10倍
resty 是 Go 语言高性能 HTTP 客户端,比 net/http 简洁 10 倍、比 axios 更 Go 风。零依赖、支持链式调用、自动 JSON 编解码、重试/拦截器/Mock/文件上传下载等,Go 1.18+ 可用,一行代码发起请求,大幅提升开发效率与可维护性。(239 字)
253 1