几十行代码轻松打造属于自己的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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!