MCP服务器

一个基于Go的轻量级JSON-RPC协议服务器,用于语言模型客户端发现和调用外部工具。

  • by lucasgdb
  • Go
  • 本地部署
  • 更新于
在 GitHub 查看 lucasgdb/mcp-server-go-example

使用说明

Hello World-Go中的MCP服务器

引言

此示例演示了如何在Go中使用 mcp-go SDK.MCP是一种基于JSON-RPC的轻量级协议,允许语言模型客户端以结构化的方式发现和调用外部工具。

只需几行Go代码,您就可以:

  1. 使用人类可读的名称和版本定义MCP服务器。
  2. 使用键入的参数和描述声明一个或多个工具(命令)。
  3. 注册在客户端调用工具时执行自定义逻辑的处理程序函数。
  4. 通过标准I/O(stdin/stdout)公开服务器,以便任何与MCP兼容的客户端(如Cursor、Claude Desktop或其他IDE扩展)都可以启动并与之通信,而无需额外设置。

运作原理

  1. 服务器初始化

    mcpServer := server.NewMCPServer(
      "Hello World MCP Server",
      "1.0.0",
      server.WithToolCapabilities(false),
    )
    
    • 创建一个名为“Hello World MCP server”的MCP服务器,版本为1.0.0。
    • 禁用自动工具功能公告(因此仅显示您的显式工具)。
  2. 工具定义

    helloWorldTool := mcp.NewTool("hello_world",
      mcp.WithDescription("Greet someone"),
      mcp.WithString("name",
       mcp.Required(),
       mcp.Description("Person’s name"),
      ),
    )
    
    • 定义一个 hello_world 接受单个必需字符串参数的工具 name.
    • 描述有助于客户端显示使用信息并生成提示。
  3. 处理程序注册

    mcpServer.AddTool(helloWorldTool, func(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
      name, ok := req.Params.Arguments["name"].(string)
    
      if !ok {
       return nil, errors.New("name must be a string")
      }
    
      return mcp.NewToolResultText(fmt.Sprintf("Hello, %s!", name)), nil
    })
    
    • 合伙人 hello_world 带有Go功能的工具。
    • 提取 name 参数,验证它,并返回问候语。
    • 错误以JSON-RPC错误的形式显示回客户端。
  4. 服务于Stdio

    if err := server.ServeStdio(mcpServer); err != nil {
     fmt.Printf("Server error: %v\n", err)
    }
    
    • 启动一个事件循环,从stdin读取JSON-RPC请求并将响应写入stdout。
    • 允许任何MCP客户端直接启动二进制文件,并通过管道传输MCP。

入门指南

  1. 再进行

    go mod tidy
    
  2. 构建服务器

    go build -o hello-mcp ./src/main.go
    
  3. 从MCP客户端连接

    • 在客户端的配置中,指向 hello-mcp 可执行。
    • 客户端将自动发现 hello_world 工具模式,并允许您调用它。

    例子:

    {
      "mcpServers": {
        "demo-go-mcp": {
          "command": "path-to-server/hello-mcp"
        }
      }
    }
    

    或者,使用 我的MCP客户端是用Go编写的

根据需要添加其他工具、参数和传输(例如HTTP/SSE),享受构建更复杂工作流程的乐趣!