Notion MCP Server について
Notion MCP Server はトークン認証を通じて、Notion のページ、データベース、ブロック、コメント、ファイルの操作を MCP クライアントに提供します。無人実行に対応し、バッチ書き込み、冪等性、操作制限の設定を備えています。
主な機能
- 01ページの検索、作成、編集
- 02データベースの照会とブロック管理
- 03コメントの追加とファイルのアップロード
- 04ロールバックと冪等性を備えたバッチ書き込み
- 05読み取り専用モードと操作権限の設定
活用シーン
- 01タスクデータベースを検索して期限超過を確認
- 02テンプレートや要約からページを作成
- 03命名規則に沿ってページを一括改名
- 04会議要約の追加や図のアップロード
MCP 対応
標準では stdio 経由で MCP クライアントに Notion 操作を提供し、設定により Streamable HTTP も利用できます。ページやデータベースの検索・変更、コメントとブロックの管理、ファイルのアップロードが可能です。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
npx -y notion-mcp-serverNOTION_TOKENシークレットNotion Personal Access Token (ntn_...) or Internal Integration Secret. Create at https://app.notion.com/developers/tokensNOTION_PAGE_IDOptional default parent page ID used by create_page / create_database when no parent is passed.ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
2掲載時のツール一覧 · 3 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| operation | string | はい | 操作名。各操作のスキーマについては notion_describe を参照するか、notion://operations リソースを読み込んで全メニューを確認してください。一般的な操作:set_page_title、append_blocks、get_page、search_pages、query_database。 |
| payload | object | はい | 操作パラメーター。単一操作のフィールドを直接渡すか、バッチの場合は { items: [...], atomic?, idempotency_key?, concurrency? } を渡します。 |
詳細
Notion MCP Server — Claude、Cursor、VS Code、CodexをNotionに接続
notion-mcp-serverは、Claude Code、Claude Desktop、Cursor、VS Code、Codex、その他あらゆるMCPクライアントに、1つのトークンでNotionへの読み書きアクセスを提供するModel Context Protocol(MCP)サーバーです。AIは、自然な言葉で検索、ページの作成と編集、データベースへのクエリ、コメントの追加、ファイルのアップロードを行えます。
- 無料プランを含む、すべてのNotionプランでトークン認証に対応。 ブラウザーでのサインインは不要なため、CI、cronジョブ、バックグラウンドエージェント、自社サーバー上など、ヘッドレス環境でも実行できます。
- コンテキストの消費を抑えます。 接続時に必要なトークンは3つのツールで1,005トークンです。Notionのオープンソースサーバーの17,163トークンと比べて少なく、ページ読み取りのデータ量も82%削減できます。ベンチマーク →
- エージェント向けに設計。 アトミックなロールバックと冪等性キーに対応した一括書き込み、レート制限時の再試行、Markdownの入出力、呼び出しを修正する方法をモデルに伝えるエラーを備えています。
クイックスタート
1. Notion トークンを取得します。 app.notion.com/developers/tokens を開き → + New token → 名前を付けて、ワークスペースを選択 → Create token → ntn_… の値をコピーします。パーソナルアクセストークンを使うと、ページごとに共有しなくても、あなた が閲覧できるすべてのものにアクセスできます。作成できない場合は、別のトークンの方法をご覧ください。
2. インストールします。
npx add-mcp notion-mcp-server --env NOTION_TOKEN=ntn_paste_your_token_here
add-mcp は、お使いのマシン上にある MCP クライアントを検出し、選択したクライアント用の設定を書き込みます。対応クライアントは、Claude Code、Claude Desktop、Cursor、VS Code、Codex、Gemini CLI、Cline、Windsurf、Zed などです。現在のプロジェクトではなく、ユーザー用にインストールするには -g を追加します。
--envフラグは必ず付けてください。これがないと、トークンなしで設定が書き込まれ、すべての呼び出しが認証エラーで失敗します。
または、ワンクリックでインストールできます。
- Cursor: 生成された設定内の
YOUR_NOTION_TOKENを置き換えます。 - VS Code(Copilot エージェントモード): トークンの入力を求められ、シークレットとして保存されます。
- Claude Desktop:
.mcpbファイルをダブルクリックするか、Settings → Extensions にドラッグして、トークンを貼り付けます。Node.js は不要です。初めての方は、何も知らなくても進められる手順ごとのガイドをご覧ください。
Claude Code をお使いですか? 代わりにプラグインとしてインストールしてください。 このプラグインには、Notion のワークフロースキルとサーバーが同梱されています。このスキルは、Claude に検索するタイミング、where を使ってデータベースをフィルタリングする方法、書き込みをまとめて行う方法を教えます。Claude Code はインストール時(または後から /plugin configure notion-mcp-server@awkoy を実行したとき)にトークンの入力を求め、システムのキーチェーンに保存します。
/plugin marketplace add awkoy/notion-mcp-server
/plugin install notion-mcp-server@awkoy
このプラグインは、プラグイン自身のバージョンに一致する npm リリースを実行し、Node.js 22 以降が必要です。デフォルトの親ページと読み取り専用の切り替え機能もあります。詳しくはプラグインの READMEをご覧ください。
手動セットアップ:JSON 設定、Claude Code、Codex、Gemini CLI、Docker
mcpServers ブロックを読み取るクライアント(Cursor の ~/.cursor/mcp.json、Claude Desktop の claude_desktop_config.json、Cline、Zed、Continue など):
{
"mcpServers": {
"notion": {
"command": "npx",
"args": ["-y", "notion-mcp-server"],
"env": { "NOTION_TOKEN": "ntn_paste_your_token_here" }
}
}
}
Claude Code:
claude mcp add notion -s user -e NOTION_TOKEN=ntn_paste_your_token_here -- npx -y notion-mcp-server
Codex(~/.codex/config.toml):
[mcp_servers.notion]
command = "npx"
args = ["-y", "notion-mcp-server"]
env = { NOTION_TOKEN = "ntn_paste_your_token_here" }
Gemini CLI: gemini extensions install https://github.com/awkoy/notion-mcp-server を実行すると、トークンの入力を一度だけ求められ、システムのキーチェーンに保存されます。
Docker(Podman、OrbStack、colima でも同じフラグを使います。stdio には -i が必要です):
claude mcp add notion -s user -e NOTION_TOKEN=ntn_paste_your_token_here \
-- docker run --rm -i -e NOTION_TOKEN ghcr.io/awkoy/notion-mcp-server:latest
3. 試してみます。 新しいチャットで、次のように入力します。
「Notion を使って『Hello from my agent』というページを作成し、今日試すことを3つ含むチェックリストを追加してください。」
AI が notion_write を呼び出し、新しいページへのリンクを返します。
質問できること
- 「Tasks データベースで Status が 'Doing' の行をすべて見つけて、期限切れのものを教えてください。」
- 「この50ページの名前を新しい規則に合わせて変更してください。」 50回ではなく、1回のバッチ呼び出しで実行します。
- 「'Weekly review' テンプレートからページを作成して、この要約を記入してください。」
- 「仕様ページを書き直してください。見出しを整えて、コードサンプルを追加してください。」 ページはMarkdownとして往復処理されます。
- 「昨日の会議メモに、1段落の要約をコメントしてください。」
- 「この図をデザインページにアップロードしてください。」
- 「バグ報告のスクリーンショットを見て、何が問題か教えてください。」 モデルは画像そのものを受け取ります。
どのNotion MCPを使うべきですか?
| 最適な用途 | 認証 | ヘッドレス/CI | 備考 | |
|---|---|---|---|---|
Notion hosted MCP (mcp.notion.com) | claude.ai、ChatGPT、Cursorでの対話型チャット、Notion AI機能 | すべてのプランでOAuth。BusinessおよびEnterpriseではMCPトークンを使用でき、ワークスペースのオーナーが作成します | BusinessおよびEnterpriseのみ | ファーストパーティで、最も豊富なツールセット(会議メモ、データソース横断のSQL、Custom Agents)を提供します。一部のツールには有料プランまたはNotion AIが必要です |
| Notion open-source server | — | トークン | ✅ | Notionは非推奨としており、「積極的なメンテナンスは終了」しています |
| このサーバー | エージェント、自動化、CI、セルフホスト、長時間のセッション | トークン、すべてのプラン | ✅ | 継続的にメンテナンスされています。ツールは3つで、書き込みはバッチ処理と冪等性に対応しています |
claude.aiやChatGPTでNotionとチャットするには、Notionのホスト型コネクターをワンクリックで利用できます。エージェントを無人で実行する場合、利用プランにMCPトークンが含まれない場合、コンテキストのコストが重要な場合、または自分のホスト上で実行したい場合は、このサーバーをお使いください。詳細な比較 →
設定
トークン:PATまたは内部インテグレーション
どちらも同じNOTION_TOKEN環境変数に設定します。異なるのは取得方法だけです。
| パーソナルアクセストークン(推奨) | 内部インテグレーション(スコープ指定) | |
|---|---|---|
| 場所 | app.notion.com/developers/tokens → + New token | app.notion.com/developers/connections → + New connection |
| スコープ | 自分が閲覧できるすべてのページ | **• • • → Connect → <integration>**をクリックしたページのみ |
| 使用する場合 | デフォルト:個人およびチームのワークスペース | PATを作成できない場合、または管理者がページごとの明示的なスコープ指定を求める場合 |
- PATを作成できるユーザー。 ワークスペースのオーナーは常に作成できます。FreeおよびBusinessプランではデフォルトでオーナーのみ、Plusではすべてのメンバーが作成できます。また、管理者はBusinessおよびEnterpriseでポリシーを変更できます。ゲストは作成できません。
- 有効期限と取り消し。 作成時に有効期間を指定します。最長で1年間です。同じトークンページで取り消すと、ただちに使用できなくなります。詳細:NotionのPATガイド。
- 閲覧できるページで
object_not_foundが表示される場合。 そのページに接続されていない内部インテグレーションが原因です。ページに接続するか、PATに切り替えてください。
環境変数
| 環境変数 | 必須 | デフォルト | 意味 |
|---|---|---|---|
NOTION_TOKEN | ✅ | — | PAT(ntn_…)または内部インテグレーションシークレット |
NOTION_PAGE_ID | — | — | parent が渡されない場合の create_page / create_database のデフォルトの親(ページ URL または ID) |
NOTION_RATE_LIMIT | — | 3 | 1 秒あたりのリクエスト数(Notion が公表している上限) |
NOTION_READ_ONLY | — | — | true にすると、すべての書き込み操作が無効になります |
NOTION_ALLOWED_OPERATIONS / NOTION_BLOCKED_OPERATIONS | — | — | 操作の許可リスト / ブロックリスト。操作の制限を参照してください |
NOTION_CONFIRM_DESTRUCTIVE | — | — | true にすると、破壊的操作の実行前に確認を求めます |
NOTION_UPLOAD_ROOT | — | — | upload_file のローカル path ソースで使用できるディレクトリ(制限しない場合は /)。未設定の場合、HTTP 経由では拒否され、stdio 経由ではドットで始まるパスとシステムおよびアプリデータのフォルダーが拒否されます。ファイルを参照してください |
NOTION_UPLOAD_MAX_BYTES | — | 1073741824(1 GiB) | upload_file がすべてのソースから受け付ける最大ファイルサイズ |
NOTION_UPLOAD_URL_TIMEOUT_MS | — | 30000 | url ソースの取得にかけられる制限時間。リダイレクトと本文も含みます |
NOTION_UPLOAD_ALLOW_PRIVATE_URLS | — | — | true にすると、url ソースがプライベート、ループバック、リンクローカルのアドレスにアクセスできます |
NOTION_FILE_URLS | — | full | ref にすると、Notion の長い署名付きファイル URL が短い参照に置き換わります。ファイルを参照してください |
HTTPS_PROXY / HTTP_PROXY | — | — | すべての送信トラフィックをプロキシ経由で送信します |
NOTION_DAILY_LOG_PAGE_ID | — | — | デイリーログ MCP プロンプトでのみ使用されます |
HTTP 変数については、リモート / HTTP トランスポートを参照してください。v1 または v2 からアップグレードしますか?環境変数はすべて引き続き使用できます。ツール名が変更されています。詳しくは MIGRATION.md を参照してください。
操作の制限
NOTION_READ_ONLY=true にすると、すべての書き込みが無効になります。より細かく制御するには、NOTION_ALLOWED_OPERATIONS と NOTION_BLOCKED_OPERATIONS に、カンマ区切りの操作名またはプリセット(read、write、destructive(アーカイブ、ゴミ箱への移動、削除)、あるいはファミリー(pages、blocks、databases、data_sources、views、comments、users、files)を指定します。ブロックリストが優先されます。
{ "env": { "NOTION_ALLOWED_OPERATIONS": "read" } } // read-only
{ "env": { "NOTION_BLOCKED_OPERATIONS": "destructive" } } // everything except removals
{ "env": { "NOTION_ALLOWED_OPERATIONS": "read,append_blocks,add_page_comment" } }
無効化された操作はツールスキーマから除外されるため、モデルに表示されません。サーバーは起動時に、解決された設定を次のように出力します。例:Operation access: 22/48 enabled (allow=read; block=(none))。
ブロックする代わりに確認を求めるには、NOTION_CONFIRM_DESTRUCTIVE=true を設定します。破壊的操作の実行前に、クライアントに対象の名前を示す「はい/いいえ」のダイアログが表示されます。クライアントは MCP エリシテーションに対応している必要があります。完全なルール、操作ごとの一覧、操作単位での制御の制限については、docs/configuration.mdを参照してください。
ファイル
upload_file は、NOTION_UPLOAD_MAX_BYTES(デフォルトは 1 GiB)までの Base64、公開 URL、またはローカルパスを受け付けます。ソースを選ぶのはモデルのため、サーバーは自身で読み取る 2 種類のソースを保護します。
- ローカルパス。 アップロード元として許可するディレクトリを
NOTION_UPLOAD_ROOTに設定してください。このディレクトリの外にあるパスは、シンボリックリンクも含めて拒否されます。設定しない場合、HTTP 経由ではパスを指定できません。また、stdio 経由では、ドットで始まるファイルやディレクトリ(~/.ssh、~/.aws、.env)を経由するパスや、MCP クライアントがトークンを保存するシステムフォルダーまたはアプリデータフォルダー(/proc、/dev、~/Library、%APPDATA%)内のパスは拒否されます。NOTION_UPLOAD_ROOT=/を設定すると、この制限は解除されます。ルート内では.envや.gitも含めてすべてのファイルを読み取れるため、HTTP 経由で使う場合は、サーバーを呼び出せる相手に渡してもよいファイルだけを格納したルートを選んでください。 - URL。 http と https のみ利用できます。リダイレクトを含むすべての経由先がパブリックアドレスに解決される必要があります。そのため、ループバック、プライベートネットワーク、クラウドのメタデータエンドポイントは拒否されます。イントラネットで利用する場合は、
NOTION_UPLOAD_ALLOW_PRIVATE_URLS=trueを設定するとこの制限を解除できます。取得はNOTION_UPLOAD_URL_TIMEOUT_MS(30 秒)経過後、または本文がサイズ制限を超えた時点で停止します。
Notion の署名付きファイル URL はそれぞれ約 500 トークン分の長さがあり、1 時間以内に期限切れになります。NOTION_FILE_URLS=ref を設定すると、レスポンス内の URL が短い notion-file: 参照に置き換わり、get_file_url と get_image が必要に応じて解決します。参照の仕組み →
リモート/HTTP トランスポート
デフォルトでは、サーバーは stdio で通信します。MCP_TRANSPORT=http を設定すると、Web クライアント、ネットワーク接続されたエージェント、共有デプロイメント向けの Streamable HTTP エンドポイントとして実行できます。
MCP_TRANSPORT=http PORT=3000 NOTION_TOKEN=ntn_xxx npx -y notion-mcp-server
# -> notion-mcp-server vX.Y.Z running on http://127.0.0.1:3000/mcp
| env | デフォルト | 説明 |
|---|---|---|
MCP_TRANSPORT | stdio | HTTP を有効にするには http を設定します |
PORT | 3000 | リッスンするポート(0 = OS が割り当て) |
HOST | 127.0.0.1 | バインドアドレス。0.0.0.0 を指定すると外部に公開されます(MCP_AUTH_TOKEN が設定されている場合のみ) |
MCP_AUTH_TOKEN | — | 設定すると、すべての /mcp リクエストで Authorization: Bearer <token> の送信が必須になります |
MCP_ALLOW_UNAUTHENTICATED | オフ | true にすると、認証プロキシを前段に置く場合に、MCP_AUTH_TOKEN がなくてもループバック以外の HOST で起動できるようになります |
MCP_ALLOWED_HOSTS | localhost + バインドされたホスト | DNS リバインディング対策として許可する Host のカンマ区切りリスト |
MCP_ALLOWED_ORIGINS | localhost のオリジン | ブラウザーの Origin で許可するオリジンのカンマ区切りリスト |
⚠️
/mcpにアクセスできる人は誰でも、あなたのNOTION_TOKENを使って操作できます。 デフォルトのループバックでは、ローカルプロセスのみが対象です。ループバック以外のHOSTを指定した場合、MCP_AUTH_TOKENがないと起動しません。さらに、前段に TLS を設置してください。
HTTP 経由では、呼び出し元がサーバーのマシン上にいるとは限らないため、NOTION_UPLOAD_ROOT を設定しない限り、upload_file にローカルパスを指定できません。Base64 と URL のソースは通常どおり使用できます。ファイルを参照してください。
claude mcp add --transport http notion https://your-host/mcp \
--header "Authorization: Bearer <MCP_AUTH_TOKEN>"
Docker、ヘルスチェック、プロトコルのバージョンについては、docs/http-transport.md を参照してください。
ツールと操作
呼び出すことになる 46 種類の操作は、3 つのツールで実行できます。読み取りには notion_read、書き込みには notion_write を使い、notion_describe は操作の JSON Schema と動作する例を返します。すべての ID フィールドには Notion の URL も指定できるので、**「共有 → リンクをコピー」**で取得したものを貼り付けてください。呼び出し例、一括処理オプション、MCP リソースについては、docs/operations.md を参照してください。
ツールごとの権限
読み取りと書き込みが分かれているため、読み取りは一度承認し、書き込みはプロンプトで確認するようにできます。Claude Code の settings.json では(notion はサーバーに付けた任意の名前です):
{ "permissions": { "allow": ["mcp__notion__notion_read", "mcp__notion__notion_describe"] } }
操作メニュー(46 個の操作と 2 つのエイリアス)
| 領域 | 操作 |
|---|---|
| ページ | create_page、get_page、set_page_title、set_page_property、set_page_properties、archive_page(エイリアス:trash_page)、restore_page、search_pages、move_page、get_page_markdown、update_page_markdown |
| ブロック | append_blocks、get_block、get_block_children、update_block、delete_block、batch_mixed_blocks |
| データベース | create_database、query_database、update_database、delete_database |
| データソース | list_data_sources、get_data_source、update_data_source、delete_data_source、list_data_source_templates |
| ビュー | list_views、get_view、query_view、create_view、update_view、delete_view |
| コメント | list_comments、add_page_comment、add_discussion_comment、get_comment、update_comment、delete_comment |
| ユーザー | list_users、get_user、get_bot_user(エイリアス:get_self) |
| ファイル | upload_file、list_file_uploads、get_file_upload、get_file_url、get_image |
よくある質問
Notion の Free プランでも動作しますか? はい。どのプランでも、ワークスペースのオーナーがパーソナルアクセストークンを作成でき、サーバーに必要なのはそれだけです。
OAuth を使わない Notion MCP サーバーはありますか? これがそうです。トークンで認証するため、誰も「認証」をクリックする必要はありません。Notion のホスト型 MCP で OAuth が不要になるのは、ワークスペースのオーナーが MCP トークンを作成する Business プランと Enterprise プランのみです。
どのクライアントで使えますか? あらゆる MCP クライアントで使えます。Claude Code、Claude Desktop、Cursor、VS Code(Copilot エージェントモード)、Codex、Gemini CLI、Cline、Windsurf、Zed、Continue、および任意の MCP ホストを介したローカルモデルに対応しています。詳しくはよくある質問をご覧ください。
トラブルシューティング
- 毎回の呼び出しで「Notion auth failed」と表示される: トークンが未設定、取り消し済み、または期限切れです。クライアント設定の
NOTION_TOKENを確認し、app.notion.com/developers/tokens でトークンが有効なままか確認してください。--envを指定せずにadd-mcpでインストールしましたか? フラグを付けて再実行してください。 object_not_found/「Could not find …」: 内部インテグレーションから見えるのは、接続済みのページのみです。そのページを接続するか、PAT に切り替えてください。- 「No parent page configured」: 呼び出しで
parentを渡すか、NOTION_PAGE_IDを設定してください。 multi_source_database: データベースに複数のデータソースがあります。list_data_sourcesを呼び出し、database_idの代わりにdata_source_idを渡してください。- 成功した結果に
warningsが含まれる: 呼び出しは実行されています。各項目には、無視されたフィールドまたは修正されたプロパティ名が記載されています。 - Claude Desktop にツールが表示されない: トークンの入力ミス(引用符の内側に記述する必要があります)、または再起動前にアプリを完全に終了していません(
Cmd+Q)。 - 起動ログに「Notion auth check failed」と表示されるが、ツールは動作する: 起動時のチェックはベストエフォートです。呼び出しが成功する場合は無視してください。
- Docker がすぐ終了する、または「NOTION_TOKEN is not set」と表示される:
-iを追加し、-e NOTION_TOKENまたは-e NOTION_TOKEN=ntn_xxxの形式で指定してください。-e NOTION_TOKEN ntn_xxxの形式では指定しないでください。
解決しない場合は、よくある質問を確認するか、GitHub のイシューを作成してください。
プライバシー
サーバーはお使いのマシンまたはご自身のホスト上で実行され、設定したトークンを使って HTTPS 経由で api.notion.com とのみ通信します(HTTPS_PROXY が設定されている場合はプロキシ経由で通信します)。テレメトリや分析機能はなく、通信経路に当社のサーバーが介在することもありません。トークンは MCP クライアントが保存する場所にとどまります。get_image は、Notion がホストするファイルに対して Notion が返す署名付き URL のみを取得します。upload_file は、要求された場合にのみローカルファイルを読み込むか URL から取得し、プライベートアドレスまたはループバックアドレスに解決される URL は拒否します。お客様のデータに関する Notion 独自の取り扱いについては、Notion のプライバシーポリシーをご覧ください。
開発
git clone https://github.com/awkoy/notion-mcp-server.git && cd notion-mcp-server
npm install && npm run build && npm test
アーキテクチャ、クライアントでのローカルビルドの実行方法、実際のワークスペースを使ったエンドツーエンドテストについては、docs/development.mdをご覧ください。PR を歓迎します。PR を作成する前に npm test を実行してください。
License
MIT — see LICENSE.
mcp-name: io.github.awkoy/notion-mcp-server
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。