Skip to main content
Glama
ai-aviate

better-mcp-notion

by ai-aviate

better-mcp-notion

Japanese / ๆ—ฅๆœฌ่ชž

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

Read a Notion page as Markdown with frontmatter. Supports recursive child page reading with depth.

write

Create or update pages from Markdown. Supports batch operations and append/prepend.

search

Search the workspace by keyword. Returns a Markdown-formatted list.

list

List database records as a table or child pages as a list. Supports natural language filter & sort.

update

Quick property update without rewriting content. Just pass page + key-value pairs.

schema

View or modify database schema โ€” add, remove, or rename columns.

comment

Add or read comments on a page.

delete

Archive (soft-delete) a page.

move

Move a page to a different parent page or database.

Quick Start

1. Create a Notion Integration

  1. Go to notion.so/profile/integrations and create a new integration

  2. Copy the API key (ntn_...)

  3. 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-notion

Then set the environment variable:

export NOTION_API_KEY=ntn_your_api_key_here

Claude 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 build

Then 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 design

Create 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 - equals

  • Priority != Low - not equals

  • Tags contains backend - multi-select contains

  • Done is true - checkbox

  • Score > 80 - number comparison (>, <, >=, <=)

  • Due Date after 2026-03-01 - date after/before

  • Combine with AND: Status is Done AND Priority is High

Sort syntax

  • Due Date ascending or Due Date asc

  • Created descending or Created 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

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 or image URL

cover

optional

optional

Cover image URL

properties

optional

optional

Database properties (matched against schema)

Read (output only)

Field

Description

id

Page UUID

url

Notion page URL

title

Page title

parent / database

Parent page or database ID

icon, cover

Emoji or image URL

properties

All database properties

created, last_edited

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 mode

License

Elastic License 2.0 (ELv2) โ€” Free to use, modify, and distribute. Cannot be offered as a managed/hosted service.

Available Tools

9 tools
commentA

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNoComment text to add. If omitted, existing comments are returned instead.
pageYesPage ID, URL, or name

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageYesPage ID or Notion URL to archive

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoSort expression (e.g. "Due Date ascending", "Created desc")
limitNoMax items to return (default: 50)
filterNoFilter expression (e.g. "Status is Done", "Priority > 3"). See tool description for syntax.
targetYesDatabase or page: name (e.g. 'Task Board'), ID, or Notion URL

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
toYesDestination: page name, database name, ID, or URL
pageYesPage ID or URL of the page to move

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
pageYesNotion page URL (https://notion.so/...) or page ID (UUID or 32-char hex)
depthNoHow deep to read child pages: 1 = this page only (default), 2 = include children, 3 = include grandchildren

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoNew name for rename action
typeNoProperty type for add (e.g. select, number, rich_text)
actionNo"list" (default): show schema. "add": add property. "remove": remove property. "rename": rename property.list
optionsNoOptions for select/multi_select (e.g. ['Low', 'Medium', 'High'])
databaseYesDatabase name, ID, or URL
propertyNoProperty name (required for add/remove/rename)

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

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://..."

ParametersJSON Schema
NameRequiredDescriptionDefault
pageYesPage ID, URL, or name
propertiesYesProperties to update as key-value pairs (e.g. { "Status": "Done", "Priority": "High" })

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 progress

Create 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 end

Batch 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
ParametersJSON Schema
NameRequiredDescriptionDefault
modeNo"auto" (default): create if no id, update if id present. "create": force create. "update": force update (requires id).auto
markdownYesMarkdown with YAML frontmatter. Separate multiple pages with '===' on its own line. See tool description for format.
positionNo"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

A4.5/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

  1. 9 tool updatesv0.3.3
    • First observedcomment
    • First observeddelete
    • First observedlist
    • First observedmove
    • First observedread
    • First observedschema
    • First observedsearch
    • First observedupdate
    • First observedwrite

TDQS

A4.2/5.0

Scored across 9 tools

Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityInactive
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers