better-mcp-notion
Allows interaction with Notion's API, providing tools for reading, writing, searching, listing, updating, deleting, and moving Notion pages and databases using Markdown documents.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@better-mcp-notionCreate a task in the Task Board database titled 'Fix login bug' with status In Progress"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
better-mcp-notion
An MCP server that lets you operate Notion with a single Markdown document.
Existing Notion MCP servers are thin API wrappers that require multiple round-trips for a single operation. better-mcp-notion uses one Markdown document (YAML frontmatter + body) to read, create, and update pages in a single call.
Why better-mcp-notion?
Traditional Notion MCP | better-mcp-notion | |
Tools | 16-22 tools | 9 tools |
Create a DB entry | 3+ calls (search DB, get schema, create page, append blocks) | 1 call |
Edit a page | 4+ calls (get page, get blocks, delete blocks, append blocks) | 1 call (read, edit, write) |
Format | Raw JSON blocks | Markdown |
Context window | Heavy (tool definitions + JSON) | Light |
Related MCP server: Notion MCP Server
Tools
Tool | Description |
| Read a Notion page as Markdown with frontmatter. Supports recursive child page reading with |
| Create or update pages from Markdown. Supports batch operations and append/prepend. |
| Search the workspace by keyword. Returns a Markdown-formatted list. |
| List database records as a table or child pages as a list. Supports natural language filter & sort. |
| Quick property update without rewriting content. Just pass page + key-value pairs. |
| View or modify database schema โ add, remove, or rename columns. |
| Add or read comments on a page. |
| Archive (soft-delete) a page. |
| Move a page to a different parent page or database. |
Quick Start
1. Create a Notion Integration
Go to notion.so/profile/integrations and create a new integration
Copy the API key (
ntn_...)Share the pages/databases you want to access with the integration ("Connect to" in the page menu)
2. Add to your MCP client
Claude Code
claude mcp add better-notion -- npx better-mcp-notionThen set the environment variable:
export NOTION_API_KEY=ntn_your_api_key_hereClaude Desktop / Cursor / Windsurf
Add to your MCP config file (e.g. claude_desktop_config.json, .cursor/mcp.json):
{
"mcpServers": {
"better-notion": {
"command": "npx",
"args": ["-y", "better-mcp-notion"],
"env": {
"NOTION_API_KEY": "ntn_your_api_key_here"
}
}
}
}From source
git clone https://github.com/ai-aviate/better-mcp-notion.git
cd better-mcp-notion
npm install && npm run buildThen point your MCP config to node /path/to/better-mcp-notion/build/index.js.
Usage
Read a page
read({ page: "https://notion.so/My-Page-abc123def456" })Returns:
---
id: abc123-def456
title: My Page
database: task-db-id
properties:
Status: In Progress
Tags:
- backend
---
## Notes
- Completed API designCreate a page
write({ markdown: `
---
title: Meeting Notes
parent: "Project Alpha"
icon: "๐"
---
## Agenda
- Review progress
- Discuss next steps
` })Create a database entry
write({ markdown: `
---
title: Fix login bug
database: "Task Board"
properties:
Status: In Progress
Tags:
- backend
- urgent
Due Date: "2026-03-01"
---
## Description
Login fails when password contains special chars.
` })Update a page (edit the output from read)
write({ markdown: `
---
id: abc123-def456
title: Updated Title
properties:
Status: Done
---
## New content
Body replaces all existing blocks.
` })Append content to an existing page
Use position: "append" to add content to the end without rewriting the entire page.
Only the new content needs to be provided โ existing content is preserved.
write({ markdown: `
---
id: abc123-def456
---
## New section
This is added to the end of the page.
`, position: "append" })position: "prepend" adds content to the beginning instead.
Batch create (multiple pages in one call)
Separate pages with ===:
write({ markdown: `
---
title: Task 1
database: "Task Board"
properties:
Status: Todo
---
Task 1 details
===
---
title: Task 2
database: "Task Board"
properties:
Status: Todo
---
Task 2 details
` })Query a database with filters
list({
target: "Task Board",
filter: "Status is Done AND Priority is High",
sort: "Due Date ascending"
})Filter syntax
Status is Done/Status = Done- equalsPriority != Low- not equalsTags contains backend- multi-select containsDone is true- checkboxScore > 80- number comparison (>,<,>=,<=)Due Date after 2026-03-01- date after/beforeCombine with
AND:Status is Done AND Priority is High
Sort syntax
Due Date ascendingorDue Date ascCreated descendingorCreated desc
Read with child pages
read({ page: "parent-page-id", depth: 2 })depth: 1 = current page only (default), 2 = include children, 3 = include grandchildren.
Quick property update
Update properties without rewriting content:
update({ page: "My Task", properties: { "Status": "Done", "Priority": "High" } })Manage database schema
// View schema
schema({ database: "Task Board" })
// Add a column
schema({ database: "Task Board", action: "add", property: "Priority", type: "select", options: ["Low", "Medium", "High"] })
// Rename a column
schema({ database: "Task Board", action: "rename", property: "Due", name: "Due Date" })
// Remove a column
schema({ database: "Task Board", action: "remove", property: "Old Column" })Comments
// Read comments
comment({ page: "abc123" })
// Add a comment
comment({ page: "abc123", body: "Looks good! Ready to ship." })Frontmatter Reference
Write (create/update)
Field | Create | Update | Description |
| - | required | Page ID to update |
| recommended | optional | Page title |
| required* | ignored | Parent page name or ID |
| required* | ignored | Database name or ID (*either |
| optional | optional | Emoji or image URL |
| optional | optional | Cover image URL |
| optional | optional | Database properties (matched against schema) |
Read (output only)
Field | Description |
| Page UUID |
| Notion page URL |
| Page title |
| Parent page or database ID |
| Emoji or image URL |
| All database properties |
| Timestamps (read-only) |
Read-only fields (url, created, last_edited, formulas, etc.) are safely ignored when passed to write.
Development
npm run dev # TypeScript watch mode
npm test # Run tests
npm run test:watch # Test watch modeLicense
Elastic License 2.0 (ELv2) โ Free to use, modify, and distribute. Cannot be offered as a managed/hosted service.
Available Tools
9 toolscommentA
Add or read comments on a Notion page.
Read comments
comment({ page: "abc123" }) Returns all comments on the page as a Markdown list.
Add a comment
comment({ page: "abc123", body: "Looks good! Ready to ship." }) Adds a comment to the page.
You can use the page name, ID, or URL.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | Comment text to add. If omitted, existing comments are returned instead. | |
| page | Yes | Page ID, URL, or name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and mostly succeeds: it discloses dual read/write behavior, the condition that triggers each mode, and the Markdown list return format for reads. It does not mention auth, rate limits, or what an add operation returns, but the core behavioral contract is 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 well-structured with a front-loaded summary, two labeled usage sections, code examples, and a short note on page references. Every section earns its place and no filler is present.
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 two-parameter dual-mode tool with no output schema, the description covers the main scenarios, return format for reads, and accepted page reference forms. The only notable gap is the unspecified response of an add operation, which is minor for practical 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?
Schema coverage is 100%, so the baseline is 3. The description mostly repeats what the schema already says, though it adds concrete invocation examples and confirms the page name/ID/URL flexibility already present in 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 opening sentence 'Add or read comments on a Notion page' states a specific verb, resource, and scope, and separates the two modes with clear headers. This distinguishes it from generic siblings like read/write by scoping it to comments.
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 context for when to use each mode: omit body to read, include body to add. It does not explicitly name sibling alternatives or say when not to use this tool, but the usage context 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.
deleteA
Archive (soft-delete) a Notion page. The page is moved to Trash and can be restored from Notion's UI. This does NOT permanently delete the page.
| Name | Required | Description | Default |
|---|---|---|---|
| page | Yes | Page ID or Notion URL to archive |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does well: it discloses the page moves to Trash, can be restored from Notion's UI, and is not permanently deleted. It does not mention output/response details or edge cases like already-archived pages, but the core behavioral trait is clearly exposed.
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 key action is stated first, and the important caveat about not permanently deleting is given immediately, making the definition efficient and easy 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?
For a one-parameter, no-output-schema tool, the description covers the essential behavior and reversibility. It does not describe the return value or potential errors, but those are less critical for an archive action whose semantics are already clearly defined.
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 single 'page' parameter already documents 'Page ID or Notion URL to archive.' The description adds no additional parameter-level semantics, but none are needed given the schema already fully explains the parameter.
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 identifies the action as 'Archive (soft-delete)' applied to a Notion page, which is a specific verb+resource. It also clarifies the non-permanent nature, distinguishing this from what the name 'delete' might imply and from any truly destructive delete operation.
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 intended use is implied: use this when you want to archive or soft-delete a page. However, there is no explicit guidance about when not to use it or which sibling tool to prefer in alternative scenarios, such as permanent deletion or moving pages.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
listA
List database records as a Markdown table, or list child pages of a page.
For databases: returns a table with properties as columns. For pages: returns a numbered list of child pages.
You can pass a database/page name (resolved via search) or an ID/URL.
Filter syntax (databases only)
Simple expressions matched against DB property names and types:
"Status is Done" โ select/status equals
"Priority = High" โ select equals
"Tags contains backend" โ multi_select contains
"Done is true" โ checkbox equals
"Due Date after 2026-03-01" โ date after
"Score > 80" โ number greater_than
"Name contains API" โ title/rich_text contains Multiple filters: separate with " AND " (e.g. "Status is Done AND Priority is High")
Sort syntax (databases only)
"Due Date ascending" or "Due Date asc"
"Created descending" or "Created desc"
Example output
Task Board (24 items)
Name | Status | Due Date |
Fix login bug | In Progress | 2026-03-01 |
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Sort expression (e.g. "Due Date ascending", "Created desc") | |
| limit | No | Max items to return (default: 50) | |
| filter | No | Filter expression (e.g. "Status is Done", "Priority > 3"). See tool description for syntax. | |
| target | Yes | Database or page: name (e.g. 'Task Board'), ID, or Notion URL |
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. It describes the return format, provides an example output, explains name resolution via search, and gives detailed filter/sort semantics. This goes well beyond what the tool name alone implies.
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 appropriately organized with headers and examples. The main behavior is front-loaded, and the length is justified by the complexity of the filter/sort syntax. No sentence 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 list operation with no output schema, the description supplies return formats, an example table, target resolution rules, and enough syntax detail to construct valid filters and sorts. There is no critical gap preventing an agent from calling 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?
Although the schema already documents all four parameters, the description adds essential meaning: a full filter expression grammar, sort syntax, and target resolution behavior. The schema even references the tool description for filter syntax, making this added detail necessary for correct invocation.
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 first sentence clearly states the action (list) and the two concrete resource types: database records as a Markdown table and child pages as a numbered list. It is unambiguous about what the tool does, though it does not explicitly name sibling tools like read/search to draw the boundary.
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 when to use each mode (databases vs pages), how targets are resolved via search, and how to construct filter and sort expressions. It does not explicitly say 'use read for page content' or 'use search to find targets,' but the context is clear enough for an agent to invoke it correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
moveA
Move a Notion page to a different parent page or database. The page keeps its content and properties; only the location changes.
Example: move a page into an "Archive" page, or move a task into a different database.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Destination: page name, database name, ID, or URL | |
| page | Yes | Page ID or URL of the page to move |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden, and it does so well by explicitly stating that the page keeps its content and properties and only the location changes. It does not mention permissions, errors, or response shape, but the core side-effect modelโnon-destructive relocationโis clearly disclosed.
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?
Every sentence earns its place: the first states the core action, the second clarifies the behavioral guarantee, and the third gives concrete usage examples. The information is front-loaded and contains 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?
For a two-parameter tool, the description is nearly complete: it covers purpose, behavior, parameter semantics, and examples. The main gaps are return-value/error semantics and explicit sibling differentiation, but these do not prevent correct invocation for the primary use case.
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 schema already covers both parameters clearly, and the description adds useful semantic nuance by framing 'to' as a parent page or database and giving practical examples. This goes beyond the baseline expected from the high schema coverage.
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 a specific verb and resource: 'Move a Notion page to a different parent page or database.' It clearly distinguishes the operation from the sibling tools by defining the scope as relocation, with examples of moving to an Archive or 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?
The description establishes clear use context: move content between locations while preserving content and properties, and gives concrete examples. It does not explicitly list when not to use it or name alternatives like 'update,' so it stops short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
readA
Read a Notion page and return it as Markdown with YAML frontmatter.
Returns frontmatter fields:
id, url: page identifiers
title: page title
parent / database: parent page ID or database ID
icon, cover: emoji or image URL
properties: database properties (if the page belongs to a database)
created, last_edited: timestamps (read-only)
The body contains the page content as standard Markdown.
The output can be edited and passed directly to the "write" tool to update the page.
Use "depth" to include child pages in a single call (default: 1 = current page only, 2 = include children, 3 = include grandchildren).
Example output:
id: abc123-def456 title: Weekly Review database: task-db-id properties: Status: In Progress Tags: - backend
Notes
Completed API design
| Name | Required | Description | Default |
|---|---|---|---|
| page | Yes | Notion page URL (https://notion.so/...) or page ID (UUID or 32-char hex) | |
| depth | No | How deep to read child pages: 1 = this page only (default), 2 = include children, 3 = include grandchildren |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It clearly discloses the return format (frontmatter fields and body), the depth recursion behavior, and marks the created/last_edited fields as read-only. This gives an agent a solid understanding of what to expect without needing additional metadata.
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 the main purpose first, followed by output details, a usage tip, and a concrete example. While it is somewhat long, every section adds value and the example makes the tool's behavior tangible.
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?
Since there is no output schema, the description appropriately explains the return value in detail (frontmatter fields and Markdown body). It also covers the depth parameter and the round-trip with 'write', making it sufficient for an agent to call the tool correctly. Minor gaps like error behavior are not critical here.
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 both parameters. The description adds an example output and rephrases depth behavior, but it does not significantly extend the parameter semantics beyond what the schema 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 states a specific verb ('Read'), resource ('a Notion page'), and output format ('Markdown with YAML frontmatter'). It is clear what the tool does, though it does not explicitly contrast with sibling tools like 'search' or 'list' to aid differentiation.
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 a concrete use caseโ'output can be edited and passed directly to the write tool'โand explains the depth parameter for including children. However, it does not provide explicit when-to-use or when-not-to-use guidance compared to alternatives like 'search' or 'list'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
schemaA
View or modify database schema (columns/properties).
Actions
"list" (default) โ View current schema
schema({ database: "Task Board" }) Returns: property names, types, and select/multi_select options.
"add" โ Add a new property
schema({ database: "Task Board", action: "add", property: "Priority", type: "select", options: ["Low", "Medium", "High"] })
"remove" โ Remove a property
schema({ database: "Task Board", action: "remove", property: "Old Column" })
"rename" โ Rename a property
schema({ database: "Task Board", action: "rename", property: "Due", name: "Due Date" })
Supported types for add
title, rich_text, number, select, multi_select, date, checkbox, url, email, phone_number, status, people, files
For select/multi_select, you can provide initial options.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New name for rename action | |
| type | No | Property type for add (e.g. select, number, rich_text) | |
| action | No | "list" (default): show schema. "add": add property. "remove": remove property. "rename": rename property. | list |
| options | No | Options for select/multi_select (e.g. ['Low', 'Medium', 'High']) | |
| database | Yes | Database name, ID, or URL | |
| property | No | Property name (required for add/remove/rename) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full responsibility for behavioral disclosure. It clearly explains each action's effect (list returns schema, add creates property, remove deletes, rename renames) and notes the return for list. However, it does not mention potential side effects (e.g., irreversible removal, permission requirements, or error conditions). For a schema-modification tool, the described behavior is transparent enough, but missing edge-case details keep it from a 5.
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 the purpose in the first sentence, then organizes actions under clear headers with code examples. Every section earns its place: actions, supported types, and option guidance. It is comprehensive without being redundant, striking an ideal balance between detail and brevity.
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 tool with 6 parameters, 4 actions, and no output schema, the description is highly complete. It covers all actions with examples, lists valid types, and explains parameter roles. It does not explicitly address error scenarios or prerequisites, but the scope is well-defined and the examples cover typical use cases. Nothing essential for calling the tool correctly 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?
Despite 100% schema coverage, the description adds substantial meaning beyond the schema. It provides concrete usage examples for each action (e.g., how to pass property, type, options, name), enumerates supported types for 'add', and clarifies the default action. This goes well beyond the schema's dry descriptions, making parameter usage intuitive and error-free.
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 clear verb+resource: 'View or modify database schema (columns/properties).' It enumerates four distinct actions (list/add/remove/rename) with concrete examples, making it unambiguous what the tool does and distinguishing it from generic sibling tools like write/update/delete. The purpose is fully articulated.
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 defines the actions and their semantics, providing examples for each. However, it does not explicitly contrast this tool with sibling tools or state when not to use it (e.g., for data operations vs. schema changes). The guidance is implicit through the tool's specific scope, but an explicit alternative route would elevate it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchA
Search the Notion workspace by title keyword. Returns a Markdown list with page/database IDs, titles, and metadata.
Use the returned IDs with other tools: read (to get full content), write (to update), list (to query a database), delete, or move.
Example output:
Search results: "MCP" (2 results)
MCP Design Doc (๐ page)
ID:
abc123Last edited: 2026-02-19
Task Board (database)
ID:
def456
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default: 10) | |
| query | Yes | Search keyword (matched against page/database titles) | |
| filter | No | Filter by type: "page", "database", or "all" (default) | all |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden. It discloses the Markdown response format, the kind of metadata shown (icon, last-edited date), and that the tool returns IDs suitable for downstream operations. It does not discuss pagination, sorting, or no-result behavior, so it is good but not exhaustive.
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: a one-line purpose, a routing sentence, and a concrete example. Every section adds distinct value with no redundancy, and the main action is 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?
Since there is no output schema, the example output compensates well by showing the exact list format, ID style, and metadata. The description also covers downstream usage across siblings, and the input schema already covers parameter constraints. Missing details like pagination are non-critical for a search tool.
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?
All three parameters are already fully documented in the schema (100% coverage), so the baseline is 3. The description adds no new parameter-level meaning beyond the schema; it reinforces how returned IDs are used afterward, which is useful but not parameter semantics.
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 ('Search'), resource ('the Notion workspace'), and scope ('by title keyword'), and immediately defines the return shape as a Markdown list with page/database IDs, titles, and metadata. The example output further clarifies the purpose and distinguishes it from read/list/write 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?
It explicitly tells the agent to use returned IDs with other tools and names each sibling role: read (get full content), write (update), list (query a database), delete, or move. This is strong routing guidance; no explicit 'when not to use' is needed because the alternatives are clearly assigned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
updateA
Quickly update page properties without rewriting content. Much simpler than the write tool for property-only changes.
The page content (blocks) is never touched โ only properties are updated.
Parameters
page: Page ID, URL, or name
properties: Key-value object of properties to set
Examples
Update a single property: update({ page: "abc123", properties: { "Status": "Done" } })
Update multiple properties: update({ page: "My Task", properties: { "Status": "Done", "Priority": "High", "Due Date": "2026-03-01" } })
Supported value types:
Text: "value"
Number: 42
Checkbox: true / false
Date: "2026-03-01"
Date range: "2026-03-01 to 2026-03-15"
Select/Status: "Option Name"
Multi-select: ["tag1", "tag2"]
URL: "https://..."
| Name | Required | Description | Default |
|---|---|---|---|
| page | Yes | Page ID, URL, or name | |
| properties | Yes | Properties to update as key-value pairs (e.g. { "Status": "Done", "Priority": "High" }) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden. It usefully discloses that page content/blocks are never touched and only properties are updated, but it does not cover merge/overwrite semantics, permissions, failure modes, or return values.
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 moderately long but well-structured with sections for parameters, examples, and value types. Each section adds practical guidance, though the parameter section partly restates the schema.
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 two-parameter update tool with no output schema, the description provides enough guidance to invoke it correctly: page identifier format, properties object shape, and value encodings. It omits response/error details, but those are not essential for this simple tool.
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 already describes both parameters, so the baseline is 3. The description adds examples and a supported value-type list (date ranges, multi-select, checkboxes, URLs) that clarify how to encode property values, going 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 it updates page properties without rewriting content, and explicitly contrasts itself with the write tool for property-only changes. This makes its purpose distinct from 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?
It names the write tool as the alternative for content changes and frames itself as the simpler option for property-only updates. It does not spell out explicit when-not-to-use conditions or cover other siblings, but the intended use case is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
writeA
Create or update Notion pages from Markdown with YAML frontmatter.
Mode (default "auto"): if frontmatter has "id" โ update, otherwise โ create.
Batch mode
Separate multiple pages with a line containing only "===" to create/update them in one call.
Frontmatter fields
Field | Create | Update | Description |
id | - | required | Page ID to update |
title | recommended | optional | Page title |
parent | required* | ignored | Parent page name or ID |
database | required* | ignored | Database name or ID (*either parent or database) |
icon | optional | optional | Emoji (e.g. ๐) or image URL |
cover | optional | optional | Cover image URL |
properties | optional | optional | DB properties (see below) |
Properties are auto-matched to the database schema. Use the exact property name as key. Read-only fields from read output (url, created, last_edited, formula, etc.) are safely ignored.
Examples
Create a page under a parent page:
---
title: Meeting Notes
parent: "Project Alpha"
icon: "๐"
---
## Agenda
- Review progressCreate a database entry:
---
title: Fix login bug
database: "Task Board"
properties:
Status: In Progress
Tags:
- backend
- urgent
Due Date: "2026-03-01"
---
## Description
Login fails when password contains special chars.Update an existing page (edit output from read):
---
id: abc123-def456
title: Updated Title
properties:
Status: Done
---
## New content
Body replaces all existing blocks.Append to an existing page (add content without rewriting):
Use position: "append" to add content to the end, or "prepend" to add to the beginning. Only the new content needs to be provided โ existing content is preserved.
---
id: abc123-def456
---
## New section added at the endBatch create (multiple pages in one call):
---
title: Task 1
database: "Task Board"
properties:
Status: Todo
---
Task 1 details
===
---
title: Task 2
database: "Task Board"
properties:
Status: Todo
---
Task 2 details| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | "auto" (default): create if no id, update if id present. "create": force create. "update": force update (requires id). | auto |
| markdown | Yes | Markdown with YAML frontmatter. Separate multiple pages with '===' on its own line. See tool description for format. | |
| position | No | "replace" (default): replace all content. "append": add to end (efficient, no need to send existing content). "prepend": add to beginning. Only affects updates. | replace |
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. It does this thoroughly: it explains that body content replaces existing blocks unless position is append/prepend, read-only fields are safely ignored, properties are auto-matched, and the '===' separator enables batch mode. This is far more transparency than expected 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 long but extremely well organized with headers, a frontmatter table, and multiple examples. Every section adds operational value, and the most important information (mode behavior) is front-loaded. It could be slightly trimmed without loss, but the structure supports usability well.
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 three parameters, no annotations, and no output schema, the description is remarkably complete. It covers all modes, batch behavior, position semantics, property handling, ignored fields, and includes practical examples. An agent has all the information needed to construct valid calls for create, update, append, and batch scenarios.
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 description coverage is 100%, the description adds substantial meaning beyond the schema. It details the YAML frontmatter structure, the meaning of 'id', 'parent', 'database', 'icon', 'cover', and 'properties', and provides concrete examples for each mode and position. This goes well beyond the baseline of 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 states a clear action: 'Create or update Notion pages from Markdown with YAML frontmatter.' This names the resource, the operation, and the input format. However, it does not explicitly differentiate itself from the sibling tool 'update', and the dual create/update scope blurs the boundary somewhat, so it misses the top score for explicit sibling distinction.
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 guidance on when to create vs update based on presence of an 'id' in frontmatter, and clearly explains when to use append/prepend versus replace. It also explains batch usage. However, it does not state when to prefer this tool over sibling alternatives such as 'update' or 'read', so it lacks the 'when-not-to-use' component of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
9 tool updates
v0.3.3- First observed
comment - First observed
delete - First observed
list - First observed
move - First observed
read - First observed
schema - First observed
search - First observed
update - First observed
write
TDQS
Scored across 9 tools
Most tools have clearly distinct roles: read, delete, search, list, move, schema, and comment are well-separated. The main ambiguity is between write and update, since write can also update properties and content, while update is explicitly scoped to property-only changes. The descriptions help clarify the boundary, but an agent could still hesitate when deciding which to use for a property update.
All tool names are single lowercase words used as imperative commands, which creates a strong, predictable pattern. Write, read, search, list, delete, move, update, schema, and comment are all short and consistent in style. Minor semantic quibbles like 'schema' being a noun do not break the overall consistency.
Nine tools is a well-scoped size for a Notion MCP server. Each tool covers a meaningful area of Notion interaction without excessive fragmentation or redundancy. The set feels appropriately balanced for both simple and moderately complex workflows.
The server covers the core page lifecycle well: create/update via write, property-only updates, read, search, list, move, delete, schema management, and comments. Minor gaps exist, such as no way to create a brand-new database from scratch, no unarchive/restore operation, and no granular block-level editing. These are workable limitations rather than critical dead ends.
Maintenance
Related MCP Connectors
MCP-native open-source Notion alternative: read & write pages, databases and kanban boards.
Markdown workspace for AI agents: read, write, organize, and share markdown documents.
Search and reason over your Obsidian-style Markdown vault, right from ChatGPT.
Parse PDF/Word/PPT/HTML to Markdown; tables as JSON, image extraction, RAG chunking, page ranges.
Related MCP Servers
- FlicenseAqualityDmaintenanceEnables interaction with Notion databases through the Notion API, supporting full CRUD operations on pages and databases. Supports advanced querying, filtering, sorting, and all property types with Docker deployment for easy integration with Cursor and Claude.8-
- AlicenseNot gradedqualityDmaintenanceEnables interaction with Notion workspaces through the Notion API, allowing users to search, read, comment on, and create pages and databases using natural language commands.122,532 npmMIT
- FlicenseNot gradedqualityDmaintenanceEnables interaction with Notion databases and pages via the Notion API. Allows searching, reading, and writing to Notion through natural language.-
- AlicenseCqualityDmaintenanceEnables natural language interaction with Notion workspace, including search, page/database management, markdown conversion, and productivity shortcuts.2716 PyPIMIT