NotionでAIを強化する | 第1章：ページデータの第一歩

## はじめに

**Notion**は、ノート、データベース、プロジェクト管理を統合したオールインワンの生産性ツールです。ページやデータベースを使って、タスク、ドキュメント、アイデアを整理できます。強力なAPIにより、ページ、データベース、コメントのデータを簡単に取得・操作できます。一方、**Model Context Protocol（MCP）**は、AI（例：Claude）を外部データやツールと標準化された方法で接続するプロトコルです。このシリーズでは、NotionとMCPを統合し、ノートやデータベースを活用するエージェントAIを構築する方法を学びます。たとえば、AIがタスクのステータスを分析したり、ページを自動整理したりできます。

第1章では、NotionとMCPの基本を理解し、Notionからページデータを取得するシンプルなMCPサーバーを構築します。Claude Desktopと接続して、ノート管理の第一歩を踏み出しましょう。

## NotionとMCPの概要

### Notionとは？
Notionは、以下のような特徴を持つ生産性ツールです：
- **柔軟な構造**：ページ、データベース、テーブルでデータを自由に整理。
- **強力なAPI**：REST APIでページ、データベース、コメントにアクセス。
- **多用途**：個人ノート、タスク管理、チームコラボレーションに対応。
- **コミュニティ**：テンプレートやインテグレーションが豊富。

### MCPの役割
MCPは、AIにNotionのデータを提供する橋渡し役です。MCPサーバーを通じて、AIは以下を行えます：
- **データ取得**：ページやデータベースの情報を取得。
- **アクション実行**：ページを作成、更新、コメントを追加。
- **分析**：タスクの進捗やデータベースの内容を評価。

### なぜNotionとMCPを組み合わせる？
この組み合わせは、以下のようなシナリオで強力です：
- ノート管理：AIがノートを自動整理し、タグやカテゴリを提案。
- データ分析：AIがデータベースを分析し、タスクのボトルネックを特定。
- チーム連携：AIがコメントや通知を生成し、コラボレーションを効率化。

## 開発環境の準備

MCPサーバーとNotionを統合するには、以下の環境を準備します：
- **Python 3.8以降**：サーバー開発用。
- **mcpライブラリ**：JSON-RPC通信を処理（仮定のライブラリ、公式ドキュメントを参照）。
- **requestsライブラリ**：Notion APIとの通信用。
- **Claude Desktop**：MCP対応のAIクライアント。
- **テキストエディタ**：VS Code推奨。

インストールコマンド：
```bash
pip install mcp jsonrpcserver requests python-dotenv
```

### Notionのセットアップ
1. **ページ準備**：
   - [Notion](https://www.notion.so)にアクセスし、新しいページを作成（例：`MCP-Project`）。
   - サブページを追加（例：`タスク管理`、`アイデア`）。
   - ページのURLからページIDを記録（例：`https://www.notion.so/ページ名-PAGE_ID`の`PAGE_ID`、ハイフン付きの32文字）。
2. **APIトークンの取得**：
   - Notionの[Integrationsページ](https://www.notion.so/my-integrations)で新しいインテグレーションを作成。
   - トークンを生成し、ページへのアクセス権を付与（`Content Capabilities: Read Content`）。
   - トークンを安全に保存。
3. **環境変数の設定**：
   `.env`ファイルに以下を追加：
   ```bash
   NOTION_TOKEN=your_token
   NOTION_PAGE_ID=your_page_id
   ```

## コード例：Notion用MCPサーバー

```python
from mcp import MCPServer
import os
from dotenv import load_dotenv
import requests

class NotionServer(MCPServer):
    def __init__(self, host, port, token, page_id):
        super().__init__(host, port)
        self.token = token
        self.page_id = page_id
        self.base_url = "https://api.notion.com/v1"
        self.headers = {
            "Authorization": f"Bearer {token}",
            "Notion-Version": "2022-06-28",
            "Content-Type": "application/json"
        }
        self.register_resource("get_page", self.get_page)

    def get_page(self, params):
        try:
            url = f"{self.base_url}/pages/{self.page_id}"
            response = requests.get(url, headers=self.headers)
            response.raise_for_status()
            page = response.json()
            page_info = {
                "id": page["id"],
                "title": page["properties"].get("title", {}).get("title", [{}])[0].get("plain_text", ""),
                "created_time": page["created_time"],
                "last_edited_time": page["last_edited_time"]
            }
            return {"status": "success", "page_info": page_info}
        except Exception as e:
            return {"status": "error", "message": str(e)}

if __name__ == "__main__":
    load_dotenv()
    server = NotionServer(
        host="localhost",
        port=8117,
        token=os.getenv("NOTION_TOKEN"),
        page_id=os.getenv("NOTION_PAGE_ID")
    )
    print("Notion MCPサーバーを起動中: http://localhost:8117")
    server.start()
```

### コードの説明
- **requests**：Notion APIにGETリクエストを送信し、ページデータを取得。
- **get_page**：指定したページのID、タイトル、作成日、更新日を取得。
- **register_resource**：リソースを登録し、AIがアクセス可能に。
- **start()**：サーバーを起動。

### 前提条件
- Notionページが存在し、ページIDが正しい。
- `.env`ファイルに正しい`NOTION_TOKEN`と`NOTION_PAGE_ID`が設定済み。
- インテグレーションにページへの読み取り権限がある。

## サーバーのテスト

サーバーが正しく動作するか確認します：

1. **サーバー起動**：
   ```bash
   python notion_server.py
   ```
   コンソールに「Notion MCPサーバーを起動中: http://localhost:8117」と表示。

2. **ページ取得のテスト**：
   Pythonでリクエストを送信：
   ```python
   import requests
   import json

   url = "http://localhost:8117"
   payload = {
       "jsonrpc": "2.0",
       "method": "get_page",
       "params": {},
       "id": 1
   }
   response = requests.post(url, json=payload)
   print(json.dumps(response.json(), indent=2, ensure_ascii=False))
   ```
   期待されるレスポンス：
   ```json
   {
     "jsonrpc": "2.0",
     "result": {
       "status": "success",
       "page_info": {
         "id": "page123",
         "title": "MCP-Project",
         "created_time": "2025-04-22T10:00:00.000Z",
         "last_edited_time": "2025-04-22T12:00:00.000Z"
       }
     },
     "id": 1
   }
   ```

## Claude Desktopとの接続

サーバーをClaude Desktopに接続します：

1. **設定ファイルの編集**：
   Claude Desktopの設定ファイル（例：`claude_desktop_config.json`）に以下を追加：
   ```json
   {
     "mcp_servers": [
       {
         "name": "NotionServer",
         "url": "http://localhost:8117",
         "auth": "none"
       }
     ]
   }
   ```

2. **Claudeでテスト**：
   Claude Desktopを起動し、プロンプトを入力：
   ```
   ページの情報を教えてください。
   ```
   レスポンス例：
   ```
   Notionページの情報：
   - タイトル：MCP-Project
   - 作成日：2025-04-22 10:00
   - 最終編集日：2025-04-22 12:00
   ```

## 次のステップ

このMCPサーバーは、NotionとAIの連携の基礎です。次の第2章では、Notionにページやデータベースを追加・更新する機能を実装し、ノートやタスクを自動化するエージェントを構築します。たとえば、AIが新しいタスクページを作成したり、データベースにエントリを追加したりできます。

## まとめ

この第1章では、NotionとMCPの基本を学び、シンプルなMCPサーバーを構築してページデータを取得しました。Notionの強力なAPIとMCPの柔軟性を組み合わせることで、AIをノート管理の強力なアシスタントに変えられます。次章以降では、ページ自動化、データベース分析、リアルタイム管理へと進化させます。

---

役に立ったと思ったら、「いいね」や「ストック」をしていただけると嬉しいです！次の章でまたお会いしましょう！