Token导航 LogoToken导航TokenDH.com
Go Lib MCP logo
AI代理未说明官方级别未说明来源级核验

Go Lib MCP

MCP Server

一个用于构建MCP(模型上下文协议)服务器的Go库,支持工具、资源和提示的交互。

工具数

2

提示词数

0

GitHub Stars

0

资源数

0
服务器开发Go本地部署

安装说明

本站只整理中文说明和来源信息,不托管安装包,也不代用户安装。

作者 / 组织

amarbel-llc

提供方

amarbel-llc

最后核验

2026/5/17 20:19

快速接入

先看主来源和安装命令,再打开仓库或文档;下面只保留这个条目的关键接入事实。

详细介绍

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, &params)
            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 用于双向RPC
  • Stream 用于LSP风格的传输(Content-Length标头)

服务器

MCP服务器支架:

  • Server 具有生命周期管理
  • ToolProvider, ResourceProvider, PromptProvider 接口
  • ToolRegistry, ResourceRegistry, PromptRegistry 助手
  • Options 用于配置

执行者(可选)

流程执行抽象:

  • Executor 用于构建和运行流程的界面
  • nix.Executor Nix薄片的实现

使用指南

实施工具

工具是客户端可以调用的函数:

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, &params); 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.go

Nix建筑

本项目使用镍片进行开发:

# 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。

目录标签

目录标签

服务器开发Go本地部署Go库MCP协议AI工具交互JSON-RPC

接入字段

传输方式(transport,传输协议)

未说明

鉴权方式(authType,认证方式)

none

工具数量(toolCount,工具数)

2

资源数量(resourceCount,资源数)

0

提示词数量(promptCount,提示词数)

0

权限和风险

未说明none部署方式未说明

接入前请确认传输方式、认证方式和部署位置,并根据实际工具能力限制访问范围。

安装前确认

不要直接授予不必要的文件、网络或账号权限;先核对安装命令和配置内容。

仍需确认:installCommand

来源信息

继续浏览同类 MCP