go lib-mcp
用于构建MCP(模型上下文协议)服务器的Go库。
概述
go-lib-mcp 为在Go中创建MCP服务器提供了一个干净、可扩展的基础。MCP是一种协议,使AI助手能够与上下文提供者(工具、资源和提示)进行交互。
这个库处理协议细节,让您专注于实现服务器的功能。
特性
- 完整的MCP协议支持:实施MCP协议版本2024-11-05
- 零依赖:核心库仅使用Go标准库
- 灵活的架构:工具、资源和提示的提供程序接口
- 运输抽象:MCP的标准传输(换行符分隔的JSON)
- JSON-RPC 2.0:具有MCP和LSP传输的完整JSON-RPC实现
- 佣工登记处:用于快速构建提供程序的可选注册表模式
- 流程管理:支持Nix的可选执行器抽象
- 生产就绪:优雅的关机、并发请求处理、错误管理
安装
go get github.com/amarbel-llc/go-lib-mcp快速开始
这是一个最小的MCP服务器:
package main
import (
"context"
"encoding/json"
"fmt"
"log"
"os"
"github.com/amarbel-llc/go-lib-mcp/protocol"
"github.com/amarbel-llc/go-lib-mcp/server"
"github.com/amarbel-llc/go-lib-mcp/transport"
)
func main() {
// Create stdio transport
t := transport.NewStdio(os.Stdin, os.Stdout)
// Create tool registry
tools := server.NewToolRegistry()
tools.Register(
"echo",
"Echoes back the message",
json.RawMessage(`{"type": "object", "properties": {"message": {"type": "string"}}, "required": ["message"]}`),
func(ctx context.Context, args json.RawMessage) (*protocol.ToolCallResult, error) {
var params struct{ Message string `json:"message"` }
json.Unmarshal(args, ¶ms)
return &protocol.ToolCallResult{
Content: []protocol.ContentBlock{protocol.TextContent("Echo: " + params.Message)},
}, nil
},
)
// Create and run server
srv, _ := server.New(t, server.Options{
ServerName: "echo-server",
Tools: tools,
})
log.Fatal(srv.Run(context.Background()))
}建筑
该库分为几个包:
协议
定义MCP协议类型和常量:
Tool,Resource,Prompt类型- 请求/响应结构
- 能力类型
- 辅助函数
运输
消息传递的传输层:
Transport接口Stdio传输(MCP用换行符分隔的JSON)
JSON远程过程调用
JSON-RPC 2.0实现:
Message具有适当ID处理的类型Conn用于双向RPCStream用于LSP风格的传输(Content-Length标头)
服务器
MCP服务器支架:
Server具有生命周期管理ToolProvider,ResourceProvider,PromptProvider接口ToolRegistry,ResourceRegistry,PromptRegistry助手Options用于配置
执行者(可选)
流程执行抽象:
Executor用于构建和运行流程的界面nix.ExecutorNix薄片的实现
使用指南
实施工具
工具是客户端可以调用的函数:
tools := server.NewToolRegistry()
tools.Register(
"calculate",
"Performs basic arithmetic",
json.RawMessage(`{
"type": "object",
"properties": {
"operation": {"type": "string", "enum": ["add", "subtract"]},
"a": {"type": "number"},
"b": {"type": "number"}
},
"required": ["operation", "a", "b"]
}`),
func(ctx context.Context, args json.RawMessage) (*protocol.ToolCallResult, error) {
var params struct {
Operation string `json:"operation"`
A float64 `json:"a"`
B float64 `json:"b"`
}
if err := json.Unmarshal(args, ¶ms); err != nil {
return protocol.ErrorResult("Invalid arguments"), nil
}
var result float64
switch params.Operation {
case "add":
result = params.A + params.B
case "subtract":
result = params.A - params.B
default:
return protocol.ErrorResult("Unknown operation"), nil
}
return &protocol.ToolCallResult{
Content: []protocol.ContentBlock{
protocol.TextContent(fmt.Sprintf("Result: %f", result)),
},
}, nil
},
)实施资源
资源提供可读取的数据:
resources := server.NewResourceRegistry()
resources.RegisterResource(
protocol.Resource{
URI: "config://settings",
Name: "App Settings",
Description: "Current application settings",
MimeType: "application/json",
},
func(ctx context.Context, uri string) (*protocol.ResourceReadResult, error) {
settings := map[string]string{
"theme": "dark",
"language": "en",
}
data, _ := json.Marshal(settings)
return &protocol.ResourceReadResult{
Contents: []protocol.ResourceContent{
{URI: uri, MimeType: "application/json", Text: string(data)},
},
}, nil
},
)实施提示
提示是可以用参数呈现的模板:
prompts := server.NewPromptRegistry()
prompts.Register(
protocol.Prompt{
Name: "code_review",
Description: "Generate a code review prompt",
Arguments: []protocol.PromptArgument{
{Name: "language", Description: "Programming language", Required: true},
{Name: "code", Description: "Code to review", Required: true},
},
},
func(ctx context.Context, args map[string]string) (*protocol.PromptGetResult, error) {
return &protocol.PromptGetResult{
Description: "Code review request",
Messages: []protocol.PromptMessage{
{
Role: "user",
Content: protocol.TextContent(fmt.Sprintf(
"Please review this %s code:\n\n%s",
args["language"],
args["code"],
)),
},
},
}, nil
},
)自定义提供程序实现
您不必使用注册表帮助程序。您可以直接实现提供者接口:
type MyToolProvider struct {
// your fields
}
func (p *MyToolProvider) ListTools(ctx context.Context) ([]protocol.Tool, error) {
// your implementation
}
func (p *MyToolProvider) CallTool(ctx context.Context, name string, args json.RawMessage) (*protocol.ToolCallResult, error) {
// your implementation
}运输选项
MCP标准传输(换行JSON)
大多数MCP服务器使用带有换行符分隔的JSON的stdio:
t := transport.NewStdio(os.Stdin, os.Stdout)LSP流传输(内容长度标头)
对于LSP风格的通信,请使用jsonrpc流:
stream := jsonrpc.NewStream(reader, writer)带执行者的流程管理
可选 executor 包有助于管理子流程:
import "github.com/amarbel-llc/go-lib-mcp/executor/nix"
exec := nix.New()
// Build a Nix flake to get executable path
path, err := exec.Build(ctx, "nixpkgs#gopls")
// Execute the process
proc, err := exec.Execute(ctx, path, []string{"-mode=stdio"})
// Use proc.Stdin, proc.Stdout, proc.Stderr
// Call proc.Wait() or proc.Kill() as needed例子
看 examples/ 完整示例目录:
simple/-带工具、资源和提示的基本MCP服务器
要运行该示例,请执行以下操作:
cd examples/simple
go run main.goNix建筑
本项目使用镍片进行开发:
# Enter development shell
nix develop
# Build the library
just build
# Run tests
just test
# Run example
just example发展
运行测试
just test代码格式化
just fmt掉毛
just lint协议参考
MCP方法
库处理这些MCP协议方法:
initialize-握手和能力谈判ping-健康检查tools/list-列出可用工具tools/call-调用工具resources/list-列出可用资源resources/read-读取资源内容resources/templates/list-列出资源URI模板prompts/list-列出可用提示prompts/get-检索提示
能力
服务器功能会根据您配置的提供程序自动进行公告:
- 工具:如果启用
Options.Tools已设置 - 资源:如果启用
Options.Resources已设置 - 提示:如果启用
Options.Prompts已设置
相关项目
- 勒克斯 -使用此库构建的LSP多路复用器MCP服务器
许可证
MIT许可证-有关详细信息,请参阅许可证文件
贡献
欢迎投稿!请打开问题或拉取请求。
支持
如有疑问或问题,请打开GitHub issue。
