MochiuWiki : SUSE, EC, PCB
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
サーバ - MCPのソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
サーバ - MCP
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == Model Context Protocol (MCP) は、Large Language Model (LLM) とツール、データソースを統一的に接続するための標準プロトコルである。<br> MCPサーバは、AIアシスタントがアクセス可能なツール、リソース、プロンプトを提供するインターフェースとして機能する。<br> <br> MCPサーバの実装において、Linuxディストリビューションに必要なプログラム言語とSDKをインストールする。<br> 一般的な選択肢としては、Node.jsのMCP SDK、PythonのFastMCP、TypeScriptによる実装等がある。<br> <br> MCPは2つの主要なトランスポート方式をサポートしている。<br> * Standard I/O (STDIO) トランスポート *: ローカル環境でのプロセス間通信に使用され、Claude Desktopなどのクライアントとの統合に最適である。 * HTTP/SSE (Server-Sent Events) トランスポート *: リモートサーバ上でMCPサーバを運用して、ネットワーク経由でアクセスする場合に使用される。 <br> 以下の例では、Node.jsのMCP SDKを使用したMCPサーバを構築している。<br> <syntaxhighlight lang="javascript"> import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import { z } from "zod"; const server = new McpServer({ name: "sample-mcp-server", version: "1.0.0", }); // ツールの定義 server.tool( "calculate-sum", "2つの数値を加算する", { a: z.number().describe("1つ目の数値"), b: z.number().describe("2つ目の数値"), }, async ({ a, b }) => ({ content: [{ type: "text", text: `結果: ${a + b}` }], }) ); // サーバの起動 const transport = new StdioServerTransport(); await server.connect(transport); </syntaxhighlight> <br> セキュリティでは、認証トークンの実装、HTTPS通信の設定、入力データのバリデーション、適切なエラーハンドリング等を行う必要がある。<br> 特にHTTPトランスポートを使用する場合は、APIキーやOAuth2.0による認証・認可の実装も検討する必要がある。<br> <br> パフォーマンスとスケーラビリティでは、ツールの実行時間の最適化、接続プールの管理、ログ記録の効率化が重要である。<br> また、コンテナ化 (Podman等) や オーケストレーション (Kubernetes) の導入により、複数のMCPサーバインスタンスを管理することも検討する。<br> <br> MCPサーバのドキュメント化も重要な要素となる。<br> ツールの説明、パラメータの型定義、使用例を明確に記述することにより、AIモデルおよび開発者がサーバの機能を正確に理解することができる。<br> MCP Inspectorを使用することで、対話的にツールをテストおよび検証することが可能である。<br> <br> モニタリングとログ収集の設定において、標準エラー出力 (stderr) を使用したログ記録、PrometheusやGrafanaによるメトリクス収集を行うことにより、<br> MCPサーバの健全性およびパフォーマンスを監視することができる。<br> <br> MCPサーバを構築・運用する場合は、以下に示す事柄に注意する。<br> * STDIOトランスポートでは標準出力 (stdout) にログを出力しない。(JSON-RPC通信が破損する) * ツールの実行時間を適切に管理して、タイムアウトを設定する。 * エラーハンドリングを適切に実装して、詳細なエラーメッセージを返す。 * セキュリティアップデートの適用 * アクセスログの監視とレート制限の実装 * ツールのバージョン管理とドキュメントの維持 * 定期的なバックアップの実施 <br><br> == サーバ環境のインストール == まず、システムの更新を行う。<br> # RHEL sudo dnf update # SUSE sudo zypper update # Banana Pi F3 (Armbian) / Raspberry Pi sudo apt update sudo apt upgrade <br> 次に、Linuxサーバに必要な基本環境をインストールする。<br> # RHEL sudo dnf install curl wget git gcc-c++ make # SUSE sudo zypper install curl wget git gcc-c++ make # Banana Pi F3 (Armbian) / Raspberry Pi sudo apt install curl wget git build-essential <br><br> == 開発言語とフレームワークの選択 == ==== Node.js + MCP SDKを使用する場合 ==== Node.jsをインストールする。<br> RHELおよびSUSEの場合、Node Version Manager (nvm) を使用することが推奨される。<br> # nvmのインストール (全ディストリビューション共通) curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v<バージョン 例 : 0.43.0>/install.sh | bash source ~/.bashrc # Node.js LTS版のインストール nvm install --lts nvm use --lts <br> Banana Pi F3 (RISC-V) の場合、パッケージ管理システムからインストールする。<br> # Banana Pi F3 (Armbian) sudo apt install nodejs npm # バージョン確認 node --version npm --version <br> もし、RISC-V向けの公式バイナリが存在しない場合は、ソースコードからビルドを行う。<br> # ソースからのビルド (RISC-V環境で必要な場合) git clone https://github.com/nodejs/node.git cd node git checkout v<バージョン 例 : 22.x> mkdir -p build && cd build ../configure --prefix=<任意のインストールディレクトリ> \ --dest-cpu=riscv64 make -j $(nproc) make install <br> プロジェクトディレクトリを作成して、MCPサーバのプロジェクトを初期化する。<br> mkdir ~/mcp-server cd ~/mcp-server npm init -y <br> 必要なJavaScriptライブラリをインストールする。<br> npm install @modelcontextprotocol/sdk zod <br> package.jsonファイルを編集して、ES Modulesを有効化する。<br> <syntaxhighlight lang="json"> { "name": "mcp-server", "version": "1.0.0", "type": "module", "scripts": { "start": "node server.js", "inspector": "npx @modelcontextprotocol/inspector node server.js" }, "dependencies": { "@modelcontextprotocol/sdk": "latest", "zod": "^3.22.0" } } </syntaxhighlight> <br> ==== Python + FastMCPを使用する場合 ==== Pythonと仮想環境をインストールする。<br> # RHEL sudo dnf install python3 python3-pip python3-virtualenv # SUSE sudo zypper install python3 python3-pip python3-virtualenv # Banana Pi F3 (Armbian) / Raspberry Pi sudo apt install python3 python3-pip python3-venv <br> プロジェクトディレクトリを作成して、Python仮想環境を設定する。<br> mkdir -p ~/mcp-server-python cd ~/mcp-server-python python3 -m venv venv <br> Pythonの仮想環境をアクティベートする。<br> source venv/bin/activate <br> 必要なPythonライブラリをインストールする。<br> pip install fastmcp httpx <br> <u>※注意</u><br> <u>venv/bin/activateスクリプトを~/.profileファイル等に設定することは非推奨である。</u><br> <u>activateスクリプトは相対パスで動作するため、フルパスで指定する必要がある。</u><br> <br> <u>これは、常に特定の仮想環境がアクティブになってしまうため、他のプロジェクトで異なる仮想環境を使用する場合に問題が発生するためである。</u> <u>また、シェルのセッションごとに自動的にアクティベートすると、どの環境で作業しているのか理解し難い。</u> <br> 代替案として、以下に示すような方法が推奨される。<br> 以下に示すような方法ならば、必要な時のみ仮想環境をアクティベートすることが可能なため、柔軟な運用が可能になる。<br> <br> 特に、複数のプロジェクトを扱う場合は、方法 2 や 方法 3 が便利である。<br> <br> <syntaxhighlight lang="sh"> # 方法 1 # エイリアスを設定する方法 (~/.profileファイル等に記述) alias activate-mcpserver="source <activateスクリプトのパス>" </syntaxhighlight> <br> <syntaxhighlight lang="sh"> # 方法 2 # プロジェクトディレクトリに入った時のみ自動的にアクティベートする方法 (~/.profileファイル等に記述) function cd() { builtin cd "$@" # プロジェクトディレクトリに入った時のみ仮想環境をアクティベート if [ -d "venv" ]; then # 既に仮想環境がアクティブでない場合のみ if [ -z "$VIRTUAL_ENV" ]; then source venv/bin/activate fi fi } </syntaxhighlight> <br> <syntaxhighlight lang="sh"> # 方法 3 # direnvのような専用ツールを使用する方法 # プロジェクトディレクトリの.envrcファイルに記述 layout python3 # Pythonの仮想環境を自動的に管理 </syntaxhighlight> <br><br> == MCPサーバの基本的な実装 == ==== Node.js + STDIOトランスポートを使用する場合 ==== STDIOトランスポートは、ローカル環境でのプロセス間通信に使用される。<br> <br> これは、Claude DesktopやCursor等のMCPクライアントと統合する場合に最適である。<br> <br> <syntaxhighlight lang="javascript"> // server.jsファイル import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import { z } from "zod"; import os from "os"; // MCPサーバインスタンスの作成 const server = new McpServer({ name: "linux-system-mcp-server", version: "1.0.0", }); // ツール 1 : 数値計算 server.tool( "add-numbers", "2つの数値を加算する", { number1: z.number().describe("1つ目の数値"), number2: z.number().describe("2つ目の数値"), }, async ({ number1, number2 }) => ({ content: [ { type: "text", text: `計算結果: ${number1} + ${number2} = ${number1 + number2}`, }, ], }) ); // ツール 2 : システム情報取得 server.tool( "get-system-info", "Linuxシステムの情報を取得する", {}, async () => { const info = { platform: os.platform(), arch: os.arch(), hostname: os.hostname(), cpus: os.cpus().length, totalMemory: `${Math.round(os.totalmem() / 1024 / 1024)} MB`, freeMemory: `${Math.round(os.freemem() / 1024 / 1024)} MB`, uptime: `${Math.round(os.uptime() / 3600)} hours`, }; return { content: [ { type: "text", text: JSON.stringify(info, null, 2), }, ], }; } ); // ツール 3 : ファイル一覧取得 server.tool( "list-files", "指定されたディレクトリのファイル一覧を取得する", { path: z.string().describe("ディレクトリのパス"), }, async ({ path }) => { const fs = await import("fs/promises"); try { const files = await fs.readdir(path); return { content: [ { type: "text", text: `ファイル一覧:\n${files.join("\n")}`, }, ], }; } catch (error) { return { content: [ { type: "text", text: `エラー: ${error.message}`, }, ], isError: true, }; } } ); // サーバの起動 async function main() { const transport = new StdioServerTransport(); await server.connect(transport); // STDIOトランスポートではstderrに出力する (stdoutは使用禁止) console.error("MCPサーバが起動しました"); } main().catch((error) => { console.error("サーバ起動エラー:", error); process.exit(1); }); </syntaxhighlight> <br> ==== Node.js + HTTPトランスポートを使用する場合 ==== HTTPトランスポートは、リモートサーバ上でMCPサーバを運用し、ネットワーク経由でアクセスする場合に使用される。<br> <br> まず、HTTP関連のライブラリをインストールする。<br> npm install express cors <br> HTTPサーバ対応の実装を行う。<br> <syntaxhighlight lang="javascript"> // http-server.jsファイル import express from "express"; import cors from "cors"; import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js"; import { z } from "zod"; const app = express(); app.use(cors()); app.use(express.json()); const server = new McpServer({ name: "linux-system-mcp-server", version: "1.0.0", }); // ツールの定義 (STDIOトランスポートと同様) server.tool( "get-system-info", "Linuxシステムの情報を取得する", {}, async () => { // 実装内容は省略 } ); // SSEエンドポイントの設定 app.post("/sse", async (req, res) => { const transport = new SSEServerTransport("/messages", res); await server.connect(transport); }); // ヘルスチェックエンドポイント app.get("/health", (req, res) => { res.json({ status: "ok", timestamp: new Date().toISOString() }); }); const PORT = process.env.PORT || 3000; const HOST = process.env.HOST || "0.0.0.0"; app.listen(PORT, HOST, () => { console.log(`MCPサーバがポート${PORT}で起動しました`); console.log(`ホスト: ${HOST}`); }); </syntaxhighlight> <br> ==== Python + FastMCPを使用する場合 ==== FastMCPは、PythonでMCPサーバを構築するためのフレームワークである。<br> 型ヒントとデコレータを使用して、ツールを定義することができる。<br> <br> <syntaxhighlight lang="python"> # server.pyファイル from fastmcp import FastMCP import platform import os import subprocess mcp = FastMCP("Linux System MCP Server") @mcp.tool() def add_numbers(number1: float, number2: float) -> str: """2つの数値を加算する""" result = number1 + number2 return f"計算結果: {number1} + {number2} = {result}" @mcp.tool() def get_system_info() -> dict: """Linuxシステムの情報を取得する""" return { "platform": platform.system(), "architecture": platform.machine(), "hostname": platform.node(), "python_version": platform.python_version(), "processor": platform.processor(), } @mcp.tool() def list_files(path: str) -> str: """指定されたディレクトリのファイル一覧を取得する""" try: files = os.listdir(path) return f"ファイル一覧:\n" + "\n".join(files) except Exception as e: return f"エラー: {str(e)}" @mcp.tool() def execute_command(command: str) -> str: """安全なシェルコマンドを実行する (制限付き)""" # セキュリティのため、許可されたコマンドのみ実行 allowed_commands = ["ls", "pwd", "whoami", "date", "uptime"] cmd_parts = command.split() if not cmd_parts or cmd_parts[0] not in allowed_commands: return f"エラー: コマンド '{cmd_parts[0] if cmd_parts else ''}' は許可されていません" try: result = subprocess.run( command, shell=True, capture_output=True, text=True, timeout=5 ) return result.stdout if result.returncode == 0 else result.stderr except subprocess.TimeoutExpired: return "エラー: コマンドがタイムアウトしました" except Exception as e: return f"エラー: {str(e)}" if __name__ == "__main__": mcp.run() </syntaxhighlight> <br><br> == MCP Inspectorによるテスト == WebMCP Inspectorは、Anthropic社が提供する対話的なデバッグツールである。<br> これにより、Webブラウザ上でMCPサーバのツールをテストおよび検証することができる。<br> <br> MCP Inspectorをインストールする。<br> # Node.js版の場合 npm install @modelcontextprotocol/inspector --save-dev <br> package.jsonにスクリプトを追加する。<br> <syntaxhighlight lang="json"> { "scripts": { "inspector": "npx @modelcontextprotocol/inspector node server.js" } } </syntaxhighlight> <br> MCP Inspectorを起動する。<br> npm run inspector <br> Webブラウザが自動的に開き、インスペクターのインターフェースが表示される。<br> ツールの一覧、パラメータの入力、実行結果の確認が可能である。<br> <br><br> == クライアント接続設定 == ==== Claude Desktopからの接続 (STDIO) ==== Claude Desktopの設定ファイルを編集する。<br> <br> * MacOS / Linuxの場合 *: ~/.config/Claude/claude_desktop_config.json *: <br> * Windowsの場合 *: %APPDATA%\Claude\claude_desktop_config.json <br> 設定ファイルの内容を編集する。<br> <syntaxhighlight lang="json"> { "mcpServers": { "linux-system-server": { "command": "node", "args": ["/home/username/mcp-server/server.js"] } } } </syntaxhighlight> <br> Pythonサーバの場合は以下に示すように設定する。<br> <syntaxhighlight lang="json"> { "mcpServers": { "linux-system-python-server": { "command": "/home/<ユーザ名>/mcp-server-python/venv/bin/python", "args": ["/home/<ユーザ名>/mcp-server-python/server.py"] } } } </syntaxhighlight> <br> 環境変数を設定する必要がある場合は、envフィールドを追加する。<br> <syntaxhighlight lang="json"> { "mcpServers": { "linux-system-server": { "command": "node", "args": ["/home/<ユーザ名>/mcp-server/server.js"], "env": { "API_KEY": "your-api-key-here", "LOG_LEVEL": "debug" } } } } </syntaxhighlight> <br> ==== リモートサーバへのSSH接続 (STDIO) ==== SSHを経由してリモートサーバ上のMCPサーバに接続する場合は、以下に示すように設定する。<br> <syntaxhighlight lang="json"> { "mcpServers": { "remote-linux-server": { "command": "ssh", "args": [ "<ユーザ名>@<リモートサーバのIPアドレス>", "cd ~/mcp-server && node server.js" ] } } } </syntaxhighlight> <br> SSH鍵認証を設定しておくことが推奨される。<br> ssh-keygen -t ed25519 -C "mcp-client" ssh-copy-id username@remote-server-ip <br><br> == HTTPS対応 == HTTPトランスポートを使用する場合、HTTPS通信を設定することが推奨される。<br> <br> ==== Let's Encryptを使用する場合 ==== Certbotをインストールする。<br> # RHEL sudo dnf install certbot python3-certbot-nginx # SUSE sudo zypper install python3-certbot python3-certbot-nginx # Banana Pi F3 (Armbian) / Raspberry Pi sudo apt install certbot python3-certbot-nginx <br> SSL証明書を取得する。<br> sudo certbot --nginx -d example.com <br> 証明書の自動更新を設定する。<br> sudo systemctl enable certbot-renew.timer sudo systemctl start certbot-renew.timer <br><br> == リバースプロキシの設定 == HTTPトランスポートを使用する場合、Nginxをリバースプロキシとして設定することが推奨される。<br> <br> ==== Nginxを使用する場合 ==== Nginxをインストールする。<br> # RHEL sudo dnf install nginx # SUSE sudo zypper install nginx # Banana Pi F3 (Armbian) / Raspberry Pi sudo apt install nginx <br> Nginxの設定ファイルを作成する。<br> <syntaxhighlight lang="nginx"> # /etc/nginx/sites-available/mcp-serverファイル server { listen 80; server_name yourdomain.com; # HTTPからHTTPSへリダイレクト return 301 https://$server_name$request_uri; } server { listen 443 ssl http2; server_name yourdomain.com; ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem; # SSL設定 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { proxy_pass http://localhost:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_cache_bypass $http_upgrade; } # SSEエンドポイント用の設定 location /sse { proxy_pass http://localhost:3000/sse; proxy_http_version 1.1; proxy_set_header Connection ''; proxy_buffering off; proxy_cache off; proxy_read_timeout 86400s; } } </syntaxhighlight> <br> 設定ファイルを有効化する。<br> # RHEL / SUSE sudo ln -s /etc/nginx/sites-available/mcp-server /etc/nginx/sites-enabled/ # Banana Pi F3 (Armbian) / Raspberry Pi sudo ln -s /etc/nginx/sites-available/mcp-server /etc/nginx/sites-enabled/ <br> Nginxの設定をテストして再起動する。<br> sudo nginx -t sudo systemctl restart nginx <br><br> == Systemdサービスファイルの作成 == MCPサーバをシステムサービスとして常時起動させる場合、systemdユニットファイルを作成する。<br> <br> ==== Node.js版MCPサーバの場合 ==== <syntaxhighlight lang="ini"> # /etc/systemd/system/mcp-server.serviceファイル [Unit] Description=MCP Server for Linux System After=network.target [Service] Type=simple User=<実行する任意のユーザ名> WorkingDirectory=/home/<ユーザ名>/mcp-server ExecStart=/usr/bin/node server.js Restart=always RestartSec=10 StandardOutput=journal StandardError=journal # 環境変数の設定 (必要に応じて) Environment="NODE_ENV=production" Environment="PORT=3000" [Install] WantedBy=multi-user.target </syntaxhighlight> <br> ==== Python版MCPサーバの場合 ==== <syntaxhighlight lang="ini"> # /etc/systemd/system/mcp-server-python.serviceファイル [Unit] Description=MCP Server for Linux System (Python) After=network.target [Service] Type=simple User=<実行する任意のユーザ名> WorkingDirectory=/home/<ユーザ名>/mcp-server-python ExecStart=/home/<ユーザ名>/mcp-server-python/venv/bin/python server.py Restart=always RestartSec=10 StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target </syntaxhighlight> <br> サービスを有効化して起動する。<br> sudo systemctl daemon-reload sudo systemctl enable mcp-server sudo systemctl start mcp-server <br> サービスの状態を確認する。<br> sudo systemctl status mcp-server <br> ログを確認する。<br> sudo journalctl -u mcp-server -f <br><br> == ファイアウォールの設定 == HTTPトランスポートを使用する場合、適切なポートを開放する必要がある。<br> <br> ==== Firewalldの場合 ==== sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --permanent --add-service=https # カスタムポートを使用する場合 sudo firewall-cmd --permanent --add-port=3000/tcp sudo firewall-cmd --reload <br> 設定を確認する。<br> sudo firewall-cmd --list-all <br> ==== UFWの場合 ==== sudo ufw allow 80/tcp sudo ufw allow 443/tcp # カスタムポートを使用する場合 sudo ufw allow 3000/tcp sudo ufw enable <br> 設定を確認する。<br> sudo ufw status verbose <br> 特定のIPアドレスからのアクセスのみを許可する場合は、以下のように設定する。<br> sudo ufw allow from 192.168.1.0/24 to any port 3000 <br><br> == セキュリティ設定 == ==== 認証の実装 ==== HTTPトランスポートを使用する場合、APIキーによる認証を行うことが推奨される。<br> <br> <syntaxhighlight lang="javascript"> // 認証ミドルウェアの実装例 (Node.js + Express) function authenticateRequest(req, res, next) { const apiKey = req.headers['x-api-key']; if (!apiKey || apiKey !== process.env.API_KEY) { return res.status(401).json({ error: 'Unauthorized' }); } next(); } app.use('/sse', authenticateRequest); </syntaxhighlight> <br> ==== レート制限の実装 ==== DoS攻撃を防ぐため、レート制限を行う。<br> <br> npm install express-rate-limit <br> <syntaxhighlight lang="javascript"> import rateLimit from 'express-rate-limit'; const limiter = rateLimit({ windowMs: 15 * 60 * 1000, // 15分 max: 100, // 最大100リクエスト message: 'リクエストが多すぎます。しばらくしてから再試行してください。' }); app.use('/sse', limiter); </syntaxhighlight> <br> ==== 入力データのバリデーション ==== ツールのパラメータに対して、適切なバリデーションを行う。<br> Zodスキーマを使用することにより、型安全性が確保される。<br> <br> <syntaxhighlight lang="javascript"> server.tool( "read-file", "ファイルの内容を読み取る", { path: z.string() .min(1) .max(500) .regex(/^[a-zA-Z0-9._\/-]+$/) .describe("ファイルのパス (英数字、ハイフン、スラッシュのみ)"), }, async ({ path }) => { // パス トラバーサル攻撃を防ぐ if (path.includes('..')) { return { content: [{ type: "text", text: "エラー: 無効なパスです" }], isError: true, }; } // 実装内容 } ); </syntaxhighlight> <br><br> == 監視とログ管理 == ==== ログの実装 ==== MCPサーバでは、STDIOトランスポートを使用する場合、標準エラー出力 (stderr) にログを出力する必要がある。<br> 標準出力 (stdout) にログを出力すると、JSON-RPC通信が破損する。<br> <br> <syntaxhighlight lang="javascript"> // Node.jsでのログ実装例 function log(level, message, data = {}) { const logEntry = { timestamp: new Date().toISOString(), level, message, ...data, }; console.error(JSON.stringify(logEntry)); } // 使用例 log('info', 'ツールが呼び出されました', { tool: 'get-system-info' }); log('error', 'エラーが発生しました', { error: error.message }); </syntaxhighlight> <br> ==== PrometheusとGrafanaによる監視 ==== メトリクスを収集するため、Prometheus用のエクスポータを構築する。<br> <br> npm install prom-client <br> <syntaxhighlight lang="javascript"> import { register, Counter, Histogram } from 'prom-client'; // メトリクスの定義 const toolCallCounter = new Counter({ name: 'mcp_tool_calls_total', help: 'ツール呼び出しの総数', labelNames: ['tool_name', 'status'], }); const toolCallDuration = new Histogram({ name: 'mcp_tool_call_duration_seconds', help: 'ツール呼び出しの実行時間', labelNames: ['tool_name'], }); // メトリクスエンドポイント app.get('/metrics', async (req, res) => { res.set('Content-Type', register.contentType); res.end(await register.metrics()); }); </syntaxhighlight> <br> Prometheusをインストールする。<br> # RHELの場合 sudo dnf install prometheus # SUSEの場合 sudo zypper install prometheus # Banana Pi F3 (Armbian) / Raspberry Piの場合 wget https://github.com/prometheus/prometheus/releases/download/v2.x.x/prometheus-2.x.x.linux-arm64.tar.gz tar xf prometheus-2.x.x.linux-arm64.tar.gz <br> Prometheusの設定ファイルを編集する。<br> <syntaxhighlight lang="yaml"> # prometheus.ymlファイル global: scrape_interval: 15s scrape_configs: - job_name: 'mcp-server' static_configs: - targets: ['localhost:3000'] </syntaxhighlight> <br> Grafanaをインストールする。<br> # RHEL sudo dnf install grafana # SUSE sudo zypper install grafana # Banana Pi F3 (Armbian) / Raspberry Pi sudo apt install grafana <br> GrafanaとPrometheusを起動する。<br> sudo systemctl enable prometheus grafana-server sudo systemctl start prometheus grafana-server <br><br> == バックアップとリストア == ==== 設定ファイルのバックアップ ==== 定期的にMCPサーバの設定ファイルおよびコードをバックアップする。<br> <br> <syntaxhighlight lang="sh"> #!/usr/bin/env sh # backup.sh BACKUP_DIR="/var/backups/mcp-server" DATE=$(date +%Y%m%d_%H%M%S) PROJECT_DIR="/home/username/mcp-server" # バックアップディレクトリの作成 mkdir -p $BACKUP_DIR # プロジェクトディレクトリの圧縮 tar -czf "$BACKUP_DIR/mcp-server_$DATE.tar.gz" -C $(dirname $PROJECT_DIR) $(basename $PROJECT_DIR) # 30日以上前のバックアップを削除 find $BACKUP_DIR -name "*.tar.gz" -mtime +30 -delete </syntaxhighlight> <br> バックアップスクリプトを実行可能にする。<br> chmod u+x backup.sh <br> cronジョブとして設定する。<br> crontab -e <br> # 毎日午前2時にバックアップを実行 0 2 * * * /path/to/backup.sh <br><br> == トラブルシューティング == ==== MCPサーバが起動しない ==== * ログを確認する。 *: sudo journalctl -u mcp-server -n 50 * ポートが既に使用されていないか確認する。 *: sudo lsof -i :3000 * Node.js または Pythonのバージョンを確認する。 <br> ==== Claude Desktopから接続できない ==== * 設定ファイルのパスが正しいか確認する。 * ファイルの実行権限を確認する *: chmod u+x server.js * STDIOトランスポートの場合、標準出力にログを出力していないか確認する。 <br> ==== ツールの実行が遅い ==== * ツールの実装を最適化する。 * タイムアウト設定を確認する。 * システムリソースを確認する *: <code>top</code>コマンド または <code>htop</code>コマンド <br> ==== RISC-V環境でNode.jsが動作しない ==== * ソースコードからビルドする必要がある場合がある。 * バージョン互換性を確認する。 * 依存関係を確認する *: <code>ldd /path/to/node</code> <br><br> == パフォーマンス最適化 == ==== Node.jsの最適化 ==== <syntaxhighlight lang="sh"> # Node.jsのメモリ制限を増やす node --max-old-space-size=4096 server.js # クラスタリングによる負荷分散 # cluster.jsファイルを作成 </syntaxhighlight> <br> <syntaxhighlight lang="javascript"> import cluster from 'cluster'; import os from 'os'; if (cluster.isPrimary) { const numCPUs = os.cpus().length; for (let i = 0; i < numCPUs; i++) { cluster.fork(); } cluster.on('exit', (worker, code, signal) => { console.error(`ワーカー ${worker.process.pid} が終了しました`); cluster.fork(); }); } else { // サーバの起動 import('./server.js'); } </syntaxhighlight> <br> ==== キャッシングの実装 ==== 頻繁にアクセスされるデータをキャッシュすることにより、パフォーマンスを向上させる。<br> <br> npm install node-cache <br> <syntaxhighlight lang="javascript"> import NodeCache from 'node-cache'; const cache = new NodeCache({ stdTTL: 600 }); // 10分間キャッシュ server.tool( "get-cached-data", "キャッシュされたデータを取得する", {}, async () => { const cacheKey = 'system-info'; let data = cache.get(cacheKey); if (!data) { // データを取得してキャッシュに保存 data = await fetchSystemInfo(); cache.set(cacheKey, data); } return { content: [{ type: "text", text: JSON.stringify(data) }], }; } ); </syntaxhighlight> <br><br> {{#seo: |title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki |keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,電気回路,電子回路,基板,プリント基板 |description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux |image=/resources/assets/MochiuLogo_Single_Blue.png }} __FORCETOC__ [[カテゴリ:RHEL]][[カテゴリ:SUSE]][[カテゴリ:Raspberry_Pi]]
サーバ - MCP
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse