← Back to directory
N

Notion MCP Server

Community
A token-auth, headless Notion MCP server for Claude, Cursor, and any MCP client
GitHub source repository ↗
★ 165 Stars Category · Collaboration Popular
61FMRS · C

A well-documented, agent-first community Notion MCP server. Its two-tool surface with on-demand schemas, batching, idempotency, retries, access controls, and HTTP transport make it a strong fit for unattended and token-sensitive deployments. Caveats: it is not official Notion software, so trust requires auditing or self-hosting, and the HTTP mode must be secured with an auth token.

Reliability
9/20
Security and permissions
11/20
Maintenance
11/20
Documentation
17/20
Setup experience
13/20
Read the FMRS scoring method →

A third-party (awkoy) Notion Model Context Protocol server — not maintained by Notion. It authenticates with a token (Personal Access Token or Internal Integration secret), so it runs headless in CI, cron jobs, background agents, and self-hosted deployments where OAuth-only hosted MCP cannot. The server exposes exactly two MCP tools (notion_execute and notion_describe) that dispatch 43 operations across pages, blocks, databases, data sources, views, comments, users, and files, with operation schemas loaded on demand to keep the connection footprint small. It adds batched mutations with atomic rollback, idempotency keys, automatic rate-limit retry, full markdown round-trip, Notion templates, file uploads, flattened query rows, and access control via NOTION_READ_ONLY and operation allow/block lists. Beyond stdio it supports a Streamable HTTP transport (single-tenant, protectable with MCP_AUTH_TOKEN).

Tools

notion_execute
Runs any of 43 operations, singly or in batch mode; validation failures return schema, example, and a fix hint so the model self-corrects in one round-trip.
notion_describe
Returns the JSON Schema and working example for one operation, useful before complex calls.

Setup

  1. Create a Personal Access Token (ntn_…, recommended) at app.notion.com/developers/tokens, or an Internal Integration secret; 2. Claude Code: claude mcp add notion -s user -e NOTION_TOKEN=ntn_… -- npx -y notion-mcp-server; for Claude Desktop / Cursor add {"command":"npx","args":["-y","notion-mcp-server"],"env":{"NOTION_TOKEN":"…"}} to mcpServers config; 3. Claude Desktop alternatively supports a one-click .mcpb extension download; 4. Docker: docker run --rm -i -e NOTION_TOKEN ghcr.io/awkoy/notion-mcp-server:latest (-i required for stdio); 5. Remote mode: start with MCP_TRANSPORT=http and always set MCP_AUTH_TOKEN when binding a non-loopback host.
claude_desktop_config.json
{"mcpServers":{"notion":{"command":"npx","args":["-y","notion-mcp-server"],"env":{"NOTION_TOKEN":"ntn_paste_your_token_here"}}}}

Fit and risk

Best for

  • Automation and CI scenarios that need headless token auth (Notion's hosted MCP is OAuth-only)
  • Agents where context/token cost matters (only 422 tokens of tool schema at connection)
  • Workflows needing batch mutations, idempotency, retries, and rate limiting
  • Self-hosted deployments and developers exposing their own HTTP endpoint
  • Users of any MCP-speaking client (Claude, Cursor, VS Code, Cline, Zed, Continue, etc.)

Not for

  • Users who want a one-click Notion connection inside claude.ai or ChatGPT web UIs (use Notion's hosted MCP; ChatGPT's built-in connectors require OAuth-hosted servers)
  • Teams that prefer the official open-source server's one-tool-per-endpoint surface
  • Organizations unwilling to grant a third-party open-source service their Notion token (unless they audit or self-host)

Required permissions

  • Requires NOTION_TOKEN: a Notion Personal Access Token (ntn_…, recommended — scope equals your account, expires in ~1 year) or an Internal Integration secret (only pages explicitly Connected)
  • Optional NOTION_PAGE_ID as default parent for create_page / create_database
  • Optional NOTION_UPLOAD_ROOT to confine which local directory upload_file's path source can read
  • Optional read-only deployment via NOTION_READ_ONLY=true or NOTION_ALLOWED_OPERATIONS=read; fine-grained control via NOTION_ALLOWED_OPERATIONS / NOTION_BLOCKED_OPERATIONS with group presets

Risks and side effects

  • The token acts as you: a PAT sees everything you can see, so a leak equals workspace exposure — issue per-member tokens and revoke immediately if a device is lost
  • When binding a non-loopback HTTP host, anyone reaching /mcp acts as your NOTION_TOKEN; failing to set MCP_AUTH_TOKEN is a serious exposure
  • Without NOTION_UPLOAD_ROOT, an upload_file path source can read any file the server process can access
  • Many write ops can modify or remove content: blocking the destructive group does not disable parameter-based removals like update_database's in_trash — use READ_ONLY or allow=read for guaranteed no-mutation
  • HTTP mode is single-tenant with one shared token — unsuitable for multi-user sharing

Troubleshooting

  1. object_not_found: an Internal Integration token was never Connected to the page — switch to a PAT or Connect the page
  2. Notion auth failed on every call: token missing, revoked, or expired (PATs expire after 1 year) — verify NOTION_TOKEN in client config
  3. No parent page configured: pass parent in the call or set NOTION_PAGE_ID
  4. multi_source_database from query_database: call list_data_sources and pass data_source_id instead
  5. Tools missing in Claude Desktop: token typo inside quotes, or the app wasn't fully quit (Cmd+Q) before reopening
  6. Docker exits immediately: add the -i flag for stdio; if NOTION_TOKEN isn't set, use -e NOTION_TOKEN (forwarding) or -e NOTION_TOKEN=ntn_xxx

Use cases

Natural-language page creation, database querying, and block appends in Claude Desktop / Cursor
Batch-renaming 50 pages in one call (10-way parallel, idempotent retry)
Creating pages from Notion templates and filling in content
Full markdown round-trip editing (get_page_markdown → edit → update_page_markdown)
Headless Notion read/write in CI, cron jobs, or background agents
Querying a database via a view's stored filters with flattened rows
Uploading single- or multi-part files to pages

Supported clients

Claude CodeFull support
Claude DesktopFull support
CursorFull support
VS Code (Copilot agent mode)Full support
ClineFull support
ZedFull support
ContinueFull support
ChatGPTPartial support