課題:Claudeは賢いが、ローカルのコンテキストが不足している
Claudeにアーキテクチャのアドバイスを求めるのは素晴らしいことですが、3週間前に削除したデータベースの列を捏造(ハルシネーション)されては困ります。私は以前、DDLをエクスポートし、機密データを削除して、チャットに貼り付けるという「コピペ作業」に、1時間のうち約15分を費やしていました。スキーマが変更されるたびに、このサイクルを繰り返していたのです。
このような手動のワークフローは脆く、危険です。コンテキストの更新を忘れると、AIは存在しないテーブルに対するクエリを提案してしまいます。さらに悪いことに、内部データをWeb UIに貼り付けることは、セキュリティ上の大きなリスクを伴います。AIが直接環境を「確認」できる、安全な方法が必要です。Model Context Protocol (MCP) は、LLMとローカルマシンの間に安全な架け橋を作ることで、この問題を解決します。
Model Context Protocol의仕組み
MCPは、AIモデルが外部データソースとやり取りできるようにするための、Anthropicによるオープン標準です。LLM用の「ユニバーサルドライバー」と考えてください。新しいAIツールが登場するたびにカスタム統合を構築する代わりに、MCPサーバーを一度構築するだけで済みます。Claude DesktopやIDEなどの対応クライアントであれば、すぐにそのツールを利用できるようになります。
このシステムは、主に3つの要素で構成されています。
- MCPホスト: あなたが入力を行うインターフェース(Claude Desktopなど)。
- MCPクライアント: ホスト内で接続を管理する隠れたエンジン。
- MCPサーバー: 特定のリソース(PostgreSQLデータベースやJira APIなど)を公開するために記述する軽量なプログラム。
ほとんどのローカルサーバーは、標準入出力(stdio)を介して通信します。このプロトコルをマスターすることで、AIは単なるチャットインターフェースを超えた存在になります。モデルは、実際の開発環境をナビゲートできる機能的なエージェントへと進化するのです。
ステップバイステップ:SQLite MCPサーバーの構築
ここでは、ClaudeがローカルのSQLiteデータベースを照会できるようにするPythonサーバーを構築します。これにより、Claudeは古いスニペットに基づいた推測ではなく、実際のSQLを実行して「先月の売上上位10名の顧客は誰ですか?」といった質問に答えられるようになります。
1. 環境の準備
Python 3.10以降がインストールされていることを確認してください。インストールをクリーンに保ち、他のプロジェクトとの依存関係の競合を避けるために、仮想環境を使用します。
mkdir my-mcp-server
cd my-mcp-server
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install mcp sqlalchemy
2. サーバーロジックの作成
server.py という名前のファイルを作成します。複雑なJSON-RPC通信を処理してくれる FastMCP SDKを使用します。このツールにより、Claudeは読み取り専用クエリを安全に実行できるようになります。
from mcp.server.fastmcp import FastMCP
import sqlite3
mcp = FastMCP("DataExplorer")
DB_PATH = "production_mirror.db"
@mcp.tool()
def query_database(sql: str) -> str:
"""ローカルデータベースに対して読み取り専用のSELECTクエリを実行します。"""
try:
with sqlite3.connect(DB_PATH) as conn:
cursor = conn.cursor()
# 安全チェック:破壊的なコマンドを防止
if not sql.strip().upper().startswith("SELECT"):
return "エラー:セキュリティのため、SELECTクエリのみが許可されています。"
cursor.execute(sql)
return str(cursor.fetchall())
except Exception as e:
return f"データベースエラー: {str(e)}"
if __name__ == "__main__":
mcp.run()
3. Claude Desktopとサーバーの連携
Claude Desktopにスクリプトを起動するための明示的な指示を与える必要があります。設定ファイルを編集してください。macOSでは ~/Library/Application Support/Claude/claude_desktop_config.json にあります。Windowsユーザーは %APPDATA%\Claude\claude_desktop_config.json を探してください。
Pythonの実行ファイルとスクリプトへの絶対パスを使用して、ファイルを更新します。
{
"mcpServers": {
"my-sqlite-server": {
"command": "/path/to/my-mcp-server/.venv/bin/python",
"args": ["/path/to/my-mcp-server/server.py"]
}
}
}
相対パスは、ここで最も多い失敗の原因です。Claude Desktopは別のシェル環境で実行されるため、正確に指定しない限り、プロジェクトフォルダの場所を特定できません。
4. 接続の確認
設定を反映させるために、Claude Desktopを完全に再起動してください。メッセージボックスの右下に小さなハンマーのアイコンが表示されているか確認します。表示されていれば、Claudeはツールの登録に成功しています。「ローカルデータベースを確認して、’logs’テーブルの最新の5件を表示して」と頼んでみてください。
ローカルファイルを超えて:プライベートAPIへの接続
MCPはローカルデータベース以外も扱えます。外部に公開されていない社内APIをラップすることも可能です。例えば、私は最近、プライベートな在庫管理API用のサーバーを構築しました。これにより、チャット画面を離れることなく、Claudeに在庫レベルを要約させることができるようになりました。
APIツールの構造は、データベース版とほぼ同じです。
import requests
@mcp.tool()
def check_inventory(sku: str) -> dict:
"""内部APIを介して特定のSKUの在庫レベルを確認します。"""
response = requests.get(f"https://api.internal-tools.com/v1/stock/{sku}")
return response.json()
実践から得られたベストプラクティス
いくつかのサーバーを構築した経験から、MCPのデバッグは一筋縄ではいかないことがわかりました。以下の4つのヒントは、無駄な時間を減らすのに役立つはずです。
- インスペクターを活用する: Claudeで試す前に、
mcp-inspectorツールを使用してサーバーをテストしてください。Claude Desktopでは見落とされがちなJSON形式のエラーを検出できます。 - ファイルにログを出力する: 通常の
print()文は、stdioストリームを妨害するため、MCP接続を切断してしまいます。代わりにPythonのloggingライブラリを使用して、debug.logファイルなどに書き出すようにしましょう。 - 読み取り専用を徹底する: LLMに
DROPやDELETEの権限を決して与えないでください。AIが生成したクエリによる事故を防ぐため、SELECTのみに制限されたデータベースユーザーを使用してください。 - タイムアウトに注意: Claude Desktopは、ツールの応答に30秒以上かかるとタイムアウトします。データ量が多い場合は、
LIMIT句を使用するか、基本的なキャッシュを実装してください。
最後に
Model Context Protocolはまだ新しいものですが、AIを孤立したサンドボックスとして扱うのをやめるための最も堅牢な方法です。Claudeがデータにアクセスする方法を自動化することで、手動でのコンテキスト管理という摩擦を排除できます。まずは、最もよく使うデータベースのシンプルな読み取り専用ツールから始めてみてください。AIが実際の環境を把握していることで、開発スピードがどれほど向上するか、すぐに実感できるはずです。

