15分でPythonでMCPサーバーを構築する方法


## はじめに

モデルコンテキストプロトコル（Model Context Protocol、以下MCP）は、大規模言語モデル（LLM）がデータソースや外部ツールと標準化された方法で接続するためのオープンプロトコルです。MCPサーバーを構築することで、Claude、GPTなどのAIアシスタントに新しい能力を追加し、データベースへのクエリ、APIとの連携、ファイル操作など、さまざまなタスクを実行できるようになります。

このチュートリアルでは、わずか15分でPythonを使用してシンプルなMCPサーバーを構築する方法を紹介します。今回はSQLiteデータベースに接続してデータを取得する基本的なサーバーを作成していきましょう。

## 前提条件

- Python 3.7以上がインストールされていること
- 基本的なPythonの知識
- コマンドライン（ターミナル）の基本操作ができること
- Claude DesktopまたはCursorなどのMCPをサポートするクライアントアプリケーション（テスト用）

## MCPとは何か、なぜ必要なのか？

GPTやClaudeなどのLLMは、テキスト生成が得意ですが、基本的には単語の次の単語を予測しているだけで、外部世界のデータを取得したり、操作したりすることはできません。MCPはこの問題を解決し、AIアシスタントが外部リソースにアクセスするための標準化されたインターフェイスを提供します。

MCPは、USBポートのようなものと考えることができます。USBがさまざまな周辺機器を接続するための標準インターフェイスであるように、MCPはAIアプリケーションがさまざまなデータソースやツールに接続するための標準インターフェイスです。

## MCPの主なコンポーネント

1. **ホスト**: Claude DesktopやCursorなどのユーザーインターフェース
2. **クライアント**: MCPプロトコルを話し、MCPサーバーにリクエストを転送するソフトウェア（多くの場合、ホストに組み込まれています）
3. **サーバー**: 実際の作業を行い、データベースへのクエリやAPI呼び出しなどの機能を提供するソフトウェア（今回作成するのはこれです）

## 15分でMCPサーバーを構築する手順

### ステップ1: 環境のセットアップ（2分）

まず、Pythonの仮想環境を作成し、必要なライブラリをインストールします。

```bash
# 仮想環境の作成
python -m venv mcp-env

# 仮想環境の有効化（Windowsの場合）
# mcp-env\Scripts\activate

# 仮想環境の有効化（macOS/Linuxの場合）
source mcp-env/bin/activate

# MCPライブラリのインストール
pip install mcp
```

### ステップ2: サンプルデータベースの準備（1分）

このチュートリアルでは、SQLiteデータベースを使用して、コミュニティのチャットユーザーに関するデータを扱います。サンプルデータベースを作成しましょう。

```bash
# SQLiteをインストール（必要な場合）
pip install sqlite3
```

`community.db`という名前のデータベースを作成するか、以下のPythonスクリプトを実行してサンプルデータを生成します：

```python
import sqlite3

# データベース接続
conn = sqlite3.connect('community.db')
cursor = conn.cursor()

# テーブル作成
cursor.execute('''
CREATE TABLE IF NOT EXISTS chatters (
    id INTEGER PRIMARY KEY,
    name TEXT NOT NULL,
    messages INTEGER NOT NULL
)
''')

# サンプルデータ挿入
sample_data = [
    ('田中太郎', 156),
    ('佐藤花子', 237),
    ('鈴木一郎', 89),
    ('高橋美咲', 321),
    ('伊藤健太', 175)
]

cursor.executemany('INSERT INTO chatters (name, messages) VALUES (?, ?)', sample_data)

# 変更を保存して接続を閉じる
conn.commit()
conn.close()
```

### ステップ3: MCPサーバーの作成（5分）

次に、`sqlite-server.py`というファイルを作成し、以下のコードを入力します：

```python
# sqlite-server.py
from mcp.server import mcptool
from mcp.server import FastMCP
import sqlite3

# MCPサーバーを初期化（わかりやすい名前をつける）
mcp = FastMCP("コミュニティチャットデータ")

# SQLiteデータベースからトップチャッターを取得するためのツールを定義
@mcptool(mcp)
def get_top_chatters():
    """メッセージ数でソートされたトップチャッターを取得する"""
    # SQLiteデータベースに接続
    conn = sqlite3.connect('community.db')
    cursor = conn.cursor()
    
    # メッセージ数でソートされたチャッターを取得するクエリを実行
    cursor.execute("SELECT name, messages FROM chatters ORDER BY messages DESC")
    results = cursor.fetchall()
    conn.close()
    
    # 結果を辞書のリストとしてフォーマット
    chatters = [{"name": name, "messages": messages} for name, messages in results]
    return chatters

# MCPサーバーをローカルで実行
if __name__ == '__main__':
    mcp.run()
```

このシンプルなMCPサーバーは、`get_top_chatters`というツールを定義し、SQLiteデータベースに接続してデータを取得し、読みやすい形式で返します。

### ステップ4: Cursor（またはClaude Desktop）への統合（5分）

#### Cursorへの追加

1. Cursor Pro（必須）を開きます
2. 設定 → MCP に移動します
3. 「新しいグローバルMCPサーバーを追加」をクリックします
4. 設定ファイル（`~/.cursor/mcp.json`）が開きます
5. 以下の設定を追加します：

```json
{
  "mcpServers": {
    "sqlite-server": {
      "command": "/あなたのプロジェクトへのパス/mcp-env/bin/python",
      "args": ["/あなたのプロジェクトへのパス/sqlite-server.py"],
      "description": "コミュニティデータベースからトップチャッターを取得するシンプルなMCPサーバー"
    }
  }
}
```

6. 保存してMCP設定に戻ります
7. サーバーとそのツールが一覧表示され、サーバーの横に緑の点があることを確認します

#### Claude Desktopへの追加

1. Claude Desktopを開きます
2. 設定 → 開発者 → 設定を編集 に移動します
3. `claude_desktop_config.json`に同様のサーバーブロックを追加します：

```json
{
  "servers": [
    {
      "name": "コミュニティチャットサーバー",
      "command": "python",
      "args": ["sqlite-server.py"],
      "description": "コミュニティデータベースからトップチャッターを取得するシンプルなMCPサーバー"
    }
  ]
}
```

4. 保存して、Claude Desktopを再起動します（新しい設定を読み込むため）

### ステップ5: MCPサーバーのテスト（2分）

#### Cursorでのテスト

1. Cursorでチャットを開きます
2. 「データベース内のチャッターの数はいくつですか？」などの質問をします
3. LLMは外部ツールが必要だと判断し、ツールを実行するための許可を求めます
4. 許可すると、MCPサーバーがSQLiteデータベースにクエリを実行し、データを返します
5. AIはチャット内で情報を表示します

#### Claude Desktopでのテスト

1. Claude Desktopでチャットを開きます
2. 「トップチャッターのリストを表示してください」などの質問をします
3. MCPツールを実行するための許可を求められます
4. 許可すると、結果が表示されます

## MCPサーバーの拡張

基本的なMCPサーバーができたら、さらに機能を追加することができます。例えば：

1. **新しいチャッターの追加**：データベースに新しいチャッターを追加するツールを作成
2. **メッセージ数の更新**：既存のチャッターのメッセージ数を更新するツール
3. **特定のチャッターの検索**：名前や他の条件でチャッターを検索するツール

以下は、新しいチャッターを追加するツールの例です：

```python
@mcptool(mcp)
def add_new_chatter(name: str, messages: int):
    """新しいチャッターをデータベースに追加する"""
    conn = sqlite3.connect('community.db')
    cursor = conn.cursor()
    
    cursor.execute("INSERT INTO chatters (name, messages) VALUES (?, ?)", (name, messages))
    conn.commit()
    conn.close()
    
    return {"status": "success", "message": f"{name}がメッセージ数{messages}で追加されました"}
```

## よくある質問

### MCPサーバーの目的は何ですか？
MCPサーバーは、LLMが外部データソースやツールと連携するためのブリッジとして機能します。データベースへのクエリ、APIの呼び出し、ファイル操作など、AIだけでは実行できないタスクをLLMが実行できるようにします。

### なぜPythonでMCPサーバーを構築するのですか？
Pythonは、豊富なライブラリエコシステムと簡潔な構文により、MCPサーバーの構築に理想的な言語です。データ操作、API呼び出し、ファイル操作など、多くのタスクを簡単に実装できます。

### MCPサーバーはどのように安全性を確保していますか？
MCPサーバーは、アクセス制御やRBAC（ロールベースのアクセス制御）などの機能を使って安全性を確保できます。また、SQLインジェクションなどの一般的な攻撃を防ぐために、適切な入力検証とサニタイズを実装することが重要です。

## まとめ

このチュートリアルでは、わずか15分でPythonを使用してシンプルなMCPサーバーを構築する方法を学びました。MCPは、LLMが外部データソースやツールと連携するための強力なプロトコルであり、AIアシスタントの能力を大幅に拡張します。

基本的なデータベース連携のサーバーから始めることで、MCPの基本的な概念と実装方法を理解することができました。ここで得た知識を基に、より複雑なMCPサーバーを構築し、AIアシスタントにより多くの機能を追加することができます。

是非このチュートリアルを出発点として、MCPの可能性を探求し、あなた独自のAIツールエコシステムを構築してください。MCPを活用することで、AIアシスタントの能力を大幅に拡張し、より多くのタスクを自動化することができるでしょう。

それでは、楽しいMCP開発ライフをお過ごしください！