notion-plus-mcp-server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| NOTION_TOKEN | Yes | Your Notion integration secret token | |
| NOTION_PLUS_HOME | No | Directory to store the undo journal (defaults to ~/.notion-plus) |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| notion_searchA | Search pages and databases shared with the integration by title. Returns id, type, title, url, and last edited time. Use this to find ids before reading or editing. Only content shared with the integration is searchable. |
| notion_get_pageA | Read a page: its properties as simple values, the database it belongs to (if any), and its content. format "outline" (default) lists every block with its id in ⟨…⟩, for surgical edits with notion_patch_block, notion_insert_blocks, notion_delete_blocks, notion_copy_blocks. format "markdown" returns the whole page as Notion-flavored markdown (colors, callouts, columns, tables, toggles, mentions), which notion_insert_blocks / notion_create_page accept back. last_edited_time can be passed to write tools as expected_last_edited_time to avoid overwriting someone else's edit. |
| notion_get_blocksA | Read the children of a page or block as an outline with block ids. Use for large pages to read one section at a time. |
| notion_find_blocksA | Find blocks on a page whose text matches a string or regex. Returns block id, type, text, and last_edited_time. Use this to locate exactly which block to edit instead of rewriting the page. |
| notion_get_schemaA | Read a database's properties: names, types, select/status options (with status groups), relation targets, and which are read-only. Read this before writing properties so values match exactly. |
| notion_queryA | Query database rows. |
| notion_update_propertiesA | Set properties on a database row using simple values: strings, numbers, booleans, arrays for multi-select/people/relations, ISO dates or {start,end}, null to clear. Property names and option values are matched forgivingly and validated against the schema before anything is written; all problems are reported together. Saves a snapshot so notion_undo can revert. Set dry_run to preview the before/after. |
| notion_create_pageA | Create a page. If |
| notion_bulk_updateA | Update many rows at once, in one of two ways: set the same values on every row matching |
| notion_trash_pageA | Move a page or database row to the Notion trash. Reversible with notion_undo or from Notion's trash. |
| notion_patch_blockA | Edit a single block in place by id without touching anything else on the page: replace its text (inline markdown, colors, mentions allowed), check/uncheck a to-do, set a code block's language or caption, change color, make a heading a toggle, change a callout's icon, or replace a table row's cells. Block type can't change (Notion API limit); to change type, insert a new block and delete the old one. Snapshots the old content for notion_undo. |
| notion_insert_blocksA | Insert new content at an exact spot: at the start or end of a page/block, or directly after a specific block id. Existing content is never rewritten. |
| notion_replace_textA | Find and replace text across a page while keeping bold/italic/links/colors and mentions intact: every text block, table cell, and code caption, plus the page title (include_title). Supports regex with $1-style groups. Defaults to dry_run=true, which shows every change (before/after) so you can confirm. Matches that cross a mention or equation are skipped and reported. Sub-pages are separate documents and aren't searched. All changes revert together with notion_undo. |
| notion_delete_blocksA | Move specific blocks (by id) to the trash. Nothing else on the page is touched. Reversible with notion_undo. |
| notion_update_pageA | Change a page's title, icon, or cover, lock or unlock it, or move it under another page or into a database. Icons: an emoji, image URL, or local image path; covers: an image URL or local path; "none" removes either. For database row fields use notion_update_properties. Reversible with notion_undo (an icon or cover that was an uploaded file is uploaded again on undo). |
| notion_duplicate_pageA | Copy a page with its icon, cover, content (every block type the API can create, with formatting), and, when it stays in the same database, all writable properties. Sub-pages and databases on the page are copied in place; databases get their schema and (by default) their rows with content, with relations inside the copy pointing at the copied rows. Views, linked database views, and read-only blocks are listed as skipped, and the result's status is "partial" when anything was. Database rows keep their own content, sub-pages, and databases. Uploaded files and images are re-uploaded so the copy doesn't depend on expiring links. dry_run shows what would be copied. notion_undo trashes the copy. |
| notion_copy_blocksA | Copy blocks (with everything nested inside them) to another spot: a page or block, at the start, end, or after a block. With move=true the originals are trashed afterward (the API has no move, so moved blocks get new ids and lose their comments). Sub-pages among the given blocks are moved with Notion's page move, or duplicated when copying; they land at the end of the destination page. A move is refused if it would lose something the API can't recreate (databases, read-only blocks, original synced blocks whose references would break). Copying an original synced block creates a reference to it. Moves default to dry_run=true. One notion_undo reverts everything. |
| notion_list_templatesA | List a database's page templates (name, id, which is the default). Use a name or id as notion_create_page's |
| notion_commentsA | Read, add, or reply to comments. action=list returns a page's or block's open comments with discussion ids (Notion's API doesn't return resolved threads). action=add starts a discussion on a page or block; action=reply answers a discussion by discussion_id. |
| notion_create_databaseA | Create a database under a page with its full schema in one call: select/multi-select/status options (status options can name their group: To-do, In progress, Complete), number formats, formulas, relations (one- or two-way, to another database or "self"), rollups over those relations, unique IDs with a prefix, people, dates, files, places, and more. If no title property is given, one called "Name" is added. Add rows with notion_bulk_create or notion_create_page. notion_undo trashes the database. |
| notion_schemaA | Change a database's properties. action=add adds a property (same definition as notion_create_database). action=rename renames one. action=delete removes one: it defaults to a dry run showing how many rows have values, and snapshots up to 2000 rows' values so notion_undo can re-create the property and restore them. action=add_options adds select/multi-select/status options (status options take a group). action=set_number_format and action=set_description change those settings. Notion's API can't rename or recolor options (it ignores or rejects it); rename them in Notion, or add a new option, move rows with notion_bulk_update, and delete the old one in Notion. |
| notion_aggregateA | Answer "how many / how much by X" without reading every row into context. Filters with |
| notion_bulk_createA | Create up to 1000 database rows from JSON objects ( |
| notion_viewsA | List, read, create, update, or delete database views. Types: table, board, list, calendar, timeline, gallery, form, map, and chart (Notion's native, live charts: column, bar, line, donut, number, with stacking). A view can be a tab on the database (default), a linked view placed on any page ( |
| notion_create_chartA | Render a chart image (PNG, or SVG) and put it on a page, or refresh an existing chart image in place. Types: bar, column, stacked_bar, stacked_column, grouped_column, line, area, stacked_area, pie, donut, scatter, and histogram (one row per observation; y is the value (x is ignored). |
| notion_build_reportA | Build a report page for a database in one call: a summary callout (row count, completion, overdue), KPI numbers side by side, charts (live Notion chart views where Notion supports the type, rendered images otherwise), a table of key rows (e.g. overdue items), and a Mermaid Gantt chart of dated work. Every section is optional; |
| notion_undoA | Revert a change made through this server. With no id, reverts the most recent change that hasn't been undone. Use notion_history to find ids. Undo restores the snapshot taken at write time. Before writing, it checks whether anything it would restore was edited later (by a person or a later change here) and refuses, listing those objects, unless force is true. Edits made within the same minute as the original write can't be detected (Notion rounds edit times to the minute). |
| notion_historyA | List changes made through this server, newest first, with their undo ids and how much of each undo can revert. Entries marked interrupted or failed stopped part-way; their input is included so the objects can be checked. |
| notion_automationA | Manage and run automation rules (rules.json in the local state folder, or NOTION_PLUS_RULES). A rule has a |
| notion_doctorA | Check that the server is set up and working, and say how to fix what isn't: settings, the token, the integration's capabilities, whether any pages are shared with it, the local state folder (undo journal, chart recipes, automation state), upload folders, the chart renderer, automation rules, and unfinished automation runs. Changes nothing. Run it first when something doesn't work. |
| notion_capabilitiesA | What this server can do with the current integration: the areas it covers, the Notion API version, limits that matter for planning (rows copied, blocks per copy, run limits), and which integration capabilities are available (probed with read-only calls; write capabilities show as unknown until a write). |
| notion_templateA | Build pages from reusable templates instead of many block calls. Built-in templates: weekly-executive-report, content-brief, launch-plan, research-dossier; save your own. Actions: list, get (a template's full spec, a good starting point), validate (check a template, and with |
| notion_workflowA | Multi-step workflows (version 2 of automations): a trigger (manual, schedule, or Notion webhook events) and typed steps run in order. Step actions: query, set, append, comment, create_page, move_page, duplicate_page, trash, replace_text, export_markdown, render_template, http, slack, foreach, switch, approval, delay, run_workflow. Each step has an id; may have |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 33 tools
Most tools have distinct resource+action boundaries, and descriptions actively steer the agent (e.g. prefer notion_views for live charts, use notion_aggregate for counts). However, a few areas overlap: notion_automation vs notion_workflow, notion_template vs notion_list_templates, and notion_doctor vs notion_capabilities. These are clarified by descriptions but still require careful reading.
All tools use snake_case with a consistent notion_ prefix, which is predictable and readable. Most names are verb_noun (get_page, create_page, update_properties), but several are noun-only or action-packed (comments, views, schema, undo, history, doctor, capabilities, automation, workflow, template), and singular/plural use varies slightly.
33 tools is above the 25+ threshold considered too many for a well-scoped server. While Notion is broad and many tools earn their place, the surface is heavy and includes advanced features (automation, workflows, templates, charts, reports) that could be consolidated or exposed as sub-actions. This increases selection overhead and the risk of misselection.
The server covers an unusually full Notion lifecycle: search, page/block read and write, database schema and row CRUD, bulk operations, comments, views, charts, templates, automations, and undo/history. Minor gaps remain: no user-directory tool for people properties, no restore for pages trashed outside this server, and comment deletion is only available indirectly via notion_undo. These are workaroundable but notable.