NotionMCP Light

by karaage0703
# 要件・設計書 ## 1. 要件定義 ### 1.1 基本情報 - ソフトウェア名称: NotionMCP Light - リポジトリ名: notion-mcp-light ### 1.2 プロジェクト概要 本プロジェクトは、Notionの公式Model Context Protocol (MCP)サーバーが抱える非効率性(Markdownをブロック単位で読み書きし、LLMトークンを消費する点)を解決するために、トークンを使用せず、API経由で直接MarkdownファイルとNotionのページ/データベースを同期できる非公式のMCPサーバーを構築することを目的とする。 ### 1.3 機能要件 #### 1.3.1 Markdown → Notion - H1をページタイトルとして認識 - Markdownの内容をNotionページまたはデータベースのページとして作成 - データベースIDを指定可能 - Notion APIを直接使用(トークン未使用) #### 1.3.2 Notion → Markdown - 指定されたページまたはデータベースのページをMarkdown形式に変換 - タイトルをH1として出力 - ブロック構造をMarkdownに変換 - ファイルに保存 #### 1.3.3 MCPサーバー対応 - Model Context Protocol(MCP)に準拠 - CursorやClineなどのAIツールから呼び出し可能なエンドポイントを提供 - JSON-RPC over stdioベースで動作(予定) ### 1.4 非機能要件 - 迅速なレスポンス(LLMを使用しないため) - ストリーム処理不要(非同期でなくても良い) - シンプルな構成とメンテナンス性重視 ### 1.5 制約条件 - Python 3.10以上で動作 - Notion API Tokenが必要 - Markdown構造に大きな自由度は持たせない(H1 = タイトル) ### 1.6 開発環境 - 言語: Python - フレームワーク: FastAPI(または標準JSON-RPC) - 外部ライブラリ: - `notion-sdk-py` - `python-sdk` (Model Context Protocol) - `markdown`, `mistune`(Markdown処理用) ### 1.7 成果物 - Python製MCPサーバースクリプト - ドキュメント変換ユーティリティ - README / 利用手順 - 設計書 ## 2. システム設計 ### 2.1 システム概要設計 #### 2.1.1 システムアーキテクチャ ``` [MCPクライアント(Cline, Cursor)] <-> [MCPサーバー (Python)] <-> [Notion API] | [Markdownファイル I/O] ``` #### 2.1.2 主要コンポーネント - **MCPサーバー** - JSON-RPC over stdioをリッスン - Notionとの連携を管理 - **Notionクライアント** - APIラッパー - ページの作成・取得 - **Markdownコンバータ** - Markdown → Notionブロック変換 - Notionブロック → Markdown変換 ### 2.2 詳細設計 #### 2.2.1 クラス設計 ##### `NotionClient` ```python class NotionClient: def upload_markdown(filepath: str, database_id: Optional[str] = None, page_id: Optional[str] = None) -> str def download_page(page_id: str, output_path: str) -> None ``` ##### `MarkdownConverter` ```python class MarkdownConverter: def parse_markdown_to_blocks(md: str) -> List[dict] def convert_blocks_to_markdown(blocks: List[dict]) -> str ``` ##### `MCPServer` ```python class MCPServer: def handle_upload_markdown(request) -> Response def handle_download_markdown(request) -> Response ``` ### 2.3 インターフェース設計 - JSON-RPCエンドポイント: - `uploadMarkdown`: Markdownファイル → Notion - `downloadMarkdown`: Notionページ → Markdownファイル ### 2.4 セキュリティ設計 - Notion APIトークンは環境変数で管理(`.env`) - 外部からの直接アクセスは制限(ローカル環境前提) ### 2.5 テスト設計 - 単体テスト - Markdown変換の正確性 - Notion APIの応答確認 - 統合テスト - 実ファイルを使用した変換テスト - MCPリクエストを模擬した動作確認 ### 2.6 開発環境・依存関係 - Python 3.10+ - `notion-client` - `python-sdk`(MCP) - `markdown`, `mistune`, `dotenv` ### 2.7 開発工程 | フェーズ | 内容 | 期間 | |---------|------|------| | 要件定義 | 本仕様書作成 | 第1週 | | 設計 | アーキテクチャ・モジュール設計 | 第1週 | | 実装 | 各モジュールの開発 | 第2-3週 | | テスト | 単体・統合テスト | 第4週 | | リリース | ドキュメント整備・デプロイ対応 | 第5週 | ## 3. Notion MCPサーバー比較 ### 3.1 公式Notion MCPサーバーのシーケンス図(Markdown→Notion書き込み) ```mermaid sequenceDiagram participant LLM as LLM participant MCP as 公式Notion MCPサーバー participant MD as Markdownファイル participant API as Notion API participant Notion as Notionページ %% Markdownからページ作成のケース LLM->>MD: Markdownファイル読み込み MD-->>LLM: Markdown内容 Note over LLM: Markdownをブロックに分割 LLM->>MCP: ブロック1のページ作成リクエスト Note over LLM,MCP: LLMトークン消費量大 MCP->>API: ブロック1のページ作成API呼び出し API->>Notion: ブロック1を作成 Notion-->>API: 作成完了 API-->>MCP: レスポンス MCP-->>LLM: 結果返却 Note over LLM,MCP: LLMトークン消費量大 LLM->>MCP: ブロック2のページ作成リクエスト Note over LLM,MCP: LLMトークン消費量大 MCP->>API: ブロック2のページ作成API呼び出し API->>Notion: ブロック2を作成 Notion-->>API: 作成完了 API-->>MCP: レスポンス MCP-->>LLM: 結果返却 Note over LLM,MCP: LLMトークン消費量大 Note over LLM,Notion: ブロック3...Nについても同様に繰り返し ``` ### 3.2 NotionMCP Lightのシーケンス図(Markdown→Notion書き込み) ```mermaid sequenceDiagram participant LLM as LLM participant MCP as NotionMCP Light participant MD as Markdownファイル participant API as Notion API participant Notion as Notionページ %% Markdownからページ作成のケース LLM->>MCP: uploadMarkdownリクエスト Note over LLM,MCP: LLMトークン消費量小 MCP->>MD: Markdownファイル読み込み MD-->>MCP: Markdown内容 MCP->>MCP: MarkdownConverterでブロック変換 MCP->>API: NotionClientでページ作成API呼び出し API->>Notion: ページ作成 Notion-->>API: 作成完了 API-->>MCP: レスポンス MCP-->>LLM: 結果返却 Note over LLM,MCP: LLMトークン消費量小 ``` ### 3.3 主な違い 1. **LLMトークン消費**: - 公式MCPサーバー: ブロックごとに処理するため、LLMトークン消費量が大きい - NotionMCP Light: 一括処理のため、LLMトークン消費量が小さい 2. **処理方法**: - 公式MCPサーバー: LLMがMarkdownを読み込み、ブロック単位で何度もAPIを呼び出す - NotionMCP Light: MCPサーバーがMarkdownファイル全体を一括処理 3. **効率性**: - 公式MCPサーバー: ブロックごとの処理によりトークン消費が多く、API呼び出しも複数回 - NotionMCP Light: ファイル操作による直接同期で効率的、API呼び出しは1回 4. **データフロー**: - 公式MCPサーバー: LLM→Markdownファイル→LLM→MCP→Notion API(ブロックごとに繰り返し) - NotionMCP Light: LLM→MCP→Markdownファイル→Notion API(一括処理)
ID: mduc0221dl