The short answer
Notion’s hosted MCP server at https://mcp.notion.com/mcp acts with your own permissions: after OAuth, the client can read and update anything you can access in that workspace.1 There’s no read-only switch on the server. To narrow it, keep your client’s confirmation on for every tool that changes content, hide the tools you don’t need in clients that support it, connect through a Notion account with limited access, and have a workspace owner review which clients are connected.
Deedglass
A tool call meets your rules before it runs
Asks to run
DELETE FROM visits;
Deletes every row in visits
Deedglass checks your rules
- Reading dataAllowed
- Deleting a whole table (DROP, TRUNCATE)Never
- Changing or deleting rows without saying which (WHERE)This one
- Other changesWait for a person
What the tools cover
Notion’s supported-tools page lists more than sixty tools. Grouped by what they can do:
| Group | Examples | Effect |
|---|---|---|
| Read and search | notion-search, notion-fetch, notion-query-data-sources |
reads pages, databases and, through connectors, other sources |
| Create | notion-create-pages, notion-create-database, notion-duplicate-page |
adds content |
| Change | notion-update-page, notion-update-data-source, notion-move-pages |
edits or moves content |
| Trash and restore | notion-delete-pages, notion-delete-databases, notion-restore-pages |
moves content to Trash, or back |
| Comments | notion-create-comment, notion-delete-comment |
writes in discussions |
| Calendar and sessions | notion-calendar-create-events, notion-spawn-session |
acts outside the page tree |
The two delete tools are the ones to understand. Each moves up to 20 pages or databases to Trash in one call, databases with all their rows, and anything trashed can be restored with notion-restore-pages or from Trash in Notion.4 That’s a softer failure than a database DROP: nothing is gone for good on the first call.
How the delete confirmation works
Notion added a guard to those two tools: the call must set user_confirmed: true. Without it, nothing moves to Trash, and the error lists the pages, or the databases and their row counts, so the client can confirm with the user.4
Be precise about what that does. user_confirmed is an argument in the tool call, and the model writes the tool call. A well-behaved client and model will show you the list and ask. But nothing in the protocol makes the model ask before setting the flag on the second attempt. The confirmation that holds is your client’s own approval prompt, the one you click. Keep that on for the delete, move and update tools, and don’t choose “always allow” for them.
Notion’s security page says the same thing from the other side: enable confirmation before actions that change content, review proposed actions, and treat content returned by tools as untrusted.2
The data leaves with the client
The less obvious risk is reading. Notion warns that a connected client may send content returned by Notion MCP to systems outside Notion, and that this can include full items from connected sources, such as Slack threads, Google Drive files and emails, when notion-fetch opens a connector search result.2
So a Notion connection can be all three legs of Simon Willison’s “lethal trifecta” at once: private data, untrusted content (anyone who can edit a shared page can plant instructions), and, if the agent also has a web or messaging tool, a way to send data out.5 For a coding agent, the simplest fix is not to give it Notion in the same session as tools that can reach the internet.
Ways to narrow it
The server doesn’t have a read-only mode, so the narrowing happens around it.
1. Hide write tools in the client. Some clients filter a server’s tools. Gemini CLI has includeTools as an allow-list and excludeTools to remove tools;6 Codex has enabled_tools and disabled_tools.7 A Codex entry that keeps Notion to reading:
Code A settings file: the rules a tool reads before it acts.
[mcp_servers.notion]
url = "https://mcp.notion.com/mcp"
enabled_tools = ["notion-search", "notion-fetch", "notion-query-data-sources"]
Hiding a tool in one client doesn’t change what the OAuth grant allows, but it does keep the model from calling it.
2. Use an account with less access. For shared or automated setups, Notion suggests a service account rather than a personal one.3 Give that account access to the teamspaces the agent needs and nothing else. The agent can only reach what the account can.
3. Let a workspace owner see the connections. Owners manage MCP clients in Settings → Notion MCP → Manage workspace clients; limiting which clients members can connect needs the Enterprise plan.2
4. Avoid the old open-source server. Notion says its open-source notion-mcp-server is no longer actively maintained.3
What a config scanner sees
A Notion entry is a URL, so a file-based scanner sees almost nothing. In our run of deedglass 0.13.0’s scan, the Notion server added no write paths to the grade.8 Everything that matters, the account and the client’s approval settings, lives outside the config file.
A checklist
- The connection uses
https://mcp.notion.com/mcp, not a third-party URL or the old package. - The Notion account behind it can reach only the teamspaces the agent needs.
- Your client asks before
notion-delete-*,notion-move-pagesandnotion-update-*. - No “always allow” on those tools.
- Notion isn’t in the same agent session as a web, email or messaging tool.
- A workspace owner has reviewed the connected clients.
Questions people ask
Can Notion MCP delete pages?
It can move up to 20 pages or databases to Trash per call with notion-delete-pages and notion-delete-databases, and they can be restored. The call needs user_confirmed: true.4
Does Notion MCP have a read-only mode?
Notion’s docs describe no read-only mode for the hosted server; a client can read and update anything the user can access.1 Narrow it with client-side tool filters and a less-privileged account.
Is the notion-mcp-server package still maintained?
No. Notion says the open-source server is no longer actively maintained and recommends the hosted server.3
For the approval side, see human-in-the-loop approval and how to require approval for MCP tool calls. Where each client keeps its config is in the config paths table, and the broader review is the ten-minute MCP config audit. The trifecta itself is explained in the lethal trifecta post.
To see what the rest of your agent setup can change, run npx deedglass scan in the repository (what the grade means), or watch the checks in the playground.
Written with AI assistance and checked against our claims register.