内容
# Golang MCP 服务器 SDK
[](https://opensource.org/licenses/MIT)
[](https://goreportcard.com/report/github.com/FreePeak/golang-mcp-server-sdk)
[](https://pkg.go.dev/github.com/FreePeak/golang-mcp-server-sdk)
[](https://github.com/FreePeak/golang-mcp-server-sdk/actions/workflows/go.yml)
[](https://github.com/FreePeak/golang-mcp-server-sdk/graphs/contributors)
## 目录
- [概述](#概述)
- [安装](#安装)
- [快速开始](#快速开始)
- [什么是 MCP?](#什么是-mcp)
- [核心概念](#核心概念)
- [服务器](#服务器)
- [工具](#工具)
- [资源](#资源)
- [提示](#提示)
- [运行您的服务器](#运行您的服务器)
- [标准输入输出](#标准输入输出)
- [HTTP 与 SSE](#http-与-sse)
- [多协议](#多协议)
- [测试和调试](#测试和调试)
- [示例](#示例)
- [回声服务器](#回声服务器)
- [计算器服务器](#计算器服务器)
- [软件包结构](#软件包结构)
- [贡献](#贡献)
- [许可证](#许可证)
## 概述
模型上下文协议(MCP)允许应用程序以标准化的方式为大型语言模型(LLM)提供上下文,分离提供上下文的关注点与实际的 LLM 交互。该 Golang SDK 实现完整的 MCP 规范,使得构建 MCP 服务器变得容易:
- 构建暴露资源和工具的 MCP 服务器
- 使用标准传输协议,如标准输入输出和服务器发送事件(SSE)
- 处理所有 MCP 协议消息和生命周期事件
- 遵循 Go 最佳实践和清洁架构原则
> **注意:** 该 SDK 始终更新以与 [spec.modelcontextprotocol.io/latest](https://spec.modelcontextprotocol.io/latest) 上的最新 MCP 规范保持一致。
## 安装
```bash
go get github.com/FreePeak/golang-mcp-server-sdk
```
## 快速开始
让我们创建一个简单的 MCP 服务器,暴露一个回声工具:
```go
package main
import (
"context"
"fmt"
"log"
"os"
"github.com/FreePeak/golang-mcp-server-sdk/pkg/server"
"github.com/FreePeak/golang-mcp-server-sdk/pkg/tools"
)
func main() {
// 创建服务器
mcpServer := server.NewMCPServer("回声服务器示例", "1.0.0")
// 创建回声工具
echoTool := tools.NewTool("echo",
tools.WithDescription("回声输入消息"),
tools.WithString("message",
tools.Description("要回声的消息"),
tools.Required(),
),
)
// 将工具添加到服务器并设置处理器
ctx := context.Background()
err := mcpServer.AddTool(ctx, echoTool, handleEcho)
if err != nil {
log.Fatalf("添加工具时出错:%v", err)
}
// 启动服务器
fmt.Println("启动回声服务器...")
fmt.Println("通过标准输入发送 JSON-RPC 消息以与服务器交互。")
// 通过标准输入输出提供服务
if err := mcpServer.ServeStdio(); err != nil {
fmt.Fprintf(os.Stderr, "错误:%v\n", err)
os.Exit(1)
}
}
// 回声工具处理器
func handleEcho(ctx context.Context, request server.ToolCallRequest) (interface{}, error) {
// 提取消息参数
message, ok := request.Parameters["message"].(string)
if !ok {
return nil, fmt.Errorf("缺少或无效的'message'参数")
}
// 以 MCP 协议期望的格式返回回声响应
return map[string]interface{}{
"content": []map[string]interface{}{
{
"type": "text",
"text": message,
},
},
}, nil
}
```
## 什么是 MCP?
[模型上下文协议(MCP)](https://modelcontextprotocol.io) 是一个标准化的协议,允许应用程序以安全和高效的方式为大型语言模型(LLM)提供上下文。它分离了提供上下文和工具的关注点与实际的 LLM 交互。MCP 服务器可以:
- 通过 **资源** (只读数据端点)公开数据
- 通过 **工具** (可执行函数)提供功能
- 通过 **提示** (可重用模板)定义交互模式
- 支持各种传输方法(标准输入输出,HTTP/SSE)
## 核心概念
### 服务器
MCP 服务器是您与 MCP 协议的核心接口。它处理连接管理、协议合规性和消息路由:
```go
// 创建新的 MCP 服务器
mcpServer := server.NewMCPServer("我的应用程序", "1.0.0")
```
### 工具
工具允许 LLM 通过您的服务器采取行动。与资源不同,工具预计会执行计算并具有副作用:
```go
// 定义计算器工具
calculatorTool := tools.NewTool("calculator",
tools.WithDescription("执行基本算术运算"),
tools.WithString("operation",
tools.Description("要执行的运算(加法,减法,乘法,除法)"),
tools.Required(),
),
tools.WithNumber("a",
tools.Description("第一个数字"),
tools.Required(),
),
tools.WithNumber("b",
tools.Description("第二个数字"),
tools.Required(),
),
)
// 将工具添加到服务器并设置处理器
mcpServer.AddTool(ctx, calculatorTool, handleCalculator)
```
### 资源
资源是您向 LLM 公开数据的方式。它们类似于 REST API 中的 GET 端点 - 它们提供数据但不应执行重大计算或产生副作用:
```go
// 创建资源(目前使用内部 API)
resource := &domain.Resource{
URI: "sample://hello-world",
Name: "Hello World 资源",
Description: "用于演示的示例资源",
MIMEType: "text/plain",
}
// 注意:资源支持正在公共 API 中更新
```
### 提示
提示是可重用的模板,帮助 LLM 有效地与您的服务器交互:
```go
// 创建提示(目前使用内部 API)
codeReviewPrompt := &domain.Prompt{
Name: "review-code",
Description: "用于代码审查的提示",
Template: "请审查此代码:\n\n{{.code}}",
Parameters: []domain.PromptParameter{
{
Name: "code",
Description: "要审查的代码",
Type: "string",
Required: true,
},
},
}
// 注意:提示支持正在公共 API 中更新
```
## 运行您的服务器
Golang 中的 MCP 服务器可以根据您的用例连接到不同的传输协议:
### 标准输入输出
适用于命令行工具和直接集成:
```go
// 启动标准输入输出服务器
if err := mcpServer.ServeStdio(); err != nil {
fmt.Fprintf(os.Stderr, "错误:%v\n", err)
os.Exit(1)
}
```
### HTTP 与 SSE
适用于 Web 应用程序,您可以使用服务器发送事件(SSE)进行实时通信:
```go
// 配置 HTTP 地址
mcpServer.SetAddress(":8080")
// 启动带有 SSE 支持的 HTTP 服务器
if err := mcpServer.ServeHTTP(); err != nil {
log.Fatalf("HTTP 服务器错误:%v", err)
}
// 用于优雅关闭
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
if err := mcpServer.Shutdown(ctx); err != nil {
log.Fatalf("服务器关闭错误:%v", err)
}
```
### 多协议
您还可以同时运行多个协议服务器:
```go
// 配置服务器以支持 HTTP 和标准输入输出
mcpServer := server.NewMCPServer("多协议服务器", "1.0.0")
mcpServer.SetAddress(":8080")
mcpServer.AddTool(ctx, echoTool, handleEcho)
// 在 goroutine 中启动 HTTP 服务器
go func() {
if err := mcpServer.ServeHTTP(); err != nil {
log.Fatalf("HTTP 服务器错误:%v", err)
}
}()
// 在主线程中启动标准输入输出服务器
if err := mcpServer.ServeStdio(); err != nil {
log.Fatalf("标准输入输出服务器错误:%v", err)
}
```
### 测试和调试
为了测试您的 MCP 服务器,您可以使用 [MCP 检查器](https://github.com/modelcontextprotocol/inspector) 或直接发送 JSON-RPC 消息:
```bash
# 使用标准输入输出测试回声工具
echo '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"echo","parameters":{"message":"Hello, World!"}}}' | go run your_server.go
```
## 示例
查看 `examples` 目录以获取完整的示例服务器:
### 回声服务器
`examples/echo_server.go` 中提供了一个简单的回声服务器示例:
```bash
# 运行示例
go run examples/echo_server.go
```
### 计算器服务器
`examples/calculator/` 中提供了一个更高级的计算器示例,支持 HTTP 和标准输入输出模式:
```bash
# 以 HTTP 模式运行
go run examples/calculator/main.go --mode http
# 以标准输入输出模式运行
go run examples/calculator/main.go --mode stdio
```
## 软件包结构
SDK 按照清洁架构原则组织:
```
golang-mcp-server-sdk/
├── pkg/ # 公共 API(暴露给用户)
│ ├── builder/ # 公共构建器模式用于服务器构造
│ ├── server/ # 公共服务器实现
│ ├── tools/ # 用于创建 MCP 工具的实用程序
│ └── types/ # 共享类型和接口
├── internal/ # 私有实现细节
├── examples/ # 示例代码片段和用例
└── cmd/ # 示例 MCP 服务器应用程序
```
`pkg/` 目录包含所有公开的 API,用户应与之交互。
## 贡献
欢迎贡献!请随时提交拉取请求。
## 许可证
该项目根据 MIT 许可证授权 - 有关详细信息,请参阅 [LICENSE](LICENSE) 文件。
## 📧 支持与联系
- 如有疑问或问题,请发送电子邮件至 [mnhatlinh.doan@gmail.com](mailto:mnhatlinh.doan@gmail.com)
- 直接打开问题:[问题跟踪器](https://github.com/FreePeak/golang-mcp-server-sdk/issues)
- 如果 Golang MCP 服务器 SDK 有助于您的工作,请考虑支持:
<p align="">
<a href="https://www.buymeacoffee.com/linhdmn">
<img src="https://img.buymeacoffee.com/button-api/?text=Support MCP Server SDK&emoji=☕&slug=linhdmn&button_colour=FFDD00&font_colour=000000&font_family=Cookie&outline_colour=000000&coffee_colour=ffffff"
alt="Buy Me A Coffee"/>
</a>
</p>
连接信息
猜你喜欢
暂无推荐服务器