使用说明
项目简介
mcp-golang 是一个非官方的 Model Context Protocol (MCP) 的 Golang 实现库,它允许开发者使用 Go 语言快速构建 MCP 服务器。该库提供了类型安全、自定义传输协议、低样板代码和模块化设计等特性,旨在简化 MCP 服务器的开发过程。
主要功能点
- 资源管理 (Resources):支持注册和托管资源,并提供客户端访问能力。
- 工具注册与执行 (Tools):允许注册外部工具函数,并支持客户端通过 MCP 协议调用执行。工具参数支持 Go 原生结构体,并自动生成 JSON Schema。
- Prompt 模板 (Prompts):支持注册 Prompt 模板,允许客户端获取并使用预定义的 Prompt 消息。
- 多种传输协议 (Transports):内置支持 Stdio 和 SSE 传输协议,并允许自定义传输协议。
- 会话管理:服务器端负责会话管理。
- 能力声明:声明服务器提供的工具、Prompt 和资源能力。
- 分页 (Pagination):支持工具、Prompt 和资源列表的分页返回。
- 变更通知 (Change Notifications):支持工具、Prompt 和资源列表变更时向客户端发送通知。
安装步骤
- 确保已安装 Go 语言环境。
- 使用 'go get' 命令安装 mcp-golang 库:
go get github.com/metoro-io/mcp-golang
服务器配置
MCP 服务器主要通过命令行启动,无需复杂的配置文件。对于 MCP 客户端(例如 Claude Desktop),需要配置服务器的启动命令。以下是 Claude Desktop 客户端的 'claude_desktop_config.json' 配置文件示例,用于配置 mcp-golang 服务器:
{ "mcpServers": { "golang-mcp-server": { "command": "<your path to golang MCP server go executable>", "args": [], "env": {} } } }
配置参数说明:
- server name: 'golang-mcp-server' (服务器名称,客户端用于标识和引用,可以自定义)
- command: '<your path to golang MCP server go executable>' (必填):指向您编译后的 mcp-golang 服务器 Go 可执行文件的绝对路径。例如:'/path/to/your/mcp-golang-server'。 请根据您的实际构建路径进行替换。
- args: '[]' (可选):启动服务器可执行文件时需要传递的命令行参数,本例中为空数组,表示没有额外的参数。
- env: '{}' (可选): 启动服务器可执行文件时需要设置的环境变量,本例中为空对象,表示没有需要设置的环境变量。
注意: 请将 '<your path to golang MCP server go executable>' 替换为您实际的 mcp-golang 服务器可执行文件路径。
基本使用方法
- 编写 Go 代码: 参考仓库提供的示例代码 'examples' 目录下的示例,例如 'readme_server/readme_server.go' 或 'basic_tool_server/basic_tool_server.go',定义您的工具、Prompt 和资源处理逻辑。
- 注册工具、Prompt 和资源: 使用 'server.RegisterTool', 'server.RegisterPrompt', 'server.RegisterResource' 方法注册您的功能。
- 实现处理函数: 为注册的工具、Prompt 和资源编写相应的处理函数。
- 启动服务器: 创建 'mcp_golang.Server' 实例,配置传输协议(例如 'stdio.NewStdioServerTransport()'),调用 'server.Serve()' 启动服务器。
- 编译和运行: 使用 'go build' 命令编译您的 Go 代码,生成可执行文件。然后根据 Claude Desktop 的配置示例,配置客户端指向该可执行文件,即可将您的 mcp-golang 服务器连接到 MCP 客户端。
示例代码 (参考 'examples/readme_server/readme_server.go'):
package main import ( "fmt" "github.com/metoro-io/mcp-golang" "github.com/metoro-io/mcp-golang/transport/stdio" ) // ... (Content 和 MyFunctionsArguments 结构体定义) ... func main() { done := make(chan struct{}) server := mcp_golang.NewServer(stdio.NewStdioServerTransport()) // 注册工具 err := server.RegisterTool("hello", "Say hello to a person", func(arguments MyFunctionsArguments) (*mcp_golang.ToolResponse, error) { return mcp_golang.NewToolResponse(mcp_golang.NewTextContent(fmt.Sprintf("Hello, %server!", arguments.Submitter))), nil }) // ... (错误处理) ... // 注册 Prompt err = server.RegisterPrompt("promt_test", "This is a test prompt", func(arguments Content) (*mcp_golang.PromptResponse, error) { return mcp_golang.NewPromptResponse("description", mcp_golang.NewPromptMessage(mcp_golang.NewTextContent(fmt.Sprintf("Hello, %server!", arguments.Title)), mcp_golang.RoleUser)), nil }) // ... (错误处理) ... // 注册资源 err = server.RegisterResource("test://resource", "resource_test", "This is a test resource", "application/json", func() (*mcp_golang.ResourceResponse, error) { return mcp_golang.NewResourceResponse(mcp_golang.NewTextEmbeddedResource("test://resource", "This is a test resource", "application/json")), nil }) // ... (错误处理) ... // 启动服务器 err = server.Serve() // ... (错误处理) ... <-done }
信息
分类
AI与计算