Your Notion workspace, fully accessible through AI.
A Model Context Protocol (MCP) server that exposes Notion's API for managing pages, databases, blocks, and users across your workspace.
The Notion MCP Server provides a complete interface to your Notion workspace:
Perfect for:
Searches all pages and databases by title, or lists all workspace content when no query is provided.
Inputs:
- `query` (string, optional) — Search query string; leave empty to list all pages (default: "")
- `filter_type` (string, optional) — Filter results by type: page or data_source
- `page_size` (int, optional) — Number of results to return (max: 100
output:
{
"results": [{ "id": "page-id", "object": "page", "properties": {...} }, ...],
"next_cursor": "cursor-string",
"has_more": true
}Retrieves a Notion page with its properties and metadata.
Inputs:
- `page_id` (string, required) — The Notion page IDoutput:
{
"id": "page-id",
"object": "page",
"properties": { "title": { "title": [{ "plain_text": "Page Title" }] } },
"parent": { "type": "workspace" },
...
}Retrieves a Notion page along with all its child blocks. Supports recursive fetching up to a configurable depth.
Inputs:
- `page_id` (string, required) — The Notion page ID
- `include_children` (bool, optional) — Fetch child blocks (default: true)
- `recursive` (bool, optional) — Recursively fetch nested blocks (default: false)
- `max_depth` (int, optional) — Maximum nesting depth for recursive fetch (default: 3)
- `page_size` (int, optional) — Number of blocks per page (default: 100)
- `start_cursor` (string, optional) — Pagination cursor for blocksoutput:
{
"id": "page-id",
"properties": {...},
"children": [
{ "type": "paragraph", "paragraph": { "rich_text": [{ "plain_text": "Hello" }] } }
]
}Creates a new child page under an existing parent page.
Inputs:
- `parent_page_id` (string, required) — ID of the parent page
- `title` (string, optional) — Title of the new page (default: "Untitled New page Created")
- `position` (object, optional) — Insert position: {"type": "page_end"} or {"type": "page_start"}output:
{
"id": "new-page-id",
"object": "page",
"url": "https://www.notion.so/new-page-id",
...
}Creates a new page at the workspace level, not under any parent page.
Inputs:
- `title` (string, optional) — Title of the new page (default: "Untitled New page Created")output:
{
"id": "new-page-id",
"object": "page",
"url": "https://www.notion.so/new-page-id",
...
}Updates properties, icon, cover, archive status, or lock state of an existing page.
Inputs:
- `page_id` (string, required) — The Notion page ID
- `properties` (object, optional) — Page properties to update (schema depends on page type)
- `icon` (object, optional) — Page icon (emoji or external URL)
- `cover` (object, optional) — Page cover image (external URL)
- `archived` (bool, optional) — Archive or unarchive the page
- `in_trash` (bool, optional) — Move to trash or restore from trash
- `is_locked` (bool, optional) — Lock or unlock the page
- `template` (object, optional) — Template settings
- `erase_content` (bool, optional) — Erase all page contentoutput:
{
"id": "page-id",
"archived": false,
"properties": {...},
...
}Adds a text block (paragraph, heading, list item, etc.) to an existing page or block.
Inputs:
- `block_id` (string, required) — Page ID or parent block ID to append to
- `type` (string, required) — Block type: paragraph, heading_1, heading_2, heading_3, bulleted_list_item, numbered_list_item, to_do, toggle, quote, or callout
- `content` (string, required) — Text content for the block
- `checked` (bool, optional) — For to_do blocks only — whether the item is checked
- `color` (string, optional) — Text or background color (e.g., red, blue_background)
- `position` (string, optional) — Insertion position: start or endoutput:
{
"results": [{ "type": "paragraph", "id": "block-id", ... }]
}Retrieves a Notion database object with its title, parent, and data sources.
Inputs:
- `database_id` (string, required) — The Notion database IDoutput:
{
"id": "database-id",
"title": [{ "plain_text": "My Database" }],
"properties": {...},
...
}Retrieves the schema and properties of a database (data source) by ID.
Inputs:
- `data_source_id` (string, required) — The data source (database) IDoutput:
{
"id": "database-id",
"properties": {
"Name": { "type": "title" },
"Status": { "type": "select", "select": { "options": [...] } }
}
}Queries a database to retrieve pages matching optional filters and sort criteria.
Inputs:
- `data_source_id` (string, required) — The data source (database) ID to query
- `filter` (object, optional) — Notion filter object to narrow results
- `sorts` (list, optional) — List of sort objects to order results
- `page_size` (int, optional) — Number of results per page (max: 100, default: 100)
- `start_cursor` (string, optional) — Pagination cursor from a previous responseoutput:
{
"results": [{ "id": "page-id", "properties": {...} }, ...],
"next_cursor": "cursor-string",
"has_more": false
}Creates a new database as a child of an existing page, with optional properties, icon, and cover.
Inputs:
- `parent_id` (string, required) — ID of the parent page to create the database under
- `title` (string, optional) — Database title (default: "Untitled Database")
- `description` (string, optional) — Database description
- `properties` (object, optional) — Database property schema definition
- `is_inline` (bool, optional) — Create as inline database (default: false)
- `icon` (object, optional) — Database icon (emoji or external URL)
- `cover` (object, optional) — Database cover imageoutput:
{
"id": "database-id",
"title": [{ "plain_text": "My Database" }],
"url": "https://www.notion.so/database-id",
...
}Lists all users in the workspace. Guest users are excluded.
Inputs:
- `page_size` (int, optional) — Number of users per page (max: 100, default: 100)
- `start_cursor` (string, optional) — Pagination cursor from a previous responseoutput:
{
"results": [{ "id": "user-id", "name": "Jane Doe", "type": "person", ... }],
"has_more": false
}Returns information about a specific workspace user by their ID.
Inputs:
- `user_id` (string, required) — The Notion user IDoutput:
{
"id": "user-id",
"name": "Jane Doe",
"type": "person",
"person": { "email": "jane@example.com" }
}Returns information about the bot associated with the current API token, including owner and workspace details.
Inputs:
noneoutput:
{
"id": "bot-user-id",
"name": "My Integration",
"type": "bot",
"bot": { "owner": { "type": "workspace" }, "workspace_name": "My Workspace" }
}List and query tools support cursor-based pagination:
page_size — Number of results per request (max: 100)start_cursor — Cursor value from a previous response's next_cursor field; omit for the first pageAvailable type values:
paragraph — Standard text blockheading_1, heading_2, heading_3 — Headings of different sizesbulleted_list_item — Bullet pointnumbered_list_item — Numbered list itemto_do — Checkbox item (use checked param)toggle — Collapsible toggle blockquote — Block quotecallout — Highlighted callout boxText colors: default, gray, brown, orange, yellow, green, blue, purple, pink, red
Background colors: append _background (e.g., red_background, blue_background)
Notion IDs are UUIDs and can be found in the page URL:
https://www.notion.so/workspace/my-page-<page-id>
Example page_id: 8f9b3c2d-1a2b-3c4d-5e6f-7a8b9c0d1e2fdashes are optional — both formats work with the API.
Authorization: Bearer YOUR_TOKEN and X-Mewcp-Credential-Id: CREDENTIAL-ID headers are presentX-Mewcp-Credential-Id header{server-name}/mcp/{tool-name}