项目简介

Taurus Pro HTTP是一个Go语言实现的高性能企业级HTTP服务框架,专门用于构建现代Web应用和API服务。它全面支持Model Context Protocol (MCP) 协议,旨在为大型语言模型(LLM)应用提供稳定、可扩展的上下文信息、功能调用及Prompt模板服务。

主要功能点

  • MCP协议支持: 核心功能,允许LLM客户端通过JSON-RPC协议与服务器交互,请求资源、调用工具和获取Prompt模板。
  • 多种传输协议: 支持Stdio、SSE(Server-Sent Events)和Streamable HTTP,适应不同部署场景和通信需求。
  • 上下文管理: 支持有状态和无状态两种运行模式,灵活管理LLM会话上下文。
  • 高性能HTTP服务: 提供标准化的请求/响应处理、灵活路由、WebSocket通信、JWT认证等,确保整体服务的高效稳定。
  • 丰富的中间件: 内置CORS、恢复等中间件,并支持自定义,提升开发效率和安全性。

安装步骤

  1. 环境要求: 确保您的系统已安装Go 1.23.0或更高版本。
  2. 安装命令: 打开终端并执行以下命令:
    go get github.com/stones-hub/taurus-pro-http
  3. 依赖管理: 进入项目目录后,运行以下命令以管理依赖:
    go mod tidy

MCP服务器配置 (面向MCP客户端)

MCP客户端需要通过启动命令来连接Taurus Pro MCP服务器。以下是一个MCP客户端配置Taurus Pro MCP服务器的JSON示例,以及其中参数的详细说明:

{
  "server_name": "my-mcp-server",
  "command": "go",
  "args": [
    "run",
    "main.go"  // 假设您的MCP服务器入口文件是main.go,或者指定编译后的可执行文件路径
    // 如果您的Taurus Pro MCP服务器运行在特定端口,可能需要在服务器启动代码中指定
  ],
  "env": {
    "MCP_TRANSPORT": "streamable_http", // 可选: 指定MCP传输协议。可选值: stdio, sse, streamable_http (默认)
    "MCP_MODE": "stateless"             // 可选: 指定MCP运行模式。可选值: stateful, stateless (默认)
  }
}

参数注释:

  • 'server_name': 您为MCP服务器定义的唯一名称,客户端将通过此名称识别服务器。
  • 'command': 用于启动Taurus Pro MCP服务器的命令行程序。例如,'go'(如果您直接运行Go源码)或编译后的服务器可执行文件路径(如 './my_server')。
  • 'args': 传递给 'command' 的命令行参数列表。这些参数将影响服务器的启动行为,例如指定配置文件路径、监听端口等。
  • 'env': 环境变量,用于配置MCP服务器的行为。
    • 'MCP_TRANSPORT': 指定MCP服务器使用的传输协议。
      • 'stdio': 适合单机部署场景。
      • 'sse': 单机和集群都适合,但在集群下需要维护有状态的会话。
      • 'streamable_http': 适合集群部署场景(默认值)。
    • 'MCP_MODE': 指定MCP服务器的会话管理模式。
      • 'stateful': 服务器会保存LLM会话上下文。
      • 'stateless': 服务器不会保存LLM会话上下文(默认值)。

重要提示: 如果选择 'stdio' 以外的传输协议 (如 'sse' 或 'streamable_http'),Taurus Pro MCP服务器需要一个HTTP服务器实例来提供服务。您需要确保启动的服务器实例 ('command' 和 'args' 指定的程序) 已经集成了 'taurus-pro-http' 框架并正确创建了 'mcp.New' 实例,并且该HTTP服务器正在监听客户端期望连接的端口。

基本使用方法

以下是一个在Taurus Pro HTTP框架中创建并运行MCP服务器的简单示例:

package main

import (
	"context"
	"encoding/json"
	"log"
	"time"

	"github.com/stones-hub/taurus-pro-http/pkg/mcp"
	"github.com/stones-hub/taurus-pro-http/pkg/server" // 导入HTTP服务器包
	"github.com/ThinkInAIXYZ/go-mcp/protocol" // 导入 go-mcp 协议定义,用于定义工具、资源等
	mcp_server "github.com/ThinkInAIXYZ/go-mcp/server" // 导入 go-mcp server包,用于注册处理器
)

func main() {
	// 1. 创建Taurus Pro HTTP服务器实例 (用于托管MCP HTTP/SSE端点)
	httpSrv := server.New(server.Config{
		Addr: ":8080", // MCP服务将通过此HTTP服务器端口暴露
		// 根据需要配置其他HTTP服务器参数,如超时时间等
		ReadTimeout:  60 * time.Second,
		WriteTimeout: 60 * time.Second,
		IdleTimeout:  300 * time.Second,
	})

	// 2. 创建MCP服务器实例
	// 这里我们配置为使用 Streamable HTTP 传输协议和无状态模式
	mcpServer, cleanup, err := mcp.New(
		mcp.WithName("my-mcp-server"),
		mcp.WithVersion("1.0.0"),
		mcp.WithTransport(mcp.TransportStreamableHTTP), // 选择传输协议
		mcp.WithMode(mcp.ModeStateless),                 // 选择会话管理模式
		mcp.WithHttpServer(httpSrv),                     // 将HTTP服务器传递给MCP服务器,使其能注册HTTP路由
	)
	if err != nil {
		log.Fatalf("创建MCP服务器失败: %v", err)
	}
	defer cleanup() // 确保MCP服务器在程序退出时正确关闭

	// 3. 注册MCP工具 (示例:注册一个获取当前时间的工具)
	mcpServer.RegisterTool(&protocol.Tool{
		Name:        "currentTime",
		Description: "获取当前的UTC时间",
		Parameters:  '{}', // 工具参数定义为JSON Schema,这里表示无参数
	}, func(ctx *protocol.ToolContext, args json.RawMessage) (json.RawMessage, error) {
		// 工具被LLM调用时将执行此函数
		log.Printf("MCP Tool 'currentTime' 被调用,参数: %s", string(args))
		return json.Marshal(map[string]string{"time": time.Now().UTC().String()}), nil
	})

	// 4. 注册MCP资源 (示例:注册一个简单的配置资源)
	mcpServer.RegisterResource(&protocol.Resource{
		Name:        "config",
		Description: "应用程序配置信息",
		Schema:      '{"type": "object", "properties": {"appName": {"type": "string"}}}',
	}, func(ctx *protocol.ResourceContext, id string, args json.RawMessage) (json.RawMessage, error) {
		// 资源被LLM客户端请求时将执行此函数
		log.Printf("MCP Resource 'config' 被请求,ID: %s, 参数: %s", id, string(args))
		return json.Marshal(map[string]string{"appName": "My LLM App", "version": "1.0"}), nil
	})

	// 5. 启动Taurus Pro HTTP服务器,MCP服务将随之启动并监听8080端口
	errChan := make(chan error, 1)
	httpSrv.Start(errChan)

	log.Printf("🚀 Taurus Pro HTTP & MCP 服务器已启动,监听地址: %s", httpSrv.GetConfig().Addr)

	// 等待服务器运行或发生错误
	select {
	case err := <-errChan:
		log.Fatalf("服务器启动失败: %v", err)
	}
}

信息

分类

AI与计算