README 从开发者内部文档风格改为面向小白用户的中文项目介绍, 增加场景演示、技能速查表、FAQ;init.sh 新增自动注册技能市场 到 known_marketplaces.json,实现真正的一键部署。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
181 lines
6.1 KiB
Bash
Executable File
181 lines
6.1 KiB
Bash
Executable File
#!/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
|
|
|
|
# ── Register skill marketplace ───────────────────────────────────────
|
|
echo "📦 注册技能市场..."
|
|
SCRIPT_DIR="$SCRIPT_DIR" python3 << 'PYEOF'
|
|
import json, os, datetime
|
|
path = os.path.expanduser("~/.claude/plugins/known_marketplaces.json")
|
|
os.makedirs(os.path.dirname(path), exist_ok=True)
|
|
data = json.load(open(path)) if os.path.exists(path) else {}
|
|
script_dir = os.environ["SCRIPT_DIR"]
|
|
data["ai-proj-helper"] = {
|
|
"source": {"source": "directory", "path": script_dir},
|
|
"installLocation": script_dir,
|
|
"lastUpdated": datetime.datetime.now(datetime.timezone.utc).strftime("%Y-%m-%dT%H:%M:%S.000Z")
|
|
}
|
|
with open(path, "w") as f:
|
|
json.dump(data, f, indent=2)
|
|
PYEOF
|
|
echo "✅ 已注册技能市场到 ~/.claude/plugins/known_marketplaces.json"
|
|
|
|
echo ""
|
|
echo "┌─────────────────────────────────────┐"
|
|
echo "│ ✅ 初始化完成! │"
|
|
echo "└─────────────────────────────────────┘"
|
|
echo ""
|
|
echo "已完成配置:"
|
|
echo " ✅ MCP 服务器 → $MCP_CONFIG"
|
|
echo " ✅ 技能市场 → ~/.claude/plugins/known_marketplaces.json"
|
|
echo ""
|
|
echo "下次启动 Claude Code 即可使用。"
|
|
echo "如需更改模式,编辑 claude-config.yaml 后重新运行 ./init.sh"
|