343 lines
9.2 KiB
Bash
Executable File
343 lines
9.2 KiB
Bash
Executable File
#!/bin/bash
|
||
# MCP (Model Context Protocol) セットアップスクリプト
|
||
|
||
set -e
|
||
|
||
# カラー定義
|
||
GREEN='\033[0;32m'
|
||
BLUE='\033[0;34m'
|
||
YELLOW='\033[1;33m'
|
||
RED='\033[0;31m'
|
||
NC='\033[0m'
|
||
|
||
# 設定ディレクトリ
|
||
MCP_DIR="$HOME/.mcp"
|
||
CONFIG_FILE="$HOME/.claude/claude_desktop_config.json"
|
||
|
||
echo -e "${BLUE}MCP (Model Context Protocol) セットアップを開始します${NC}"
|
||
|
||
# MCPディレクトリの作成
|
||
mkdir -p "$MCP_DIR"
|
||
|
||
# 必要なパッケージのインストール
|
||
install_mcp_servers() {
|
||
echo -e "${GREEN}MCPサーバーをインストール中...${NC}"
|
||
|
||
# 基本的なMCPサーバー
|
||
npm install -g @modelcontextprotocol/server-filesystem
|
||
npm install -g @modelcontextprotocol/server-github
|
||
npm install -g @modelcontextprotocol/server-postgres
|
||
npm install -g @modelcontextprotocol/server-slack
|
||
|
||
# 開発系
|
||
npm install -g @modelcontextprotocol/server-git
|
||
npm install -g @modelcontextprotocol/server-docker
|
||
|
||
echo -e "${GREEN}✓ MCPサーバーのインストール完了${NC}"
|
||
}
|
||
|
||
# 設定ファイルの作成
|
||
create_config() {
|
||
echo -e "${GREEN}設定ファイルを作成中...${NC}"
|
||
|
||
# 既存の設定をバックアップ
|
||
if [[ -f "$CONFIG_FILE" ]]; then
|
||
cp "$CONFIG_FILE" "$CONFIG_FILE.backup.$(date +%Y%m%d-%H%M%S)"
|
||
echo -e "${YELLOW}既存の設定をバックアップしました${NC}"
|
||
fi
|
||
|
||
# 新しい設定を作成
|
||
cat > "$CONFIG_FILE" << EOF
|
||
{
|
||
"mcpServers": {
|
||
"filesystem": {
|
||
"command": "npx",
|
||
"args": ["-y", "@modelcontextprotocol/server-filesystem"],
|
||
"env": {
|
||
"FILESYSTEM_ROOT": "$HOME/projects"
|
||
}
|
||
},
|
||
"github": {
|
||
"command": "npx",
|
||
"args": ["-y", "@modelcontextprotocol/server-github"],
|
||
"env": {
|
||
"GITHUB_TOKEN": "your-github-token-here"
|
||
}
|
||
},
|
||
"git": {
|
||
"command": "npx",
|
||
"args": ["-y", "@modelcontextprotocol/server-git"],
|
||
"env": {
|
||
"GIT_ROOT": "$HOME/projects"
|
||
}
|
||
},
|
||
"postgres": {
|
||
"command": "npx",
|
||
"args": ["-y", "@modelcontextprotocol/server-postgres"],
|
||
"env": {
|
||
"DATABASE_URL": "postgresql://localhost/postgres"
|
||
}
|
||
},
|
||
"docker": {
|
||
"command": "npx",
|
||
"args": ["-y", "@modelcontextprotocol/server-docker"]
|
||
}
|
||
}
|
||
}
|
||
EOF
|
||
|
||
echo -e "${GREEN}✓ 設定ファイルを作成しました: $CONFIG_FILE${NC}"
|
||
}
|
||
|
||
# カスタムMCPサーバーの作成
|
||
create_custom_server() {
|
||
local server_name="$1"
|
||
local server_dir="$MCP_DIR/servers/$server_name"
|
||
|
||
mkdir -p "$server_dir"
|
||
|
||
# Python版のサンプルMCPサーバー
|
||
cat > "$server_dir/server.py" << 'EOF'
|
||
#!/usr/bin/env python3
|
||
import asyncio
|
||
import json
|
||
import sys
|
||
from typing import Dict, Any, List
|
||
from mcp.server import Server
|
||
from mcp.types import Tool, TextContent, ImageContent
|
||
|
||
app = Server("custom-tools")
|
||
|
||
@app.tool()
|
||
async def search_codebase(query: str, file_pattern: str = "*.py") -> TextContent:
|
||
"""コードベース全体を検索"""
|
||
import subprocess
|
||
|
||
try:
|
||
result = subprocess.run(
|
||
["rg", query, "--type", "py", "--json"],
|
||
capture_output=True,
|
||
text=True
|
||
)
|
||
return TextContent(text=result.stdout)
|
||
except Exception as e:
|
||
return TextContent(text=f"エラー: {str(e)}")
|
||
|
||
@app.tool()
|
||
async def get_system_info() -> TextContent:
|
||
"""システム情報を取得"""
|
||
import platform
|
||
import psutil
|
||
|
||
info = {
|
||
"platform": platform.system(),
|
||
"machine": platform.machine(),
|
||
"processor": platform.processor(),
|
||
"memory": f"{psutil.virtual_memory().total // (1024**3)} GB",
|
||
"disk": f"{psutil.disk_usage('/').total // (1024**3)} GB"
|
||
}
|
||
|
||
return TextContent(text=json.dumps(info, indent=2))
|
||
|
||
@app.tool()
|
||
async def run_shell_command(command: str) -> TextContent:
|
||
"""シェルコマンドを実行(注意: セキュリティリスクあり)"""
|
||
import subprocess
|
||
|
||
# セキュリティ: 危険なコマンドをブロック
|
||
dangerous_commands = ["rm -rf", "dd if=", "mkfs", "format"]
|
||
if any(cmd in command for cmd in dangerous_commands):
|
||
return TextContent(text="エラー: 危険なコマンドです")
|
||
|
||
try:
|
||
result = subprocess.run(
|
||
command,
|
||
shell=True,
|
||
capture_output=True,
|
||
text=True,
|
||
timeout=30
|
||
)
|
||
return TextContent(text=f"stdout: {result.stdout}\nstderr: {result.stderr}")
|
||
except subprocess.TimeoutExpired:
|
||
return TextContent(text="エラー: コマンドがタイムアウトしました")
|
||
except Exception as e:
|
||
return TextContent(text=f"エラー: {str(e)}")
|
||
|
||
if __name__ == "__main__":
|
||
asyncio.run(app.run())
|
||
EOF
|
||
|
||
# 実行権限を付与
|
||
chmod +x "$server_dir/server.py"
|
||
|
||
# 設定ファイルに追加
|
||
echo -e "${GREEN}カスタムMCPサーバーを作成しました: $server_dir${NC}"
|
||
echo -e "${YELLOW}設定ファイルに以下を追加してください:${NC}"
|
||
cat << EOF
|
||
"$server_name": {
|
||
"command": "python3",
|
||
"args": ["$server_dir/server.py"]
|
||
}
|
||
EOF
|
||
}
|
||
|
||
# Arch Linux固有の設定
|
||
setup_arch_specific() {
|
||
echo -e "${GREEN}Arch Linux固有の設定を適用中...${NC}"
|
||
|
||
# pacmanツール用のMCPサーバー
|
||
cat > "$MCP_DIR/servers/pacman/server.py" << 'EOF'
|
||
#!/usr/bin/env python3
|
||
import asyncio
|
||
import subprocess
|
||
from mcp.server import Server
|
||
from mcp.types import Tool, TextContent
|
||
|
||
app = Server("pacman-tools")
|
||
|
||
@app.tool()
|
||
async def search_packages(query: str) -> TextContent:
|
||
"""パッケージを検索"""
|
||
result = subprocess.run(
|
||
["pacman", "-Ss", query],
|
||
capture_output=True,
|
||
text=True
|
||
)
|
||
return TextContent(text=result.stdout)
|
||
|
||
@app.tool()
|
||
async def get_package_info(package: str) -> TextContent:
|
||
"""パッケージ情報を取得"""
|
||
result = subprocess.run(
|
||
["pacman", "-Si", package],
|
||
capture_output=True,
|
||
text=True
|
||
)
|
||
return TextContent(text=result.stdout)
|
||
|
||
@app.tool()
|
||
async def list_installed_packages() -> TextContent:
|
||
"""インストール済みパッケージのリスト"""
|
||
result = subprocess.run(
|
||
["pacman", "-Q"],
|
||
capture_output=True,
|
||
text=True
|
||
)
|
||
return TextContent(text=result.stdout)
|
||
|
||
if __name__ == "__main__":
|
||
asyncio.run(app.run())
|
||
EOF
|
||
|
||
chmod +x "$MCP_DIR/servers/pacman/server.py"
|
||
mkdir -p "$MCP_DIR/servers/pacman"
|
||
}
|
||
|
||
# macOS固有の設定
|
||
setup_macos_specific() {
|
||
echo -e "${GREEN}macOS固有の設定を適用中...${NC}"
|
||
|
||
# Homebrew用のMCPサーバー
|
||
cat > "$MCP_DIR/servers/homebrew/server.py" << 'EOF'
|
||
#!/usr/bin/env python3
|
||
import asyncio
|
||
import subprocess
|
||
from mcp.server import Server
|
||
from mcp.types import Tool, TextContent
|
||
|
||
app = Server("homebrew-tools")
|
||
|
||
@app.tool()
|
||
async def search_formulae(query: str) -> TextContent:
|
||
"""Homebrewのformulaを検索"""
|
||
result = subprocess.run(
|
||
["brew", "search", query],
|
||
capture_output=True,
|
||
text=True
|
||
)
|
||
return TextContent(text=result.stdout)
|
||
|
||
@app.tool()
|
||
async def get_formula_info(formula: str) -> TextContent:
|
||
"""formula情報を取得"""
|
||
result = subprocess.run(
|
||
["brew", "info", formula],
|
||
capture_output=True,
|
||
text=True
|
||
)
|
||
return TextContent(text=result.stdout)
|
||
|
||
@app.tool()
|
||
async def list_installed_formulae() -> TextContent:
|
||
"""インストール済みformulaのリスト"""
|
||
result = subprocess.run(
|
||
["brew", "list"],
|
||
capture_output=True,
|
||
text=True
|
||
)
|
||
return TextContent(text=result.stdout)
|
||
|
||
if __name__ == "__main__":
|
||
asyncio.run(app.run())
|
||
EOF
|
||
|
||
chmod +x "$MCP_DIR/servers/homebrew/server.py"
|
||
mkdir -p "$MCP_DIR/servers/homebrew"
|
||
}
|
||
|
||
# テスト実行
|
||
test_mcp() {
|
||
echo -e "${GREEN}MCP設定をテスト中...${NC}"
|
||
|
||
# Claude Codeでテスト
|
||
claude "MCPが正常に動作しているかテストしてください。利用可能なツールを確認してください。"
|
||
}
|
||
|
||
# メイン処理
|
||
case "$1" in
|
||
install)
|
||
install_mcp_servers
|
||
;;
|
||
config)
|
||
create_config
|
||
;;
|
||
custom)
|
||
create_custom_server "${2:-custom-tools}"
|
||
;;
|
||
arch)
|
||
setup_arch_specific
|
||
;;
|
||
macos)
|
||
setup_macos_specific
|
||
;;
|
||
test)
|
||
test_mcp
|
||
;;
|
||
all)
|
||
install_mcp_servers
|
||
create_config
|
||
create_custom_server "custom-tools"
|
||
|
||
# OS固有の設定
|
||
if [[ "$(uname)" == "Linux" ]]; then
|
||
setup_arch_specific
|
||
elif [[ "$(uname)" == "Darwin" ]]; then
|
||
setup_macos_specific
|
||
fi
|
||
|
||
echo -e "${GREEN}✓ MCP設定完了!${NC}"
|
||
echo -e "${YELLOW}Claude Codeを再起動してください${NC}"
|
||
;;
|
||
*)
|
||
echo "使用方法: $0 {install|config|custom|arch|macos|test|all}"
|
||
echo ""
|
||
echo " install - MCPサーバーをインストール"
|
||
echo " config - 設定ファイルを作成"
|
||
echo " custom - カスタムMCPサーバーを作成"
|
||
echo " arch - Arch Linux固有の設定"
|
||
echo " macos - macOS固有の設定"
|
||
echo " test - 設定をテスト"
|
||
echo " all - 全ての設定を実行"
|
||
exit 1
|
||
;;
|
||
esac |