Go语言 Stdio 传输 MCP Server 示例
AI 应用开发正处于加速发展阶段,新技术和新方法不断涌现。Model Context Protocol (MCP) 作为一个开放标准,正在改变 AI 应用与数据源和工具集成的方式。
Go-MCP 是一个 MCP 协议的 GO 实现,此 SDK 采用清晰的分层架构设计,确保代码模块化、可扩展性和可维护性。通过深入了解这一架构,开发者可以更好地利用 Go-MCP 的所有功能,甚至根据自己的需求进行定制和扩展。
https://github.com/ThinkInAIXYZ/go-mcp
Go-MCP 的架构可以抽象为三个主要层次:
- 传输层(Transport Layer):处理底层通信,支持不同的传输协议;
- 协议层(Protocol Layer):实现所有 MCP 协议数据结构定义;
- 用户层(User Layer):包括服务器和客户端实现,提供面向用户的 API。
这种分层设计使各层彼此解耦,允许独立演化和替换,同时保持整体功能一致性。
Jack码原理说明
Jack码是一种基于北京时间的编码方式,具体规则如下:
- 获取当前北京时间,格式为
yyyyMMddHHmm
,如202505050829
,类型为 int64。 - 将该时间值加上常数
1314520
。 - 对结果进行 Base64 编码,得到最终的 Jack码。
示例:
-
当前北京时间:2025年5月5日08时29分 →
202505050829
-
加上常数:
202505050829 + 1314520 = 202506865349
-
Base64 编码:
MjAyNTA2ODY1MzQ5
(以上内容是作者为了练习开发一个自定义MCP服务临时想出的概念,仅供娱乐)
代码实现
go mod init jack_stdio_server
main.go
go
package main
import (
"context"
"encoding/base64"
"fmt"
"strconv"
"time"
"github.com/ThinkInAIXYZ/go-mcp/protocol"
"github.com/ThinkInAIXYZ/go-mcp/server"
"github.com/ThinkInAIXYZ/go-mcp/transport"
)
type JackRequest struct{}
func handleJackRequest(ctx context.Context, req *protocol.CallToolRequest) (*protocol.CallToolResult, error) {
// 解析参数(如有)
// 获取当前北京时间
now := time.Now().In(time.FixedZone("CST", 8*3600))
base := now.Format("200601021504")
baseInt, err := strconv.Atoi(base)
if err != nil {
return nil, err
}
jackValue := baseInt + 1314520
jackStr := strconv.Itoa(jackValue)
jackCode := base64.StdEncoding.EncodeToString([]byte(jackStr))
// 构造文本内容
content := &protocol.TextContent{
Type: "text",
Text: fmt.Sprintf("Jack码: %s\n原始值: %s\n基准时间: %s", jackCode, jackStr, base),
}
// 返回结果,Content 字段为 Content 接口切片
return &protocol.CallToolResult{
Content: []protocol.Content{content},
IsError: false,
}, nil
}
func main() {
transportServer := transport.NewStdioServerTransport()
mcpServer, _ := server.NewServer(transportServer)
tool, _ := protocol.NewTool("get_jack_code", "获取当前Jack码", JackRequest{})
mcpServer.RegisterTool(tool, handleJackRequest)
mcpServer.Run()
}
go.mod
module jack_stdio_server
go 1.24.1
require github.com/ThinkInAIXYZ/go-mcp v0.2.2
require (
github.com/google/uuid v1.6.0 // indirect
github.com/orcaman/concurrent-map/v2 v2.0.1 // indirect
github.com/tidwall/gjson v1.18.0 // indirect
github.com/tidwall/match v1.1.1 // indirect
github.com/tidwall/pretty v1.2.0 // indirect
github.com/yosida95/uritemplate/v3 v3.0.2 // indirect
)
然后编译
go mod tidy
go build
Cline (Roo Code)配置mcp Json文件(Windows)
json
{
"mcpServers": {
"jack_stdio": {
"command": "./jack_stdio_server.exe",
"args": [],
"env": {},
"disabled": false,
"autoApprove": [],
"alwaysAllow": []
}
}
}
如果mcp服务文件不在项目目录下的话请写完整路径,如C:\\mcpServer\\jack_stdio_server.exe
配置好后提问AI:
当前的jack码是多少?
AI:
