项目简介

MCP-Cobra是一个Go语言库,它将流行的Cobra命令行框架与Model Context Protocol (MCP) 集成。通过使用MCP-Cobra,开发者可以将现有的或新建的基于Cobra的命令行应用程序轻松地转化为MCP服务器,从而使其CLI命令和功能能够被支持MCP的AI助手或其他客户端发现和调用。

主要功能点

  • 自动转换命令行命令为AI工具: 无需手动定义复杂的MCP工具规范,MCP-Cobra可以自动解析您的Cobra命令结构(包括子命令和各种类型的Flag)并将其转换为AI可调用的MCP工具。
  • 无缝集成现有CLI: 可以在不大幅改动现有Cobra代码的基础上,增加作为MCP服务器运行的模式。
  • 支持多种参数类型: 自动处理字符串、整数、布尔、浮点数等不同类型的命令Flag,并将其映射为MCP工具参数。
  • 双重运行模式: 您的应用程序可以根据启动参数选择作为传统的命令行工具运行,或者作为MCP服务器在后台提供服务。

安装步骤

使用Go语言的包管理工具进行安装:

go get github.com/PlusLemon/mcp-cobra

服务器配置(供MCP客户端使用)

MCP服务器是为MCP客户端提供服务的。MCP客户端需要知道如何启动并连接到服务器。对于使用MCP-Cobra构建的应用,典型的客户端配置方式是通过Stdio(标准输入输出)传输协议。

客户端需要配置服务器的启动命令及其参数,例如:

  • 服务器名称 (server name): 一个描述性的名称,例如 "我的CLI工具服务" 或 "项目名称 API"。
  • 传输协议 (transport): 指定为 'stdio'。
  • 启动命令 (command): 这是一个包含可执行文件路径和启动参数的列表。对于MCP-Cobra应用,通常是您的应用编译后的路径,并带上一个特定参数(如 'mcp-server'),告诉应用以MCP服务器模式启动。

例如,如果您的Go应用编译后生成的可执行文件是 './bin/myapp',并且您在代码中设置了通过 'mcp-server' 参数进入MCP模式,则MCP客户端的启动命令配置部分可能类似于 '["./bin/myapp", "mcp-server"]'。具体的可执行文件路径和参数取决于您的项目构建方式和代码实现。

基本使用方法

  1. 定义您的Cobra命令: 像往常一样使用'spf13/cobra'库构建您的命令行应用程序结构,包括定义根命令、子命令和Flags。
  2. 集成MCP-Cobra: 在您的应用入口处,检查特定的启动参数(例如检查'os.Args'),如果存在该参数,则创建'mcp.NewMCPServer()'实例,传入您的Cobra根命令。
  3. 启动服务器: 调用'mcpServer.ServeStdio()'方法来启动MCP服务器,它会监听标准输入,与MCP客户端通过标准输出进行通信。
  4. 运行应用:
    • 直接运行应用(不带特定参数),它将作为传统CLI工具执行。
    • 带上特定参数运行应用(例如 './myapp mcp-server'),它将作为MCP服务器在后台运行,等待MCP客户端连接并调用工具。

例如代码片段(详见仓库的'foocli'示例):

package main

import (
    "fmt"
    "os"
    "github.com/PlusLemon/mcp-cobra/mcp" // 导入mcp-cobra库
    "github.com/spf13/cobra"
)

func main() {
    rootCmd := &cobra.Command{
        Use:   "myapp",
        Short: "我的应用",
    }
    // ... 添加你的子命令和Flags ...

    // 判断是否以MCP服务器模式启动
    if len(os.Args) > 1 && os.Args[1] == "mcp-server" {
        // 以MCP服务器模式启动
        mcpServer := mcp.NewMCPServer(rootCmd) // 创建MCP服务器实例
        if err := mcpServer.ServeStdio(); err != nil { // 启动Stdio服务
            fmt.Printf("MCP server error: %v\n", err)
            os.Exit(1)
        }
    } else {
        // 作为普通CLI应用运行
        if err := rootCmd.Execute(); err != nil {
            fmt.Println(err)
            os.Exit(1)
        }
    }
}

信息

分类

开发者工具