#!/bin/bash # ai-proj-helper 初始化脚本 # 配置 MCP 服务器 + 生成 marketplace.json set -e SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" MCP_CONFIG="$HOME/.claude/.mcp.json" MCP_BRIDGE_DIR="$HOME/coding/qiudl/new-ai-proj/mcp-task-bridge" CONFIG_FILE="$SCRIPT_DIR/claude-config.yaml" # Default values MODE="" ENV="" TOKEN="" # ── Parse command line arguments ────────────────────────────────────── while [[ $# -gt 0 ]]; do case $1 in --mode) MODE="$2"; shift 2 ;; --env) ENV="$2"; shift 2 ;; --token) TOKEN="$2"; shift 2 ;; -h|--help) echo "Usage: ./init.sh [--mode stdio|sse] [--env dev|staging|prod] [--token PAT_TOKEN]" echo "" echo "Options:" echo " --mode MCP connection mode: stdio (local) or sse (remote)" echo " --env Environment: dev, staging, or prod" echo " --token Personal Access Token for ai-proj API" 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" "stdio") CONFIG_ENV=$(read_config_value "env" "prod") # ── Interactive mode selection ──────────────────────────────────────── if [ -z "$MODE" ]; then echo "┌─────────────────────────────────────┐" echo "│ ai-proj-helper 初始化 │" echo "└─────────────────────────────────────┘" echo "" echo "MCP 连接模式:" echo " 1) stdio - 本地进程 (需要 mcp-task-bridge)" echo " 2) sse - 远程 SSE 连接" echo "" read -p "选择模式 [1/2] (default: $([ "$CONFIG_MODE" = "sse" ] && echo "2" || echo "1")): " mode_choice case "$mode_choice" in 2|sse) MODE="sse" ;; *) MODE="stdio" ;; esac fi # ── Interactive environment selection ───────────────────────────────── if [ -z "$ENV" ]; then echo "" echo "环境:" echo " 1) dev - http://localhost:8080" echo " 2) staging - https://ai-staging.pipexerp.com" echo " 3) prod - https://ai.pipexerp.com" echo "" default_num=3 [ "$CONFIG_ENV" = "dev" ] && default_num=1 [ "$CONFIG_ENV" = "staging" ] && default_num=2 read -p "选择环境 [1/2/3] (default: $default_num): " env_choice case "$env_choice" in 1|dev) ENV="dev" ;; 2|staging) ENV="staging" ;; *) ENV="prod" ;; esac fi # ── Resolve API base URL ───────────────────────────────────────────── case "$ENV" in dev) API_BASE="http://localhost:8080/api/v1" ;; staging) API_BASE="https://ai-staging.pipexerp.com/api/v1" ;; prod) API_BASE="https://ai.pipexerp.com/api/v1" ;; esac # ── Token input ─────────────────────────────────────────────────────── if [ -z "$TOKEN" ]; then echo "" echo "请输入 AI-Proj Personal Access Token (PAT):" echo " 获取方式: 登录 AI-Proj → 设置 → API Tokens → 创建" echo "" read -sp "Token: " TOKEN echo "" fi if [ -z "$TOKEN" ]; then echo "❌ Token 不能为空" exit 1 fi echo "" echo "配置信息:" echo " 模式: $MODE" echo " 环境: $ENV ($API_BASE)" echo "" # ── stdio mode: ensure mcp-task-bridge ──────────────────────────────── if [ "$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" # Generate .mcp.json for stdio mode 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 模式)" elif [ "$MODE" = "sse" ]; then # Generate .mcp.json for SSE mode SSE_URL="${API_BASE%/api/v1}/mcp/sse" mkdir -p "$(dirname "$MCP_CONFIG")" cat > "$MCP_CONFIG" << EOF { "mcpServers": { "ai-proj": { "type": "sse", "url": "$SSE_URL", "headers": { "Authorization": "Bearer $TOKEN" } } } } EOF echo "✅ 已生成 $MCP_CONFIG (SSE 模式)" fi # ── Generate marketplace.json ───────────────────────────────────────── echo "" echo "🔄 生成 marketplace.json..." cd "$SCRIPT_DIR" python3 generate-marketplace.py echo "" echo "┌─────────────────────────────────────┐" echo "│ ✅ 初始化完成! │" echo "└─────────────────────────────────────┘" echo "" echo "下次启动 Claude Code 即可使用 MCP 工具。" echo "如需更新技能配置,编辑 claude-config.yaml 后重新运行 ./init.sh"