fix: update init.sh with lessons from MCP SSE debugging

- Rename mode "sse" → "remote" (actual transport is Streamable HTTP)
- Fix .mcp.json fallback: "type": "sse" → "type": "http"
- Add post-install connection verification (curl initialize test)
- Accept "sse" as alias for backward compatibility

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-15 12:41:10 +10:30
parent 3547db27d7
commit c303b534fc

45
init.sh
View File

@@ -21,10 +21,10 @@ while [[ $# -gt 0 ]]; do
--mode) MODE="$2"; shift 2 ;; --mode) MODE="$2"; shift 2 ;;
--token) TOKEN="$2"; shift 2 ;; --token) TOKEN="$2"; shift 2 ;;
-h|--help) -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 ""
echo "Options:" 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 " --token MCP API Key (aiproj_pk_xxx)"
echo "" echo ""
echo "Without arguments, runs in interactive mode." echo "Without arguments, runs in interactive mode."
@@ -49,7 +49,12 @@ read_config_value() {
echo "$default" 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 ──────────────────────────────────────────────── # ── Detect claude CLI ────────────────────────────────────────────────
HAS_CLAUDE=false HAS_CLAUDE=false
@@ -64,13 +69,13 @@ if [ -z "$MODE" ]; then
echo "└─────────────────────────────────────┘" echo "└─────────────────────────────────────┘"
echo "" echo ""
echo "MCP 连接模式:" echo "MCP 连接模式:"
echo " 1) sse - 远程连接 (推荐,零依赖)" echo " 1) remote - 远程连接 (推荐,零依赖Streamable HTTP)"
echo " 2) stdio - 本地进程 (需要 Node.js + mcp-task-bridge)" echo " 2) stdio - 本地进程 (需要 Node.js + mcp-task-bridge)"
echo "" echo ""
read -p "选择模式 [1/2] (default: $([ "$CONFIG_MODE" = "stdio" ] && echo "2" || echo "1")): " mode_choice read -p "选择模式 [1/2] (default: $([ "$CONFIG_MODE" = "stdio" ] && echo "2" || echo "1")): " mode_choice
case "$mode_choice" in case "$mode_choice" in
2|stdio) MODE="stdio" ;; 2|stdio) MODE="stdio" ;;
*) MODE="sse" ;; *) MODE="remote" ;;
esac esac
fi fi
@@ -94,7 +99,7 @@ echo ""
echo "配置信息:" echo "配置信息:"
echo " 模式: $MODE" echo " 模式: $MODE"
echo " Claude CLI: $($HAS_CLAUDE && echo '检测到' || echo '未检测到 (回退写 .mcp.json)')" echo " Claude CLI: $($HAS_CLAUDE && echo '检测到' || echo '未检测到 (回退写 .mcp.json)')"
if [ "$MODE" = "sse" ]; then if [ "$MODE" = "remote" ]; then
echo " URL: $SSE_URL" echo " URL: $SSE_URL"
else else
echo " API: $API_BASE" echo " API: $API_BASE"
@@ -102,7 +107,7 @@ fi
echo "" echo ""
# ── Configure MCP ──────────────────────────────────────────────────── # ── Configure MCP ────────────────────────────────────────────────────
if [ "$MODE" = "sse" ]; then if [ "$MODE" = "remote" ]; then
if $HAS_CLAUDE; then if $HAS_CLAUDE; then
# 新版 Claude Code: 用 claude mcp add 注册transport=http即 Streamable HTTP # 新版 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 claude mcp add ai-proj "$SSE_URL" -t http -s user -H "X-API-Key: $TOKEN" 2>&1
echo "✅ 已通过 claude mcp add 注册 (Streamable HTTP)" echo "✅ 已通过 claude mcp add 注册 (Streamable HTTP)"
else else
# 旧版或无 CLI: 回退写 .mcp.json # 旧版或无 CLI: 回退写 .mcp.json(使用 http transport
mkdir -p "$(dirname "$MCP_CONFIG")" mkdir -p "$(dirname "$MCP_CONFIG")"
cat > "$MCP_CONFIG" << EOF cat > "$MCP_CONFIG" << EOF
{ {
"mcpServers": { "mcpServers": {
"ai-proj": { "ai-proj": {
"type": "sse", "type": "http",
"url": "$SSE_URL", "url": "$SSE_URL",
"headers": { "headers": {
"X-API-Key": "$TOKEN" "X-API-Key": "$TOKEN"
@@ -125,7 +130,7 @@ if [ "$MODE" = "sse" ]; then
} }
} }
EOF EOF
echo "✅ 已生成 $MCP_CONFIG (SSE 模式)" echo "✅ 已生成 $MCP_CONFIG (Streamable HTTP 模式)"
fi fi
elif [ "$MODE" = "stdio" ]; then elif [ "$MODE" = "stdio" ]; then
@@ -197,6 +202,24 @@ done
echo " 已安装 $SKILL_COUNT 个技能" echo " 已安装 $SKILL_COUNT 个技能"
echo "✅ 技能安装完成 → $SKILLS_DIR" 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 "┌─────────────────────────────────────┐" echo "┌─────────────────────────────────────┐"
echo "│ ✅ 初始化完成! │" echo "│ ✅ 初始化完成! │"
@@ -204,7 +227,7 @@ echo "└───────────────────────
echo "" echo ""
echo "已完成配置:" echo "已完成配置:"
if $HAS_CLAUDE; then if $HAS_CLAUDE; then
echo " ✅ MCP 服务器 (claude mcp add)" echo " ✅ MCP 服务器 (claude mcp add, transport=http)"
else else
echo " ✅ MCP 服务器 → $MCP_CONFIG" echo " ✅ MCP 服务器 → $MCP_CONFIG"
fi fi