diff --git a/init.sh b/init.sh index fc2f9d0..9a9a5e9 100755 --- a/init.sh +++ b/init.sh @@ -21,10 +21,10 @@ while [[ $# -gt 0 ]]; do --mode) MODE="$2"; shift 2 ;; --token) TOKEN="$2"; shift 2 ;; -h|--help) - echo "Usage: ./init.sh [--mode sse|stdio] [--token MCP_API_KEY]" + echo "Usage: ./init.sh [--mode remote|stdio] [--token MCP_API_KEY]" echo "" echo "Options:" - echo " --mode MCP connection mode: sse (remote, recommended) or stdio (local)" + echo " --mode MCP connection mode: remote (Streamable HTTP, recommended) or stdio (local Node.js)" echo " --token MCP API Key (aiproj_pk_xxx)" echo "" echo "Without arguments, runs in interactive mode." @@ -49,7 +49,12 @@ read_config_value() { echo "$default" } -CONFIG_MODE=$(read_config_value "mode" "sse") +CONFIG_MODE=$(read_config_value "mode" "remote") + +# Normalize mode aliases: sse → remote +if [ "$MODE" = "sse" ]; then + MODE="remote" +fi # ── Detect claude CLI ──────────────────────────────────────────────── HAS_CLAUDE=false @@ -64,13 +69,13 @@ if [ -z "$MODE" ]; then echo "└─────────────────────────────────────┘" echo "" echo "MCP 连接模式:" - echo " 1) sse - 远程连接 (推荐,零依赖)" + echo " 1) remote - 远程连接 (推荐,零依赖,Streamable HTTP)" echo " 2) stdio - 本地进程 (需要 Node.js + mcp-task-bridge)" echo "" read -p "选择模式 [1/2] (default: $([ "$CONFIG_MODE" = "stdio" ] && echo "2" || echo "1")): " mode_choice case "$mode_choice" in 2|stdio) MODE="stdio" ;; - *) MODE="sse" ;; + *) MODE="remote" ;; esac fi @@ -94,7 +99,7 @@ echo "" echo "配置信息:" echo " 模式: $MODE" echo " Claude CLI: $($HAS_CLAUDE && echo '检测到' || echo '未检测到 (回退写 .mcp.json)')" -if [ "$MODE" = "sse" ]; then +if [ "$MODE" = "remote" ]; then echo " URL: $SSE_URL" else echo " API: $API_BASE" @@ -102,7 +107,7 @@ fi echo "" # ── Configure MCP ──────────────────────────────────────────────────── -if [ "$MODE" = "sse" ]; then +if [ "$MODE" = "remote" ]; then if $HAS_CLAUDE; then # 新版 Claude Code: 用 claude mcp add 注册(transport=http,即 Streamable HTTP) # 先移除旧配置(忽略错误) @@ -110,13 +115,13 @@ if [ "$MODE" = "sse" ]; then claude mcp add ai-proj "$SSE_URL" -t http -s user -H "X-API-Key: $TOKEN" 2>&1 echo "✅ 已通过 claude mcp add 注册 (Streamable HTTP)" else - # 旧版或无 CLI: 回退写 .mcp.json + # 旧版或无 CLI: 回退写 .mcp.json(使用 http transport) mkdir -p "$(dirname "$MCP_CONFIG")" cat > "$MCP_CONFIG" << EOF { "mcpServers": { "ai-proj": { - "type": "sse", + "type": "http", "url": "$SSE_URL", "headers": { "X-API-Key": "$TOKEN" @@ -125,7 +130,7 @@ if [ "$MODE" = "sse" ]; then } } EOF - echo "✅ 已生成 $MCP_CONFIG (SSE 模式)" + echo "✅ 已生成 $MCP_CONFIG (Streamable HTTP 模式)" fi elif [ "$MODE" = "stdio" ]; then @@ -197,6 +202,24 @@ done echo " 已安装 $SKILL_COUNT 个技能" echo "✅ 技能安装完成 → $SKILLS_DIR" +# ── Verify MCP connection ──────────────────────────────────────────── +echo "" +echo "🔍 验证 MCP 连接..." +if [ "$MODE" = "remote" ]; then + VERIFY_RESPONSE=$(curl -s -o /dev/null -w "%{http_code}" -X POST "$SSE_URL" \ + -H "Content-Type: application/json" \ + -H "X-API-Key: $TOKEN" \ + -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"init-verify","version":"1.0"}}}' \ + --connect-timeout 10 --max-time 15 2>/dev/null) + if [ "$VERIFY_RESPONSE" = "200" ]; then + echo " ✅ MCP 服务端连接正常 (HTTP $VERIFY_RESPONSE)" + else + echo " ⚠️ MCP 服务端连接异常 (HTTP $VERIFY_RESPONSE)" + echo " 请检查: 1) API Key 是否正确 2) 服务端是否运行 3) 网络是否通畅" + echo " 测试命令: curl -s -X POST '$SSE_URL' -H 'X-API-Key: \$TOKEN' -H 'Content-Type: application/json' -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"initialize\",\"params\":{}}'" + fi +fi + echo "" echo "┌─────────────────────────────────────┐" echo "│ ✅ 初始化完成! │" @@ -204,7 +227,7 @@ echo "└─────────────────────── echo "" echo "已完成配置:" if $HAS_CLAUDE; then - echo " ✅ MCP 服务器 (claude mcp add)" + echo " ✅ MCP 服务器 (claude mcp add, transport=http)" else echo " ✅ MCP 服务器 → $MCP_CONFIG" fi