#!/bin/bash
# Gitea MCP Server - Client Configuration Wizard
# 自动配置多个 MCP 客户端
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m'
log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
log_step() { echo -e "${CYAN}[STEP]${NC} $1"; }
# 配置参数
INSTALL_DIR="${HOME}/.gitea-mcp"
GITEA_BASE_URL="${GITEA_BASE_URL:-https://gitea.ktyun.cc}"
GITEA_API_TOKEN="${GITEA_API_TOKEN:-}"
# 检测操作系统
detect_os() {
case "$(uname -s)" in
Darwin*)
OS="macos"
;;
Linux*)
OS="linux"
;;
MINGW*|MSYS*|CYGWIN*)
OS="windows"
;;
*)
OS="unknown"
;;
esac
}
# 获取配置文件路径
get_config_paths() {
case "$OS" in
macos)
CLAUDE_DESKTOP_CONFIG="${HOME}/Library/Application Support/Claude/claude_desktop_config.json"
CLAUDE_CLI_CONFIG="${HOME}/.claude.json"
VSCODE_USER_CONFIG="${HOME}/Library/Application Support/Code/User/settings.json"
CURSOR_USER_CONFIG="${HOME}/Library/Application Support/Cursor/User/settings.json"
WINDSURF_USER_CONFIG="${HOME}/Library/Application Support/Windsurf/User/settings.json"
;;
linux)
CLAUDE_DESKTOP_CONFIG="${HOME}/.config/Claude/claude_desktop_config.json"
CLAUDE_CLI_CONFIG="${HOME}/.claude.json"
VSCODE_USER_CONFIG="${HOME}/.config/Code/User/settings.json"
CURSOR_USER_CONFIG="${HOME}/.config/Cursor/User/settings.json"
WINDSURF_USER_CONFIG="${HOME}/.config/Windsurf/User/settings.json"
;;
windows)
CLAUDE_DESKTOP_CONFIG="${APPDATA}/Claude/claude_desktop_config.json"
CLAUDE_CLI_CONFIG="${HOME}/.claude.json"
VSCODE_USER_CONFIG="${APPDATA}/Code/User/settings.json"
CURSOR_USER_CONFIG="${APPDATA}/Cursor/User/settings.json"
WINDSURF_USER_CONFIG="${APPDATA}/Windsurf/User/settings.json"
;;
esac
}
# 检查 jq 是否安装
check_jq() {
if ! command -v jq >/dev/null 2>&1; then
log_warn "未安装 jq,将使用手动 JSON 处理"
HAS_JQ=false
else
HAS_JQ=true
fi
}
# 创建 MCP 服务器配置 JSON (for Claude Desktop)
create_mcp_config() {
cat <<EOF
{
"command": "node",
"args": ["${INSTALL_DIR}/dist/index.js"],
"env": {
"GITEA_BASE_URL": "${GITEA_BASE_URL}",
"GITEA_API_TOKEN": "${GITEA_API_TOKEN}"
}
}
EOF
}
# 创建 MCP 服务器配置 JSON (for Claude CLI - needs "type": "stdio")
create_mcp_config_stdio() {
cat <<EOF
{
"type": "stdio",
"command": "node",
"args": ["${INSTALL_DIR}/dist/index.js"],
"env": {
"GITEA_BASE_URL": "${GITEA_BASE_URL}",
"GITEA_API_TOKEN": "${GITEA_API_TOKEN}"
}
}
EOF
}
# 配置 Claude Desktop
configure_claude_desktop() {
log_step "配置 Claude Desktop..."
local config_dir=$(dirname "${CLAUDE_DESKTOP_CONFIG}")
# 创建配置目录
if [ ! -d "$config_dir" ]; then
log_warn "Claude Desktop 配置目录不存在: $config_dir"
read -p "是否创建配置目录? (y/n): " -n 1 -r < /dev/tty
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
mkdir -p "$config_dir"
else
log_warn "跳过 Claude Desktop 配置"
return
fi
fi
# 备份现有配置
if [ -f "${CLAUDE_DESKTOP_CONFIG}" ]; then
cp "${CLAUDE_DESKTOP_CONFIG}" "${CLAUDE_DESKTOP_CONFIG}.backup.$(date +%s)"
log_info "已备份现有配置"
fi
# 创建或更新配置
if [ "$HAS_JQ" = true ]; then
# 使用 jq 更新配置
local mcp_config=$(create_mcp_config)
if [ -f "${CLAUDE_DESKTOP_CONFIG}" ]; then
# 更新现有配置
jq --argjson config "$mcp_config" \
'.mcpServers["gitea-mcp-tool"] = $config' \
"${CLAUDE_DESKTOP_CONFIG}" > "${CLAUDE_DESKTOP_CONFIG}.tmp"
mv "${CLAUDE_DESKTOP_CONFIG}.tmp" "${CLAUDE_DESKTOP_CONFIG}"
else
# 创建新配置
jq -n --argjson config "$mcp_config" \
'{mcpServers: {"gitea-mcp-tool": $config}}' \
> "${CLAUDE_DESKTOP_CONFIG}"
fi
else
# 手动创建配置
cat > "${CLAUDE_DESKTOP_CONFIG}" <<EOF
{
"mcpServers": {
"gitea-mcp-tool": $(create_mcp_config)
}
}
EOF
fi
log_info "✓ Claude Desktop 配置完成: ${CLAUDE_DESKTOP_CONFIG}"
}
# 配置 Claude CLI
configure_claude_cli() {
log_step "配置 Claude CLI..."
# 检查配置文件是否存在
if [ ! -f "${CLAUDE_CLI_CONFIG}" ]; then
log_error "Claude CLI 配置文件不存在: ${CLAUDE_CLI_CONFIG}"
log_warn "请先运行 Claude CLI 一次以创建配置文件,然后重新运行此脚本"
log_warn "或者手动创建配置文件"
return
fi
# 检查是否安装 jq
if [ "$HAS_JQ" != true ]; then
log_error "配置 Claude CLI 需要安装 jq"
log_warn "请安装 jq: brew install jq (macOS) 或 apt-get install jq (Linux)"
return
fi
# 备份现有配置
cp "${CLAUDE_CLI_CONFIG}" "${CLAUDE_CLI_CONFIG}.backup.$(date +%s)"
log_info "已备份现有配置"
# 更新配置(在顶层 mcpServers 字段中添加 gitea-mcp-tool)
local mcp_config=$(create_mcp_config_stdio)
# 检查是否已有 mcpServers 字段
if jq -e '.mcpServers' "${CLAUDE_CLI_CONFIG}" > /dev/null 2>&1; then
# 更新现有 mcpServers
jq --argjson config "$mcp_config" \
'.mcpServers["gitea-mcp-tool"] = $config' \
"${CLAUDE_CLI_CONFIG}" > "${CLAUDE_CLI_CONFIG}.tmp"
else
# 创建 mcpServers 字段
jq --argjson config "$mcp_config" \
'. + {mcpServers: {"gitea-mcp-tool": $config}}' \
"${CLAUDE_CLI_CONFIG}" > "${CLAUDE_CLI_CONFIG}.tmp"
fi
mv "${CLAUDE_CLI_CONFIG}.tmp" "${CLAUDE_CLI_CONFIG}"
log_info "✓ Claude CLI 配置完成: ${CLAUDE_CLI_CONFIG}"
log_info " 配置位置: 顶层 mcpServers 字段 (全局配置)"
}
# 配置 VSCode (Cline)
configure_vscode() {
log_step "配置 VSCode (Cline)..."
local config_dir=$(dirname "${VSCODE_USER_CONFIG}")
if [ ! -d "$config_dir" ]; then
log_warn "VSCode 配置目录不存在: $config_dir"
read -p "是否创建配置目录? (y/n): " -n 1 -r < /dev/tty
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
mkdir -p "$config_dir"
else
log_warn "跳过 VSCode 配置"
return
fi
fi
# 备份现有配置
if [ -f "${VSCODE_USER_CONFIG}" ]; then
cp "${VSCODE_USER_CONFIG}" "${VSCODE_USER_CONFIG}.backup.$(date +%s)"
fi
# 创建或更新配置
if [ "$HAS_JQ" = true ]; then
local mcp_config=$(create_mcp_config)
if [ -f "${VSCODE_USER_CONFIG}" ]; then
jq --argjson config "$mcp_config" \
'.["cline.mcpServers"]["gitea-mcp-tool"] = $config' \
"${VSCODE_USER_CONFIG}" > "${VSCODE_USER_CONFIG}.tmp"
mv "${VSCODE_USER_CONFIG}.tmp" "${VSCODE_USER_CONFIG}"
else
jq -n --argjson config "$mcp_config" \
'{"cline.mcpServers": {"gitea-mcp-tool": $config}}' \
> "${VSCODE_USER_CONFIG}"
fi
else
cat > "${VSCODE_USER_CONFIG}" <<EOF
{
"cline.mcpServers": {
"gitea-mcp-tool": $(create_mcp_config)
}
}
EOF
fi
log_info "✓ VSCode (Cline) 配置完成: ${VSCODE_USER_CONFIG}"
}
# 配置 Cursor
configure_cursor() {
log_step "配置 Cursor..."
local config_dir=$(dirname "${CURSOR_USER_CONFIG}")
if [ ! -d "$config_dir" ]; then
log_warn "Cursor 配置目录不存在: $config_dir"
log_warn "跳过 Cursor 配置"
return
fi
# 备份现有配置
if [ -f "${CURSOR_USER_CONFIG}" ]; then
cp "${CURSOR_USER_CONFIG}" "${CURSOR_USER_CONFIG}.backup.$(date +%s)"
fi
# 创建或更新配置(Cursor 可能使用与 VSCode 相同的配置格式)
if [ "$HAS_JQ" = true ]; then
local mcp_config=$(create_mcp_config)
if [ -f "${CURSOR_USER_CONFIG}" ]; then
jq --argjson config "$mcp_config" \
'.["mcpServers"]["gitea-mcp-tool"] = $config' \
"${CURSOR_USER_CONFIG}" > "${CURSOR_USER_CONFIG}.tmp"
mv "${CURSOR_USER_CONFIG}.tmp" "${CURSOR_USER_CONFIG}"
else
jq -n --argjson config "$mcp_config" \
'{"mcpServers": {"gitea-mcp-tool": $config}}' \
> "${CURSOR_USER_CONFIG}"
fi
else
cat > "${CURSOR_USER_CONFIG}" <<EOF
{
"mcpServers": {
"gitea-mcp-tool": $(create_mcp_config)
}
}
EOF
fi
log_info "✓ Cursor 配置完成: ${CURSOR_USER_CONFIG}"
}
# 配置 Windsurf
configure_windsurf() {
log_step "配置 Windsurf..."
local config_dir=$(dirname "${WINDSURF_USER_CONFIG}")
if [ ! -d "$config_dir" ]; then
log_warn "Windsurf 配置目录不存在: $config_dir"
log_warn "跳过 Windsurf 配置"
return
fi
# 备份现有配置
if [ -f "${WINDSURF_USER_CONFIG}" ]; then
cp "${WINDSURF_USER_CONFIG}" "${WINDSURF_USER_CONFIG}.backup.$(date +%s)"
fi
# 创建或更新配置
if [ "$HAS_JQ" = true ]; then
local mcp_config=$(create_mcp_config)
if [ -f "${WINDSURF_USER_CONFIG}" ]; then
jq --argjson config "$mcp_config" \
'.["mcpServers"]["gitea-mcp-tool"] = $config' \
"${WINDSURF_USER_CONFIG}" > "${WINDSURF_USER_CONFIG}.tmp"
mv "${WINDSURF_USER_CONFIG}.tmp" "${WINDSURF_USER_CONFIG}"
else
jq -n --argjson config "$mcp_config" \
'{"mcpServers": {"gitea-mcp-tool": $config}}' \
> "${WINDSURF_USER_CONFIG}"
fi
else
cat > "${WINDSURF_USER_CONFIG}" <<EOF
{
"mcpServers": {
"gitea-mcp-tool": $(create_mcp_config)
}
}
EOF
fi
log_info "✓ Windsurf 配置完成: ${WINDSURF_USER_CONFIG}"
}
# 显示配置信息
show_config_info() {
echo ""
log_info "=========================================="
log_info "配置信息"
log_info "=========================================="
echo ""
echo " 安装目录: ${INSTALL_DIR}"
echo " Gitea 服务器: ${GITEA_BASE_URL}"
echo " API Token: ${GITEA_API_TOKEN:0:10}..."
echo ""
}
# 选择要配置的客户端
select_clients() {
echo ""
log_info "请选择要配置的 MCP 客户端:"
echo ""
echo " 1) Claude Desktop"
echo " 2) Claude CLI"
echo " 3) VSCode (Cline)"
echo " 4) Cursor"
echo " 5) Windsurf"
echo " 6) 全部配置"
echo ""
read -p "请输入选项 (1-6): " choice < /dev/tty
case $choice in
1)
configure_claude_desktop
;;
2)
configure_claude_cli
;;
3)
configure_vscode
;;
4)
configure_cursor
;;
5)
configure_windsurf
;;
6)
configure_claude_desktop
configure_claude_cli
configure_vscode
configure_cursor
configure_windsurf
;;
*)
log_error "无效选项"
exit 1
;;
esac
}
# 主函数
main() {
echo ""
log_info "=========================================="
log_info "Gitea MCP Server - 客户端配置向导"
log_info "=========================================="
echo ""
# 检查安装目录
if [ ! -d "${INSTALL_DIR}" ]; then
log_error "未找到安装目录: ${INSTALL_DIR}"
log_info "请先运行安装脚本: install-quick.sh"
exit 1
fi
# 检测操作系统
detect_os
log_info "检测到操作系统: ${OS}"
# 获取配置路径
get_config_paths
# 检查 jq
check_jq
# 获取配置信息
echo ""
log_info "配置参数设置"
echo ""
# 获取 Gitea 服务器地址
if [ -n "$GITEA_BASE_URL" ]; then
read -p "Gitea 服务器地址 [${GITEA_BASE_URL}]: " input_url < /dev/tty
GITEA_BASE_URL="${input_url:-$GITEA_BASE_URL}"
else
read -p "Gitea 服务器地址 [https://gitea.ktyun.cc]: " input_url < /dev/tty
GITEA_BASE_URL="${input_url:-https://gitea.ktyun.cc}"
fi
# 获取 Gitea API Token
if [ -n "$GITEA_API_TOKEN" ]; then
local masked_token="${GITEA_API_TOKEN:0:10}..."
read -p "Gitea API Token [当前: ${masked_token}] (按回车保持不变): " input_token < /dev/tty
if [ -n "$input_token" ]; then
GITEA_API_TOKEN="$input_token"
fi
else
while [ -z "$GITEA_API_TOKEN" ]; do
read -p "Gitea API Token (必填): " GITEA_API_TOKEN < /dev/tty
if [ -z "$GITEA_API_TOKEN" ]; then
log_warn "API Token 不能为空,请重新输入"
fi
done
fi
# 显示配置信息
show_config_info
# 选择客户端
select_clients
echo ""
log_info "=========================================="
log_info "配置完成!"
log_info "=========================================="
echo ""
log_info "请重启相应的 MCP 客户端以使配置生效"
echo ""
}
main