Connects to Notion's internal web API using browser credentials (token_v2, user ID, space ID) instead of the official integration flow. Exposes full-text search across your workspace, bidirectional markdown conversion (export pages to markdown with clean formatting, import or append markdown back into pages), page creation, image uploads, and comment management. Skips the OAuth dance and admin approval process by using the same endpoints the web app calls. Trade-off is token expiry and reliance on an undocumented API. Useful when you want programmatic Notion access without workspace admin permissions or need markdown-based workflows that the official blocks API doesn't support. Includes a one-command setup that extracts credentials from a cURL command copied from DevTools.
Public tool metadata for what this MCP can expose to an agent.
notion-searchPerform a search over: - "internal": Semantic search over Notion workspace and connected sources (Slack, Google Drive, Github, Jira, Microsoft Teams, Sharepoint, OneDrive, Linear). Supports filtering by creation date and creator. - "user": Search for users by name or email. Au...9 paramsPerform a search over: - "internal": Semantic search over Notion workspace and connected sources (Slack, Google Drive, Github, Jira, Microsoft Teams, Sharepoint, OneDrive, Linear). Supports filtering by creation date and creator. - "user": Search for users by name or email. Au...
querystringfiltersobjectpage_urlstringpage_sizeintegerquery_typestringinternal · userteamspace_idstringdata_source_urlstringcontent_search_modestringworkspace_search · ai_searchmax_highlight_lengthintegernotion-fetchRetrieves details about a Notion entity (page, database, or data source) by URL or ID. Provide URL or ID in `id` parameter. Make multiple calls to fetch multiple entities. Pages use enhanced Markdown format. For the complete specification, fetch the MCP resource at `notion://d...3 paramsRetrieves details about a Notion entity (page, database, or data source) by URL or ID. Provide URL or ID in `id` parameter. Make multiple calls to fetch multiple entities. Pages use enhanced Markdown format. For the complete specification, fetch the MCP resource at `notion://d...
idstringinclude_transcriptbooleaninclude_discussionsbooleannotion-create-pages## Overview Creates one or more Notion pages, with the specified properties and content. ## Parent All pages created with a single call to this tool will have the same parent. The parent can be a Notion page ("page_id") or data source ("data_source_id"). If the parent is omitt...2 params## Overview Creates one or more Notion pages, with the specified properties and content. ## Parent All pages created with a single call to this tool will have the same parent. The parent can be a Notion page ("page_id") or data source ("data_source_id"). If the parent is omitt...
pagesarrayparentvaluenotion-update-page## Overview Update a Notion page's properties or content. ## Properties Notion page properties are a JSON map of property names to SQLite values. For pages in a database: - ALWAYS use the "fetch" tool first to get the data source schema and the exact property names. - Provide...11 params## Overview Update a Notion page's properties or content. ## Properties Notion page properties are a JSON map of property names to SQLite values. For pages in a database: - ALWAYS use the "fetch" tool first to get the data source schema and the exact property names. - Provide...
iconstringcoverstringcommandstringupdate_properties · update_content · replace_content · apply_template · update_verificationnew_strstringpage_idstringpropertiesobjecttemplate_idstringcontent_updatesarrayverification_statusstringverified · unverifiedallow_deleting_contentbooleanverification_expiry_daysintegernotion-move-pagesMove one or more Notion pages or databases to a new parent.2 paramsMove one or more Notion pages or databases to a new parent.
new_parentvaluepage_or_database_idsarraynotion-duplicate-pageDuplicate a Notion page. The page must be within the current workspace, and you must have permission to access it. The duplication completes asynchronously, so do not rely on the new page identified by the returned ID or URL to be populated immediately. Let the user know that...1 paramsDuplicate a Notion page. The page must be within the current workspace, and you must have permission to access it. The duplication completes asynchronously, so do not rely on the new page identified by the returned ID or URL to be populated immediately. Let the user know that...
page_idstringnotion-create-databaseCreates a new Notion database using SQL DDL syntax. If no title property provided, "Name" is auto-added. Returns Markdown with schema, SQLite definition, and data source ID in <data-source> tag for use with update_data_source and query_data_sources tools. The schema param acce...4 paramsCreates a new Notion database using SQL DDL syntax. If no title property provided, "Name" is auto-added. Returns Markdown with schema, SQLite definition, and data source ID in <data-source> tag for use with update_data_source and query_data_sources tools. The schema param acce...
titlestringparentobjectschemastringdescriptionstringnotion-update-data-sourceUpdate a Notion data source's schema, title, or attributes using SQL DDL statements. Returns Markdown showing updated structure and schema. Accepts a data source ID (collection ID from fetch response's <data-source> tag) or a single-source database ID. Multi-source databases r...6 paramsUpdate a Notion data source's schema, title, or attributes using SQL DDL statements. Returns Markdown showing updated structure and schema. Accepts a data source ID (collection ID from fetch response's <data-source> tag) or a single-source database ID. Multi-source databases r...
titlestringin_trashbooleanis_inlinebooleanstatementsstringdescriptionstringdata_source_idstringnotion-create-commentAdd a comment to a page or specific content. Creates a new comment. Provide `page_id` to identify the page, then choose ONE targeting mode: - `page_id` alone: Page-level comment on the entire page - `page_id` + `selection_with_ellipsis`: Comment on specific block content - `di...4 paramsAdd a comment to a page or specific content. Creates a new comment. Provide `page_id` to identify the page, then choose ONE targeting mode: - `page_id` alone: Page-level comment on the entire page - `page_id` + `selection_with_ellipsis`: Comment on specific block content - `di...
page_idstringrich_textarraydiscussion_idstringselection_with_ellipsisstringnotion-get-commentsGet comments and discussions from a Notion page. Returns discussions with full comment content in XML format. By default, returns page-level discussions only. Tip: Use the `fetch` tool with `include_discussions: true` first to see where discussions are anchored in the page con...4 paramsGet comments and discussions from a Notion page. Returns discussions with full comment content in XML format. By default, returns page-level discussions only. Tip: Use the `fetch` tool with `include_discussions: true` first to see where discussions are anchored in the page con...
page_idstringdiscussion_idstringinclude_resolvedbooleaninclude_all_blocksbooleannotion-get-teamsRetrieves a list of teams (teamspaces) in the current workspace. Shows which teams exist, user membership status, IDs, names, and roles. Teams are returned split by membership status and limited to a maximum of 10 results. <examples> 1. List all teams (up to the limit of each...1 paramsRetrieves a list of teams (teamspaces) in the current workspace. Shows which teams exist, user membership status, IDs, names, and roles. Teams are returned split by membership status and limited to a maximum of 10 results. <examples> 1. List all teams (up to the limit of each...
querystringnotion-get-usersRetrieves a list of users in the current workspace. Shows workspace members and guests with their IDs, names, emails (if available), and types (person or bot). Supports cursor-based pagination to iterate through all users in the workspace. <examples> 1. List all users (first p...4 paramsRetrieves a list of users in the current workspace. Shows workspace members and guests with their IDs, names, emails (if available), and types (person or bot). Supports cursor-based pagination to iterate through all users in the workspace. <examples> 1. List all users (first p...
querystringuser_idstringpage_sizeintegerstart_cursorstringnotion-create-viewCreate a new view on a Notion database. Exactly one of "database_id" or "parent_page_id" must be provided: - "database_id": add a new view tab to an existing database. - "parent_page_id": create an inline linked database view on a page that references the existing "data_source...6 paramsCreate a new view on a Notion database. Exactly one of "database_id" or "parent_page_id" must be provided: - "database_id": add a new view tab to an existing database. - "parent_page_id": create an inline linked database view on a page that references the existing "data_source...
namestringtypestringtable · board · list · calendar · timeline · galleryconfigurestringdatabase_idstringdata_source_idstringparent_page_idstringnotion-update-viewUpdate a view's name, filters, sorts, or display configuration. Use "fetch" to get view IDs from database responses. Only include fields you want to change. The "configure" param uses the same DSL as create_view. Use CLEAR to remove settings: - CLEAR FILTER — remove all filter...3 paramsUpdate a view's name, filters, sorts, or display configuration. Use "fetch" to get view IDs from database responses. Only include fields you want to change. The "configure" param uses the same DSL as create_view. Use CLEAR to remove settings: - CLEAR FILTER — remove all filter...
namestringview_idstringconfigurestringNotion 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.
npx @shck-dev/notion-mcp init: paste a browser "Copy as cURL" and it extracts + saves your credentialsnotion_setup prompt and a notion://guide resource for in-client onboarding| 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 |
| 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).
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.
www.notion.sotoken_v2 cookie value → NOTION_TOKENapi/v3/*, click itx-notion-active-user-header → NOTION_USER_IDspaceId → NOTION_SPACE_IDclaude 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
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"
}
}
}
}
npx) — or Bun. The published server is compiled to node-compatible JS, so Bun is no longer required to run it.token_v2 expires periodically; re-grab from browser when auth failsnotion_add_image (or embedded in markdown) are referenced as-is and not re-uploaded to NotionMIT
NOTION_TOKEN*secretNotion token_v2 cookie value from browser DevTools
NOTION_USER_ID*Notion user ID from x-notion-active-user-header
NOTION_SPACE_ID*Notion workspace ID from API request body
csoai-org/pdf-document-mcp
xt765/mcp-document-converter
io.github.xjtlumedia/markdown-formatter
io.github.ai-aviate/better-notion
suekou/mcp-notion-server
meterlong/mcp-doc