Easy Notion MCP
Easy Notion MCP is a markdown-first MCP server that connects AI agents to Notion, enabling full read/write access to pages, databases, comments, and users using standard Markdown syntax — with up to 95.5% fewer tokens than the official Notion MCP server.
Page Management
Create, read, append, replace, duplicate, archive, restore, and move pages
Update sections by heading, find and replace text, update individual blocks by ID
Update page metadata (title, icon, cover image)
Create pages from local markdown files (stdio only)
Database Operations
Create databases with typed schemas; update schemas (add, rename, remove properties)
List, query with filters/sorts/text search, and get database schemas
Add, update, and delete entries using simple key-value pairs
Navigation & Discovery
List child pages, search pages/databases, and get shareable page URLs
Comments & Users
List and add comments to pages; list workspace users and get current bot user info
Content Support (24 Block Types)
Standard markdown: headings, bold/italic/strikethrough, inline code, links, images, lists, blockquotes, code blocks, tables, dividers
Notion-specific: toggles, column layouts, callouts, equations, table of contents, embeds, bookmarks, and file uploads (stdio only)
Additional Features
Full round-trip fidelity between markdown and Notion's block API
Supports API token (stdio) and OAuth (HTTP) authentication
Prompt injection defense and URL sanitization
Explicit error messages to help agents self-correct
Partial failure handling: batch operations return per-entry results for retry
Enables AI agents to manage Notion pages and databases using markdown, supporting complex block types, page content manipulation (creation, reading, and updating), and database entry management.
Easy Notion MCP
Markdown-first MCP server that connects AI agents to Notion. Agents write markdown — easy-notion-mcp converts it to Notion's block API and back again.
43 tools · 24 block types · ~6–7× fewer response tokens vs official Notion MCP · Documented round-trip support
npx easy-notion-mcpSee it in action → Live Notion page created and managed entirely through easy-notion-mcp.

Contents: Comparison · Setup · CLI profiles · Config · Why markdown · How it works · Tools · MCP resources · Block types · Round-trip · Databases · Cookbook · Security · Stability · FAQ · Community
How does easy-notion-mcp compare to other Notion MCP servers?
Feature | easy-notion-mcp | Official Notion MCP (npm) | better-notion-mcp |
Content format | ✅ Standard GFM markdown | ❌ Raw Notion API JSON | ⚠️ Markdown (limited block types) |
Block types | ✅ 24 (toggles, columns, callouts, equations, embeds, tables, file uploads, task lists) | ⚠️ All (as raw JSON) | ⚠️ ~7 (headings, paragraphs, lists, code, quotes, dividers) |
Round-trip support | ✅ 24 block types, documented caveats | ❌ Raw JSON requires block reconstruction | ⚠️ Unsupported blocks silently dropped |
Tools | 43 individually-named tools | 18 auto-generated from OpenAPI | 9 composite tools (39 actions) |
File uploads | ✅ | ✅ 5-step lifecycle | |
Prompt injection defense | ✅ Content notice prefix + URL sanitization | ❌ | ❌ |
Database entry format | Simple | Simplified key-value pairs | Simplified key-value pairs |
Auth options | API token or OAuth | API token or OAuth | API token or OAuth |
How many tokens does easy-notion-mcp save?
Reading a page's content costs about 6–7× fewer response tokens than the official Notion MCP server, because Notion's raw block JSON carries per-block metadata (block IDs, timestamps, author objects) that an agent reading for content never needs. Typically ~5–7×, ranging from ~3× on code-heavy pages to ~15× on rich pages, with ≥94% of the page's content preserved. Measured against the official raw-JSON server; roughly on par with other markdown-based servers.
The win is metadata omission, not encoding efficiency. At equal information the two formats cost about the same (the common intermediate-representation ratio is ~1.0–1.06× on fully represented page shapes, and 1.32× on typical prose), so the saving is the per-block metadata (block UUIDs, timestamps, author objects, annotation wrappers) that raw JSON carries and a content read never uses. Database queries show a similar ~7× win at full content completeness.
Methodology, per-class results, and every caveat: .meta/research/token-bench-results-2026-06-13.md (re-run via scripts/bench/lib/recompute-tiers.ts).
Related MCP server: MCP Notion Server (@suncreation)
How do I set up easy-notion-mcp?
With API token
Create a Notion integration, copy the token, share your pages with it.
Claude Code:
claude mcp add notion -s user \
-e NOTION_TOKEN=ntn_your_integration_token \
-- npx -y easy-notion-mcpThis registers the server in your Claude Code user-level config (-s user) and passes NOTION_TOKEN directly to the MCP child process via -e. Your shell environment and rcfiles are untouched — the token lives in Claude Code's config file, scoped to this server, and is not visible to other processes. To set a default parent page for create_page, add -e NOTION_ROOT_PAGE_ID=<page-id> to the same command.
OpenClaw:
openclaw config set mcpServers.notion.command "npx"
openclaw config set mcpServers.notion.args '["-y","easy-notion-mcp"]'Then provide the token via the parent shell environment before starting OpenClaw:
export NOTION_TOKEN=ntn_your_integration_tokenThis export form is the generic fallback for any MCP client that inherits the parent shell environment. Caveat: it only persists for the current shell session unless you add it to your shell rcfile, which has its own security implications — prefer the -e form above when using Claude Code specifically.
Claude Desktop / Cursor / Windsurf — add to your MCP config file:
{
"mcpServers": {
"notion": {
"command": "npx",
"args": ["-y", "easy-notion-mcp"],
"env": {
"NOTION_TOKEN": "ntn_your_integration_token"
}
}
}
}Config file locations: Claude Desktop → claude_desktop_config.json · Cursor → .cursor/mcp.json · Windsurf → ~/.windsurf/mcp.json
{
"servers": {
"notion": {
"command": "npx",
"args": ["-y", "easy-notion-mcp"],
"env": {
"NOTION_TOKEN": "ntn_your_integration_token"
}
}
}
}CLI profiles for low-context Notion access
Use the easy-notion CLI when an agent needs Notion access without loading the full MCP tool surface, or when you want separate Notion integrations for different permission modes. Profiles live in ~/.config/easy-notion-mcp/profiles.json by default and reference environment variable names, not raw tokens.
export NOTION_WORK_READONLY=ntn_readonly_token
export NOTION_WORK_WRITE=ntn_readwrite_token
npx -y --package easy-notion-mcp easy-notion profile add work-ro \
--token-env NOTION_WORK_READONLY \
--mode readonly \
--default
npx -y --package easy-notion-mcp easy-notion profile add work-rw \
--token-env NOTION_WORK_WRITE \
--mode readwrite \
--root-page-id your_root_page_idRead commands work with readonly profiles:
npx -y --package easy-notion-mcp easy-notion --profile work-ro search "roadmap" --filter pages
npx -y --package easy-notion-mcp easy-notion --profile work-ro page read PAGE_ID --include-metadata
npx -y --package easy-notion-mcp easy-notion --profile work-ro content search-in-page PAGE_ID --query "launch" --within-toggle "Script"Mutating commands require a readwrite profile:
npx -y --package easy-notion-mcp easy-notion --profile work-rw content append PAGE_ID --markdown "## Update"
npx -y --package easy-notion-mcp easy-notion --profile work-rw content update-toggle PAGE_ID --title "Script" --markdown-file ./script.md
npx -y --package easy-notion-mcp easy-notion --profile work-rw content archive-toggle PAGE_ID --title "Done"
npx -y --package easy-notion-mcp easy-notion --profile work-rw content restore-toggle ARCHIVED_BLOCK_IDDestructive CLI commands support --dry-run as a readonly preflight. It runs
the same lookup and markdown validation where possible, returns planned fields
such as would_delete_block_ids, would_update, would_archive, or
would_restore, and does not mutate Notion.
The lightweight skill for agent routing is published in this repo at skills/easy-notion-cli/. It teaches agents to prefer the CLI for profile-based Notion access instead of registering multiple MCP servers.
With OAuth
API-token + stdio is the lower-friction default. If you're running a shared deployment or want per-user access, OAuth handles authentication with no token to copy-paste.
Start the server:
npx -p easy-notion-mcp easy-notion-mcp-httpRequires NOTION_OAUTH_CLIENT_ID and NOTION_OAUTH_CLIENT_SECRET env vars. See OAuth setup below.
Claude Code:
claude mcp add notion --transport http http://localhost:3333/mcpOpenClaw:
openclaw config set mcpServers.notion.transport "http"
openclaw config set mcpServers.notion.url "http://localhost:3333/mcp"Claude Desktop:
Go to Settings → Connectors → Add custom connector, enter http://localhost:3333/mcp.
Your browser will open to Notion's authorization page. Pick the pages to share, click Allow, done.
If you want to register easy-notion-mcp per-project instead of user-wide, paste the following into a .mcp.json file at your project's root:
{
"mcpServers": {
"easy-notion-mcp": {
"command": "npx",
"args": ["-y", "easy-notion-mcp"],
"env": {
"NOTION_TOKEN": "ntn_your_integration_token",
"NOTION_ROOT_PAGE_ID": "your_root_page_id"
}
}
}
}Replace the placeholder values with your real Notion integration token and (optional) root page ID. Note that this file should live in your project, not in this repo — Claude Code will auto-register any server it finds in a project-scoped .mcp.json and try to start it, so committing one with placeholder credentials will cause "Failed to connect" on repo open.
Dify / n8n / FlowiseAI (Docker-based platforms):
Run the HTTP server on your host machine:
export NOTION_MCP_BEARER=$(openssl rand -hex 32)
NOTION_TOKEN=ntn_your_integration_token \
NOTION_MCP_BIND_HOST=0.0.0.0 \
NOTION_MCP_BEARER=$NOTION_MCP_BEARER \
npx -p easy-notion-mcp easy-notion-mcp-httpIn your platform's MCP server settings, use host.docker.internal instead of localhost, and add the bearer to the request headers:
http://host.docker.internal:3333/mcp
Authorization: Bearer <your NOTION_MCP_BEARER value>Why not localhost? These platforms typically run in Docker.
localhostinside a container refers to the container itself, not your host machine.host.docker.internalbridges the gap.HTTP host and bearer: The HTTP server binds
127.0.0.1by default and static-token mode requiresNOTION_MCP_BEARER.host.docker.internalreaches the host's bridge IP, so setNOTION_MCP_BIND_HOST=0.0.0.0on the host and send the bearer header on every client request. OAuth mode, which issues per-user bearers, is the alternative for shared Docker deployments.
easy-notion-mcp works with any MCP-compatible client. The server runs via stdio (API token mode) or HTTP (OAuth or API token mode).
If you run into questions during setup, the Discord community is a good place to ask. The #easy-notion-mcp channel covers setup and design discussion. Bugs go on GitHub issues.
Configuration
Stdio mode (API token)
Variable | Required | Default | Description |
| Yes | — | Notion API integration token |
| No | — | Default parent page ID |
| No |
| Skip content notice on markdown read responses ( |
About
.envfiles (contributors only): easy-notion-mcp loads a.envfile from the current working directory viadotenv. In practice this means.envonly "just works" when you run the server from a cloned repo checkout (node dist/index.jsafternpm install && npm run build), because the repo root is your cwd. It is not loaded when the package is invoked vianpx easy-notion-mcpor a global install from an arbitrary directory — that is standard npm CLI behavior. For thenpxpath, passNOTION_TOKENvia the-eflag in the Claude Code setup above, or via your MCP client's configenvblock.
OAuth / HTTP transport
Run npx -p easy-notion-mcp easy-notion-mcp-http to start the HTTP server with OAuth support.
Variable | Required | Default | Description |
| Yes (OAuth mode) | — | Notion public integration OAuth client ID |
| Yes (OAuth mode) | — | Notion public integration OAuth client secret |
| No |
| HTTP server port |
| No |
| OAuth callback URL |
| No |
| Bind address. Default is loopback; set |
| Yes (static-token mode) | — | Shared-secret bearer required by clients in static-token HTTP mode. Server refuses to start without it. Not required in OAuth mode. |
To get OAuth credentials, create a public integration at notion.so/profile/integrations and configure http://localhost:3333/callback as the redirect URI.
In OAuth mode, create_page works without NOTION_ROOT_PAGE_ID — pages are created in the user's private workspace section by default.
HTTP mode security posture
The HTTP transport is designed for trusted networks: single-operator self-hosting with a bearer secret, or OAuth for shared deployments. It is not hardened for direct exposure to the open internet; put a reverse proxy with TLS in front of it if you need remote access.
Static-token mode requires a bearer. Starting npx -p easy-notion-mcp easy-notion-mcp-http with only NOTION_TOKEN set will refuse to start. Set a shared-secret bearer in the server's environment, then configure your MCP client to send it as Authorization: Bearer <secret> on every /mcp request:
export NOTION_MCP_BEARER=$(openssl rand -hex 32)
NOTION_TOKEN=ntn_your_integration_token npx -p easy-notion-mcp easy-notion-mcp-httpThe bearer is compared with crypto.timingSafeEqual. Missing or wrong bearers get 401 { "error": "invalid_token" }. Rotate the secret by restarting the server with a new value.
Default bind is loopback. The server binds 127.0.0.1 by default — local processes only. Set NOTION_MCP_BIND_HOST=0.0.0.0 to expose all interfaces, or a specific IP like 192.168.1.5 to expose one. Bearer is required regardless of bind.
Bearer-always is the trust boundary. DNS-rebinding protection is not wired on the /mcp endpoint, and CORS on the OAuth registration/token endpoints (/register, /token, /revoke) is permissive. Treat the bearer, or OAuth's per-user bearer, as the only thing standing between the network and your Notion workspace. Keep it set even for loopback-only deployments. If you need to expose this server beyond a trusted network, put it behind a reverse proxy that handles TLS and origin checks.
OAuth mode for multi-user / remote. OAuth has its own per-user bearer enforcement; NOTION_MCP_BEARER is not required in OAuth mode. For shared deployments, OAuth's per-user identity model is the right shape — static-token + bearer is intended for single-operator self-hosting.
file:// uploads are stdio-only. Markdown passed to create_page, append_content, replace_content, update_section, or update_page.cover with file:// URLs is rejected over HTTP. Use stdio mode for local-file workflows (create_page_from_file is also stdio-only), or host the file at an HTTPS URL and use that URL in the markdown.

Why markdown-first?
The official Notion MCP npm package returns raw API JSON — deeply nested block objects with ~120 tokens of metadata per block. Other servers convert to markdown but support only a handful of block types, silently dropping callouts, toggles, tables, equations, and more.
easy-notion-mcp uses standard GFM markdown that agents already know. There's nothing new to learn, no custom tag syntax, no block objects to construct. The agent writes markdown, easy-notion-mcp handles the conversion to Notion's block API — and back again, with 24 block types preserved.
This means agents can edit existing content. Read a page, get markdown back, modify the string, write it back. Supported formatting and structure are preserved for the block types this server represents, and the known omissions and degradations are documented below. Agents edit Notion pages the same way they edit code, as text.
How does easy-notion-mcp work?
Pages — write and read markdown:
create_page({
title: "Sprint Review",
markdown: "## Decisions\n\n- Ship v2 by Friday\n- [ ] Update deploy scripts\n\n> [!WARNING]\n> Deploy window is Saturday 2–4am only"
})Read it back — same markdown comes out:
read_page({ page_id: "..." }){ "markdown": "## Decisions\n\n- Ship v2 by Friday\n- [ ] Update deploy scripts\n\n> [!WARNING]\n> Deploy window is Saturday 2–4am only" }Modify the string, call replace_content, done. Or target a single section by heading name with update_section. Or do a surgical find_replace without touching the rest of the page. Pages can also have emoji icons and cover images set via create_page or update_page.
Databases — write simple key-value pairs:
add_database_entry({
database_id: "...",
properties: { "Status": "Done", "Priority": "High", "Due": "2026-05-15", "Tags": ["v2", "launch"] }
})No property type objects, no nested { select: { name: "Done" } } wrappers. easy-notion-mcp fetches the database schema at runtime and converts automatically. Agents pass { "Status": "Done" }, easy-notion-mcp does the rest.
Errors tell you how to fix them. A wrong heading name returns the available headings. A missing page suggests sharing it with the integration. A bad filter tells you to call get_database first. Agents can self-correct without asking the user for help.
Complex content works. Nested toggles inside toggles, columns with mixed content types (lists + code blocks + blockquotes), deep list nesting, and full unicode (Japanese, Chinese, Arabic, emoji) are covered by round-trip tests. update_section heading search is case-insensitive and returns available headings on miss. add_database_entries handles partial failures, and succeeded and failed entries are returned separately so agents can retry just the failures.

What tools does easy-notion-mcp provide?
easy-notion-mcp includes 43 individually-named tools across 7 categories (42 over HTTP, which excludes the stdio-only create_page_from_file). Tool descriptions keep safety-critical behavior inline and point to MCP resources for longer reference material such as markdown syntax, warning shapes, property pagination, and update_data_source examples.
Pages (20 tools)
Tool | Description |
| Create a page from markdown |
| Create a page from a local markdown file (stdio only) |
| Read a page as markdown |
| Read one section by heading name |
| Read one block by ID, including nested children for containers |
| Read one toggle or toggleable heading by title |
| Search raw block text in a page or one toggle |
| Append markdown to a page |
| Replace all page content atomically (preserves block IDs of matched blocks) |
| Update a section by heading name; optional heading-preserving body replacement (destructive; duplicate_page first for irreplaceable content) |
| Update one toggle body by title (destructive; preserves the toggle container ID) |
| Archive one toggle or toggleable heading by title |
| Restore an archived toggle or toggleable heading by archived block ID |
| Find and replace text, preserving files |
| Update a single block by ID (preserves block identity for deep links and comments) |
| Update title, icon, or cover |
| Copy a page and its content |
| Move a page to trash |
| Move a page to a new parent |
| Restore an archived page |
Destructive tools support dry_run: true as a preflight. Dry-run does not
upload or validate local file:// markdown uploads because that would create
Notion uploads; use HTTPS URLs or run without dry-run for local files.
replace_content dry-run translates markdown and returns translator warnings,
but it cannot surface Notion-side unmatched_blocks or truncated fields
because it does not call Notion's update endpoint.
restore_toggle is intentionally ID-based: pass the archived block ID returned
by archive_toggle. Notion does not expose archived child enumeration for title
search or a read_page include_archived workflow, so restore-by-title is not
available.
Navigation (3 tools)
Tool | Description |
| List child pages under a parent, with |
| Search pages and databases |
| Get the shareable URL |
Each list_pages row returns id, title, created_time, and last_edited_time, so an agent can tell active pages from stale ones without a per-page round trip. The timestamps come straight from Notion, rounded to the minute, and last_edited_time advances on page content and property edits. Note the deliberate difference from search, which returns last_edited as a date only, while list_pages returns last_edited_time as a full ISO-8601 timestamp.
Databases (9 tools)
Tool | Description |
| Create a database with typed schema |
| Update database schema (add, rename, or remove properties; change title; trash or restore) |
| Get database schema, property names, and options |
| List all databases the integration can access |
| Query with filters, sorts, or text search |
| Add a row using simple key-value pairs |
| Add multiple rows in one call |
| Update a row using simple key-value pairs |
| Delete (archive) a database entry |
Database write tools reject unknown property names and unsupported property types with a clear error instead of silently dropping them. Call
get_databasefirst to confirm property names and types. Supported property types for writes:title,rich_text,number,select,multi_select,date,checkbox,url,phone,status,relation,people. Forpeople, pass a single user-ID string or an array of user IDs. Computed types (formula,rollup,unique_id,created_time,last_edited_time,created_by,last_edited_by) are populated by Notion and cannot be set via API. Value writes are also rejected forfiles,verification,place,location, andbutton. For relation writes, pass either a single page-ID string ("Projects": "page-id") or an array ("Projects": ["id-a", "id-b"]); an empty array clears the relation.
easy-notion-mcp fetches the database schema, maps values to Notion's property format, and handles type conversion automatically when agents pass simple key-value pairs like { "Status": "Done" }. Schema is cached for 5 minutes to avoid redundant API calls during batch operations.
Views (6 tools)
Tool | Description |
| List saved views for a database or data source |
| Get one saved view's raw configuration |
| Query entries through a saved view |
| Create a table, list, board, calendar, gallery, or timeline view |
| Rename or update a saved view's raw filter/sort/configuration fields |
| Delete a saved view with explicit confirmation |
Comments (2 tools)
Tool | Description |
| List comments on a page |
| Add a comment to a page |
Users (2 tools)
Tool | Description |
| List workspace users |
| Get the current bot user |
Server (1 tool)
Tool | Description |
| Report the server's own settings: version, transport, workspace root, and visible tool count |
get_config is the tool to reach for when a file-path or configuration error leaves you guessing. create_page_from_file only accepts paths inside the workspace root, and when a path falls outside it, the rejection now names the resolved root. get_config lets you read that root directly instead of inferring it. In HTTP mode the workspace root does not apply, so the path fields are null and the status is not_applicable; the server never reports host paths to HTTP callers.
What MCP resources are available?
Clients that support MCP Resources can read these docs on demand without loading all reference material into every tool description:
Resource URI | Contents |
| Supported markdown syntax for page writes and reads |
| Warning codes and response shapes |
|
|
|
|
What block types does easy-notion-mcp support?
easy-notion-mcp supports 24 Notion block types using standard markdown syntax extended with conventions for Notion-specific blocks like toggles, columns, and callouts. Agents write familiar markdown — easy-notion-mcp handles the conversion to and from Notion's block format.
Standard markdown
Syntax | Markdown |
Headings |
|
Bold, italic, strikethrough |
|
Inline code |
|
Links |
|
Images |
|
Bullet list |
|
Numbered list |
|
Task list |
|
Blockquote |
|
Code block |
|
Table | Standard pipe table syntax |
Divider |
|
Notion-specific syntax
Block | Syntax |
Toggle |
|
Columns |
|
Callout (note) |
|
Callout (tip) |
|
Callout (warning) |
|
Callout (important) |
|
Callout (info) |
|
Callout (success) |
|
Callout (error) |
|
Equation |
|
Table of contents |
|
Embed |
|
Bookmark | Bare URL on its own line |
File upload (image) |
|
File upload (file) |
|
Line breaks and collapse_soft_wraps
By default, a single newline inside a paragraph is written through as it is. Markdown that is hard wrapped at a fixed column (the convention in most repositories) therefore arrives in Notion carrying those line breaks. That default has not changed.
Every markdown-writing tool accepts an optional collapse_soft_wraps: true, which applies CommonMark soft-wrap semantics instead: a single newline inside a paragraph becomes a space, so a hard-wrapped file arrives as flowing paragraphs. Blank lines still separate blocks and fenced code blocks are untouched in both modes.
easy-notion page create-from-file --title "Design notes" --file ./NOTES.md --collapse-soft-wrapsDo not use it when re-uploading content you read back from Notion, or intentional line breaks will be lost.
Explicit hard breaks (a trailing backslash or two trailing spaces) behave identically whether or not the option is set, but they differ by write path:
Write path | Hard break behavior |
| Kept inside the block |
| Notion's Enhanced Markdown import renders an in-paragraph line break as a separate paragraph, so a hard break arrives as a paragraph split |
That difference is a property of the import path, not of collapse_soft_wraps.
Title and leading H1 duplication
create_page and create_page_from_file accept an optional strip_leading_h1: true, which removes the document's leading H1 so a file that opens with the same heading you pass as title does not put that heading on the page twice. It applies only when the first converted top-level block is a plain (non-toggleable) heading_1, and defaults to false.
easy-notion page create-from-file --title "Design notes" --file ./NOTES.md --strip-leading-h1create_page, create_page_from_file, append_content, replace_content, update_section, and update_toggle accept return_block_map: false to omit block_map when it is not needed; the default remains true and is unchanged.
Can I read and rewrite pages with formatting preserved?
Yes, for the markdown conventions this server represents. Round-trip support covers 24 block types. Known omissions and degradations are documented, and many are reported with explicit warnings.
read_page returns the markdown conventions that create_page accepts: headings, lists, tables, callouts, toggles, columns, equations, and page mentions.
When a page contains Notion block types this server does not yet represent, such as synced_block, child_database, child_page, or link_to_page, read_page includes a warnings field with code omitted_block_types listing the omitted block IDs and types. Writing that markdown back through replace_content would delete those blocks, so the warning lets agents avoid unsafe rewrites. For an inline page mention, use @[Title](notion-url), which is a separate construct from the link_to_page block type.
Notion AI meeting-notes (and deprecated transcription) blocks are rendered as a synthetic toggle containing the title, an optional recording timestamp, and ## Summary / ## Notes sections; transcripts are included only with read_page include_transcript: true. These render reads emit a read_only_block_rendered warning to flag that writing the markdown back replaces the native meeting block with ordinary blocks.
Some degradations are not reported by a warning. On the replace_content path, bookmarks and embeds are written as bare URLs (these do warn), while file, audio, and video blocks are reduced to their URLs silently. Underline and colored-text annotations are not represented in markdown and are dropped silently on read and on write.
easy-notion-mcp enables agents to read a page, modify the markdown string, and write it back while preserving supported formatting, structure, and content. No format translation. No block reconstruction. Agents edit Notion pages the same way they edit code, as text.
What's the difference between find_replace and replace_content?
easy-notion-mcp provides three editing strategies for different use cases:
replace_content— Replaces all content on a page with new markdown. Best for full rewrites.update_section— Replaces a single section identified by heading name. By default the replacement markdown includes the heading and replaces the full section. Passpreserve_heading: true(or CLI--preserve-heading) to keep the existing heading block ID, text, type, comments, and toggleable state while destructively replacing only the section body.find_replace— Finds and replaces specific text anywhere on the page, preserving all other content and attached files. Best for surgical edits.
Pass dry_run: true on MCP tools, or --dry-run in the CLI, before destructive
edits when you want a preflight response instead of a mutation.
How does easy-notion-mcp handle databases?
easy-notion-mcp provides 9 database tools that abstract away Notion's complex property format. Agents pass simple key-value pairs like { "Status": "Done", "Priority": "High" }; easy-notion-mcp fetches the database schema at runtime, caches it for 5 minutes, and converts to Notion's property format automatically.
easy-notion-mcp supports creating and updating databases with typed schemas, querying with filters and sorts, and bulk operations via add_database_entries (multiple rows in one call).
Cookbook: recipes for your own agent
These recipes point your own agent at Notion. The agent owns the intelligence; easy-notion-mcp supplies deterministic connective tissue through the existing MCP tools, so the recipes run on demand with zero second install. They are free and sovereign: your own agent, your own token, no-OAuth API-token setup, and free-plan database queries.
These steps work through the MCP tools or the claude.ai connector when the equivalent tools are enabled. Recipe 2 additionally works through the easy-notion CLI skill in skills/easy-notion-cli/; Recipe 1 needs create_database, source-block lookup with search_in_page, and a structured dedupe filter, and the current CLI surface does not expose that full workflow. Claude Code agents can use the operational skill in skills/notion-recipes/.
Recipe 1: meeting notes to action items
This recipe turns a meeting-notes page or pasted notes into deduplicated rows in an Action Items database. The tool sequence is create_database once, then per run read_page when the source is a page, search_in_page to resolve each item's source block ID, query_database with an exact Item Key filter for each candidate item, add_database_entry or add_database_entries for new rows, and a final query_database verification.
The proven live result was 5 rows from a planning meeting. Missing owners and due dates were stored in the Flags multi-select, not in Source, and a query_database filter of {"property":"Item Key","rich_text":{"equals":"38bbe876-242f-81f1-97b7-df935d050a24:38bbe876-242f-81c9-86c6-d9a792fc70b7"}} returned exactly 1 row. Running twice over the same notes left the count at 5 with zero duplicates. A free-text search for the shared meeting name returned every row because it also scanned Source, so this recipe uses the exact Item Key filter for dedupe.
Safety boundary: Recipe 1 is re-run-safe and idempotent because Item Key stores the source line's stable Notion identity (<pageId>:<blockId>), not the action wording.
Copy-paste for claude.ai connector users, Recipe 1
Use the enabled easy-notion or Notion connector tools to turn my meeting notes into an Action Items database.
Note: the simple {"Property":"Value"} write format below assumes the easy-notion tools. If only the official Notion connector is enabled, wrap each value in its Notion property-type object instead.
Inputs I will provide:
- Meeting notes page or pasted meeting notes: <MEETING_NOTES_PAGE_OR_TEXT>
- Parent page for the database, if a new database is needed: <PARENT_PAGE>
- Existing Action Items database, if one already exists: <DATABASE_NAME_OR_ID>
If an Action Items database does not already exist, create one with these properties:
- Name: title
- Item Key: rich_text
- Owner: rich_text
- Due: date
- Status: status
- Flags: multi_select
- Source: rich_text
Read the meeting notes or use the pasted notes. Extract only discrete action items. For each item, derive:
- Name: the action text
- Owner: the named assignee, or blank
- Due: the stated date as ISO YYYY-MM-DD, or blank
- Item Key: the source line's stable identity, formatted as <sourcePageId>:<sourceBlockId>
- Source: the meeting title plus date, with no flags stashed here
- Status: Not started
- Flags: add needs-owner if no owner, and needs-due if no due date
Resolve sourceBlockId with search_in_page. read_page returns markdown without block IDs. For a Notion-page source, call read_page to extract items, then for each item call search_in_page with a verbatim, distinctive substring of that item's original source line. Use the matches[].block_id whose text is that source line. If several blocks match, use a longer verbatim substring to isolate one block. For pasted notes, first save them as a Notion page with create_page, then proceed through search_in_page. Do not rely on block IDs from create_page, which returns only {id,title,url}. If one source line contains multiple distinct actions, append a stable ordinal suffix in source order, such as :1 or :2, to keep keys unique.
Before inserting each item, dedupe with an exact Item Key filter:
{"property":"Item Key","rich_text":{"equals":"<that item's key>"}}
If the query returns no results, insert the row with simple key-value properties. If it returns a result, skip that item. Do not dedupe with free-text database search, because text search also scans Source and can false-match every row from the same meeting.
After inserting, query the database and summarize the rows created and skipped.
Re-running is safe and idempotent because the exact Item Key filter uses the source line's stable Notion identity, not the action wording.Recipe 2: bulk-edit, find-replace, and repair
This recipe covers two surfaces where an agent can iterate past native Notion limits: database property repair and page-body find-replace. For database repair, the sequence is get_database, query_database through all rows, build a normalization map, update_database_entry for rows that need fixes, then re-query. For page text, the sequence is find_replace with dry_run: true, find_replace with replace_all: true, then read_page to verify.
The proven live database repair normalized 4 rows with mixed Eng and engineering values to one consistent option while leaving unrelated rows unchanged. The proven live page edit replaced 4 occurrences across paragraphs and a heading body. Caveat: select and status option matching is case-insensitive, and writes snap to the earliest-existing option's casing. If a lowercase variant already exists, writing a capitalized version reuses the existing lowercase option. To force specific casing, rename the option in Notion's UI rather than writing the new casing.
Copy-paste for claude.ai connector users, Recipe 2
Use the enabled easy-notion or Notion connector tools to repair Notion database rows or replace repeated text in a Notion page.
Note: the simple {"Property":"Value"} write format below assumes the easy-notion tools. If only the official Notion connector is enabled, wrap each value in its Notion property-type object instead.
Inputs I will provide:
- Target database for property repair: <DATABASE_NAME_OR_ID>
- Property to normalize: <PROPERTY_NAME>
- Normalization map, for example {"Eng":"Engineering","engineering":"Engineering"}
- Target page for find-replace, if needed: <PAGE_NAME_OR_ID>
- Find text and replacement text, if needed: <FIND_TEXT> -> <REPLACE_TEXT>
For database property repair:
1. Get the database schema so you know the exact property names. If select or status options are missing from the schema, query live rows and read the current values from the results.
2. Query the database rows. If the database is large, page through all results in a loop.
3. Build or use the normalization map I provide.
4. For each row whose property value needs fixing, update that row with a simple key-value map such as {"<PROPERTY_NAME>":"<CANONICAL_VALUE>"}.
5. Re-query the database and summarize how many rows changed and which values remain.
Important caveat: select and status option matching is case-insensitive, and writes snap to the earliest-existing option's casing. If a lowercase variant already exists, writing a capitalized version may reuse the lowercase option. To force specific casing, I need to rename the option in Notion's UI.
For page-body find-replace:
1. Run a dry-run find-replace with replace_all enabled and report the match count before changing anything.
2. If the match count is expected, run find-replace with replace_all enabled.
3. Read the page afterward and verify the replacement.What about security and prompt injection?
easy-notion-mcp includes two layers of security for production deployments:
Prompt-injection hardening: Markdown read responses (read_page, read_section, read_block, and read_toggle) include a content notice prefix instructing the agent to treat Notion data as content, not instructions. search_in_page returns raw snippets/text that should be treated the same way. This reduces the risk of page content steering agent behavior; ultimate behavior depends on the model and client. Set NOTION_TRUST_CONTENT=true to disable the markdown notice if you control the workspace.
URL sanitization: javascript:, data:, and other unsafe URL protocols are stripped and rendered as plain text. Only http:, https:, and mailto: are allowed.

Stability and versioning
easy-notion-mcp follows Semantic Versioning. As of 1.0.0 the public contract is frozen additive-only: tool names, tool input schemas, tool return shapes, the custom markdown conventions, and the warning-code vocabulary will not change in a breaking way until a future 2.0 release. Additive changes (new tools, new optional parameters, new optional response fields, new warning codes) are not breaking and can ship in minor releases.
Two surfaces are outside this freeze: the OAuth / HTTP authentication contract
is experimental and may change while its security posture matures, and the
easy-notion CLI is pre-1.0 and not yet covered. See the
CHANGELOG for the full contract statement and per-release
history.
Frequently Asked Questions
How is easy-notion-mcp different from the official Notion MCP server?
The official Notion MCP npm package (@notionhq/notion-mcp-server) is a raw API proxy that returns unmodified Notion JSON, so reading a page costs roughly 6–7× more response tokens than easy-notion-mcp's markdown. easy-notion-mcp converts everything to standard GFM markdown that agents already know, supports 24 block types with documented round-trip caveats, and includes prompt-injection hardening. Notion also offers a separate hosted remote MCP server (OAuth-based) that uses a custom HTML-tag-based markdown format, whereas easy-notion-mcp uses standard markdown syntax.
What MCP clients does easy-notion-mcp work with?
easy-notion-mcp works with any MCP-compatible client, including Claude Desktop, Claude Code, Cursor, VS Code Copilot, Windsurf, and OpenClaw. It supports both stdio transport (API token) and HTTP transport (OAuth). See the setup instructions for copy-pasteable configs for each client.
Does easy-notion-mcp support file uploads?
Yes. easy-notion-mcp supports file uploads using the file:/// protocol in markdown syntax. Upload images with  and files with [name](file:///path/to/file.pdf).
Does easy-notion-mcp handle nested and complex content?
Yes. Nested toggles inside toggles, columns with mixed content types (lists, blockquotes, and code blocks in different columns), nested bullet and numbered lists, and full unicode support including Japanese, Chinese, Russian, Arabic, and emoji are covered by round-trip tests for these supported shapes.
Does easy-notion-mcp handle partial failures in batch operations?
Yes. add_database_entries returns separate succeeded and failed arrays. If one entry fails validation, the others still get created. Agents can retry just the failures without re-sending the whole batch.
Community
There's a community Discord at discord.gg/S8cghJSVBU. The #easy-notion-mcp channel covers setup questions and design discussion, and the rest of the server is open for show-and-tell or general conversation. For bugs and concrete feature requests, GitHub issues remain the canonical channel.
Contributing
Issues and PRs welcome on GitHub.
License
MIT
Available Tools
43 toolsadd_commentA
Add a comment to a page. Supports inline markdown and page mentions with @Title. Unlike append_content, a mention the integration cannot resolve is not downgraded to a plain link and returns no warning, so the call can fail. Returns { id, content }.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Comment text (supports markdown inline formatting) | |
| page_id | Yes | Page ID | |
| collapse_soft_wraps | No | Collapse single line breaks to spaces per CommonMark before writing. Default false (single line breaks are kept as they are today). Recommended when posting hard-wrapped prose. Do not use when re-posting content read from Notion, or intentional line breaks will be lost. Blank lines are unaffected. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It discloses that unresolved mentions cause the call to fail, that no warning is returned, and that the response shape is { id, content }. This is meaningful transparency beyond the schema, though it does not address permissions or other side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, no filler. The primary action comes first, the important failure caveat is second, and the return shape is last. Every sentence earns its place and the description remains compact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a comment-creation tool with no output schema and no annotations, the description covers the essential operational details: what the tool does, the expected return shape, and a critical failure mode. It is not exhaustive, but it is complete enough for an agent to invoke the tool correctly in most cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value beyond the schema by spelling out the mention syntax @[Title](notion-url) and clarifying that this syntax is supported in inline comment text. This supplements the schema's simpler 'supports markdown inline formatting.'
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb and resource: 'Add a comment to a page.' It also differentiates itself from append_content by explaining a key mention-resolution difference, so an agent can distinguish this tool from a closely related sibling without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the primary use case clear—add a comment to a page—and provides a meaningful comparison to append_content regarding unresolved mentions. It does not enumerate all alternatives or edge cases, but the context is sufficient for an agent to choose this tool over sibling comment-related operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| entries | Yes | Array of property objects, same format as add_database_entry | |
| page_id | No | Alias accepted when database_id is absent. If the ID is a page containing exactly one inline database, it resolves to that database. Providing both database_id and page_id with different values is an error. | |
| database_id | No | Database ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden. It meaningfully reveals per-entry results and that partial failures don't block the batch, which is important batch behavior. It doesn't address permissions or failure details of the whole call, but for a create operation this is reasonable coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with no filler. The core purpose is front-loaded, and each sentence adds useful information: batch creation, format reference, and failure behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is adequate for a moderately simple batch-create tool. It covers the operation, the entry format, and the key behavioral nuance of partial failures. Minor gaps such as response shape details and any batch size limits are acceptable given the succinctness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters are documented. The description mostly restates what the entries parameter already says about using the same format as add_database_entry, adding little new parameter-level meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Create multiple entries in a database in one call.' It also clearly differentiates this from the singular sibling add_database_entry by emphasizing the batch nature.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The batch context is clear: use this when creating multiple database entries at once. It does not explicitly state exclusions or name alternatives as a routing rule, but the intent is obvious enough for an agent to choose between this and the singular sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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:
title, rich_text: string
number: number
select, status: option name string
multi_select: array of option name strings
date: ISO date string (start only)
checkbox: boolean
url, email, phone: string
relation: string or array of page IDs
people: string or array of user IDs
Not writable from this tool:
formula, rollup, unique_id, created_time, last_edited_time, created_by, last_edited_by: computed by Notion
files, verification, place, location, button: not supported for value writes here
Example: { "Name": "Buy groceries", "Status": "Todo", "Priority": "High", "Due": "2025-03-20", "Tags": ["Personal"] }.
| Name | Required | Description | Default |
|---|---|---|---|
| page_id | No | Alias accepted when database_id is absent. If the ID is a page containing exactly one inline database, it resolves to that database. Providing both database_id and page_id with different values is an error. | |
| properties | Yes | Key-value property map to convert using the database schema | |
| database_id | No | Database ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses writable property types, notes date is start-only, and lists computed or unsupported properties that cannot be written. It doesn't discuss response format, failures, or permissions, but still provides substantial behavioral clarity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured well: purpose, prerequisite, type mappings, exclusions, and example. It is longer than average, but the density of actionable information justifies the length and it remains scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a create operation with no output schema or annotations, the description provides preconditions, accepted value shapes, and unsupported properties needed to invoke it correctly. It doesn't describe response format or error behavior, but those are less critical for a straightforward creation call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even though schema coverage is 100%, the description adds significant meaning beyond the schema by mapping each Notion property type to concrete JSON input shapes and giving an example object. It also clarifies unsupported property categories, greatly enriching the vague 'properties' parameter description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Create one database entry using simple key-value property inputs,' naming a specific verb and resource. The singular 'one' differentiates it from siblings like add_database_entries and update_database_entry.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly directs agents to 'Call get_database first' to discover valid property names and select/status options, giving a clear prerequisite. It doesn't explicitly name alternative tools or when-not-to-use conditions, but the single-entry scope and property guidance make intended usage clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
append_contentA
Append markdown content to an existing page. The server converts markdown into native Notion blocks, not flat/plain text. The server automatically handles Notion API limits: batches more than 100 child blocks, splits rich text over 2000 characters, and writes deeply nested blocks in additional passes, so callers can append large documents in one call with no need to pre-chunk or pre-split. Supports the same syntax as create_page; read resource easy-notion://docs/markdown for the full syntax guide. Page mentions: @Title; a mention the integration cannot resolve is downgraded to a plain link and reported with a mention_target_unresolved warning. Returns: { success: true, blocks_added: }, plus block_map for top-level appended blocks when present and warnings when present.
| Name | Required | Description | Default |
|---|---|---|---|
| page_id | Yes | Page ID | |
| markdown | Yes | Markdown to append | |
| return_block_map | No | Include block_map in the response. Default true. Set false to skip the per-block id list when you do not plan to edit individual blocks. | |
| collapse_soft_wraps | No | Collapse single line breaks to spaces per CommonMark before writing. Default false (single line breaks are kept as they are today). Recommended when uploading hard-wrapped prose files (e.g. repo markdown wrapped at 78 columns). Do not use when re-uploading content read from Notion, or intentional line breaks will be lost. Blank lines and code blocks are unaffected. Note: replace_content renders an in-paragraph line break as a separate paragraph regardless of this option. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full responsibility for disclosing behavior, and it does so thoroughly: it explains server-side batching, rich text splitting, nested block handling, mention resolution fallback with a warning, and the exact return shape. This far exceeds typical MCP descriptions and leaves little hidden behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence earns its place: purpose, conversion semantics, rate-limit handling, syntax compatibility, mention behavior, and return payload. It is front-loaded with the core purpose and contains no filler or redundant restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there is no output schema and no annotations, the description is remarkably complete—it covers behavior, limitations, error/warning conditions, return values, and even references a syntax guide for advanced usage. The only minor omission is explicitly stating insertion position, but 'append' already conveys that clearly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds meaningful context beyond the schema by explaining the markdown conversion behavior, pointing to the full markdown syntax guide, and detailing mention fallback behavior for the markdown parameter. This materially improves parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('append'), a specific resource ('markdown content to an existing page'), and the semantics ('converts markdown into native Notion blocks'). It differentiates from sibling tools like create_page and replace_content by framing the action as additive to an existing page.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly indicates this tool is for appending to existing pages and explicitly notes that large documents can be sent in one call without pre-chunking, which guides when it is appropriate. It does not explicitly contrast with replace_content or create_page in a when-to-use/when-not-to-use list, but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
archive_pageC
Archive a page in Notion.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | Preview the archive target without mutating Notion. Default false. | |
| page_id | Yes | Page ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description does not disclose behavioral traits beyond the minimal verb. No annotations are present, so the description must cover behaviors like reversibility or side effects, but it fails to do so. The presence of the 'dry_run' parameter implies mutability, but this is not explained.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence, concise and to the point. It could be improved by adding structured details, but it wastes no words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is minimal and does not address the tool's behavior in context. With sibling tools like 'archive_toggle', 'restore_page', and 'delete_*' operations, more context is needed to differentiate. The 'dry_run' parameter and return values are not described.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage with descriptions for both parameters. The tool description adds no additional meaning beyond the schema, so it meets the baseline of 3 without adding value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (archive) and resource (page) within Notion. It is specific enough to distinguish from sibling tools like 'archive_toggle' by resource variation, but lacks further detail on what archiving entails.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. There is no mention of prerequisites, non-archiving cases, or references to related tools like 'restore_page' or 'delete_database_entry'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Toggle title to find (case-insensitive) | |
| dry_run | No | Preview the archive target without mutating Notion. Default false. | |
| page_id | Yes | Page ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description bears full burden. Discloses recursive search, case-insensitive matching, archiving of container only (children not deleted), and behavior on missing title (returns available titles). Covers key behaviors but could mention if action is reversible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, no fluff, front-loaded with main purpose. Each sentence adds distinct value: verb, search specifics, archiving behavior, edge case.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers matching logic, archival behavior, and missing title edge case. No output schema, so return value on success is not specified, but overall complete for a simple tool. Could mention permissions or reversibility.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for all params. Description adds minimal extra meaning (e.g., 'case-insensitive trimmed text' reinforces title param, but overall adds little beyond schema). Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states verb 'archive', resource 'one toggle by title from a page', and specifies matching logic including toggle blocks and headings. Distinguishes from siblings like restore_toggle and read_toggle.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implied usage for archiving a single toggle by title, but no explicit when-to-use vs alternatives (e.g., archive_page) or when-not-to-use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_databaseA
Create a database under a parent page.
Supported property types and extras:
title
rich_text (alias: text)
number (optional: format, for example "dollar", "percent", "number_with_commas")
select, multi_select, status (optional: options array of strings or {name, color, description})
date, checkbox, url, email, phone
formula (required: expression, for example "prop("Count") * 2")
rollup (required: function, relation_property, rollup_property)
relation (required: data_source_id; optional: relation_type "single_property" or "dual_property", synced_property_name)
unique_id (optional: prefix, for example "ENG")
people, files
created_time, last_edited_time, created_by, last_edited_by
verification, place, location, button
Unknown property types fail with an explicit error. No silent drops.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Database title | |
| schema | Yes | Array of {name, type} property definitions | |
| is_inline | No | Create the database inline within the parent page | |
| parent_page_id | Yes | Parent page ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries the behavioral burden. It explicitly states that unknown property types 'fail with an explicit error. No silent drops,' which is critical for safe tool invocation. It also lists supported types and optional extras, ensuring the agent knows exactly what will happen.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear opening sentence followed by a bulleted list of property types. It is informative without being verbose, though it could be slightly more concise by omitting redundant wording (e.g., 'optional' repeated). Still, it earns its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description is remarkably complete. It covers the core action, property type options, error handling, and even provides usage examples for extras. The agent has sufficient context to use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage for parameters, so the baseline is 3. The description adds significant value to the 'schema' parameter by detailing supported property types, aliases, and extras (e.g., format for number, options for select). This exceeds the schema's basic array definition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the exact action: 'Create a database under a parent page.' It lists supported property types, which distinguishes it from sibling tools like create_page or add_database_entry. The verb+resource is specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use this tool (to create a database with specific property types). It does not explicitly mention when not to use it or provide alternatives, but the extensive type list implies applicability. A brief note about alternatives (e.g., use add_database_entry for adding entries) would improve it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_pageA
Create a Notion page from markdown as native Notion blocks. Server handles 100-block batching, 2000-char splitting, and deep nesting, so no pre-chunking. Supports stdio-only file:// uploads. Syntax: easy-notion://docs/markdown. Mentions: @Title. Returns { id, title, url, success: true }, note for workspace-parent pages, plus block_map for top-level created blocks when present.
| Name | Required | Description | Default |
|---|---|---|---|
| icon | No | Optional emoji icon | |
| cover | No | Optional cover image URL | |
| title | Yes | Page title | |
| markdown | Yes | Markdown content for the page body | |
| parent_page_id | No | Parent page ID. Resolution order when omitted: NOTION_ROOT_PAGE_ID env var → last used parent in this session → workspace-level private page (OAuth mode). In stdio mode without NOTION_ROOT_PAGE_ID, this is required on first use. | |
| return_block_map | No | Include block_map in the response. Default true. Set false to skip the per-block id list when you do not plan to edit individual blocks. | |
| strip_leading_h1 | No | Remove the document's leading H1 heading. Applies only when the first converted top-level block is a plain (non-toggleable) heading_1. Useful when title is also passed and the file begins with the same heading. Default false. | |
| collapse_soft_wraps | No | Collapse single line breaks to spaces per CommonMark before writing. Default false (single line breaks are kept as they are today). Recommended when uploading hard-wrapped prose files (e.g. repo markdown wrapped at 78 columns). Do not use when re-uploading content read from Notion, or intentional line breaks will be lost. Blank lines and code blocks are unaffected. Note: replace_content renders an in-paragraph line break as a separate paragraph regardless of this option. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does it well: it discloses server-side batching/splitting/nesting behavior, the stdio-only file:// upload constraint, and the return shape including block_map. It could add failure modes or permission requirements, but the major behavioral traits are transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but free of filler. Every sentence adds operational value: purpose, server-side handling, upload constraints, syntax, and return format are all covered without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a write tool with no output schema, the description adequately covers the return object, batching behavior, and syntax rules, with parameter resolution delegated to the rich input schema. The main gaps are error/failure semantics and explicit routing guidance relative to sibling tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaningful parameter-level context by defining the markdown syntax extensions (easy-notion://docs/markdown and @[Title](notion-url)) and clarifying when block_map is relevant. This goes beyond the schema's generic 'Markdown content' description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description is highly specific: 'Create a Notion page from markdown as native Notion blocks' names the verb, resource, input format, and conversion behavior. It also semantically separates itself from the sibling create_page_from_file by emphasizing in-memory markdown rather than file input.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear operational context: the server handles batching, splitting, and nesting, so the agent should not pre-chunk input. It also documents supported syntax for uploads and mentions. It stops short of explicitly naming alternative tools or saying when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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. The server converts the markdown to native Notion blocks (not flat text) and automatically handles Notion's limits (100-block batching, 2000-char splitting, deep nesting), so large files need no pre-chunking.
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:
file_path must be an ABSOLUTE path (no relative paths, no ~ expansion)
File must be inside the configured workspace root (defaults to the server's process.cwd(); override via the NOTION_MCP_WORKSPACE_ROOT env var)
File extension must be .md or .markdown
File size must be ≤ 1 MB (1,048,576 bytes)
File must be valid UTF-8
Symlinks are resolved and the resolved path must still be inside the workspace root
For supported markdown syntax, read resource easy-notion://docs/markdown. Page mentions: @Title. Returns: { id, title, url, success: true }, plus note only when created as a private workspace page, plus block_map for top-level created blocks when present.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Page title | |
| file_path | Yes | Absolute path to a local .md or .markdown file (≤ 1 MB, UTF-8, inside the configured workspace root) | |
| parent_page_id | No | Parent page ID. Same resolution rules as create_page. | |
| return_block_map | No | Include block_map in the response. Default true. Set false to skip the per-block id list when you do not plan to edit individual blocks. | |
| strip_leading_h1 | No | Remove the document's leading H1 heading. Applies only when the first converted top-level block is a plain (non-toggleable) heading_1. Useful when title is also passed and the file begins with the same heading. Default false. | |
| collapse_soft_wraps | No | Collapse single line breaks to spaces per CommonMark before writing. Default false (single line breaks are kept as they are today). Recommended when uploading hard-wrapped prose files (e.g. repo markdown wrapped at 78 columns). Do not use when re-uploading content read from Notion, or intentional line breaks will be lost. Blank lines and code blocks are unaffected. Note: replace_content renders an in-paragraph line break as a separate paragraph regardless of this option. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries the behavioral burden. It discloses file validation, automatic 100-block batching, 2000-char splitting, deep-nesting handling, symlink resolution, workspace-root enforcement, and the exact return shape. This is unusually transparent for a tool definition.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence earns its place. It front-loads the core purpose, then logically groups mode restrictions, file constraints, markdown reference, and return value. The bulleted restriction list improves scannability without wordiness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with no output schema and no annotations, this description is remarkably complete: it covers prerequisites, environmental constraints, file validation rules, conversion behavior, return values, and edge-case options. An agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds significant meaning beyond the schema: absolute-path requirements, workspace-root default and override, symlink resolution, file-size and encoding limits, and detailed behavior for collapse_soft_wraps with usage recommendations. The parameter descriptions are materially enhanced.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb-resource pair ('Create a Notion page from a local markdown file') and explicitly distinguishes itself from create_page by noting it produces the same result without sending file contents through the agent context. This makes its purpose unmistakable even among many sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is explicit: it is STDIO mode only, unavailable over HTTP, and appropriate when file contents should not pass through agent context. It also names create_page as the equivalent alternative and provides concrete do/don't guidance for collapse_soft_wraps, plus a resource for supported markdown syntax.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_viewA
Create a Notion database view. Pass database_id. Dashboard views and dashboard widget placement are not supported.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | View name | |
| type | Yes | View type. Dashboard is intentionally unsupported. | |
| sorts | No | Raw Notion view sorts payload | |
| filter | No | Raw Notion view filter payload | |
| position | No | Raw Notion view tab position payload | |
| database_id | Yes | Database ID | |
| configuration | No | Raw Notion view configuration payload. Dashboard configuration is rejected. | |
| quick_filters | No | Raw Notion quick filters payload |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It notes unsupported types but fails to mention side effects, return values, or error scenarios. The minimal detail is adequate for a simple create operation but lacks depth for complex configurations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences deliver all necessary purpose and usage notes without extraneous content. The front-loading of the core function is effective.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 8 parameters, no output schema, and no annotations, the description is incomplete for a fully autonomous agent. While it covers the basic requirement and a key limitation, it lacks details on success behavior, error handling, and nested object structures.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters. The description adds only a brief instruction to pass database_id and reiterates the dashboard exclusion seen in the schema, providing marginal added value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Create a Notion database view,' specifying the verb and resource. It also distinguishes itself from sibling tools like delete_view and update_view by mentioning unsupported dashboard views, which helps avoid misuse.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description instructs to 'Pass database_id,' indicating a prerequisite, and explicitly states 'Dashboard views and dashboard widget placement are not supported,' providing clear exclusion criteria. However, it does not compare with alternatives like update_view or query_view.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_database_entryB
Delete (archive) a database entry.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | Preview the entry archive/delete target without mutating Notion. Default false. | |
| page_id | Yes | Database entry page ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description only states the action with no behavioral details like reversibility, side effects, or permissions; the dry_run parameter is not referenced, leaving the agent uninformed about preview capability.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence is concise and front-loaded with verb and object, but it could be more structured to include behavior or guidelines; still effective.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is insufficient for a deletion/archival tool; it lacks disclosure of destructive nature, reversibility, or the dry_run parameter's purpose; sibling tools like archive_page may overlap but are not differentiated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema provides full descriptions for both parameters (page_id string, dry_run boolean for preview), so description adds no additional value but also doesn't detract; baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses specific verb 'delete' with parenthetical 'archive' to clarify the action on a 'database entry', which distinguishes it from sibling tools like archive_page or update_database_entry.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No usage context is provided; the description does not differentiate when to use delete vs archive vs other database entry modifications.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_viewA
Delete a Notion database view. Destructive: confirm must be exactly true.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be exactly true to delete the view unless dry_run is true | |
| dry_run | No | Preview the delete target without mutating Notion. Default false. | |
| view_id | Yes | View ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavioral traits. It notes the tool is destructive and requires confirmation, but does not elaborate on side effects, permissions, or reversibility. The schema adds some transparency via confirm and dry_run, but the description itself is minimal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise with two sentences, front-loading the purpose. No unnecessary words, making it easy for an agent to quickly grasp the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the three-parameter schema with thorough descriptions and no output schema, the description is adequate but lacks broader context such as when to prefer this tool over siblings, required permissions, or typical use cases. It meets minimum completeness but has gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, providing clear purpose for each parameter. The description adds no additional meaning beyond the schema, so baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Delete' and the resource 'Notion database view', making the purpose unambiguous. It distinguishes from siblings like delete_database_entry by specifying the resource type.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description mentions that the tool is destructive and requires confirm to be true, providing a condition for safe use. However, it does not explicitly state when to use this tool over alternatives or provide exclusions, leaving some ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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 warnings field with code omitted_block_types. Notion AI meeting notes are duplicated as ordinary toggle/heading/paragraph blocks (summary and notes only — transcripts are not duplicated); a read_only_block_rendered warning is emitted to identify meeting-notes blocks whose native identity was not preserved across the duplicate. Deep-duplication of subpages is not yet supported.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Title for the new page. Defaults to source title + ' (Copy)' | |
| page_id | Yes | Source page ID to duplicate | |
| parent_page_id | No | Parent page ID for the new page. Falls back to source page's parent, then follows the same resolution as create_page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behaviors: reads all blocks, omits unsupported types with warnings, handles AI meeting notes (converts to ordinary blocks), and notes that deep-duplication is not supported. This provides comprehensive transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is detailed but not overly verbose; it front-loads the main purpose and uses examples for clarity. It could be slightly more concise, but the structure is logical and informative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema or annotations, the description fully addresses the tool's complexity: it covers behavior, warnings, limitations, and edge cases (AI meeting notes, subpages). The agent has sufficient information to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with parameter descriptions. The description adds value beyond the schema by explaining the title default behavior and parent_page_id fallback resolution, which are not fully covered in the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Duplicate a page' and specifies the action: reads all blocks and creates a new page with same content. It distinguishes from siblings like move_page (moving) and create_page (creating from scratch) by detailing the duplication behavior and limitations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implicitly guides usage by listing limitations (e.g., unsupported block types omitted, deep-duplication not supported), but does not explicitly state when to avoid the tool or name alternative tools. However, no other duplication tool exists among siblings, making the guidance adequate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| find | Yes | Text to find (exact match) | |
| dry_run | No | Preview match counts without mutating Notion. Default false. | |
| page_id | Yes | Page ID | |
| replace | Yes | Replacement text | |
| replace_all | No | Replace all occurrences. Default: first only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that find_replace preserves uploaded files and untounched blocks, indicating non-destructive behavior. It could additionally mention irreversibility, but the provided info is strong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no wasted words. The purpose is stated first, followed by valuable usage context. Perfectly front-loaded and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, full schema coverage, and lack of output schema, the description covers purpose, usage guidelines, and behavioral transparency adequately. No gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and all parameters are well-described in the schema. The description adds value by giving usage examples (typos, URLs, terms) but does not significantly extend parameter meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Find and replace text on a page.' and explicitly differentiates from sibling tool replace_content by highlighting efficiency for targeted changes like fixing typos, updating URLs, or renaming terms.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance ('targeted text changes') and when-not-to-use ('more efficient than replace_content'), along with behavioral notes like preserving untouched blocks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_configA
Report this server's own settings: version, transport, the workspace root that bounds create_page_from_file file paths, and how many tools are visible. Call this when a file-path or configuration error occurs and you need the server's actual settings rather than a guess. Read-only, makes no Notion API call, and never returns credentials. Returns { version, transport, workspace_root_configured, workspace_root_resolved, workspace_root_status, workspace_root_source, markdown_docs, visible_tools_count }.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and it excels: it declares 'Read-only, makes no Notion API call, and never returns credentials.' This discloses safety and scope explicitly. It also states the exact return fields, adding transparency beyond typical descriptions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two well-structured sentences. The first fronts the purpose and key outputs; the second gives usage context and safety guarantees. Every sentence earns its place, and there is no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple diagnostic tool with no parameters, no annotations, and no output schema, but the description supplies everything needed: what it does, when to call it, its read-only nature, and the exact return structure. Nothing is missing for an agent to use it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema (empty) already covers them 100%. The description doesn't need to add parameter details, and the baseline for no parameters is 4. It adds no unnecessary parameter information, which is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool 'Reports this server's own settings' and names specific elements: version, transport, workspace root, and visible tools count. It is a diagnostic tool distinct from the many content-focused siblings, so an agent can tell it apart without confusion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Call this when a file-path or configuration error occurs and you need the server's actual settings rather than a guess.' This provides a concrete trigger condition. It doesn't mention when not to use it or alternatives, but the tool is unique enough that no alternative is obvious; still, some negative guidance is missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| page_id | No | Alias accepted when database_id is absent. If the ID is a page containing exactly one inline database, it resolves to that database. Providing both database_id and page_id with different values is an error. | |
| database_id | No | Database ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the disclosure burden. It communicates that this is a retrieval operation and specifies what the response contains, though it does not explicitly discuss errors, side effects, or permission expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with the purpose front-loaded and a concrete usage directive following immediately. Every sentence earns its place, and there is no redundant phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple schema-lookup tool, the description plus the complete schema gives the agent the accepted identifiers, the output scope, and the follow-up tools. The absence of an output schema is mitigated by the explicit summary of return content.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and both parameters are fully described in the input schema, including the page_id alias rule. The description adds no parameter-specific meaning beyond what the schema already provides, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names an explicit action and object: 'Get a database's schema' and specifies the returned content (property names, types, and select/status options). This clearly distinguishes it from query_database and other tools in the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly tells the agent to call this before query_database or add_database_entry to discover valid property names and values. It does not describe negative cases or alternatives exhaustively, but the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_meA
Get the current bot user.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description lacks any behavioral details (e.g., read-only, permissions, or side effects). For a simple get operation, a statement like 'Read-only, returns user object' would help.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one concise sentence with no wasted words. It could be improved by adding return info without sacrificing conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless tool with no output schema, the description is minimally adequate but fails to mention what the tool returns (e.g., user object). Adding a brief return description would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and schema description coverage is 100%. According to rules, 0 parameters earns a baseline score of 4, as no additional parameter documentation is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Get the current bot user' uses a specific verb ('Get') and a clear resource ('current bot user'), which distinguishes it from sibling tools that operate on pages, comments, databases, etc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
While no explicit when-to-use or alternative guidance is provided, the tool's purpose is unique among siblings (only tool for bot user info), so implicit context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_viewA
Retrieve one Notion database view by ID. Returns a curated summary (id, name, type, url, data_source_id); set include_config: true for the full raw Notion view object.
| Name | Required | Description | Default |
|---|---|---|---|
| view_id | Yes | View ID | |
| include_config | No | Return the full raw Notion view objects (filter, sorts, configuration, parent) instead of the curated summary. Default false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses the default output as a curated summary with specific fields (id, name, type, url, data_source_id) and the alternative full raw object. No annotations provided, so description carries the burden well.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no wasted words. Front-loaded with core action, followed by parameter tip.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and 2 parameters with full schema coverage, the description sufficiently explains what the tool returns and the key parameter behavior. Could mention prerequisite that the view ID must exist, but not critical.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but description adds value by explaining the distinction between the default curated summary and the full object when include_config=true, beyond the schema's 'Return the full raw' statement.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description uses specific verb 'Retrieve' and resource 'Notion database view by ID', clearly distinguishing from sibling tools like create_view, delete_view, update_view, list_views.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a usage hint for the include_config parameter but does not explicitly state when to use this tool versus alternatives (e.g., list_views, query_view). The context is adequate but lacks exclusions or when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_commentsB
List comments on a page.
| Name | Required | Description | Default |
|---|---|---|---|
| page_id | Yes | Page ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description does not disclose behavioral traits such as whether it returns all comments or paginated data, ordering, or required permissions. The description carries the full burden but fails to provide this context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One succinct sentence that directly states the tool's purpose with no extraneous information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is minimal but sufficient for a simple list tool with one parameter. However, it lacks details on pagination, sorting, or comment threading, which could be relevant.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a single parameter 'page_id' described as 'Page ID'. The description adds no extra meaning beyond the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'List comments on a page.' clearly identifies the action (list) and resource (comments on a page), distinguishing it from sibling tools like add_comment or list_pages.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives (e.g., search_in_page for filtered comments) or when not to use it. The description does not provide usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_databasesA
List all databases the integration can access. Returns database names and IDs — use get_database on any result to see its schema.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so description must cover behavior. It discloses that the tool lists accessible databases, implying read-only and access control, but omits details like error handling, rate limits, or whether results are ordered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with purpose, no extraneous words. Efficient and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter list tool with no output schema, the description adequately explains what it returns and suggests a next action. Could mention empty results or errors, but is sufficient for typical use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 0 parameters with 100% coverage; baseline is 4. Description adds no parameter info, but none is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states verb "List" and resource "databases", specifies scope "all databases the integration can access", and distinguishes from sibling list tools (e.g., list_pages). Offers a concrete next step: use get_database on results.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context by stating the action and return values, and implicitly guides to use get_database for schema. However, no explicit when-not or alternative specifications.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_pagesA
List child pages under a parent page. Each row returns id, title, created_time, and last_edited_time. Timestamps are full ISO-8601 values from Notion, rounded to the minute, and last_edited_time advances on page content and property edits.
| Name | Required | Description | Default |
|---|---|---|---|
| parent_page_id | Yes | Parent page ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It usefully discloses timestamp formatting (ISO-8601, rounded to the minute), the fact that last_edited_time updates on content and property edits, and the returned row structure. It does not mention pagination or ordering, but the disclosed details are meaningful and not redundant.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the primary action appears first, followed by the returned fields and a useful timestamp caveat. Every sentence adds value, and there is no padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read tool with no output schema, the description adequately covers what the result contains and important timestamp nuances. It could also mention pagination, sorting, or whether archived pages are included, but the core invocation and return semantics are sufficiently specified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the parameter's schema description ('Parent page ID') already explains its role. The tool description adds no further parameter-level detail such as ID format or validity rules, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('List child pages under a parent page'), identifies the target resource, and lists the returned fields. This makes the tool's purpose concrete and easily distinguishable from siblings like list_databases or list_views.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes clear this tool is for listing child pages directly under a given parent page. It does not explicitly name alternatives or state when not to use it, but the parent-page scoping and single required parameter imply the correct usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_usersB
List workspace users.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description does not disclose any behavioral traits such as read-only nature, permission requirements, or output characteristics. It provides no additional behavioral context beyond the implied listing operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with a single sentence, containing no unnecessary words. Every word is purposeful, efficiently conveying the tool's function.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simplicity of the tool (no parameters, no output schema), the description is adequate but minimal. It lacks details about pagination, sorting, or potential filtering, which could be useful context for the agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters, so schema coverage is effectively 100%. The description adds no parameter details, but none are needed. The baseline for zero parameters is 4, as the description adequately covers the schema's emptiness.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (list) and the resource (workspace users), making the purpose unambiguous. However, it does not differentiate from sibling list tools like list_pages or list_databases, which share similar verb-noun construction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. With many list tools available, the description lacks any context about prerequisites, scope, or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_viewsA
List Notion database views. Pass exactly one of database_id or data_source_id. Returns a curated summary of each view (id, name, type, url, data_source_id) plus pagination cursors; set include_config: true for the full raw Notion view objects.
| Name | Required | Description | Default |
|---|---|---|---|
| page_size | No | Maximum number of views to return | |
| database_id | No | Database ID | |
| start_cursor | No | Pagination cursor from a previous response | |
| data_source_id | No | Data source ID | |
| include_config | No | Return the full raw Notion view objects (filter, sorts, configuration, parent) instead of the curated summary. Default false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses return format (curated summary with fields, pagination cursors) and the effect of include_config, but does not explicitly state that the tool is read-only, which is important given no annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, each with essential information: purpose, parameter constraint, return format, and configuration option. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers main return structure and pagination, but lacks default page_size, error handling, or explicit mention of optional parameters. With no output schema, a bit more detail could be beneficial.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Adds meaning beyond schema by clarifying the exclusivity of database_id/data_source_id and the behavior of include_config. Schema coverage is 100%, so a 3 is baseline; the description provides added value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it lists Notion database views and specifies the mutually exclusive parameters (database_id or data_source_id). However, it does not differentiate from sibling tools like get_view, query_view, or create_view.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides specific guidance on parameter exclusivity and the include_config option, but no explicit guidance on when to use list_views versus alternatives like query_view or get_view.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_pageB
Move a page to a new parent page.
| Name | Required | Description | Default |
|---|---|---|---|
| page_id | Yes | Page ID to move | |
| new_parent_id | Yes | New parent page ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided; description fails to disclose side effects (e.g., child pages, permissions) or behavioral constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, front-loaded, no extraneous content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequate for a simple two-parameter tool, but lacks detail on expected behavior or return values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with clear descriptions; tool description adds no extra meaning beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states action (move), resource (page), and target (new parent page), distinguishing it from sibling tools like duplicate_page or archive_page.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool vs alternatives (e.g., duplicate or archive), nor any prerequisites or limitations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Search text — matches across all text fields (title, rich_text, url, email, phone) | |
| sorts | No | Optional Notion sorts array | |
| filter | No | Optional Notion filter object | |
| page_id | No | Alias accepted when database_id is absent. If the ID is a page containing exactly one inline database, it resolves to that database. Providing both database_id and page_id with different values is an error. | |
| database_id | No | Database ID | |
| max_property_items | No | Max items returned per multi-value property (title, rich_text, relation, people). Default 75. Set to 0 for unlimited. Negative values rejected. When the cap is hit, the response includes a truncated_properties warning with a how_to_fetch_all hint. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It discloses the response shape, warning behavior, max_property_items cap, truncated_properties emission, and links to relevant docs. It stops short of explicitly stating read-only behavior or error handling, but overall it is transparent for a query tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with a concise purpose, followed by usage guidance and a compact response-shape explanation. Each sentence earns its place, including the links to edge-case documentation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter query tool with no output schema, the description covers the response format, parameter usage, and important edge-case behavior. It could optionally explain top-level result pagination, but the linked docs and warning details make it sufficiently complete for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 100% of parameters, so baseline is 3. The description adds value by explaining text search fields, advising get_database for advanced filter options, and detailing max_property_items behavior beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool queries a database and lists the available operations: filters, sorts, and text search. It differentiates from siblings like query_view by specifying the resource as a database, though it does not explicitly name the sibling alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides practical guidance on when to use text search versus advanced filters, and instructs the agent to call get_database first for valid property names. It does not explicitly contrast with query_view or state exclusion criteria, but the in-tool routing is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_viewB
Query a Notion database view. Creates a temporary view query, fetches database row results, then deletes the query.
| Name | Required | Description | Default |
|---|---|---|---|
| view_id | Yes | View ID | |
| page_size | No | Maximum number of results to return | |
| start_cursor | No | Pagination cursor from a previous view query results response |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so description carries burden. It discloses the create-fetch-delete lifecycle, which is important behavioral context. However, it doesn't mention error states, permissions, or side effects beyond deletion of the temporary query.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence front-loading the core action. Every word is necessary and no filler. Highly efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequate for a 3-parameter tool with no output schema. The lifecycle is explained, but lacks detail on return format or error handling. Given the absence of output schema, some expectation for return structure description is unmet.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with basic descriptions. The tool description adds no additional meaning beyond the schema. At baseline, no value added.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states verb+resource: 'Query a Notion database view.' It adds lifecycle detail (creates, fetches, deletes) which distinguishes it from a simple read. However, it doesn't explicitly differentiate from sibling tool 'query_database'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives like 'query_database' or 'get_view'. No exclusive or prerequisite conditions mentioned. The description only states what it does, not when to choose it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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_only_block_rendered warning. Transcripts are not included from these tools.
| Name | Required | Description | Default |
|---|---|---|---|
| block_id | Yes | Block ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description fully bears the burden of disclosure. It comprehensively covers behaviors: recursive children for containers, error for unsupported root blocks, omission with warnings for nested unsupported types, rendering of AI meeting-notes as synthetic toggles with warnings, and exclusion of transcripts. No missing critical traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with four sentences, each adding value. The main purpose is front-loaded. Minor redundancy could be trimmed, but overall it is efficient and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of block reading (multiple block types, recursive containers, unsupported types), the description covers key behaviors. No output schema exists, but the description partially compensates by mentioning markdown and warnings. Lacks structural details about the markdown output format.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage for the sole parameter (block_id). The description adds no additional semantic meaning beyond restating 'by ID'. Baseline of 3 is appropriate as schema already documents the parameter adequately.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reads one block by ID as markdown and includes details about container blocks and error handling. However, it does not explicitly differentiate from sibling tools like read_page or read_toggle, which reduces clarity for selection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool (to read a block by ID) but does not provide explicit guidance on when not to use it or when alternatives like read_page are more appropriate. No exclusions or contextual triggers are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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 ## Summary / ## Notes heading sections. Transcript sections are included only with include_transcript: true. A read_only_block_rendered warning is emitted whenever such a block is rendered, indicating that round-tripping the markdown through replace_content will replace the native meeting-notes block with ordinary blocks.
Note on max_blocks: the cap counts top-level page blocks only; section descendants of meeting-notes blocks are fetched in full regardless of the cap, consistent with how nested children of normal blocks are fetched.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| page_id | Yes | Page ID | |
| max_blocks | No | Maximum top-level blocks to return. Omit to return all. | |
| include_metadata | No | Include created_time, last_edited_time, created_by, last_edited_by in response. Default false. | |
| include_transcript | No | Include Notion AI meeting-notes transcript sections. Default false. Summary and Notes sections are always included when present. | |
| max_property_items | No | Max rich_text segments returned when a page title exceeds 25 segments (uncommon in practice). Default 75. Set to 0 for unlimited. Negative values rejected. When the cap is hit, the response includes a truncated_properties warning with a how_to_fetch_all hint. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, but the description fully discloses key behavioral traits: recursive fetching, handling of unsupported block types with warnings, synthetic rendering of Notion AI meeting notes, and max_blocks counting rules. This compensates for missing annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with paragraphs and bullet points, front-loading the core purpose. Slightly verbose in places, but each sentence adds value. Could be compacted slightly without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite lacking output schema, the description covers the response structure (metadata, markdown, warnings) and directs to external resources for conventions. Given the tool's complexity and 5 parameters, the description is remarkably complete and self-contained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% but the description adds significant nuance beyond the schema: max_blocks boundary behavior for meeting-notes descendants, max_property_items default and truncation handling, and include_transcript inclusion scope. Each parameter is enriched with practical context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states 'Read a page and return metadata plus markdown' and specifies recursive fetching, making the purpose clear. It distinguishes from sibling tools like read_block by focusing on entire page content with markdown conversion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides actionable guidance: warns against round-tripping markdown when omitted_block_types warnings are present, and clarifies when to use include_transcript. Does not explicitly list alternatives but the context is clear enough for correct invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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_only_block_rendered warning. Transcripts are not included from these tools.
| Name | Required | Description | Default |
|---|---|---|---|
| heading | Yes | Heading text to find (case-insensitive) | |
| page_id | Yes | Page ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries the burden of behavioral disclosure. It explicitly states case-insensitive heading matching, hierarchical boundary rules, handling of nested children, omission warnings for unsupported blocks, and synthetic rendering of Notion AI meeting-notes blocks with warnings.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, focused paragraph that front-loads the purpose. It is concise but includes necessary behavioral details without being verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers key aspects of behavior (heading matching, boundary rules, children rendering, warnings) but lacks explicit details about the return format and error cases (e.g., heading not found). Given no output schema, it is moderately complete but has gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both parameters. The description adds minimal additional meaning beyond confirming the case-insensitive matching behavior for the heading parameter. Per guidelines, a score of 3 is appropriate when schema coverage is high and description adds limited value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: to read a single page section by heading name. It uses a specific verb ('Read') and resource ('page section'), and distinguishes itself from siblings like update_section and read_page by referencing its unique behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the tool's behavior in detail but does not provide guidance on when to use this tool over alternatives (e.g., read_page, read_block). There are no explicit 'when to use' or 'when not to use' statements.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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 read_only_block_rendered warning. Transcripts are not included from these tools.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Toggle title to find (case-insensitive) | |
| page_id | Yes | Page ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description fully covers behavior: recursive search, case-insensitive trimmed matching, missing titles returning available toggle titles, synthetic toggle rendering for Notion AI meeting-notes blocks with a warning, and exclusion of transcripts.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, front-loaded with the main purpose, and every sentence adds value. It uses clear language without unnecessary repetition, making it efficient for an AI agent to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description adequately covers input usage, special behaviors, and limitations (transcripts not included). It is complete for the tool's scope and complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema describes page_id and title briefly. The description adds meaning by explaining how 'title' is matched (case-insensitive, trimmed text) and the recursive search behavior. This goes beyond the schema, though no per-parameter details are added for page_id.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reads a single toggle by title from a page, specifying it searches recursively and matches plain toggle blocks plus toggleable headings. It distinguishes itself from siblings like read_block or search by focusing on toggles by title.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for reading a specific toggle by title but lacks explicit when-to-use or when-not-to-use guidance. It does not reference alternative tools like search or read_block for other scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
replace_contentA
Replaces all page content with the provided markdown atomically (one Notion API call). Notion's atomic markdown endpoint converts the markdown to native Notion blocks in that one API call. On matched blocks Notion preserves the original block IDs, so deep-link anchors (#block-id) and inline-comment threads attached to those blocks survive the edit. Unmatched blocks (returned in warnings with code unmatched_blocks) are replaced with new IDs.
NOT preserved across replace_content: child_page subpages, synced_block instances, child_database views, and link_to_page references on the source page. Enhanced Markdown has no input form for these, so they are dropped from the new page content. If the source contains them, use duplicate_page first or edit those types via the Notion UI. For an inline page mention, use @Title; that is a separate construct from the link_to_page block type.
Bookmarks and embeds are written as bare URLs (Notion auto-links) and surface a bookmark_lost_on_atomic_replace or embed_lost_on_atomic_replace warning so callers know the rich preview is lost. For supported markdown syntax and warning details, read resources easy-notion://docs/markdown and easy-notion://docs/warnings. Returns: { success: true }, optionally truncated: true, optionally warnings with entries such as { code: "unmatched_blocks", block_ids: [...] }, plus block_map for the resulting top-level blocks when present. A dry run returns { success: true, dry_run: true, operation, page_id, would_update: true } and optionally warnings.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | Preview validation and planned effect without mutating Notion. Default false. | |
| page_id | Yes | Page ID | |
| markdown | Yes | Replacement markdown content | |
| return_block_map | No | Include block_map in the response. Default true. Set false to skip the per-block id list when you do not plan to edit individual blocks. | |
| collapse_soft_wraps | No | Collapse single line breaks to spaces per CommonMark before writing. Default false (single line breaks are kept as they are today). Recommended when uploading hard-wrapped prose files (e.g. repo markdown wrapped at 78 columns). Do not use when re-uploading content read from Notion, or intentional line breaks will be lost. Blank lines and code blocks are unaffected. Note: replace_content renders an in-paragraph line break as a separate paragraph regardless of this option. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden, and it delivers extensively. It discloses atomicity, block-ID preservation, unmatched block replacement, dropped page types, bookmark/embed preview loss, and warning codes. It also describes the dry-run behavior and response shape, so the agent knows exactly what to expect.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence earns its place, covering core behavior, preservation caveats, alternatives, parameter effects, docs references, and return values. The most important facts are front-loaded, with the atomic replacement behavior stated first and supporting details organized in a logical progression.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a complex tool with five parameters, no annotations, and no output schema, yet the description is nearly self-contained. It covers the return value with success/truncated/warnings/block_map details, documents the dry-run response, names warning codes, and points to docs for further detail. The only minor gap is that not every warning code is enumerated, but the description references docs and gives representative examples, which is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds meaningful semantic value beyond the schema. It explains the effect of collapse_soft_wraps on single line breaks, mentions that replace_content renders in-paragraph line breaks as separate paragraphs regardless of the option, and clarifies that bookmarks/embeds are written as bare URLs. These details help the agent choose parameter values correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Replaces all page content with the provided markdown atomically (one Notion API call).' This makes the tool's core action unmistakable and distinguishes it from sibling tools like append_content, which adds rather than replaces content. It also clarifies that this is an all-page replacement, not a targeted edit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use and when-not-to-use guidance, including 'use duplicate_page first or edit those types via the Notion UI' when the source contains child_page subpages or other unsupported constructs. It also provides concrete parameter-level guidance, such as recommending collapse_soft_wraps for hard-wrapped prose files and warning not to use it when re-uploading content read from Notion. This routes the agent to alternatives and away from misuse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restore_pageA
Restore an archived page.
| Name | Required | Description | Default |
|---|---|---|---|
| page_id | Yes | Page ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the burden. It only states the action without disclosing permissions, failure conditions, or return behavior, which is insufficient for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that gets straight to the point with no unnecessary words, fulfilling the requirement of being concise and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter tool, the description is minimally adequate but does not explain return values or edge cases, which would be helpful given the absence of an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage for 'page_id', and the description adds no additional meaning beyond what the schema provides. Baseline score is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool restores an archived page, using a specific verb and resource. It distinguishes itself from the sibling tool 'archive_page' which performs the opposite action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for unarchiving pages, but lacks explicit guidance on when to use this tool versus alternatives. However, the context of sibling tools makes it clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | Preview the restore target without mutating Notion. Default false. | |
| block_id | Yes | Archived toggle or toggleable heading block ID returned by archive_toggle |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided; description lacks details on side effects, permissions, or consequences (e.g., what happens if block is not archived).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no filler, efficiently conveying key information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers prerequisite and limitation, but lacks details on restore behavior (e.g., children, return value) given no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions; description adds context for block_id but not significantly beyond schema. Baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it restores an archived toggle or toggleable heading by block ID, distinguishing it from siblings like archive_toggle.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Specifies to use the block ID from archive_toggle and notes that Notion does not expose archived child enumeration, guiding when and how to use the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchA
Search Notion pages or databases. Use filter: 'databases' to find databases by name, then get_database for schema details.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query | |
| filter | No | Optional object filter |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, and description lacks disclosure of behavioral traits such as read-only nature, authentication needs, rate limits, pagination, or results format. For a search tool without annotations, more transparency expected.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely concise: two sentences with no filler. Front-loads the verb and resource, and includes a practical tip for using the filter. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the number of siblings and lack of output schema, the description is adequate but incomplete. It does not explain return values, pagination, or sorting. The workflow hint is helpful but not comprehensive for an agent to fully anticipate behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, but description adds value by explaining the 'databases' filter usage and linking to a workflow. The query parameter is minimally described; however, the description compensates by providing context beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Search Notion pages or databases' with specific verb and resource, and distinguishes from sibling tools like search_in_page. It provides actionable workflow (use filter 'databases' then get_database).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use the filter for databases and directs to get_database for schema details. Does not explicitly mention when not to use, but the sibling list implies alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Plain substring to search for (case-insensitive, non-empty) | |
| page_id | Yes | Page ID | |
| within_toggle | No | Optional toggle title to restrict search scope (case-insensitive) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of revealing behavioral traits. It discloses that matching is case-insensitive and substring-based, but does not describe what is returned (e.g., block IDs, context, count), whether pagination exists, or any side effects. For a read-only tool, this is insufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, no redundant words, and front-loads the core purpose. Every phrase earns its place without being verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description should cover what the tool returns, but it does not. It explains the search behavior and optional scope adequately, but leaves the return format and coverage (e.g., which block types) unstated. It is functional but not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description adds minimal detail: it only reemphasizes that the search is case-insensitive and that the optional scope is a toggle title. This does not add significant meaning beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it searches raw Notion block plain text inside a page, with optional scoping to a toggle. This distinguishes it from sibling tools like 'search' (global search) and 'find_replace' (find and replace). The verb 'search' and resource 'page' are specific and directly convey the function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool: for searching within a page's raw block text, optionally restricted to a toggle. However, it does not explicitly state when not to use it or contrast with alternatives like the global 'search' tool. The guidance is clear but lacks exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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, because 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, and children stay untouched. Non-updatable types (divider, table, image, bookmark, etc.) accept only archived: true to delete the block. Page mentions: @Title.
To delete a block, pass archived: true instead of markdown. Exactly one of markdown or archived is required.
| Name | Required | Description | Default |
|---|---|---|---|
| checked | No | to_do only: explicit check-state override (otherwise inferred from `- [x]` / `- [ ]`). | |
| dry_run | No | Preview validation and planned effect without mutating Notion. Default false. | |
| archived | No | Set true to delete the block (sends in_trash: true). | |
| block_id | Yes | Block ID to update | |
| markdown | No | New content for the block. Must parse to a single block of the same type as the existing block. For to_do blocks, `- [x]` / `- [ ]` syntax sets the checked state. | |
| collapse_soft_wraps | No | Collapse single line breaks to spaces per CommonMark before writing. Default false (single line breaks are kept as they are today). Recommended when uploading hard-wrapped prose files (e.g. repo markdown wrapped at 78 columns). Do not use when re-uploading content read from Notion, or intentional line breaks will be lost. Blank lines and code blocks are unaffected. Note: replace_content renders an in-paragraph line break as a separate paragraph regardless of this option. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full disclosure burden and does so extensively: it reveals type lock-in, identity preservation, container-block depth limits, non-updatable type behavior, and deletion via archived. These are non-obvious behavioral traits an agent could not infer from the schema or tool name.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The paragraphs are dense but each sentence adds a distinct constraint or usage rule; there is no filler. The core purpose is front-loaded, followed by when to use it, type restrictions, edge cases for containers and non-updatable types, and finally deletion semantics.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with six parameters and no output schema, the description covers the full decision space: valid types, invalid types, deletion, container behavior, and alternatives. No necessary calling condition or constraint appears to be missing, so an agent has enough information to invoke it correctly and predict side effects.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds critical relational semantics: exactly one of markdown or archived is required, markdown must parse to a single block of the same type, and archived true means deletion. It also clarifies the checked parameter's relationship to to_do markdown syntax, going beyond individual field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Update a single block in place by ID,' and differentiates itself from multi-block tools by labeling these as surgical edits. It also clarifies what identity preservation means with concrete examples (deep-link anchors and inline-comment threads), leaving no ambiguity about scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use the tool ('fixing a heading, toggling a checkbox, rewriting one paragraph') and names alternatives for multi-block edits (append_content, replace_content, update_section). It also gives exclusion criteria for type changes, directing to replace_content or delete + append, so an agent can route accurately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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:
title, rich_text: string
number: number
select, status: option name string
multi_select: array of option name strings
date: ISO date string (start only)
checkbox: boolean
url, email, phone: string
relation: string or array of page IDs
people: string or array of user IDs
Not writable from this tool:
formula, rollup, unique_id, created_time, last_edited_time, created_by, last_edited_by: computed by Notion
files, verification, place, location, button: not supported for value writes here
| Name | Required | Description | Default |
|---|---|---|---|
| page_id | Yes | Page ID for the database entry | |
| properties | Yes | Key-value property map to convert using the parent database schema |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, description fully discloses behavior: omitted properties unchanged, writable types enumerated, non-writable types listed. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with bullet points and clear sections. Front-loads purpose. Slightly verbose but every sentence is informative. Could be tightened slightly without losing clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of updating various property types, the description is complete. Covers all writable types, non-writable types, and a prerequisite step. No output schema, but behavior is fully explained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but description adds significant value by explaining the properties object format and listing all writable property types with examples, going beyond the schema's brief descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool updates an existing database entry with key-value properties. It distinguishes from siblings like add_database_entry and delete_database_entry by specifying that only properties to change are passed, and omitted properties remain unchanged.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance: call get_database first to see property names and valid options, pass only properties to change, and lists which properties are not writable. This answers when to use and what to avoid.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_data_sourceA
CRITICAL: full-list semantics. When you update a select or status property's options array, you MUST send the full desired list. Any existing option you omit will be permanently removed from the database, along with any relationship to rows currently using it. Rows that currently reference a removed option are silently reassigned to the default group's first option (for example "Not started" for status properties). No signal is raised. If you want to preserve the meaning of existing rows when removing an option, reclassify those rows to another explicit option before removing the option from the schema. To add one option, first call get_database, then resend the full current list with your addition appended.
Cannot toggle is_inline on existing databases. is_inline is a database-level field, not a data-source field. A separate update_database tool may be added later.
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 title, properties, or in_trash must be provided.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | New database title | |
| page_id | No | Alias accepted when database_id is absent. If the ID is a page containing exactly one inline database, it resolves to that database. Providing both database_id and page_id with different values is an error. | |
| in_trash | No | True to trash, false to restore | |
| properties | No | Raw Notion property update map | |
| database_id | No | Database ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It does this exceptionally well, disclosing that omitted options are permanently removed, affected rows are silently reassigned with no signal, and that is_inline changes are unsupported. This is precisely the kind of destructive and surprising behavior an agent must know before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is lengthy but each sentence carries substantive guidance. It is front-loaded with the critical destructive warning, followed by the inline exception and a clear summary of what the tool does. The structure is slightly unconventional—the core purpose statement appears near the end—but the density and organization are strong enough that nothing feels wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex mutation tool with zero annotations and no output schema, this description is exceptionally complete. It covers destructive edge cases, prerequisite calls, unsupported operations, accepted payload modes, documentation references, and required arguments. An agent has everything needed to invoke the tool correctly and avoid irreversible mistakes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds meaningful semantics beyond the schema, especially for the properties parameter: it explains full-list semantics for select/status options, the silent reassignment behavior, and the safe procedure for adding an option by first calling get_database. This extra guidance justifies a score above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states that this tool updates a database's schema: renaming properties, adding/updating/removing property definitions, changing the title, and moving to/from trash. This is a specific verb+resource and clearly distinguishes it from sibling tools like update_database_entry or update_view.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage context: 'Use after get_database', mandates reading the docs resource for modes and limitations, and warns that is_inline cannot be toggled on existing databases. It also explains the required parameters ('At least one of title, properties, or in_trash must be provided'), leaving little ambiguity about when and how to invoke the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| icon | No | Updated emoji icon | |
| cover | No | Updated cover image URL | |
| title | No | Updated page title | |
| page_id | Yes | Page ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries burden. It discloses that file:// URLs are rejected in HTTP transport, which is important behavioral detail. Does not cover auth or side effects, but acceptable for a simple update.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded purpose, each sentence adds necessary detail without fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but update operations often have simple responses. Description covers key behavioral nuances (URL types, transport). Missing potential partial update info, but adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, yet description adds value: clarifies icon is emoji, and cover has transport-specific handling. This goes beyond schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool updates page title, icon, or cover, with specific detail on cover URL types. This verb+resource combination is distinct from sibling tools like archive_page or duplicate_page.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides specific guidance on when to use file:// vs https:// cover URLs and notes transport-specific rejection. However, it does not explicitly compare to siblings like update_block for content updates.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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. Page mentions: @Title. Returns { deleted, appended }, plus deleted_blocks for the deleted top-level blocks when present and block_map for the top-level appended blocks when present. A dry run instead returns { success: true, dry_run: true, operation, page_id, heading, target_block_id, target_block_type, preserve_heading, deleted, appended, would_delete_block_ids, append_parent_id }, plus append_after_block_id when the append is anchored to a preceding block, and would_update with would_update_block_id when the heading block itself is rewritten.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | Preview validation and planned effect without mutating Notion. Default false. | |
| heading | Yes | Heading text to find (case-insensitive) | |
| page_id | Yes | Page ID | |
| markdown | Yes | Replacement markdown including the heading | |
| preserve_heading | No | Preserve the existing heading block and replace only the section body. Default false. | |
| return_block_map | No | Include block_map in the response. Default true. Set false to skip the per-block id list when you do not plan to edit individual blocks. | |
| collapse_soft_wraps | No | Collapse single line breaks to spaces per CommonMark before writing. Default false (single line breaks are kept as they are today). Recommended when uploading hard-wrapped prose files (e.g. repo markdown wrapped at 78 columns). Do not use when re-uploading content read from Notion, or intentional line breaks will be lost. Blank lines and code blocks are unaffected. Note: replace_content renders an in-paragraph line break as a separate paragraph regardless of this option. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full disclosure burden and succeeds impressively. It opens with 'DESTRUCTIVE, no rollback,' details the mid-call failure mode (section partially or fully emptied, retry can fail with 'heading not found'), and specifies exact preserve_heading semantics: which attributes survive and which blocks are still destructively replaced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but every sentence earns its place and the most critical safety warning is front-loaded. The return-value enumerations for both normal and dry-run paths are dense run-on prose rather than structured lists, which is a minor readability cost for an otherwise information-dense definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given high complexity (7 params, destructive semantics, two operational modes), zero annotations, and no output schema, this description is remarkably complete: it covers safety, failure modes, recovery, boundary semantics, preserve_heading nuances, efficiency trade-offs, mention syntax, and exact return shapes for both normal and dry-run invocations. Nothing an agent needs to call it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds substantial meaning beyond the schema: heading boundary rules for H1 vs H2/H3, the requirement to include the heading in the markdown, the first-block edge case requiring matching heading type, the leading-heading-stripping behavior under preserve_heading, and the full dry_run return shape including would_delete_block_ids.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Update a section of a page by heading name.' It precisely defines the operation — finds the heading and replaces everything from that heading to the next section boundary — which unambiguously differentiates it from siblings like replace_content, append_content, and update_block.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description names the closest alternative and the deciding condition: 'More efficient than replace_content for editing one section of a large page.' It also gives active safety guidance — 'For irreplaceable sections, duplicate_page the target first so you have a restore point' — and explains when preserve_heading is the right mode.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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, and the server converts it into native Notion blocks, not flat/plain text. The server automatically handles Notion API limits: batches more than 100 child blocks, splits rich text over 2000 characters, and writes deeply nested blocks in additional passes, so callers can send a full multi-section toggle tree in one call with no need to pre-chunk or pre-split. 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. For supported markdown syntax, read resource easy-notion://docs/markdown. Page mentions: @Title. Returns: { success: true, block_id, type, deleted, appended }, where deleted and appended are counts, plus deleted_blocks for the deleted top-level body blocks when present and block_map for the top-level appended body blocks when present. A dry run instead returns { success: true, dry_run: true, operation, page_id, title, block_id, type, deleted, appended, would_delete_block_ids, append_parent_id }.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Toggle title to find (case-insensitive) | |
| dry_run | No | Preview validation and planned effect without mutating Notion. Default false. | |
| page_id | Yes | Page ID | |
| markdown | Yes | Replacement markdown for the toggle body | |
| return_block_map | No | Include block_map in the response. Default true. Set false to skip the per-block id list when you do not plan to edit individual blocks. | |
| collapse_soft_wraps | No | Collapse single line breaks to spaces per CommonMark before writing. Default false (single line breaks are kept as they are today). Recommended when uploading hard-wrapped prose files (e.g. repo markdown wrapped at 78 columns). Do not use when re-uploading content read from Notion, or intentional line breaks will be lost. Blank lines and code blocks are unaffected. Note: replace_content renders an in-paragraph line break as a separate paragraph regardless of this option. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure, and it excels. It openly states the destructive nature, no rollback, that child block IDs change, and the risk of partial emptying on mid-call failure. It explains server-side handling of API limits (batching, splitting, nested passes) and clarifies that markdown becomes native blocks, not plain text. It also details the dry-run behavior and return structure. This is far beyond minimal transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is lengthy but every sentence earns its place given the tool's complexity. It opens with the critical destructive warning, then states the core purpose, then details behavior, limits, and response. It is well-organized, flows logically, and avoids redundancy. The density of information is appropriate for a tool with this many nuances, and there is no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's destructive nature, API limit handling, markdown-to-native-block conversion, and multiple return scenarios (including dry run), the description covers all essential aspects. It explains what changes, how failures affect state, how to create a restore point, what the server does automatically, and the exact response shape. No output schema exists, so the description's detailed return documentation is crucial, and it provides it comprehensively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides complete descriptions for all six parameters (coverage 100%), so the baseline is 3. The description adds extra meaning primarily for the 'markdown' parameter—clarifying it is replacement body content, not a wrapper, and that the server converts it to native Notion blocks. It also clarifies the effect of 'collapse_soft_wraps' under specific scenarios. This goes beyond the schema's short descriptions and justifies a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Update the body of one toggle by title from a page.' It clearly delineates scope by specifying it matches plain toggle blocks and toggleable heading_1/2/3 blocks, and distinguishes itself from siblings like replace_content by clarifying it updates a toggle's body, not renaming it or acting as a wrapper. The wording is unambiguous and directly relatable to the tool's name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
While the description does not explicitly name alternative tools like replace_content or update_section, it provides rich context on when to use it: it targets a specific toggle by title, handles nested structures, and automates API limit batching. The warning about destructiveness and the recommendation to duplicate_page for irreplaceable content implicitly conveys when caution is needed. It lacks explicit 'when not to use' exclusions, but the context is strong enough for an agent to infer appropriate usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Updated view name | |
| sorts | No | Raw Notion view sorts payload, or null to clear | |
| filter | No | Raw Notion view filter payload, or null to clear | |
| view_id | Yes | View ID | |
| configuration | No | Raw Notion view configuration payload. Dashboard configuration is rejected. | |
| quick_filters | No | Raw Notion quick filters payload, or null to clear |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It discloses that null values are forwarded to clear fields and that dashboard configuration is rejected, adding behavioral context beyond a simple 'update'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two efficient sentences front-load purpose and convey key behavioral details without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers null clearing and configuration rejection, but lacks mention of return value (no output schema) or error conditions. With 6 parameters and nested objects, more detail would be useful.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, baseline 3. Description adds value by stating 'Pass at least one update field' (required but not in schema) and clarifying null behavior for filter, sorts, and quick_filters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Update a Notion database view' with specific verb and resource. Additional info about passing update fields and clearing with null distinguishes it from create_view, delete_view, and other siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context on how to use null values to clear filter, sorts, or quick_filters. However, does not explicitly mention when not to use (e.g., vs. query_view) or list alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Most tools have clearly distinct purposes, but query_database and query_view could be confused without careful reading. The descriptions help disambiguate.
Tool names use a mix of verbs: add, create, get, read, list, query, update, delete, archive, restore, duplicate, etc. No consistent pattern; some tools like add_database_entries and add_database_entry differ only by plurality.
42 tools is far beyond the typical 3-15 range. While Notion is complex, many tools could be consolidated (e.g., add_database_entries/single, create_page/from_file). The set feels bloated.
Covers most Notion API operations including pages, databases, comments, search, and views. Missing a dedicated get_database_entry by ID, but query_database can approximate it. Overall very comprehensive.
Maintenance
Related MCP Connectors
Markdown-based note-taking with a hosted MCP server. Your notes serve you and your AI.
MCP-native open-source Notion alternative: read & write pages, databases and kanban boards.
One memory, every AI. A shared, user-owned markdown memory your AI clients read and write over MCP.
MCP-native collaborative markdown editor with real-time AI document editing
Related MCP Servers
- AlicenseAqualityAmaintenanceMarkdown-first MCP server for Notion that provides 7 composite action-based tools consolidating 28+ REST API endpoints, enabling AI agents to efficiently manage pages, databases, blocks, and content with automatic pagination and bulk operations.1189136Apache 2.0
- AlicenseAqualityDmaintenanceAn MCP server that enables LLMs to interact with Notion workspaces via the Notion API, supporting page creation, database management, and content retrieval. It features markdown conversion to optimize token usage and enhanced error handling for more reliable workspace interactions.19141MIT
- AlicenseBqualityCmaintenance🚀 Token-efficient MCP server for Confluence. Reduces LLM costs by 76% via Markdown conversion. Supports listing, searching, and fetching pages.33MIT
- AlicenseAqualityCmaintenanceA lightweight Notion MCP server that minimizes token usage by returning Markdown instead of raw JSON, enabling efficient read/write operations on Notion pages.9MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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