今天,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 实现虽然优秀,但并未解决所有关键场景,特别是在高性能、可维护性、部署简便性等方面存在缺口。
具体体现在:
为了解决上述问题,我们基于以下理念设计了 Go-MCP:不是把 Python SDK 翻译成 Go,而是重新定义 Go 场景下 MCP 的最佳实践。Go-MCP 不仅是一个 SDK,更是 MCP 开源生态的补齐。
我们的目标不仅是提供高质量 SDK,更是构建完整 MCP 开源生态系统,打造 MCP 的操作系统式体验,包括:
因此 Go-MCP 只是开始,接下来我们还将构建:
在未来的 LLM 生态中,MCP 不只是协议,而是 Agent 构建的操作系统底座。我们希望通过 Go-MCP,成为这个底座的重要构件。
项目地址:https://github.com/ThinkInAIXYZ/go-mcp
快速认识 Go-MCP SDK
Go-MCP SDK 采用清晰的分层架构设计,确保代码模块化、可扩展性和可维护性。通过深入了解这一架构,开发者可以更好地利用 Go-MCP 的所有功能,甚至根据自己的需求进行定制和扩展。
Go-MCP 的架构可以抽象为三个主要层次:
这种分层设计使各层彼此解耦,允许独立演化和替换,同时保持整体功能一致性。
其中由传输层处理底层通信细节,目前支持两种主要传输方式:
传输层通过统一接口抽象,使上层代码不需要关心具体的传输实现细节。这种设计允许轻松添加新的传输方式,如 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 采用清晰的三层架构设计,确保核心功能的稳定性和一致性:
消息处理流程清晰,按请求、响应和通知进行分类,确保同步和异步操作的正确处理:
Client Server
| |
|------- Request (Ping, ListTools, etc) ------>|
| |
|<-------- Response (ServerInfo, etc) ---------|
| |
|<------ Notification (ToolsChanged, etc) -----|
Go-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 main
import (
"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 main
import (
"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 main
import (
"encoding/json"
"fmt"
"log"
"net/http"
"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() {
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)
}
// 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
toolHandler := 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, 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 功能,包括:
结语
Go-MCP 为 Go 语言开发者提供了一种便捷、高效的方式来集成和利用大模型互动的标准化协议。凭借其清晰的架构、高性能设计和丰富的功能,Go-MCP 是构建下一代 AI 应用的理想选择。开始使用 Go-MCP,探索大模型交互的无限可能吧!
参考链接:
https://finance.sina.com.cn/tech/roll/2025-03-25/doc-ineqvvkv9991129.shtml
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有