摘要:今天,ThinkInAI 团队(前身为 GoCN 团队)自豪地宣布,基于 Go 语言的大模型交互协议(Model Context Protocol)SDK —— Go-MCP 正式开源!
作者 l 张毓 & ThinkInAI 团队
今天,ThinkInAI 团队(前身为 GoCN 团队)自豪地宣布,基于 Go 语言的大模型交互协议(Model Context Protocol)SDK —— Go-MCP 正式开源!
什么是 MCP?为什么我们需要它?
在大语言模型(LLM)时代,模型与外部系统之间的连接方式正在经历深刻变革。Model Context Protocol(MCP)正是在这一背景下应运而生的开放通信协议,旨在通过标准化手段,构建起 LLM 与外部数据资源、可调用工具之间的桥梁,从而让 AI 应用更易构建、更强交互,彻底改变 AI 工具的连接方式以及它们与现实世界的交互范式。
那么,什么是 MCP?我们为什么需要它?
MCP(模型上下文协议)是一种标准化的通信协议,专为 AI 工具(如聊天机器人、代码助手、AI Agent 等)与外部系统的集成而设计。它为 AI 引入了“使用工具”的能力框架,使其不仅能理解自然语言,还能主动调用系统资源、访问数据或执行操作。MCP Server 的出现,正在重塑 AI 的能力边界,使其从单纯的对话机器演化为能够完成实际任务的智能助手。在 MCP 出现之前,开发者若希望让 AI 工具访问 Gmail、Google Drive 或天气 API 等外部系统,通常需要为每个集成单独编写定制逻辑,硬编码对每一个 API 的连接方式。这不仅增加了开发成本,也阻碍了 AI 工具的可扩展性与通用性。而 MCP 的核心价值,在于为模型与系统之间的通信建立统一标准,降低接入门槛、提升开发效率。它正如 HTTP 之于 Web 应用,是支撑智能系统互联互通的基础协议之一。
简单来说,MCP 把过去“一个模型对一个系统”的烟囱式集成,变成了“多模型对多能力”的标准化连接网络。这是推动 AI 工具平台化和生态化的关键一步。
业界 MCP SDK 现状
当前业界主流的 MCP SDK 实现,主要由官方维护的 Python SDK 和 TypeScript SDK 主导。
Python SDK 凭借丰富的生态和快速迭代能力,能够较便捷地支持多样化功能开发。然而,作为动态语言,Python 也不可避免地带来了类型不明确、运行时错误难以预防、长期维护成本高等问题。随着大模型应用加速进入大规模生产部署阶段,基于 Go 这类强类型语言所具备的高可靠性和可维护性,正在成为越来越重要的优势。
另一方面,TypeScript SDK 则更适合用于浏览器或桌面端环境,作为前端 MCP 客户端对接应用服务。但对于需要高并发处理、简洁部署、本地运行等 MCP Server 场景而言,TypeScript 的能力和生态显然难以胜任。
所以我们认为:当前的 MCP SDK 实现虽然优秀,但并未解决所有关键场景,特别是在高性能、可维护性、部署简便性等方面存在缺口。
具体体现在:
动态语言维护成本高:Python 等语言虽然开发效率高,但类型不明确,维护难度大;
跨平台部署复杂:JS/Python 生态部署常常伴随依赖管理、环境冲突等问题;
无法满足本地执行、边缘计算等需求:这些场景更适合静态编译、资源占用少的语言;
交互协议仍缺闭环生态:只有 SDK,而没有配套的工具市场、调试器、资源管理组件;缺乏完善的工具链、调试面板、生态工具市场等系统化组件;
ThinkInAI 开源团队的目标
为了解决上述问题,我们基于以下理念设计了 Go-MCP:不是把 Python SDK 翻译成 Go,而是重新定义 Go 场景下 MCP 的最佳实践。Go-MCP 不仅是一个 SDK,更是 MCP 开源生态的补齐。
我们的目标不仅是提供高质量 SDK,更是构建完整 MCP 开源生态系统,打造 MCP 的操作系统式体验,包括:
Go-MCP SDK
实现 MCP 协议核心规范与传输方式,确保与所有兼容的 MCP 服务或客户端无缝交互,适应不同应用场景和部署方式;
清晰的分层架构设计,确保代码模块化、可扩展、可维护,让开发者能够轻松理解和定制;
基于 Golang 开发,代码清晰、强类型校验、高度可维护;依托 Go 语言的静态编译和二进制产物特性,使部署变得极其简单,无需管理复杂的依赖关系;Go 语言的高性能设计,使 SDK 具备优秀的并发处理能力和极低的资源占用。
MCP Marketplace:如今 MCP Server 已经增长到 2000+,开发质量也会有参差。怎么让 Agent 根据相应速度、成本和相关性等因素选到更好的产品,可能需要一个类似 App store 那样的双边平台,同时这个平台在架构上将兼具控制面与数据面。在这个双边平台中:
消费侧,MCP Server 使用者能够:
浏览官方及社区创建的 MCP Server,按名称、类别、标签等进行检索;
一键接入 MCP Server,自动配置或提供 API 文档 / 代码;
提供统一的 MCP Server 调用接口,调用在平台上注册的 MCP Server;
支持基于自然语言的意图识别,自动调用符合需求的 MCP Server;
供给侧,MCP Server开发者能够:
通过登记元信息的方式注册 MCP Server 到 Marketplace;
通过自然语言或 API 文档自动化生成 MCP Server 并一键部署;
更丰富的工具生态:开发和集成更多预构建工具,使开发者能够更快地构建功能丰富的 AI 应用;
因此 Go-MCP 只是开始,接下来我们还将构建:
🛠️ MCP 工具开发框架:方便开发者编写 MCP Server 并发布到 Marketplace;
🧩 MCP Marketplace:支持意图识别自动调用、服务注册与发现、服务信息检索、一键部署;
🔍 调试工具与可视化平台:辅助开发者调试通信、模拟协议交互、分析上下行协议;
在未来的 LLM 生态中,MCP 不只是协议,而是 Agent 构建的操作系统底座。我们希望通过 Go-MCP,成为这个底座的重要构件。
项目地址:https://github.com/ThinkInAIXYZ/go-mcp
快速认识 Go-MCP SDK
Go-MCP SDK 采用清晰的分层架构设计,确保代码模块化、可扩展性和可维护性。通过深入了解这一架构,开发者可以更好地利用 Go-MCP 的所有功能,甚至根据自己的需求进行定制和扩展。
Go-MCP 的架构可以抽象为三个主要层次:
传输层(Transport Layer):处理底层通信,支持不同的传输协议;
协议层(Protocol Layer):实现所有 MCP 协议数据结构定义;
用户层(User Layer):包括服务器和客户端实现,提供面向用户的 API。
这种分层设计使各层彼此解耦,允许独立演化和替换,同时保持整体功能一致性。
其中由传输层处理底层通信细节,目前支持两种主要传输方式:
HTTP SSE/POST:基于 HTTP 的服务器发送事件(SSE)和客户端 POST 请求,适用于网络通信;
Stdio:基于标准输入 / 输出流的通信,适用于进程间通信;
传输层通过统一接口抽象,使上层代码不需要关心具体的传输实现细节。这种设计允许轻松添加新的传输方式,如 Streamable HTTP、WebSocket、gRPC 等,而不影响上层代码。
Go-MCP 的独特优势
AI 应用开发正处于加速发展阶段,新技术和新方法不断涌现。Model Context Protocol (MCP) 作为一个开放标准,正在改变 AI 应用与数据源和工具集成的方式。作为开发者,我们既需要可靠高效地实现当前协议规范,又需要适应未来的发展趋势。因此,一个优秀的 MCP 客户端库,既需要完整实现协议规范,又需要具备足够的灵活性和扩展性。
另一方面,现有的许多 MCP 实现多基于 Python 或 JavaScript,虽然这些语言生态丰富,但在性能、类型安全、本地部署和长期维护成本方面存在挑战。随着 AI 应用逐渐走向生产环境和大规模部署,基于 Go 语言的实现因其卓越的性能、强类型系统和出色的并发能力,以及极简的本地部署,变得越来越有价值。
Go-MCP 的设计充分考虑了实际应用场景,特别适合对性能和可靠性有高要求的企业级应用。对于需要本地部署、边缘计算、或微服务和 serverless 架构的场景,Go-MCP 提供了理想的解决方案。
架构稳定,灵活扩展
我们认为,MCP 作为一个开放协议,其核心功能和接口应当保持稳定,同时提供足够的扩展性以适应不同场景。Go-MCP 采用清晰的三层架构设计,确保核心功能的稳定性和一致性:
传输层(Transport Layer):抽象底层通信方式,目前支持 SSE 和 Stdio 两种传输方式。传输层通过统一接口屏蔽底层通信细节,便于增加新的传输方式;
协议层(Protocol Layer):包含所有 MCP 协议相关定义,实现核心功能如初始化、心跳检测、取消操作、进度通知、根资源管理、采样控制等。协议层确保所有消息的构造和解析符合 MCP 规范;
用户层(User Layer):提供面向开发者的友好 API,包括客户端和服务端实现。用户层通过简洁的接口封装底层复杂性,使开发者能够轻松集成 MCP 功能。
消息处理流程清晰,按请求、响应和通知进行分类,确保同步和异步操作的正确处理:
| | |------- Request (Ping, ListTools, etc) ------>| | | | | | |Go-MCP 的设计也充分考虑了扩展性,支持多种扩展方式:
传输层扩展:可以实现自定义传输方式(如 Streamable HTTP、WebSocket、gRPC 等),只需实现传输接口即可;
协议扩展:对于新的 MCP 协议功能,可以通过扩展协议层实现支持。
在不断更新的 AI 领域,Go-MCP 将紧跟 MCP 协议的发展,持续集成最新功能和最佳实践,确保开发者始终能够使用最先进的工具构建 AI 应用。
高可靠易维护
目前较为主流的 Python-SDK,虽然能借助 Python 较为丰富的生态快速实现多样的功能,但是同时也继承了 Python 作为动态语言所带来的“弱类型检验”和“长期维护成本高”等问题。
在大模型应用快速进入大规模线上运行阶段的当下,基于 Go 语言开发的 Go-MCP 充分利用了 Go 的强类型系统、并发模型和内存管理机制,提供高度可靠的 MCP 协议的实现。相比动态语言的实现,Go-MCP 具有以下优势:
编译时类型检查,减少运行时错误;
强大的并发支持,适合处理复杂的异步通信;
高效的内存管理,减少性能消耗;
丰富的标准库支持,减少外部依赖;
基于 Golang 写 MCP 代码时,开发者可以充分利用 Golang 的强类型特性进行开发。这像是为代码绘制了一幅精确的地图,开发者可以沿着清晰的路径进行维护和扩展,即使在项目规模不断扩大、功能持续迭代的情况下,依然能够保有较高的可维护性。
同时 Go-MCP 采用模块化设计,每个模块职责明确,功能内聚,便于维护和扩展。同时,代码风格遵循 Go 社区最佳实践,使用标准工具如 gofmt 和 goimports 确保代码质量和一致性。
极其简便的本地部署
与 Python 的解释执行不同,Go 语言通过静态编译生成二进制文件的特性,使得本地部署变得异常简便。Go 编译后的程序无需依赖外部环境或复杂的运行时,极大地简化了部署流程,开发者无需担心不同环境下的依赖冲突或版本不一致的问题,这对于本地部署的成功率至关重要。
此外,Go 语言具有出色的跨平台兼容性、可移植性强,支持所有主流操作系统和处理器架构。这意味着无论是 Windows、Linux 还是 macOS,Go 程序都能提供一致的行为和极其简便的部署方法。通过静态链接和跨平台编译,Go 语言能确保在不同平台间的统一体验,极大地提高了开发和运维效率。
Go-MCP 将这一优势发挥到极致,使得基于 Go-MCP 开发的本地 AI 应用的部署更加高效、简洁,为开发者和企业提供了更多的灵活性和可控性。
特别是对于本地部署、边缘计算、云端微服务、serverless 等需要高性能、低延迟、快速启动的 AI 应用,Go-MCP 也保证了快速的请求响应、极低的资源占用。
快速上手
安装
安装 Go-MCP 非常简单,只需使用 Go 的标准包管理工具 go get 命令:
go get github.com/ThinkInAIXYZ/go-mcp这将下载并安装 Go-MCP 及其所有依赖项。Go-MCP 需要 Go 1.18 或更高版本,以确保支持最新的语言特性和标准库。
看一个简单的客户端实现例子,展示如何创建 MCP 客户端、连接服务器和执行基本操作:
package mainimport ( "context" "fmt" "log" "github.com/ThinkInAIXYZ/go-mcp/client" "github.com/ThinkInAIXYZ/go-mcp/protocol" "github.com/ThinkInAIXYZ/go-mcp/transport")func main { // Create transport client (using SSE in this example) transportClient, err := transport.NewSSEClientTransport("http://127.0.0.1:8080/sse") if err != nil { log.Fatalf("Failed to create transport client: %v", err) } // Create MCP client using transport mcpClient, err := client.NewClient(transportClient) if err != nil { log.Fatalf("Failed to create MCP client: %v", err) } defer mcpClient.Close // List available tools toolsResult, err := mcpClient.ListTools(context.Background) if err != nil { log.Fatalf("Failed to list tools: %v", err) } b, _ := json.Marshal(toolsResult.Tools) fmt.Printf("Available tools: %+v\n", string(b)) // Call tool callResult, err := mcpClient.CallTool( context.Background, protocol.NewCallToolRequest("current time", map[string]interface{}{ "timezone": "UTC", })) if err != nil { log.Fatalf("Failed to call tool: %v", err) } b, _ = json.Marshal(callResult) fmt.Printf("Tool call result: %+v\n", string(b))}服务器
以下是构建 MCP 服务器的基本示例,展示如何创建 MCP 服务器,注册工具处理器,处理客户端请求:
package mainimport ( "encoding/json" "fmt" "log" "time" "github.com/ThinkInAIXYZ/go-mcp/protocol" "github.com/ThinkInAIXYZ/go-mcp/server" "github.com/ThinkInAIXYZ/go-mcp/transport")type currentTimeReq struct { Timezone string `json:"timezone" description:"current time timezone"`}func main { // Create transport server (using SSE in this example) transportServer, err := transport.NewSSEServerTransport("127.0.0.1:8080") if err != nil { log.Fatalf("Failed to create transport server: %v", err) } // Create MCP server using transport mcpServer, err := server.NewServer(transportServer, // Set server implementation information server.WithServerInfo(protocol.Implementation{ Name: "Example MCP Server", Version: "1.0.0", }), ) if err != nil { log.Fatalf("Failed to create MCP server: %v", err) } // Register tool handler tool, err := protocol.NewTool("current time", "Get current time with timezone, Asia/Shanghai is default", currentTimeReq{}) if err != nil { log.Fatalf("Failed to create tool: %v", err) return } // new tool handler and return result handler := func(request *protocol.CallToolRequest) (*protocol.CallToolResult, error) { req := new(currentTimeReq) if err := json.Unmarshal(request.RawArguments, &req); err != nil { return nil, err } loc, err := time.LoadLocation(req.Timezone) if err != nil { return nil, fmt.Errorf("parse timezone with error: %v", err) } text := fmt.Sprintf(`current time is %s`, time.Now.In(loc)) return &protocol.CallToolResult{ Content: protocol.Content{ protocol.TextContent{ Type: "text", Text: text, }, }, }, nil } mcpServer.RegisterTool(tool, handler) if err = mcpServer.Run; err != nil { log.Fatalf("Failed to start MCP server: %v", err) return }}同时,我们考虑到,在使用 MCP 协议的过程中,开发者需要灵活地选择启动服务的方式,以适应不同的应用场景。有些情况下,开发者可能希望自己控制 HTTP 服务的启动和管理,而不仅仅是依赖 SDK 内置的默认方式。
为了解决这一需求,我们提供了一种更灵活的方式,使得开发者可以根据自己的需求选择是否通过 SDK 内建的方式启动 MCP Server,或者自行管理 HTTP 服务。
SDK 提供了实现 MCP 协议的 http.Handler,允许开发者在 SDK 外部自行启动 http.Server。这种方式允许开发者在自己的服务框架中灵活配置和管理 HTTP 服务,确保与其他系统的无缝集成,同时保持对服务生命周期的更高控制。
package mainimport ( "encoding/json" "fmt" "log" "net/http" "time"type currentTimeReq struct { Timezone string `json:"timezone" description:"current time timezone"`}func main { var ( messageUrl = "/message" port = "8080" ) // Create transport server (using SSE in this example) transport, handler, err := transport.NewSSEServerTransportAndHandler(fmt.Sprintf("http://127.0.0.1:%s%s", port, messageUrl)) if err != nil { log.Fatalf("Failed to create SSE transport: %v", err) } // Create MCP server using transport mcpServer, err := server.NewServer(transport, // Set server implementation information server.WithServerInfo(protocol.Implementation{ Name: "Example MCP Server", Version: "1.0.0", }), ) if err != nil { log.Fatalf("Failed to create MCP server: %v", err) } // new tool handler and return result toolHandler := func(request *protocol.CallToolRequest) (*protocol.CallToolResult, error) { req := new(currentTimeReq) if err := json.Unmarshal(request.RawArguments, &req); err != nil { return nil, err } mcpServer.RegisterTool(tool, toolHandler) // 设置 HTTP 路由 http.Handle("/sse", handler.HandleSSE) http.Handle(messageUrl, handler.HandleMessage) // 启动 HTTP 服务器 fmt.Println("Starting MCP server on :8080...") if err := http.ListenAndServe(":"+port, nil); err != nil { log.Fatalf("Failed to start HTTP server: %v", err) }}未来展望
MCP 作为一个新兴的开源协议,有着广阔的发展前景。随着 AI 行业的快速发展,标准化和互操作性变得越来越重要,而 Go-MCP 正是为此而生。未来,我们将继续完善和扩展 SDK 功能,包括:
支持更多传输方式:计划增加 Streamable HTTP 传输方式,以适应新版协议需求;
更丰富的工具生态:开发和集成更多预构建工具,使开发者能够更快地构建功能丰富的 AI 应用;
完善 MCP 协议实现:补足 Cancellation、Progress、Roots、Sampling、Completion、Logging 等协议实现;
社区共建:积极拓展开源社区,吸引更多开发者参与贡献,共同推动项目发展。
结语
Go-MCP 为 Go 语言开发者提供了一种便捷、高效的方式来集成和利用大模型互动的标准化协议。凭借其清晰的架构、高性能设计和丰富的功能,Go-MCP 是构建下一代 AI 应用的理想选择。开始使用 Go-MCP,探索大模型交互的无限可能吧!
参考链接:
今日好文推荐
GPU 编程“改朝换代”:英伟达终为 CUDA 添加原生 Python 支持,百万用户变千万?
7500 万竟滚成 2.5 亿巨坑,违约还没后果!这家“皮包”科技公司把美政府“忽悠”瘸了,延期 2 年还不断甩锅!
Meta开源Llama 4,正面迎战 DeepSeek!经过重新设计,首次采用MoE
DeepSeek打击面太广!新论文疑是R2发布前兆,奥特曼火速“应战”:o3即将上线,GPT-5免费放送!
来源:极客邦科技