模型上下文协议服务器

一个安全的、自托管的模型上下文协议(MCP)服务器,提供全面的数据治理功能,包括访问控制、审计日志和数据加密。

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

使用说明

MCP Go服务器

一个用Go编写的安全、自托管的模型上下文协议(MCP)服务器,具有全面的数据治理功能。此服务器使您可以完全控制您的数据,确保隐私、安全和合规性。

特性

  • 🔒 数据治理:完整的审计日志记录、访问控制和数据保留策略
  • 🛡️ 安全:身份验证、加密和安全配置管理
  • 📊 监控:内置指标和结构化日志记录
  • 🔧 可扩展:易于添加自定义工具和资源
  • ⚡ 演出:高效的并发请求处理
  • 📝 审计跟踪:全面记录所有操作

先决条件

  • 转到1.21或更高版本
  • 对MCP(模型上下文协议)的基本理解

安装

  1. 克隆存储库:
git clone <your-repo-url>
cd mcp-go
  1. 安装依赖项:
go mod download
  1. 复制示例环境文件:
cp .env.example .env
  1. 编辑 .env 并配置您的设置(尤其是 API_KEY 如果 AUTH_ENABLED=true)

配置

服务器是通过环境变量配置的。看 .env.example 对于所有可用选项:

关键配置选项

  • AUTH_ENABLED:启用/禁用身份验证(默认值:true)
  • API_KEY:用于身份验证的密钥(如果启用了身份验证,则需要)
  • AUDIT_ENABLED:启用审核日志记录(默认值:true)
  • AUDIT_LOG_PATH:审核日志文件的路径(默认值:./audit.log)
  • DATA_RETENTION_DAYS:保留审计数据的天数(默认值:90)
  • ENCRYPTION_ENABLED:启用数据加密(默认值:true)
  • LOG_LEVEL:日志记录级别(调试、信息、警告、错误)
  • LOG_FORMAT:日志格式(json或控制台)

用法

运行服务器

MCP服务器通过stdin/stdout(标准MCP协议)进行通信:

make run

或者构建并运行:

make build
./bin/mcp-server

与MCP客户端集成

服务器遵循MCP协议,可以与任何兼容MCP的客户端集成。Claude Desktop的配置示例:

{
  "mcpServers": {
    "mcp-go": {
      "command": "/path/to/bin/mcp-server",
      "env": {
        "API_KEY": "your-api-key",
        "AUDIT_ENABLED": "true",
        "AUDIT_LOG_PATH": "./audit.log"
      }
    }
  }
}

或者创建一个 .env 文件与配置的二进制文件位于同一目录中。

可用工具

echo

回显输入消息。

参数:

  • message (string,必填):要回显的消息

例子:

{
  "message": "Hello, World!"
}

calculate

执行基本算术运算。

参数:

  • operation (字符串,必填):“加”、“减”、“乘”、“除”之一
  • a (数字,必填):第一个数字
  • b (数字,必填):第二个数字

例子:

{
  "operation": "add",
  "a": 10,
  "b": 5
}

system_info

返回系统信息和治理指标。

参数: 无

可用资源

config://server

返回当前服务器配置(只读)。

metrics://governance

返回当前数据治理指标。

数据治理

审计日志

所有操作都记录在审计日志文件中(可通过以下方式配置 AUDIT_LOG_PATH).每个条目包括:

  • 时间戳
  • 动作类型
  • 工具/资源已访问
  • 成功/失败状态
  • 错误消息(如有)
  • 数据大小
  • 请求ID

访问控制

服务器支持通过API密钥进行身份验证。当 AUTH_ENABLED=true,所有请求都必须包含有效的API密钥。

数据保留

审计日志根据以下内容保留 DATA_RETENTION_DAYS。自动清理每天运行。

加密

当 ENCRYPTION_ENABLED=true,敏感数据可以加密(可以用适当的加密库扩展实现)。

添加自定义工具

要添加自定义工具,请编辑 internal/tools/tools.go 并添加新的工具定义:

// Define your tool arguments struct
type MyToolArgs struct {
    Param1 string `json:"param1" jsonschema:"description=Parameter description,required"`
}

// Register the tool
if err := server.RegisterTool("my_tool", "Description of my tool", func(ctx context.Context, args MyToolArgs) (*mcp_golang.ToolResponse, error) {
    // Your tool logic here
    // Don't forget to audit!
    gov.Audit(AuditEntry{
        Action:  "tool_execution",
        Tool:    "my_tool",
        Success: true,
    })
    
    result := map[string]interface{}{
        "result": "your result",
    }
    resultJSON, _ := json.Marshal(result)
    return mcp_golang.NewToolResponse(mcp_golang.NewTextContent(string(resultJSON))), nil
}); err != nil {
    return fmt.Errorf("failed to register my_tool: %w", err)
}

添加自定义资源

要添加自定义资源,请编辑 internal/resources/resources.go:

if err := server.RegisterResource(
    "resource://my-resource",
    "My Resource",
    "Description of my resource",
    "application/json",
    func(ctx context.Context) (*mcp_golang.ResourceResponse, error) {
        // Your resource logic here
        gov.Audit(AuditEntry{
            Action:   "resource_access",
            Resource: "resource://my-resource",
            Success:  true,
        })
        
        data := map[string]interface{}{
            "data": "your data",
        }
        dataJSON, _ := json.Marshal(data)
        return mcp_golang.NewResourceResponse(
            mcp_golang.NewTextEmbeddedResource("resource://my-resource", string(dataJSON), "application/json"),
        ), nil
    },
); err != nil {
    return fmt.Errorf("failed to register resource: %w", err)
}

<|工具▁calls▁开始|><|工具▁call▁开始|> todo_write

安全最佳实践

  1. 始终设置强API_KEY 启用身份验证时
  2. 限制允许的来源 到生产中的特定领域
  3. 启用审核日志记录 跟踪所有操作
  4. 定期审查审计日志 可疑活动
  5. 保持依赖关系更新 随着 go get -u ./...
  6. 使用加密 用于传输和静止的敏感数据
  7. 实施速率限制 用于生产部署
  8. 监控指标 定期检查异常情况

发展

项目结构

该项目遵循标准的Go项目布局:

mcp-go/
├── cmd/
│   └── mcp-server/          # Main application entry point
│       └── main.go
├── internal/                 # Private application code
│   ├── config/              # Configuration management
│   ├── governance/           # Data governance and audit logging
│   ├── logger/              # Logging setup
│   ├── resources/           # MCP resource definitions
│   ├── security/            # Security utilities
│   ├── server/              # MCP server setup
│   └── tools/               # MCP tool definitions
├── bin/                     # Build output
├── go.mod                   # Go module file
├── env.example              # Example configuration
├── PROJECT_STRUCTURE.md      # Detailed structure documentation
└── README.md                # This file

看 项目_结构.md 有关项目组织的详细信息。

测试

go test ./...

建筑

go build -o mcp-go-server

故障排除

服务器无法启动

  • 检查是否设置了所有必需的环境变量
  • 验证 API_KEY 如果满足以下条件,则设置 AUTH_ENABLED=true
  • 检查日志输出中的特定错误消息

工具不工作

  • 在中验证工具注册 tools.go
  • 检查审核日志以了解错误详细信息
  • 确保输入架构与预期格式匹配

未创建审核日志

  • 检查 AUDIT_LOG_PATH 可写
  • 验证 AUDIT_ENABLED=true
  • 检查文件权限

许可证

[在此处指定您的许可证]

贡献

[您的贡献指南]

支持

[您的支持信息]