Easy Notion MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| PORT | No | HTTP server port for OAuth/HTTP transport. | 3333 |
| NOTION_TOKEN | No | Notion API integration token used for Stdio mode. | |
| OAUTH_REDIRECT_URI | No | OAuth callback URL. | http://localhost:{PORT}/callback |
| NOTION_ROOT_PAGE_ID | No | Default parent page ID. | |
| NOTION_TRUST_CONTENT | No | Skip content notice on read_page responses. | false |
| NOTION_OAUTH_CLIENT_ID | No | Notion public integration OAuth client ID. | |
| NOTION_OAUTH_CLIENT_SECRET | No | Notion public integration OAuth client secret. |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {} |
| resources | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| create_pageA | Create a Notion page from markdown. Supports GFM plus Notion extensions for callouts, toggles, columns, bookmarks, embeds, equations, table of contents, and stdio-only file:// uploads. For the full syntax guide, read resource easy-notion://docs/markdown. |
| create_page_from_fileA | Create a Notion page from a local markdown file. The server reads and validates the file, then creates the same result as create_page without sending file contents through the agent context. STDIO MODE ONLY. This tool is not available when the server runs over HTTP, because in HTTP mode the server's filesystem belongs to the server host, not the caller. Restrictions:
For supported markdown syntax, read resource easy-notion://docs/markdown. |
| append_contentA | Append markdown content to an existing page. Supports the same syntax as create_page; read resource easy-notion://docs/markdown for the full syntax guide. |
| replace_contentA | Replaces all page content with the provided markdown atomically (one Notion API call). On matched blocks Notion preserves the original block IDs, so deep-link anchors ( NOT preserved across replace_content: Bookmarks and embeds round-trip as bare URLs (Notion auto-links) and surface a |
| update_sectionA | DESTRUCTIVE — no rollback: this tool deletes blocks in the section, then writes new blocks. If the write fails mid-call, the section is left partially or fully emptied; for most sections the heading anchor is deleted, so a retry can fail with "heading not found." For irreplaceable sections, duplicate_page the target first so you have a restore point. Update a section of a page by heading name. Finds the heading, replaces everything from that heading to the next section boundary. For H1 headings, the section extends to the next heading of any level. For H2/H3 headings, it extends to the next heading of the same or higher level. Include the heading itself in the markdown. If the section starts at the first block, the replacement markdown must start with the same heading type so following sections stay in place. With preserve_heading:true, the existing heading block ID, text, type, comments, and toggleable state are preserved, but the section body blocks and existing toggleable-heading children are still destructively replaced; replacement markdown is treated as body-only, and a leading matching heading is stripped for compatibility. More efficient than replace_content for editing one section of a large page. |
| find_replaceA | Find and replace text on a page. Preserves uploaded files and blocks that aren't touched. More efficient than replace_content for targeted text changes like fixing typos, updating URLs, or renaming terms. |
| read_sectionA | Read a single page section by heading name. Uses the same heading matching and boundary rules as update_section: headings are matched case-insensitively, H1 sections end at the next heading of any level, and H2/H3 sections end at the next heading of the same or higher level. Includes the heading block itself and recursively renders nested children only for blocks inside the selected section. If unsupported nested block types are omitted, the response includes warnings. Notion AI meeting-notes blocks encountered in the result are rendered as a synthetic toggle and produce a |
| read_blockA | Read one block by ID as markdown. Container blocks are fetched recursively with children. Unsupported root block types return a clear error; unsupported nested blocks are omitted and listed in warnings. Notion AI meeting-notes blocks encountered in the result are rendered as a synthetic toggle and produce a |
| read_toggleA | Read one toggle by title from a page. Searches recursively and matches plain toggle blocks plus toggleable heading_1, heading_2, and heading_3 blocks using case-insensitive trimmed text. Missing titles return the available toggle titles. Notion AI meeting-notes blocks encountered in the result are rendered as a synthetic toggle and produce a |
| search_in_pageA | Search raw Notion block plain text inside a page, optionally scoped to one toggle or toggleable heading by title. Matching is case-insensitive plain substring search. |
| update_toggleA | DESTRUCTIVE — no rollback: this tool preserves the matched toggle container block ID, then deletes its body children and appends replacement body blocks. Child block IDs inside the body change, and if the write fails mid-call the toggle can be left partially or fully emptied. For irreplaceable content, duplicate_page the target first so you have a restore point. Update the body of one toggle by title from a page. Searches recursively and matches plain toggle blocks plus toggleable heading_1, heading_2, and heading_3 blocks using case-insensitive trimmed text. The markdown is replacement body content, not a wrapper that renames the toggle. If the markdown parses as one matching top-level toggle or toggleable heading wrapper, that wrapper is ignored and only its children are used as the replacement body. |
| archive_toggleA | Archive one toggle by title from a page. Searches recursively and matches plain toggle blocks plus toggleable heading_1, heading_2, and heading_3 blocks using case-insensitive trimmed text. Archives the matched container block; children are not deleted individually. Missing titles return the available toggle titles. |
| restore_toggleA | Restore an archived toggle or toggleable heading by archived block ID. Use the block ID returned by archive_toggle; Notion does not expose archived child enumeration for title search or read_page include_archived. |
| update_blockA | Update a single block in place by ID. Preserves the block's identity (deep-link anchors and inline-comment threads attached to the block survive the edit). Use this for surgical edits: fixing a heading, toggling a checkbox, rewriting one paragraph. For multi-block edits, use append_content, replace_content, or update_section. Type lock-in: the markdown must parse to the same block type as the existing block. update_block cannot change a block's type — Notion's API forbids it. To change a block's type, use replace_content or delete + append. Updatable types: paragraph, heading_1, heading_2, heading_3, toggle, bulleted_list_item, numbered_list_item, quote, callout, to_do, code, equation. Container blocks (toggle, callout) update first-level content only — children stay untouched. Non-updatable types (divider, table, image, bookmark, etc.) accept only To delete a block, pass |
| read_pageA | Read a page and return metadata plus markdown. Recursively fetches nested blocks and uses the same markdown conventions accepted by create_page. If unsupported block types are omitted from the markdown, they are listed in warnings. Do NOT round-trip markdown through replace_content when omitted_block_types warnings are present; omitted blocks would be deleted. Notion AI meeting notes are rendered as a synthetic toggle containing the title, an optional recording timestamp callout, and Note on Long titles are paginated with max_property_items. For markdown conventions, warning shapes, and pagination details, read resources easy-notion://docs/markdown, easy-notion://docs/warnings, and easy-notion://docs/property-pagination. |
| duplicate_pageA | Duplicate a page. Reads all blocks from the source and creates a new page with the same content that this server can represent. If the source contains block types this server does not yet support (e.g. child_page subpages, synced_block, child_database, link_to_page), those are omitted from the duplicate AND listed in a |
| update_pageA | Update page title, icon, or cover. Cover accepts an image URL, or a file:// path (stdio transport only) which will be uploaded to Notion. In HTTP transport, the file:// form is rejected — use an HTTPS URL instead. |
| archive_pageC | Archive a page in Notion. |
| searchA | Search Notion pages or databases. Use filter: 'databases' to find databases by name, then get_database for schema details. |
| list_pagesB | List child pages under a parent page. |
| share_pageA | Return the page URL that can be shared from Notion. |
| create_databaseA | Create a database under a parent page. Supported property types and extras:
Unknown property types fail with an explicit error. No silent drops. |
| update_data_sourceA | CRITICAL: full-list semantics. When you update a select or status property's Cannot toggle Updates a database's schema: rename properties, add or update property definitions, remove properties, change the title, or move it to/from trash. Use after get_database. Supports raw Notion payloads and schema helper payloads; read resource easy-notion://docs/update-data-source for modes, examples, status notes, and limitations. At least one of |
| get_databaseA | Get a database's schema — property names, types, and select/status options. Call this before query_database or add_database_entry to know the exact property names and valid values. |
| list_databasesA | List all databases the integration can access. Returns database names and IDs — use get_database on any result to see its schema. |
| query_databaseA | Query a database with optional filters, sorts, or text search. Use text for simple keyword search across title, rich_text, url, email, and phone fields. For advanced filters, pass Notion filter syntax and call get_database first to see property names and valid options. Response shape: { results: Array, warnings?: Array }. Multi-value properties are capped by max_property_items and can emit truncated_properties; read resources easy-notion://docs/property-pagination and easy-notion://docs/warnings for details. |
| list_viewsA | List Notion database views. Pass exactly one of database_id or data_source_id. Returns the raw Notion views list response. |
| get_viewB | Retrieve one Notion database view by ID. Returns the raw Notion view response. |
| query_viewA | Query a Notion database view. Creates a temporary view query, fetches raw page results, then deletes the query. |
| create_viewB | Create a Notion database view. Pass database_id. Dashboard views and dashboard widget placement are not supported. |
| update_viewA | Update a Notion database view. Pass at least one update field. Null filter, sorts, or quick_filters values are forwarded to clear those fields. |
| delete_viewA | Delete a Notion database view. Destructive: confirm must be exactly true. |
| add_database_entryA | Create one database entry using simple key-value property inputs. Call get_database first to see available property names and valid select/status options. Writable property values use simple inputs:
Not writable from this tool:
Example: { "Name": "Buy groceries", "Status": "Todo", "Priority": "High", "Due": "2025-03-20", "Tags": ["Personal"] }. |
| add_database_entriesA | Create multiple entries in a database in one call. Each entry uses the same simple key-value format as add_database_entry. Returns per-entry results — partial failures don't block the batch. |
| update_database_entryA | Update an existing database entry using simple key-value property inputs. Pass only properties to change; omitted properties are left unchanged. Call get_database first to see available property names and valid select/status options. Writable property values use the same simple inputs as add_database_entry:
Not writable from this tool:
|
| list_commentsB | List comments on a page. |
| add_commentC | Add a comment to a page. |
| move_pageB | Move a page to a new parent page. |
| restore_pageB | Restore an archived page. |
| delete_database_entryB | Delete (archive) a database entry. |
| list_usersB | List workspace users. |
| get_meA | Get the current bot user. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| markdown-conventions | Supported markdown syntax for page creation, appends, replacements, targeted updates, and reads. |
| warning-shapes | Warning codes and response shapes emitted by markdown read and write tools. |
| property-pagination | How read_page and query_database paginate long Notion property values. |
| update-data-source-guide | Full-list schema semantics, raw/helper payload modes, and examples for update_data_source. |
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Grey-Iris/easy-notion-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server