#!/bin/bash # ai-proj-helper MCP 初始化脚本 # 为用户配置 ai-proj MCP 连接 set -e SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" MCP_CONFIG="$HOME/.claude/.mcp.json" MCP_BRIDGE_DIR="$SCRIPT_DIR/mcp-task-bridge" CONFIG_FILE="$SCRIPT_DIR/claude-config.yaml" API_BASE="https://ai.pipexerp.com/api/v1" SSE_URL="${API_BASE}/mcp/sse" # Default values MODE="" TOKEN="" # ── Parse command line arguments ────────────────────────────────────── while [[ $# -gt 0 ]]; do case $1 in --mode) MODE="$2"; shift 2 ;; --token) TOKEN="$2"; shift 2 ;; -h|--help) echo "Usage: ./init.sh [--mode sse|stdio] [--token MCP_API_KEY]" echo "" echo "Options:" echo " --mode MCP connection mode: sse (remote, recommended) or stdio (local)" echo " --token MCP API Key (aiproj_pk_xxx)" echo "" echo "Without arguments, runs in interactive mode." exit 0 ;; *) echo "Unknown option: $1"; exit 1 ;; esac done # ── Read config defaults ───────────────────────────────────────────── read_config_value() { local key="$1" local default="$2" if [ -f "$CONFIG_FILE" ]; then local val val=$(grep "^ ${key}:" "$CONFIG_FILE" 2>/dev/null | head -1 | sed 's/^[^:]*: *//' | sed 's/ *#.*//' | tr -d '"' | tr -d "'") if [ -n "$val" ]; then echo "$val" return fi fi echo "$default" } CONFIG_MODE=$(read_config_value "mode" "sse") # ── Interactive mode selection ──────────────────────────────────────── if [ -z "$MODE" ]; then echo "┌─────────────────────────────────────┐" echo "│ ai-proj MCP 初始化 │" echo "└─────────────────────────────────────┘" echo "" echo "MCP 连接模式:" echo " 1) sse - 远程 SSE 连接 (推荐,零依赖)" 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" ;; esac fi # ── Token input ─────────────────────────────────────────────────────── if [ -z "$TOKEN" ]; then echo "" echo "请输入 MCP API Key:" echo " 格式: aiproj_pk_xxxxxxxx" echo " 获取: 登录 AI-Proj → 设置 → MCP API Keys → 创建" echo "" read -sp "API Key: " TOKEN echo "" fi if [ -z "$TOKEN" ]; then echo "❌ API Key 不能为空" exit 1 fi echo "" echo "配置信息:" echo " 模式: $MODE" if [ "$MODE" = "sse" ]; then echo " SSE: $SSE_URL" else echo " API: $API_BASE" fi echo "" # ── SSE mode ───────────────────────────────────────────────────────── if [ "$MODE" = "sse" ]; then mkdir -p "$(dirname "$MCP_CONFIG")" cat > "$MCP_CONFIG" << EOF { "mcpServers": { "ai-proj": { "type": "sse", "url": "$SSE_URL", "headers": { "X-API-Key": "$TOKEN" } } } } EOF echo "✅ 已生成 $MCP_CONFIG (SSE 模式)" # ── stdio mode: ensure mcp-task-bridge ──────────────────────────────── elif [ "$MODE" = "stdio" ]; then if [ ! -d "$MCP_BRIDGE_DIR" ]; then echo "📦 mcp-task-bridge 未找到,正在克隆..." git clone https://gitea.pipexerp.com/pipexerp/mcp-task-bridge.git "$MCP_BRIDGE_DIR" fi if [ ! -f "$MCP_BRIDGE_DIR/dist/index.js" ]; then echo "🔨 构建 mcp-task-bridge..." cd "$MCP_BRIDGE_DIR" npm install npm run build cd "$SCRIPT_DIR" fi BRIDGE_ENTRY="$MCP_BRIDGE_DIR/dist/index.js" mkdir -p "$(dirname "$MCP_CONFIG")" cat > "$MCP_CONFIG" << EOF { "mcpServers": { "ai-proj": { "command": "node", "args": ["$BRIDGE_ENTRY"], "env": { "NODE_ENV": "production", "TASK_API_BASE": "$API_BASE", "TASK_API_TOKEN": "$TOKEN", "MCP_SERVER_NAME": "ai-proj" } } } } EOF echo "✅ 已生成 $MCP_CONFIG (stdio 模式)" fi echo "" echo "┌─────────────────────────────────────┐" echo "│ ✅ 初始化完成! │" echo "└─────────────────────────────────────┘" echo "" echo "下次启动 Claude Code 即可使用 MCP 工具。" echo "如需更改模式,编辑 claude-config.yaml 后重新运行 ./init.sh"