About notion-mcp
notion-mcp is an MCP server for searching Notion workspaces and transferring page content as Markdown. It supports page creation, comments, and image handling, using browser-derived credentials rather than OAuth or workspace admin approval.
Key features
- 01Full-text workspace search
- 02Export pages as Markdown
- 03Import or append Markdown
- 04Create child pages
- 05Upload or reference images
- 06List and reply to comments
Use cases
- 01Find pages across a Notion workspace
- 02Export page content for Markdown workflows
- 03Write or append a local Markdown file to a page
- 04Create pages and participate in discussions
MCP support
Exposes Notion search, page import and export, page creation, image, and comment tools, along with a setup prompt and guide resource for MCP clients.
Configuration
Local server config is the same for every client. Copy it into your client’s MCP config file.
npx -y @shck-dev/notion-mcpNOTION_TOKENSecretNotion token_v2 cookie value from browser DevToolsNOTION_USER_IDNotion user ID from x-notion-active-user-headerNOTION_SPACE_IDNotion workspace ID from API request bodyLocal servers need a runtime on your machine (e.g. Node.js 18+). Config file locations differ by client; see your client’s docs.
Tools
13Saved tool list · updated 2w ago
| Parameter | Type | Required | Description |
|---|---|---|---|
| limit | number | No | Maximum number of results to return (default: 10) |
| query | string | Yes | Search query (matches page titles and content) |
Details
From the project README@shck-dev/notion-mcp
Notion MCP Server — search, export, and import pages as markdown
No workspace admin. No OAuth. No page sharing.
Just paste 3 values from your browser and go.
Features
- Search — full-text search across your entire workspace
- Export — download any page as clean markdown (headings, lists, to-do, code blocks, tables, links, images with viewable URLs)
- Import — write markdown back to Notion pages (replaces content), from a string or local file
- Append — add markdown to the end of a page without touching existing content
- Create — spin up new child pages, optionally prefilled from a markdown string or file
- Images — upload a local image to a page, or reference an external URL
- Comments — list open discussions, add new comments, reply to threads
- One-command setup —
npx @shck-dev/notion-mcp init: paste a browser "Copy as cURL" and it extracts + saves your credentials - Prompts & resources — a
notion_setupprompt and anotion://guideresource for in-client onboarding - Zero setup friction — uses the same internal API as the Notion web app; if you can see it in your browser, this server can access it
Tools
| Tool | Description |
|---|---|
notion_search | Full-text search across all pages in your workspace |
notion_export_page | Export any Notion page as markdown; image links resolve to viewable CDN URLs (pass image_dir to download images locally instead) |
notion_import_page | Write markdown to a Notion page — replaces all existing content |
notion_import_page_from_file | Write a local .md file to a page — replaces all content |
notion_append_to_page | Append markdown to the end of a page (non-destructive) |
notion_append_to_page_from_file | Append a local .md file to the end of a page (non-destructive) |
notion_create_page | Create a new sub-page, optionally prefilled with markdown |
notion_create_page_from_file | Create a new sub-page from a local .md file |
notion_add_image | Append an image to the end of a page — local file is uploaded to Notion, http(s) URL is referenced as-is |
notion_list_comments | List open discussion threads on a page |
notion_add_comment | Start a new discussion — inline (anchored to text) or block-level |
notion_reply_comment | Reply to an existing discussion thread |
notion_init | Paste a browser "Copy as cURL" to extract & save credentials |
Why not the official Notion API?
| This MCP server | Official Notion API | |
|---|---|---|
| Setup | Paste 3 values from DevTools | Create integration, get admin approval, share pages |
| Page access | Everything you can see | Only explicitly shared pages |
| Markdown | Bidirectional (export + import) | Read-only blocks API |
| Auth | Cookie (token_v2) | OAuth / integration token |
Trade-off: The internal API is undocumented and may change. Token expires periodically (re-grab from browser).
Quick start
Easiest: interactive setup
npx @shck-dev/notion-mcp init
Open Notion in Chrome → DevTools (F12) → Network → click any request to notion.so/api/v3/… → right-click → Copy as cURL, then paste it and press Ctrl-D. Your token, user id, and workspace id are extracted and saved to ~/.notion-mcp/config.json. Then register the server — no env block needed:
claude mcp add notion -- npx @shck-dev/notion-mcp
Prefer to set the three values by hand? Steps below.
1. Get credentials from your browser
- Open notion.so in Chrome
- Press F12 → Application → Cookies →
www.notion.so - Copy the
token_v2cookie value →NOTION_TOKEN - Press F12 → Network tab, do any action in Notion
- Find a POST request to
api/v3/*, click it - From Request Headers: copy
x-notion-active-user-header→NOTION_USER_ID - From Request Body (Payload): find
spaceId→NOTION_SPACE_ID
2. Configure your MCP client
Claude Code
claude mcp add notion -- env NOTION_TOKEN=your_token NOTION_USER_ID=your_user_id NOTION_SPACE_ID=your_space_id npx @shck-dev/notion-mcp
Claude Desktop / Cursor / any MCP client
Add to your MCP config (claude_desktop_config.json, .cursor/mcp.json, etc.):
{
"mcpServers": {
"notion": {
"command": "npx",
"args": ["@shck-dev/notion-mcp"],
"env": {
"NOTION_TOKEN": "your_token_v2_value",
"NOTION_USER_ID": "your_user_id",
"NOTION_SPACE_ID": "your_space_id"
}
}
}
}
Requirements
- Node.js ≥ 18 (for
npx) — or Bun. The published server is compiled to node-compatible JS, so Bun is no longer required to run it.
Limitations
- Internal API — undocumented, may break with Notion updates
- Token expiry —
token_v2expires periodically; re-grab from browser when auth fails - Databases — database/collection pages don't export rows yet; sub-pages render as links and such pages return an explanatory note instead of empty output
- Block granularity — import replaces all content, append adds to the end (no in-place editing of individual blocks)
- Lossy markdown — some complex formatting may simplify during conversion (e.g. nested lists flatten on import)
- External images — http(s) image URLs added via
notion_add_image(or embedded in markdown) are referenced as-is and not re-uploaded to Notion
License
MIT
Comments
New to MCP?
From what the protocol is to installing your first server, these answers cover most first questions.
An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.