Skip to content

Notion

notion wraps the official Notion REST API using an Internal Integration bot token — no OAuth dance. One instance = one integration; it sees only pages and databases that have been explicitly shared to it.

fetch is the MCP-style single-call read: it flattens a page's properties and walks the block tree into clean markdown, matching the shape of Notion's own MCP server.

Sourceplugins/connector/notion/
Keynotion
Icon📝
Tierplugin — install with <app> plugin install notion
Default tagsConnector, Productivity

See Connector Plugins for the install flow.

Configs

FieldTypeRequiredNotes
TokensecretNotion Internal Integration Secret (starts with ntn_). Create one at notion.so/my-integrations.
StatuswidgetLive connection status card — probes the token against GET /v1/users/me and shows the bot name + workspace.

Sharing pages. The REST API only sees what's explicitly shared to the integration. For any page or database the connector needs, open it in Notion and add the integration via that page's Connections menu. A page not shared returns 404, not 403 — that's Notion's permission model, not a connector bug.

All requests use API version 2022-06-28.

Operations

Read

OpInputWhat it does
searchquery, object_type, page_sizeSearch pages/databases shared to the integration by title. Empty query lists everything shared.
fetchid, with_content, with_blocksFetch one page or database by ID. For a page: flattened properties, plus (default on) the body rendered as markdown by walking the block tree. Set with_blocks on to also get blocks[] = {id, type, text} for targeting a specific block (e.g. to comment on it). For a database: title + normalized property schema.
query_databasedatabase_id, filter, sorts, page_size, limitQuery a database's rows with an optional raw-JSON Notion filter/sort. Returns normalized rows {id, url, title, properties}. Pagination is followed automatically up to limit.
get_commentsblock_idList comments on a page or block.
get_usersqueryList workspace users (people + bots), optionally filtered by name/email substring.

Write

OpInputWhat it does
create_pageparent_type, parent_id, title, properties, contentCreate a page — a row in a database or a subpage under a page. properties is raw JSON keyed by property name (Notion property-object form); content is markdown converted to blocks. Returns {id, url}.
update_pagepage_id, properties, append_md, archiveUpdate a page's properties and/or append markdown to its body. archive=true moves it to trash and ignores the other fields. Returns {id, url}.
create_commenttext, page_id, block_id, discussion_idAdd a comment. Target precedence: discussion_id (reply into a thread) > block_id (comment on a specific block) > page_id (page-level).
create_databaseparent_page_id, title, schemaCreate a database under a page from a raw-JSON property schema (must include exactly one title property).
update_data_sourcedatabase_id, title, propertiesChange a database's schema and/or title: add a property (new key), remove one (null), or rename one ({"name":"New"}).

All write ops are destructive and disabled/enabled per row like any other connector — see Connector Module ▶ Destructive ops.

fetch output shape

fetch is built to be the one call an agent needs for "read this page":

  • meta — flattened {id, url, title, properties, edited_at} (property values normalized to plain JSON, not Notion's verbose property-object form).
  • content_md — the page body rendered as markdown (default on; turn off with with_content=false to save an API call when only properties are needed).
  • blocks — flat {id, type, text} list, off by default; turn on with with_blocks=true when you need a block ID to target with create_comment or a future block-level edit.

See also

  • Notion (Unofficial) — the private-web-API sibling connector. Use this official one first; reach for the unofficial connector only when you need to read content the bot integration hasn't been shared to.
  • Connector Module — module contract, per-instance AI description.
  • Connector Plugins — install / update / uninstall flow.
Built with ❤️ by a developer, for developers.