Two agents, one limit, one refused.

Documents integration

Notion, in your agent's hands and under your limits.

Let an agent search, read and write your workspace, and only the pages you share with it. You create an integration in your own Notion, share the pages, and Anlyon holds its token. Archiving a page can wait for a person.

Connect

API key

bound to api.notion.com

What you create

  • An internal integration you create
  • Read, Update and Insert content; Read and Insert comments
  • Only the pages you share with it
  1. 01In Notion, open Settings, Connections, Develop or manage integrations, and create an internal integration.
  2. 02Give it Read content, Update content and Insert content.
  3. 03Open each page your agent should reach and add the integration under Connections.
  4. 04In Anlyon, open Actions, then Integrations, choose Notion and paste the integration's secret.

Connecting allows nothing by itself. No API returns the credential afterwards, to you, to the console or to an agent, and Anlyon refuses to send it anywhere but api.notion.com.

Operations

Each one is a named tool, off until you switch it on, and Anlyon makes every call with the credential your agent never sees. Reads return what Notion answers and change nothing. Writes count against a limit you set, can wait for a person, and are read back from Notion wherever it allows.

Reads

Search pages

notion-search-pages

Search the pages shared with the integration by title, most recently edited first. Changes nothing. Returns up to 10 pages per call; pass the response's next_cursor as start_cursor for the next page. Leave query out or empty to list every shared page.

Search databases

notion-search-databases

Search the databases shared with the integration by title, most recently edited first. Changes nothing. Returns up to 10 databases per call; pass the response's next_cursor as start_cursor for the next page. Leave query out or empty to list every shared database.

Get page

notion-get-page

Read one page's properties (title, and for a database row every column), parent, url and trash state. Does not return the page's content: use list-block-children with the page id for that. Relation and people values over 25 entries are cut; read them with get-page-property.

Get page property

notion-get-page-property

Read one property of a page in full, for values get-page cuts short (long titles and text, relations, people, rollups). property_id is the property's id from get-page with any %XX escapes decoded (for example ':UPp' for '%3AUPp'), or 'title' for the title. Paginated properties return up to 25 items per call; pass next_cursor as start_cursor for the next page.

Get block

notion-get-block

Read one block: its type, its text or other content, whether it has children, and its trash state.

List block children

notion-list-block-children

Read a page's content, or the blocks nested under a block, in order. Returns up to 10 blocks per call; pass next_cursor as start_cursor for the next page. Only the first level: a block with has_children true holds more blocks, read with its own id.

Get database

notion-get-database

Read one database's title, parent and column schema (each property's name, id, type and options). Fails on a database with more than one data source under the pinned API version.

Query database

notion-query-database

List the rows (pages) of a database, optionally filtered and sorted. Changes nothing. Returns up to 10 rows per call, each with all its properties; pass next_cursor as start_cursor for the next page. Fails on a database with more than one data source under the pinned API version.

List comments

notion-list-comments

List the open (unresolved) comments on a page or block, oldest first, with each comment's discussion_id for replying. Returns up to 25 comments per call; pass next_cursor as start_cursor for the next page. Needs the integration's read comments capability.

Writes

Create page

notion-create-page

Create one page under a page that is shared with the integration.

parent_page_idtitle

Read back

Read back by page id; the title must match.

Create database

notion-create-database

Create one database (a table) under a page shared with the integration, with the columns given in properties.

parent_page_idtitlepropertiesis_inline

Read back

Read back by database id; the title must match.

Create database page

notion-create-database-page

Add one row (page) to a database, with its property values. database_id must be the hyphenated lowercase id the API returns (search-databases, get-database).

database_idproperties

Read back

Read back by page id; its parent must be that database.

Update page properties

notion-update-page-properties

Set property values on one page: the title of any page, or any column of a database row. Properties left out keep their values.

page_idproperties

Read back

Read back by page id: the page must be live and show the last-edited time this update returned; the read-back does not compare the values, whose names the caller chooses.

Archive page

notion-archive-page

Move one page to the trash.

page_id

Read back

Read back from the page; it must be archived.

Restore page

notion-restore-page

Take one page out of the trash.

page_id

Read back

Read back from the page; it must not be archived.

Append paragraph

notion-append-paragraph

Add one paragraph to the end of a page.

page_idtext

Read back

Read back by the new block's id; the text must match.

Append blocks

notion-append-blocks

Add blocks to the end of a page or under a block (or after one of its children with after): paragraphs, headings, bulleted and numbered items, to-dos, toggles, quotes, callouts, code and dividers, text only, no nesting in one call. At most 100 blocks; each counts as one mutation.

block_idchildrenafter

Read back

Read back by the first new block's id; its type and creation time must match.

Update block text

notion-update-block-text

Replace the text of one block, or tick or untick a to-do. Give exactly one content object, named by the block's current type (get-block shows it); its rich_text replaces the whole text, and checked alone ticks a to-do.

block_idparagraphheading_1heading_2heading_3bulleted_list_itemnumbered_list_itemto_dotogglequotecalloutcode

Read back

Read back by block id: the block must be live and show the last-edited time this update returned; the read-back does not compare the text.

Delete block

notion-delete-block

Move one block (a paragraph, heading, to-do or other content block) to the trash.

block_id

Read back

Read back from the block; it must be archived.

Add comment

notion-add-comment

Start a new comment discussion on a page.

page_idtext

Read back

Read back by comment id; the text must match. Needs the integration's insert comments capability.

Reply to comment

notion-reply-to-comment

Reply in an existing comment discussion (on a page or on selected text), using a discussion_id from list-comments.

discussion_idtext

Read back

Read back by comment id; the discussion and the text must match. Needs the integration's insert comments capability.

Update comment

notion-update-comment

Replace the text of one comment the integration itself posted (Notion answers 404 for anyone else's).

comment_idtext

Read back

Read back by comment id; the text must match. Needs the integration's insert comments capability.

Delete comment

notion-delete-comment

Delete one comment the integration itself posted (Notion answers 404 for anyone else's). Needs the integration's insert comments capability.

comment_id

Acknowledged

Sent once and acknowledged; not read back: Notion does not document what reading a deleted comment returns, so the receipt is graded acknowledged.

The brake

Suggested limits

  • 100 pages created a day
  • 10 databases created a day
  • 200 database rows created a day
  • 300 page property updates a day
  • 20 pages archived a day
  • 20 pages restored a day
  • 500 paragraphs added a day
  • 1,000 blocks added a day
  • 300 block edits a day
  • 50 blocks deleted a day
  • 100 comments a day
  • 100 comment replies a day
  • 100 comment edits a day
  • 50 comments deleted a day

Shared by every agent, session and key in the environment. You set the number.

Suggested approvals

  • A person approves archiving a page
  • A person approves deleting a block
  • A person approves deleting a comment

Installed turned off. The reviewer sees the exact request, and the approved request is the one that runs.

Before you rely on it

  • A page that is not shared with the integration cannot be reached.
  • A database row takes that database's own property names. The agent reads them with the database first.

Use it

1. Connect, from a terminal
npm install -g @anlyonhq/cli
anlyon auth login

# Shows where to create the key, then asks for it without echoing
anlyon connections add notion --secret NOTION

# From a clone of github.com/AnlyonHQ/anlyon-platform:
# see what would be installed, then switch on one operation
anlyon packs plan ./packs/notion
anlyon packs install ./packs/notion --action create-page --yes
2. Call it from your agent, TypeScript
import { Client } from "@anlyonhq/sdk";

const anlyon = new Client({ apiKey: process.env.ANLYON_AGENT_KEY! });

const { data } = await anlyon.actions.invoke(
  "notion-create-page",
  {
    "parent_page_id": "7b1f2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d",
    "title": "Launch checklist"
  },
);

if (data?.pendingApproval) {
  console.log("Waiting for a person", data.approvalId);
} else {
  console.log(data?.status, data?.responseStatus);
}
Or hand it to Claude Code over MCP
# Claude Code. Sign in with the browser, no key to paste.
claude mcp add --transport http anlyon https://api.anlyon.com/mcp

# Then ask in plain words. Each operation you switched on is a tool.

Prefer to click?

The console does all of it: connect, switch operations on, set the limit, and copy the setup for your agent.

Free tier, no credit card. One command if you use Claude or Cursor.

$ claude mcp add anlyon -- npx -y @anlyonhq/mcp-server