From bcf7cbbeea9f547293ad6c1d47f50381431c53fa Mon Sep 17 00:00:00 2001 From: TaskPool Date: Mon, 27 Jul 2026 02:52:46 +0800 Subject: [PATCH] refactor(mcp): remove standalone HTTP mode, keep only built-in endpoint and stdio - MCP Server is now only available via built-in /mcp endpoint or stdio - Remove --http flag and standalone HTTP server code - Simplify documentation and frontend settings --- cmd/mcp/server.go | 94 +++++++----------------------------- docs/guide/mcp.md | 98 +++++--------------------------------- web/src/pages/Settings.tsx | 6 +-- 3 files changed, 30 insertions(+), 168 deletions(-) diff --git a/cmd/mcp/server.go b/cmd/mcp/server.go index 0e66a9d..2183913 100644 --- a/cmd/mcp/server.go +++ b/cmd/mcp/server.go @@ -2,7 +2,6 @@ package mcp import ( "fmt" - "net/http" "os" "strings" @@ -10,15 +9,10 @@ import ( imc "github.com/engigu/taskpool/internal/mcp" ) -// Run 启动 TaskPool MCP Server -// 模式: -// - stdio(默认):通过 stdin/stdout 通信,适用于 Claude Desktop / Cursor 等本地 Agent -// - http:通过 HTTP/SSE 通信,适用于 Hermes / OpenClaw 等远程 Agent -// -// 环境变量: -// TASKPOOL_URL 面板地址,如 http://127.0.0.1:8052 或 https://panel.example.com -// TASKPOOL_TOKEN 设置页 OpenAPI Token -// MCP_HTTP_ADDR HTTP 模式监听地址(默认 :8053) +// Run 启动 TaskPool MCP Server(stdio 模式) +// 环境变量(可选,默认使用本地服务器配置): +// TASKPOOL_URL 面板地址 +// TASKPOOL_TOKEN OpenAPI Token func Run(args []string) { for _, a := range args { if a == "-h" || a == "--help" { @@ -27,68 +21,18 @@ func Run(args []string) { } } - mode := "stdio" - httpAddr := ":8053" - - for i, a := range args { - if a == "--http" { - mode = "http" - if i+1 < len(args) && !strings.HasPrefix(args[i+1], "-") { - httpAddr = args[i+1] - } - } - } - - if envAddr := os.Getenv("MCP_HTTP_ADDR"); envAddr != "" { - httpAddr = envAddr - } - - if mode == "http" { - runHTTP(httpAddr) - } else { - runStdio() - } -} - -func runStdio() { // 使用内部 OpenAPI 客户端(自动获取服务器地址和 Token) client := imc.GetOpenAPIClient() - fmt.Fprintf(os.Stderr, "[taskpool-mcp] mode=stdio url=%s token=%s\n", client.BaseURL, maskToken(client.Token)) + fmt.Fprintf(os.Stderr, "[taskpool-mcp] stdio mode, url=%s token=%s\n", client.BaseURL, maskToken(client.Token)) s := mcp.GetServer() - // 设置外部客户端(用于 stdio 模式连接远程服务器) + // 设置外部客户端(用于连接远程服务器) if client.Token != "" { mcp.SetExternalClient(client) } if err := mcp.ServeStdio(s); err != nil { - fmt.Fprintf(os.Stderr, "[taskpool-mcp] server error: %v\n", err) - os.Exit(1) - } -} - -func runHTTP(addr string) { - client := imc.GetOpenAPIClient() - fmt.Fprintf(os.Stderr, "[taskpool-mcp] mode=http addr=%s url=%s token=%s\n", addr, client.BaseURL, maskToken(client.Token)) - - // 设置外部客户端 - if client.Token != "" { - mcp.SetExternalClient(client) - } - - handler := mcp.GetHTTPHandler() - - // 添加健康检查端点 - mux := http.NewServeMux() - mux.Handle("/mcp/", http.StripPrefix("/mcp", handler)) - mux.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(http.StatusOK) - w.Write([]byte(`{"status":"ok"}`)) - }) - - fmt.Fprintf(os.Stderr, "[taskpool-mcp] MCP endpoint: http://%s/mcp\n", strings.TrimPrefix(addr, ":")) - if err := http.ListenAndServe(addr, mux); err != nil { - fmt.Fprintf(os.Stderr, "[taskpool-mcp] http server error: %v\n", err) + fmt.Fprintf(os.Stderr, "[taskpool-mcp] error: %v\n", err) os.Exit(1) } } @@ -106,26 +50,22 @@ func maskToken(t string) string { func printHelp() { fmt.Fprintf(os.Stderr, ` -TaskPool MCP Server(内置模式) +TaskPool MCP Server -MCP Server 已集成到后端服务中,推荐直接使用内置端点: - http://your-server:8052/mcp +MCP Server 已内置在后端服务中: + HTTP 端点: http://your-server:8052/mcp -此命令用于: - - stdio 模式:本地 Agent(Claude Desktop / Cursor) - - 独立 HTTP 服务:需要单独端口时 +此命令仅用于 stdio 模式(Claude Desktop / Cursor 等)。 用法: - taskpool mcp # stdio 模式 - taskpool mcp --http # HTTP 模式,监听 :8053 - taskpool mcp --http :9000 # HTTP 模式,指定端口 + taskpool mcp -环境变量(stdio 模式可选): - TASKPOOL_URL 面板地址(默认本机) +环境变量(可选): + TASKPOOL_URL 面板地址(默认使用本机) TASKPOOL_TOKEN OpenAPI Token(默认从系统设置读取) -Agent 配置示例: - HTTP 模式(推荐): +Agent 配置: + HTTP 模式(Hermes / OpenClaw): { "mcpServers": { "taskpool": { @@ -137,7 +77,7 @@ Agent 配置示例: } } - stdio 模式: + stdio 模式(Claude Desktop / Cursor): { "mcpServers": { "taskpool": { diff --git a/docs/guide/mcp.md b/docs/guide/mcp.md index 42bd1b8..49fac6e 100644 --- a/docs/guide/mcp.md +++ b/docs/guide/mcp.md @@ -14,17 +14,17 @@ TaskPool 提供官方 **MCP Server**,让 Hermes、OpenClaw、Cursor 等 AI Age ## 内置 MCP 端点 -MCP Server 已**内置在后端服务中**,无需单独启动进程。启用 OpenAPI 后,MCP 端点自动可用: +MCP Server 已**内置在后端服务中**,无需单独进程。启用 OpenAPI 后,MCP 端点自动可用: ``` http://your-server:8052/mcp ``` -## Agent 配置示例 +## Agent 配置 ### HTTP 模式(推荐) -远程 Agent 直接访问内置端点,无需本地安装二进制。 +远程 Agent 直接访问内置端点,无需本地安装。 ```json { @@ -39,98 +39,24 @@ http://your-server:8052/mcp } ``` +适用于:Hermes、OpenClaw 等支持 HTTP URL 的 Agent。 + ### stdio 模式 -本地 Agent 需要安装 `taskpool` 二进制(Claude Desktop、Cursor)。 - -```bash -export TASKPOOL_URL=http://your-server:8052 -export TASKPOOL_TOKEN=你的OpenAPI_Token -taskpool mcp -``` - -Agent 配置: +本地 Agent 需要安装 `taskpool` 二进制。 ```json { "mcpServers": { "taskpool": { "command": "taskpool", - "args": ["mcp"], - "env": { - "TASKPOOL_URL": "http://your-server:8052", - "TASKPOOL_TOKEN": "你的OpenAPI_Token" - } + "args": ["mcp"] } } } ``` -### 独立 HTTP 服务模式(可选) - -如果需要单独部署 MCP 服务(如不同的端口或机器): - -```bash -# 监听默认端口 :8053 -taskpool mcp --http - -# 指定端口 -taskpool mcp --http :9000 - -# 或通过环境变量 -export MCP_HTTP_ADDR=:8053 -taskpool mcp --http -``` - -独立模式暴露端点: -- `POST /mcp` - MCP 协议端点 -- `GET /health` - 健康检查 - -## Agent 配置示例 - -### stdio 模式(Claude Desktop / Cursor) - -```json -{ - "mcpServers": { - "taskpool": { - "command": "taskpool", - "args": ["mcp"], - "env": { - "TASKPOOL_URL": "http://127.0.0.1:8052", - "TASKPOOL_TOKEN": "替换为设置页 Token" - } - } - } -} -``` - -若二进制不在 PATH: - -```json -{ - "command": "/path/to/taskpool", - "args": ["mcp"], - "env": { - "TASKPOOL_URL": "https://你的面板地址", - "TASKPOOL_TOKEN": "xxx" - } -} -``` - -### HTTP 模式(Hermes / OpenClaw) - -```json -{ - "mcpServers": { - "taskpool": { - "url": "http://your-server:8053/mcp" - } - } -} -``` - -Docker 部署时,把 `TASKPOOL_URL` 写成 Agent 能访问的地址(宿主机映射端口或内网域名)。 +适用于:Claude Desktop、Cursor 等只支持 stdio 的本地 Agent。 ## 工具清单(Tools) @@ -197,7 +123,7 @@ Skill 是说明书;**真正执行依赖 MCP Tools**。两者一起用效果最 | 现象 | 处理 | |------|------| -| `TASKPOOL_TOKEN 未配置` | 设置 env 或配置里的 Token | -| `无效的 OpenAPI 令牌` | 设置页启用 OpenAPI 并重新生成 | -| 连接失败 | 检查 `TASKPOOL_URL`、防火墙、容器网络 | -| Agent 看不到 tools | 确认 `command` 路径正确,重启 Agent Gateway | +| `OpenAPI Token 未配置` | 设置页启用 OpenAPI 并生成 Token | +| `无效的 OpenAPI 令牌` | 设置页重新生成 Token | +| 连接失败 | 检查服务器地址、防火墙、容器网络 | +| Agent 看不到 tools | 确认配置正确,Token 有效 | diff --git a/web/src/pages/Settings.tsx b/web/src/pages/Settings.tsx index 002fc3d..cde462f 100644 --- a/web/src/pages/Settings.tsx +++ b/web/src/pages/Settings.tsx @@ -322,11 +322,7 @@ export default function Settings() { "mcpServers": { "taskpool": { "command": "taskpool", - "args": ["mcp"], - "env": { - "TASKPOOL_URL": "${window.location.origin}", - "TASKPOOL_TOKEN": "${siteForm.openapi_token || '在设置页生成 Token'}" - } + "args": ["mcp"] } } }`}