几十行代码轻松打造属于自己的MCP服务器
什么是MCP服务器
MCP(Model Control Protocol)服务器是一种轻量级的工具服务器,可以让你快速构建和部署AI工具。通过简单的几十行代码,你就能创建一个功能完整的MCP服务,实现工具注册、请求处理和结果返回等核心功能。
优势
- 极简开发:核心逻辑仅需几十行代码
- 链式配置:通过链式API快速配置服务特性
- 标准化接口:符合JSONRPC规范的请求响应
- 灵活扩展:轻松添加新工具和处理函数
快速开始
环境准备
go get github.com/mark3labs/mcp-go/server
创建MCP服务器(5行代码)
// 创建MCP服务器实例
s := server.NewMCPServer(
"my-mcp-server", // 服务名称
"1.0.0", // 版本号
server.WithLogging(), // 启用日志
)
定义工具(链式配置)
// 定义工具及其参数
func getMyTool() mcp.Tool {
return mcp.NewTool("my_tool",
mcp.WithDescription("这是我的第一个工具"),
mcp.WithString("query",
mcp.Required(),
mcp.Description("查询参数"),
),
)
实现处理函数
// 处理工具调用的函数
func myHandler(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
// 1. 解析参数
query, ok := request.Params.Arguments["query"].(string)
if !ok {
return nil, errors.New("query must be a string")
}
// 2. 业务逻辑处理
result := "处理结果: " + query
// 3. 返回结果
return mcp.NewToolResultText(result), nil
}
注册工具并启动服务
// 注册工具和处理函数
s.AddTool(getMyTool(), myHandler)
// 启动服务
if err := server.ServeStdio(s); err != nil {
fmt.Printf("Server error: %v\n", err)
}
完整示例
package main
import (
"context"
"errors"
"fmt"
"os"
"github.com/cloudwego/eino-ext/components/model/openai"
"github.com/mark3labs/mcp-go/mcp"
"github.com/mark3labs/mcp-go/server"
"github.com/wangle201210/text2sql"
"github.com/wangle201210/text2sql/eino"
)
func main() {
// 创建MCP服务器
s := server.NewMCPServer(
"text2sql", // 服务名称
"1.0.0", // 版本号
server.WithResourceCapabilities(true, true), // 启用资源能力
server.WithPromptCapabilities(true), // 启用提示能力
server.WithLogging(), // 启用日志
)
// 注册工具和处理函数
s.AddTool(getText2sqlTool(), text2sqlHandler)
// 启动服务
if err := server.ServeStdio(s); err != nil {
fmt.Printf("Server error: %v\n", err)
}
}
func getText2sqlTool() mcp.Tool {
return mcp.NewTool("dt_texe2sql",
mcp.WithDescription("数据库查询"),
mcp.WithString("question",
mcp.Required(),
mcp.Description("查询数据的问题"),
),
)
}
func text2sqlHandler(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
link := os.Getenv("link")
if link == "" {
return nil, fmt.Errorf("link is empty")
}
question, ok := request.Params.Arguments["question"].(string)
if !ok {
return nil, errors.New("question must be a string")
}
cfg := &text2sql.Config{
DbLink: link,
ShouldRun: true,
Times: 3,
Try: 3,
}
newEino, err := eino.NewEino(&openai.ChatModelConfig{
APIKey: "sk-******",
BaseURL: "https://api.openai.com/v1",
Model: "gpt-4o-mini",
})
if err != nil {
return nil, fmt.Errorf("eino err: %+v", err)
}
ts := text2sql.NewText2sql(cfg, newEino)
sql, result, err := ts.Pretty(question)
if err != nil {
return nil, fmt.Errorf("text2sql err: %+v", err)
}
// 组装返回的数据
res := fmt.Sprintf("sql: %s, \nresult: %s", sql, result)
return mcp.NewToolResultText(res), nil
}
高级功能
支持SSE服务
// 创建SSE服务器
sseServer := server.NewSSEServer(s, server.WithBaseURL("http://localhost:8088"))
// 启动SSE服务
log.Printf("SSE server listening on :8088")
if err := sseServer.Start(":8088"); err != nil {
log.Fatalf("Server error: %v", err)
}
链式配置的优势
- 代码简洁:每个With方法对应一个完整功能模块
- 语义清晰:配置意图明确,易于理解
- 易于扩展:添加新功能只需增加新的With方法
总结
MCP服务器开发简单高效,通过链式配置可以快速构建功能完整的工具服务。无论是简单的文本处理还是复杂的AI工具集成,都可以通过几十行代码轻松实现。
如果您觉得我的项目还不错,还请在github上给点个 Star~
底层依赖
示例源码
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: