Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Notion

NPM · @FOREVERWORKS/MCP-NOTION

Search, read and write your Notion workspaces, with pages as Markdown and typed database queries.

+3 this week 83 Trust /100

Last scanned (12 hours ago)

Scores higher than 76% of npm servers

Category Productivity and Notes

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security99
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • No install/post-install scripts declared.Pass
  • 7 of 23 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency100
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Cryptographically verified build provenance (signed, bound to foreverworks/mcps). View diagnostics → Pass
  • Clear OSI-approved license (MIT).Pass
  • Actively maintained (last published 4 days ago).Pass
  • Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability61
  • AI-judged instruction clarity (good).Pass
  • Context-footprint check failed: tool/resource definitions use about 5676 tokens (~210/item across 27 items; 27 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management33
  • Stability observed for 10 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 98% of tool parameters carry a description.Partial
  • Structured output schemas are declared (7% of tools); any adoption earns full credit.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • We read all 27 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
  • An AI judge read all 28 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass
What we tested

Checks we ran (16)

  • Malware scan
  • Known CVEs
  • Install scripts
  • Dependency health
  • Source repository
  • Provenance
  • License
  • Maintenance
  • Security disclosure
  • Schema quality
  • Stability
  • Tool coverage
  • Injection markers
  • Destructive annotations
  • Judged manipulation
  • MCP protocol

Does not apply to this package (2)

  • Endpoint SecurityScored on hosted endpoints only. A package has no live endpoint of its own for us to probe.
  • Transport & ReachabilityScored on hosted endpoints only. A package has no live endpoint of its own for us to probe.

The score does not measure everything. What the score does not measure →

Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 4 Nov 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 27 to 30. That category is still filling its 30-day observation window: 8 days of observed history at the previous scan, 9 at this one. The score rises as the window fills, whether or not the server changes.

  • 2 Nov 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 20 to 23. That category is still filling its 30-day observation window: 6 days of observed history at the previous scan, 7 at this one. The score rises as the window fills, whether or not the server changes.

  • 1 Nov 26 +15
    • Malware scan: unverified → pass ▲ security
  • 31 Oct 26 −15
    • Malware scan: pass → unverified ▼ security
    • Package version: 0.1.0 → 0.1.1 functional
  • 30 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 10 to 13. That category is still filling its 30-day observation window: 3 days of observed history at the previous scan, 4 at this one. The score rises as the window fills, whether or not the server changes.

  • 28 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 3 to 7. That category is still filling its 30-day observation window: 1 days of observed history at the previous scan, 2 at this one. The score rises as the window fills, whether or not the server changes.

  • 26 Oct 26 79

    First indexed and scored.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 5 Nov 2026 · Analysed npm/@foreverworks/mcp-notion@0.1.1

Provenance Verified

A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.

Result Verified
Ecosystem npm
Reason Verified
Discovered via Registry attestation endpoint
Source repo foreverworks/mcps
Certificate issuer https://token.actions.githubusercontent.com
Certificate SAN https://github.com/foreverworks/mcps/.github/workflows/release.yml@refs/tags/release-2026-10-31
Rekor log index 3614032564
Predicate type SLSA build provenance https://slsa.dev/provenance/v1
Subject digest sha512:ca13316befb5d1b7e27b6944a8609b7ef9649506abf4bea5e6024be8de62ee45418cd6cae381186f5aaf7ccbed905270688d60ea61c59946efc2e9b15

Background: How many MCP packages publish verified provenance →

Dependencies 23 packages
Packages resolved 23
Stale 7
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 27 exposed · ~5,558 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
add_column ~175

Add a column to a database: a name it does not have yet, a type, and that type's settings (options, a number's format, a formula's expression, a relation's target). Checked against the table as it is now before anything is sent; answers the column as Notion made it. Renaming and deleting columns are left to Notion's app.

NameTypeReqDescription
accountstring–Workspace: a label list_accounts names ("*": every one). Rarely needed: an id or URL finds its own.
columnobjectyes–
databasestringyesThe database: its id, its Notion URL, or the dataSourceId search returned for it.
sourcestring–Which table, only when the database holds several (describe_database lists them): its name or id.

No output schema declared.

No examples provided.

add_comment ~150

A comment on a page, or a reply in one of its discussions, shown in Notion as the workspace's integration. Not resent after a lost answer (outcome_unknown): get_comments says whether it arrived.

NameTypeReqDescription
accountstring–Workspace: a label list_accounts names ("*": every one). Rarely needed: an id or URL finds its own.
discussionstring–A discussionId from get_comments, to reply in that thread. Default: a new comment on the page.
markdownstringyesThe comment, in Markdown.
pagestringyesThe page: its id, or its Notion URL (a row of a database is a page too).

No output schema declared.

No examples provided.

add_options ~237

Add options to a select, multi-select or status column (a status option in a group: To-do, In progress, Complete). The options already there are kept and sent back by id, and the column is read back after: an option that went missing fails the call. Names already there are skipped and listed under alreadyThere. For one new option while writing a row, create_page's allow_new_options is enough.

NameTypeReqDescription
accountstring–Workspace: a label list_accounts names ("*": every one). Rarely needed: an id or URL finds its own.
columnstringyesA select, multi-select or status column, by name.
databasestringyesThe database: its id, its Notion URL, or the dataSourceId search returned for it.
groupstring–Status only: the group the new options go in. Default: To-do.
optionsarrayyesThe options to add; one already there is left as it is.
sourcestring–Which table, only when the database holds several (describe_database lists them): its name or id.

No output schema declared.

No examples provided.

append_content ~178

Markdown added to a page's body: at the end (default), at the start, or after a passage. Not resent after a lost answer: that is outcome_unknown, and read_page says whether it went through.

NameTypeReqDescription
accountstring–Workspace: a label list_accounts names ("*": every one). Rarely needed: an id or URL finds its own.
afterstring–Or after a passage, named "first words...last words" as it reads in the page.
atstring–Where it goes.
markdownstringyesNotion's Markdown: headings, lists, to-dos (- [ ]), quotes, code, tables, callouts.
pagestringyesThe page: its id, or its Notion URL (a row of a database is a page too).

No output schema declared.

No examples provided.

count_rows ~279

How many rows match where, and with by, how many hold each value of one column ("how many tasks per status"), most first; an empty value counts as "(empty)", and a multi-select row counts once per option. Reads the matching rows without sending them, up to Notion's 10,000 per query.

NameTypeReqDescription
accountstring–Workspace: a label list_accounts names ("*": every one). Rarely needed: an id or URL finds its own.
bystring–A column to count by: rows per option, per value, per related page.
databasestringyesThe database: its id, its Notion URL, or the dataSourceId search returned for it.
in_trashboolean–Rows in Notion's trash instead of the live ones.
matchstring–Whether a row must meet all the conditions in where, or any of them.
notion_filterobject–Notion's own filter object, for what where cannot say (nested and/or, rollups). ANDed with where when both are given.
sourcestring–Which table, only when the database holds several (describe_database lists them): its name or id.
wherearray–Conditions on the columns, exactly as query_database's where takes them.

No output schema declared.

No examples provided.

create_database ~202

Create a database under a page, with a title column and the other columns given, each checked against the others before anything is made (and a relation's target found in the same workspace). Answers its id, URL and table. A database is not created twice: if the answer is lost it is outcome_unknown, and search says whether it exists.

NameTypeReqDescription
accountstring–Workspace: a label list_accounts names ("*": every one). Rarely needed: an id or URL finds its own.
columnsarray–Its other columns, as add_column takes one.
inlineboolean–Shown inside the page's body rather than as a page of its own.
parentstringyesThe page it goes under: its id or Notion URL.
titlestringyesThe database's title.
title_columnstring–The name of its title column, which every row is known by. Default: Name.

No output schema declared.

No examples provided.

create_page ~543

A new row in a database, its properties checked against the columns first (an unknown column or option is refused with the ones that exist), a child page under a page, or with no parent a private page at the top of a workspace (a title and a body, no properties). The body is Notion's Markdown. A row can start from one of its database's templates (template): Notion applies it just after the page is made, so read_page a moment later shows what it filled in. Answers the new page's workspace, id and URL. A page is not created twice: if the answer is lost it is outcome_unknown, and search or query_database says whether it exists.

NameTypeReqDescription
accountstring–Workspace: a label list_accounts names ("*": every one). Rarely needed: an id or URL finds its own.
allow_new_optionsboolean–Let a select or multi-select value add an option the column does not have yet. A status can never be added.
iconstring–An emoji for the page's icon.
markdownstring–The body, in Notion's Markdown. Notion takes a leading '# ' heading as the title, so start the body below it.
parentstring–Where it goes: a database (id, URL or dataSourceId) for a new row, or a page for a child page. Leave it out for a private page at the top level of the workspace account names.
propertiesobject–Column name -> value, checked against the database's columns (describe_database). Text and title: a string. Number: a number. Select and status: an existing option's name. Multi-select: a list of nam…
sourcestring–Which table, only when the database holds several (describe_database lists them): its name or id.
templatestring–For a row: "default" for the database's default template, or a template's name or id (list_database_templates). Notion fills the row's body and properties from it just after making it; properties giv…
titlestring–The title. For a row, this fills the database's title column.

No output schema declared.

No examples provided.

describe_database ~132

A database's columns: name, type, the options of a select, multi-select or status (with a status's groups), where a relation points, a formula's expression. Read it before writing where, sort or properties: every one of those names these columns. A database holding several tables (data sources) lists each.

NameTypeReqDescription
accountstring–Workspace: a label list_accounts names ("*": every one). Rarely needed: an id or URL finds its own.
databasestringyesThe database: its id, its Notion URL, or the dataSourceId search returned for it.

No output schema declared.

No examples provided.

download_files ~226

Save the files Notion hosts for a page to this server's outbox: its files columns and the file blocks of its body (up to 50 MiB each). Answers each file's path, size and SHA-256, and where it was on the page. External links are listed, not fetched. A file that fails is listed with why, beside the others.

NameTypeReqDescription
accountstring–Workspace: a label list_accounts names ("*": every one). Rarely needed: an id or URL finds its own.
bodyboolean–Also the files in the page's body: file, image, PDF, video and audio blocks, nested ones included.
columnstring–Only this files column; the body is then left alone.
pagestringyesThe page: its id, or its Notion URL (a row of a database is a page too).
save_dirstring–A folder inside the outbox, e.g. "2026-10/contracts". Default: a folder named after the page's id.

No output schema declared.

No examples provided.

edit_content ~175

Find and replace in a page's body, in its Markdown as read_page shows it. The smallest change that does the job: the rest of the page, its comments and its history stay as they were. Not resent after a lost answer: that is outcome_unknown, and read_page says whether it went through.

NameTypeReqDescription
accountstring–Workspace: a label list_accounts names ("*": every one). Rarely needed: an id or URL finds its own.
allow_deletingboolean–Let the change remove child pages or databases inside the page. Off, Notion refuses such a change.
editsarrayyesFind-and-replace pairs, applied in order.
pagestringyesThe page: its id, or its Notion URL (a row of a database is a page too).

No output schema declared.

No examples provided.

get_comments ~131

The open comments on a page, oldest first, each with its discussion, author, time and text. Resolved ones are not listed by Notion.

NameTypeReqDescription
accountstring–Workspace: a label list_accounts names ("*": every one). Rarely needed: an id or URL finds its own.
cursorstring–nextCursor from the previous call, exactly as it came back, to read on.
limitinteger–Comments per call.
pagestringyesThe page: its id, or its Notion URL (a row of a database is a page too).

No output schema declared.

No examples provided.

health ~95

Ask each workspace: is its integration token accepted, which workspace and integration it is, and whether it sees any page at all (a new integration sees nothing until pages are shared with it). One broken workspace never hides the others' answers. Run this before concluding the server is broken.

NameTypeReqDescription
accountstring–Workspace: a label list_accounts names ("*": every one). Rarely needed: an id or URL finds its own.

No output schema declared.

No examples provided.

list_accounts ~71

The Notion workspaces this server reaches, by label (one per token file), from the token files alone: no request to Notion. Every other tool finds an id's workspace by itself, so a label is needed only to narrow a search. Says nothing about whether a token works; that is health.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

list_database_templates ~175

The page templates of a database or data source, with their page ids, names and default flags. Use this catalog to distinguish templates from ordinary rows; search can return both. Inspect their pages before editing recurring content. Follow nextCursor when hasMore is true.

NameTypeReqDescription
accountstring–Workspace: a label list_accounts names ("*": every one). Rarely needed: an id or URL finds its own.
cursorstring–nextCursor from the previous call, exactly as it came back, to read on.
databasestringyesThe database: its id, its Notion URL, or the dataSourceId search returned for it.
limitinteger––
sourcestring–Which table, only when the database holds several (describe_database lists them): its name or id.

No output schema declared.

No examples provided.

list_users ~125

The people (and bots) of every workspace, or of the one account names: each one's id, name, and email when the token may read it. A person column's where takes a name or an email directly, so this is for checking who is who, or for the id when two people share a name.

NameTypeReqDescription
accountstring–Workspace: a label list_accounts names ("*": every one). Rarely needed: an id or URL finds its own.
querystring–Words in a name or an email. Leave it out to list everyone.
NameTypeReqDescription
failedobject–Workspaces that could not be read, with why
usersarrayyes–

No examples provided.

list_views ~167

A database's saved views (table, board, calendar, ...): each one's id, name, type, the table it shows, and the filter and sorts saved in it, in Notion's query grammar with columns by name. Use it to find the view a person means ("my Open tasks"), then query_view to read its rows exactly as Notion shows them.

NameTypeReqDescription
accountstring–Workspace: a label list_accounts names ("*": every one). Rarely needed: an id or URL finds its own.
databasestringyesThe database: its id, its Notion URL, or the dataSourceId search returned for it.
sourcestring–Which table, only when the database holds several (describe_database lists them): its name or id.
NameTypeReqDescription
accountstringyes–
databasestringyes–
sourcestring–The table the views were narrowed to
viewsarrayyes–

No examples provided.

move_page ~150

Under another page, or into a database as a row. Only within the page's own workspace: Notion cannot move a page between workspaces.

NameTypeReqDescription
accountstring–Workspace: a label list_accounts names ("*": every one). Rarely needed: an id or URL finds its own.
pagestringyesThe page: its id, or its Notion URL (a row of a database is a page too).
sourcestring–Which table, only when the database holds several (describe_database lists them): its name or id.
tostringyesThe new parent: a page, or a database (the page becomes a row). Same workspace only.

No output schema declared.

No examples provided.

query_database ~403

Rows of a database, filtered by where (checked against the columns first), sorted, with the columns asked for. Each row is its id, its title and its non-empty columns as plain values. A relation lists its first 25 pages here (truncated names it); read_page lists them all. nextCursor reads on; Notion stops one query at 10,000 rows (incomplete says so). Works on the Free plan, unlike the hosted connector's SQL query.

NameTypeReqDescription
accountstring–Workspace: a label list_accounts names ("*": every one). Rarely needed: an id or URL finds its own.
cursorstring–nextCursor from the previous call, exactly as it came back, to read on.
databasestringyesThe database: its id, its Notion URL, or the dataSourceId search returned for it.
in_trashboolean–Rows in Notion's trash instead of the live ones.
limitinteger–Rows to return; more than 100 are read 100 at a time.
matchstring–Whether a row must meet all the conditions in where, or any of them.
notion_filterobject–Notion's own filter object, for what where cannot say (nested and/or, rollups). ANDed with where when both are given.
propertiesarray–The columns to return, by name; the title always comes back. Default: all.
sortarray–The order, first key first. Default: Notion's (the database's own order).
sourcestring–Which table, only when the database holds several (describe_database lists them): its name or id.
wherearray–Conditions on the columns, e.g. [{"property": "Status", "op": "equals", "value": "In progress"}]. The column type comes from the schema.

No output schema declared.

No examples provided.

query_view ~249

The rows a saved view shows, in its order, filtered and sorted exactly as Notion applies the view (quick filters and 'me' included), with total, the number of rows the view holds. Each row is its id, title and non-empty columns as query_database answers them. Notion keeps a view's result about 15 minutes: nextCursor reads on in that same result, and after that a new call without cursor starts again. A view takes no extra filter: for that, query_database with where.

NameTypeReqDescription
accountstring–Workspace: a label list_accounts names ("*": every one). Rarely needed: an id or URL finds its own.
cursorstring–nextCursor from the previous call, exactly as it came back, to read on.
limitinteger–Rows to return. Each row is one more request, so read a long view in pages.
propertiesarray–The columns to keep in each row, by name; the title always comes back. Default: all.
viewstringyesThe view: its id from list_views, or the view's own Notion link (it carries ?v=).

No output schema declared.

No examples provided.

read_blocks ~231

The blocks directly inside a page or a block, in order, one level down: each one's id, type and plain text, and hasChildren when it holds more (read those by its id). An AI meeting-notes block answers its title, status, recording and calendar times, and the ids of the blocks that hold its summary, notes and transcript, each readable here in turn. A type the API does not support says its Notion name under unsupported. For a page's body as one text, read_page is cheaper.

NameTypeReqDescription
accountstring–Workspace: a label list_accounts names ("*": every one). Rarely needed: an id or URL finds its own.
blockstringyesThe page or block: its id, or a Notion URL. A URL's #fragment names a block inside the page, and that block is the one read.
cursorstring–nextCursor from the previous call, exactly as it came back, to read on.
limitinteger–Blocks to return; more than 100 are read 100 at a time.

No output schema declared.

No examples provided.

read_page ~211

One page by id or URL, in whichever workspace has it: its title, parent and properties as plain values (a select is its option's name, a relation its page ids, all of them), and its body as Notion's Markdown. Empty properties are left out. A body past Notion's limit (~20,000 blocks) comes back cut, with contentTruncated and the ids of the parts left out, each readable as a page. A database's id is refused: use describe_database.

NameTypeReqDescription
accountstring–Workspace: a label list_accounts names ("*": every one). Rarely needed: an id or URL finds its own.
contentboolean–Include the body as Markdown. false reads the properties alone, which is cheaper.
include_transcriptboolean–For a meeting-notes page, include the transcript.
pagestringyesThe page: its id, or its Notion URL (a row of a database is a page too).

No output schema declared.

No examples provided.

replace_content ~237

A page's whole body, replaced by this Markdown. Properties are untouched. Child pages and databases in the body are kept unless allow_deleting. An empty body needs clear: true. Answers with the page's title and how many blocks its body held before and after; check both. Prefer edit_content for a change to part of a page.

NameTypeReqDescription
accountstring–Workspace: a label list_accounts names ("*": every one). Rarely needed: an id or URL finds its own.
allow_deletingboolean–Let the change remove child pages or databases inside the page. Off, Notion refuses such a change.
clearboolean–Empty the body on purpose, with markdown "". Without it an empty markdown is refused, since it would erase the page.
markdownstringyesNotion's Markdown: headings, lists, to-dos (- [ ]), quotes, code, tables, callouts. The page's new body; empty only with clear.
pagestringyesThe page: its id, or its Notion URL (a row of a database is a page too).

No output schema declared.

No examples provided.

restore_page ~112

Out of Notion's trash, back where it was. Notion's API cannot restore a page from the top level of a workspace (it answers a validation error); that one is restored from the Trash in Notion.

NameTypeReqDescription
accountstring–Workspace: a label list_accounts names ("*": every one). Rarely needed: an id or URL finds its own.
pagestringyesThe page: its id, or its Notion URL (a row of a database is a page too).

No output schema declared.

No examples provided.

search ~199

Pages and databases by title, in every workspace at once unless account names one. Notion matches words in titles, not in page bodies. Each hit says its workspace, kind, id and parent; a database hit also carries the dataSourceId of its table. Only what is shared with the workspace's integration can be found. A workspace that fails is listed under failed, beside the others' hits.

NameTypeReqDescription
accountstring–Workspace: a label list_accounts names ("*": every one). Rarely needed: an id or URL finds its own.
cursorstring–nextCursor from the previous call, exactly as it came back, to read on.
kindstring–Only pages, or only databases.
limitinteger–Hits per workspace; across several workspaces, up to this many from each.
querystring–Words in the title. Leave it out to list everything, newest edit first.

No output schema declared.

No examples provided.

trash_page ~128

Into Notion's trash, with everything under it. Direct deletion of database templates is refused unless allow_template is explicit. Notion keeps trash 30 days; restore_page brings it back.

NameTypeReqDescription
accountstring–Workspace: a label list_accounts names ("*": every one). Rarely needed: an id or URL finds its own.
allow_templateboolean–Explicitly allow removing a database template after checking its role in list_database_templates.
pagestringyesThe page: its id, or its Notion URL (a row of a database is a page too).

No output schema declared.

No examples provided.

update_page ~217

Change a page's properties (a row's columns, checked against the database's schema; a page's title as properties: {title: ...}) and its icon. Only the columns named change. Answers the page as read_page does, without the body. The body is changed with append_content, edit_content and replace_content.

NameTypeReqDescription
accountstring–Workspace: a label list_accounts names ("*": every one). Rarely needed: an id or URL finds its own.
allow_new_optionsboolean–Let a select or multi-select value add an option the column does not have yet. A status can never be added.
icon––An emoji for the page's icon; null removes it.
pagestringyesThe page: its id, or its Notion URL (a row of a database is a page too).
propertiesobject–Column name -> value, as create_page's properties take them; only the columns named change. A page under a page: {title: ...}.

No output schema declared.

No examples provided.

upload_file ~360

Upload a file to Notion and attach it to a page: to one of a row's files columns, or as a block at the end of the page's body (an image, PDF, video or sound shows as such). The file goes by path, never as text you type. Answers with its size and SHA-256 as sent: compare them with the source. A column's own Notion-hosted files are kept unless the API cannot write them back, which is refused unless replace says so; nothing is uploaded before every check passes.

NameTypeReqDescription
accountstring–Workspace: a label list_accounts names ("*": every one). Rarely needed: an id or URL finds its own.
columnstring–A files column of the row to add it to, after the files already there. Leave it out to put it in a block at the end of the page's body.
fileobjectyesThe file, up to 20 MiB (Notion's Free plan takes 5 MiB a file). Never type or paste a file's base64 yourself: a retyped file can arrive changed. Give the path of a file in your workspace folders (the…
namestring–The name Notion shows. Default: the file's own name.
pagestringyesThe page: its id, or its Notion URL (a row of a database is a page too).
replaceboolean–With column: drop the column's Notion-hosted files, which the API cannot write back. Its external links are always kept.

No output schema declared.

No examples provided.

Install

How do I install the Notion MCP server?

Notion runs locally as an npm package, launched with npx -y @foreverworks/mcp-notion. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

npm · @foreverworks/mcp-notion

# add to Claude Code
claude mcp add com-foreverworks-notion -- npx -y @foreverworks/mcp-notion
Common questions

What is the Notion MCP server?

Notion is an MCP server listed in the public MCP registry as com.foreverworks/notion. Search, read and write your Notion workspaces, with pages as Markdown and typed database queries. This page covers its npm package (@foreverworks/mcp-notion).

Is the Notion MCP server safe to use?

Notion scores 83 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 5 November 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the Notion MCP server expose?

Notion exposes 27 tools: add_column, add_comment, add_options, append_content, count_rows, and 22 more. Their descriptions and schemas cost roughly 5,558 tokens of context every time the server is loaded.

Is the Notion MCP server still maintained?

Notion is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the Notion MCP server under?

Notion declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

What did VerifyMCP test on the Notion MCP server?

VerifyMCP ran 16 checks on Notion, covering Malware scan, Known CVEs, Install scripts, Dependency health and 12 more. Endpoint Security and Transport & Reachability do not apply to an npm package, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.