mcp-notion
MCP Notion Server
Status: beta
MCP server + human CLI for common Notion page workflows: search pages, inspect content, create structured pages, append rich blocks, and start documents from reusable templates.
Requirements
Node.js 18+
A Notion token with access to the target pages
A Notion page shared with the integration when you want to create or update content
Install
From npm after publishing:
npm install -g @mcp/notionFrom source:
git clone https://github.com/ftaricano/mcp-notion.git
cd mcp-notion
npm install
npm run buildConfigure Notion Auth
Create a local environment file:
cp .env.example .envSet NOTION_TOKEN in .env or in your MCP client environment. Do not commit .env.
Internal Integration Token
Create an internal integration.
Copy the integration secret into
NOTION_TOKEN.Share the target Notion pages with that integration.
OAuth Token
Notion OAuth apps can also provide an access token. This package does not run the OAuth browser authorization flow; pass the OAuth access token as NOTION_TOKEN after your OAuth app obtains it.
Use the smallest workspace/page access needed. If a token leaks, revoke or rotate it in Notion and remove it from local env files, shell profiles, CI secrets, and MCP client configs.
Quickstart
Check local config without calling Notion:
notion --env-file .env auth statusTest the token against Notion:
notion --env-file .env --timeout 10s auth testList available MCP tools:
notion listSearch pages:
notion --env-file .env search_pages --query "Release notes" --page_size=5Create a page under a parent page:
notion --env-file .env create_page \
--parent_page_id=11111111-1111-1111-1111-111111111111 \
--title="Weekly Notes" \
--content="Draft agenda"Create a formatted page from JSON:
notion --env-file .env create_rich_page --json '{
"parent_page_id": "11111111-1111-1111-1111-111111111111",
"title": "Project Overview",
"blocks": [
{ "type": "heading_1", "content": "Overview" },
{ "type": "paragraph", "content": "Current scope and next steps." },
{ "type": "to_do", "content": "Confirm milestones", "checked": false }
]
}'MCP Client Setup
Use the built server entrypoint with any stdio MCP client:
{
"mcpServers": {
"notion": {
"command": "node",
"args": ["/absolute/path/to/mcp-notion/dist/index.js"],
"env": {
"NOTION_TOKEN": "your-token-from-a-secret-store",
"VALIDATE_TOKEN": "true",
"MAX_REQUESTS_PER_MINUTE": "60"
}
}
}
}For local source checkouts, build before connecting:
npm run build
node dist/index.jsFor installed npm packages, point your client at the mcp-notion binary when your runtime can resolve global npm bins.
CLI Reference
notion list
notion schema <tool>
notion auth status
notion auth test
notion <tool> --key=value [--other=value]
notion <tool> --json '{"key":"value"}'Global options:
--env-file <path>loads environment variables before running.--timeout <value>accepts values such as5000or10s.--compactprints JSON output on one line where supported.
Available MCP Tools
Core page operations:
search_pagesget_pageget_page_contentcreate_pageupdate_page
Rich content and templates:
create_rich_pagecreate_page_from_templateadd_content_blocks(appendonly)list_templatescreate_root_page
create_root_page requires NOTION_ROOT_PARENT_PAGE_ID or MCP_NOTION_ROOT_PARENT_PAGE_ID.
Runtime Guardrails
Environment variables:
NOTION_TOKEN- required for live Notion calls.VALIDATE_TOKEN=false- skips startup token validation for offline/local smoke tests.MAX_REQUESTS_PER_MINUTE=60- controls in-process request throttling.ENABLE_AUDIT_LOG=false- disables local operation audit logging.ALLOWED_PAGE_IDS=id1,id2- restricts operations to an allowlist.BLOCKED_PAGE_IDS=id3,id4- denies specific pages.NOTION_ROOT_PARENT_PAGE_ID=<page-id>- enablescreate_root_page.MCP_NOTION_ROOT_PARENT_PAGE_ID=<page-id>- compatibility alias for the same root parent.
Notion page IDs may use UUIDs with or without hyphens.
Templates
meeting_notesproject_plandocumentationarticleweekly_reportbug_report
Development
npm install
npm run build
npm run lint
npm run type-check
npm test
npm run pack:dry-runnpm run test:unit runs fast unit coverage. npm run test:integration verifies package metadata, security docs, and the npm pack file list.
Security
See SECURITY.md. The short version:
keep real tokens out of git,
use Notion workspace/page permissions to limit access,
use
ALLOWED_PAGE_IDSandBLOCKED_PAGE_IDSfor runtime blast-radius control,report vulnerabilities through GitHub Security Advisories.
MCP Hub Usage
If you use this server behind MCP Hub, see CLAUDE.md for hub-specific calling patterns and Portuguese examples.