Remote MCP server
KnowledgeConnect Claude to Notion
Read and update pages, databases, and team knowledge. Toolspoke puts 17 of its actions behind one MCP endpoint that Claude, Cursor, and Codex all speak.
- Connection
- Remote MCP server
- Authentication
- Notion OAuth
- Actions exposed
- 17
- Cost per call (typical)
- 1 credit
- Adapter
- Maintained by Toolspoke
Connected in three steps
- 1
Install Notion
Open the marketplace in your workspace, add Notion to the project your agents work in, and it appears on the gateway immediately.
- 2
Connect the credential
Sign in to Notion. Toolspoke holds the token encrypted and refreshes it when it expires.
- 3
Point your agent at the gateway
Give your client one address, https://toolspoke.com/mcp. Claude Code takes it as a command, Claude and Claude Desktop add it as a custom connector, and Cursor, Codex and VS Code each read it from a config file of their own.
.mcp.json{
"mcpServers": {
"toolspoke": {
"type": "http",
"url": "https://toolspoke.com/mcp"
}
}
}One block covers every tool you have installed. Notion shows up in the client as soon as your policy allows it, and so does everything else you install later.
Where the address goes, per client
- Claude Code
Run it in your project, then /mcp to sign in
claude mcp add --transport http toolspoke https://toolspoke.com/mcp- Claude and Claude Desktop
Settings, then Connectors, then Add custom connector
https://toolspoke.com/mcp- Cursor
~/.cursor/mcp.json, or .cursor/mcp.json for one project
{ "mcpServers": { "toolspoke": { "url": "https://toolspoke.com/mcp" } } }- Codex
~/.codex/config.toml
[mcp_servers.toolspoke] url = "https://toolspoke.com/mcp"- VS Code
.vscode/mcp.json, or the MCP: Add Server command
{ "servers": { "toolspoke": { "type": "http", "url": "https://toolspoke.com/mcp" } } }
What Notion asks for
Press connect and sign in to Notion. Toolspoke keeps the token encrypted and refreshes it when it expires, so there is nothing to copy and nothing to rotate by hand.
What Claude can do in Notion
17 actions, each one declared and named by the connector rather than discovered at runtime. A workspace policy grants a person all of them, a hand-picked selection, everything on the read side, everything on the write side, or none.
- Reads
- 8Reads
- Writes
- 9Writes
- Destructive
- 0Destructive
Reads
8Fetches data and changes nothing.
notion-searchSearch Notion and any connected sources (Slack, Drive, GitHub, Jira, Linear) and return ranked results to read. Start here when you do not already have a page id, then call notion-fetch on the ids you want in full. Set query_type to "user" to look people up by name or email.
notion-fetchRetrieve a Notion page, database, or data source in full by id or URL. Pages come back as Notion-flavored Markdown; databases list their data sources with collection:// ids you need for querying. Pass the id "self" to identify the connected workspace and user.
notion-query-data-sourcesQuery database rows with read-only SQLite against one or more data sources. Call notion-fetch on the database first to get its collection:// URLs and schema, then use those URLs as table names. Use parameters rather than string interpolation; checkboxes compare against "__YES__" and "__NO__".
notion-query-database-viewReturn the rows of a database view with its own filters and sorts already applied. Use this when the workspace already has the view you want; use notion-query-data-sources when you need custom SQL or aggregation.
notion-get-commentsRead the discussions on a page, with their full comment text. Returns page-level threads by default; set include_all_blocks for inline comments and include_resolved to see closed ones.
notion-get-teamsList the teamspaces in this workspace with their ids, names, and whether the connected user is a member. Use it to get the teamspace_id that narrows notion-search.
notion-get-usersList or search workspace members and guests, returning their ids, names, and emails. Use it to resolve a person's name to the user id that People properties and user mentions need. Pass user_id "self" for the connected user.
notion-get-async-taskPoll a background task started by notion-create-pages, notion-update-page, or another tool called with allow_async. Status is queued, running, retrying, succeeded, or failed; the result or error arrives once it finishes. Wait a few seconds between polls.
Writes
9Creates or updates something on the other side.
notion-create-pagesCreate one or more Notion pages under a shared parent. When the parent is a database, call notion-fetch on it first to learn its schema and exact property names. Content is Notion-flavored Markdown and must not repeat the title.
notion-update-pageUpdate one page's properties or content. Pick the narrowest command: update_properties for fields, update_content for search-and-replace edits, insert_content to prepend or append, replace_content only to rewrite the whole page. Fetch the page first so old_str matches exactly.
notion-move-pagesMove up to 100 pages or databases under a new parent. Use it to file loose pages into a teamspace page or a database. Data sources under a database cannot be moved on their own.
notion-duplicate-pageDuplicate a page inside the same workspace. The copy is created asynchronously, so the returned id may not be populated immediately - re-read it with notion-fetch if you need its contents.
notion-create-databaseCreate a database from a SQL-style CREATE TABLE schema, or from one of Notion's canonical types (tasks, projects, skills). Returns the new data source id needed by notion-query-data-sources and notion-update-data-source. Provide exactly one of schema or database_type.
notion-update-data-sourceChange a data source's schema, title, or description with SQL DDL. Supports ADD COLUMN, DROP COLUMN, RENAME COLUMN, and ALTER COLUMN SET. DROP COLUMN removes a property and its values, and in_trash moves the whole data source to the trash - use both deliberately.
notion-create-viewAdd a view to a database, or embed a linked view of it on another page. Supply database_id to add a tab, or parent_page_id to append an inline linked view. Filters, sorts, and grouping come from the configure DSL.
notion-update-viewRename a view or change its filters, sorts, grouping, and visible properties. Only send the fields you want to change; CLEAR FILTER, CLEAR SORT, and CLEAR GROUP BY remove existing settings.
notion-create-commentAdd a comment to a page, to a specific passage on it, or as a reply in an existing thread. Pass page_id alone for a page-level comment, add selection_with_ellipsis to anchor it to content, or pass discussion_id to reply.
What it will not do
Enforced by the gateway rather than left to convention, which is why each of these can be stated flatly.
- It cannot call anything else
- The 17 actions above are the whole of it. A call to any other name is refused before it reaches Notion rather than forwarded on, and connecting your account does not add to the list: it is fixed by the connector, not discovered at run time.
- Nothing here deletes
- This connector writes to Notion, but nothing in it deletes or permanently alters anything.
- It reaches no further than your credential
- Toolspoke holds no access to Notion of its own. Every call carries the credential you stored and nothing besides, so whatever that credential cannot reach, this connector cannot reach either.
- It never hears from Notion
- Nothing is pushed to it. There is no webhook, no subscription and no polling, so this connector cannot notice by itself that something changed in Notion. An agent has to ask.
- It does not smooth over provider limits
- Toolspoke does not retry, queue or back off around Notion's own rate limits. A call that Notion refuses comes back to the agent as a failed call.
Before you connect it
What can Claude do in Notion?
17 named actions: 8 that only read and 9 that write. They include notion-search, notion-fetch and notion-create-pages. Nothing outside that list is reachable: the connector declares each operation by name rather than proxying whatever an agent asks for.
What credentials does the Notion connector need?
Nothing to paste. You sign in to Notion over OAuth 2.0 and Toolspoke keeps the resulting token encrypted, refreshing it when it expires.
Does the Notion connector work with Cursor and Codex, or only Claude?
Any client that speaks MCP, and every one of them gets the same 17 actions. There is a single address, https://toolspoke.com/mcp. Claude Code adds it with claude mcp add --transport http, Claude and Claude Desktop take it as a custom connector in settings, Cursor reads it from .cursor/mcp.json, Codex from ~/.codex/config.toml, and VS Code from .vscode/mcp.json. Each of them signs in to the gateway itself, so there is no key to paste.
What does the Notion connector not do?
The 17 actions above are the whole of it. A call to any other name is refused before it reaches Notion rather than forwarded on, and connecting your account does not add to the list: it is fixed by the connector, not discovered at run time. This connector writes to Notion, but nothing in it deletes or permanently alters anything. Toolspoke holds no access to Notion of its own. Every call carries the credential you stored and nothing besides, so whatever that credential cannot reach, this connector cannot reach either. Nothing is pushed to it. There is no webhook, no subscription and no polling, so this connector cannot notice by itself that something changed in Notion. An agent has to ask. Toolspoke does not retry, queue or back off around Notion's own rate limits. A call that Notion refuses comes back to the agent as a failed call.
Can I limit which actions an agent can call?
Yes, in two places. The project switches Notion's actions on and off one at a time, for everyone in the project at once, and the screen groups them by read, write and destructive so turning off everything that deletes is one click. An individual agent key can then be narrowed further, to particular toolkits in a project and to particular actions in a toolkit. Whatever it was granted, a key never reaches a project its owner cannot.
What gets recorded when an agent calls Notion?
Every attempt, with the agent that made it and the person that agent belongs to, the full request payload, the response payload, the status, the duration, and the credits spent. Values whose key names a secret are masked out before the record is shown to anyone. An operation the connector marks as not retained never has its response body written at all, so the gateway keeps no second copy of what was read.