Notion MCP Server
for AI Agents
Connect your AI agent to StackOne's Notion MCP server and give it 35 MCP tools out of the box. Auth, tool execution, and security all managed.
Coverage
35 Agent Actions
Create, read, update, and delete across Notion — and extend your agent's capabilities with custom actions.
Authentication
Agent Tool Authentication
Per-user OAuth in one call. Your Notion MCP server gets session-scoped tokens with zero credentials stored on your infra.
Agent Auth →Security
Agent Protection
Every Notion tool response scanned for prompt injection in milliseconds — 88.7% accuracy, all running on CPU.
Prompt Injection Defense →Performance
Max Agent Context. Min Cost.
Free up to 96% of your agent's context window to enhance reasoning and reduce cost, on every Notion call.
Tools Discovery →What is the Notion MCP Server?
A Notion MCP server lets AI agents read and write Notion data through the Model Context Protocol — Anthropic's open standard for connecting LLMs to external tools. StackOne's Notion MCP server ships with 35 pre-built actions, fully extensible via the Connector Builder — plus managed authentication, prompt injection defense, observability, and agent execution runtime. Connect it from MCP clients like Claude Desktop, Claude Code, Cursor, Goose, and VS Code, or from agent frameworks like OpenAI Agents SDK, LangChain, and Vercel AI SDK.
How Your AI Agent Uses the Notion MCP Server
Prompt your Notion MCP Agent
Untitled
Waiting for agent...
Interactive demo available on desktop.
All Notion MCP Tools
Every action from Notion's API, ready for your agent. Create, read, update, and delete — scoped to exactly what you need.
Block Children
- Append Block Children
Add content blocks (text, headings, lists, images, etc.) to an existing page or block. Use this after create_page to add more content, or to append to any existing page. The block_id parameter accepts a page_id directly.
- Get Block Children
Retrieve the content blocks inside a page or parent block. This is how you read a page's actual content (text, headings, lists, etc.) — get_page only returns properties/metadata, not content.
Blocks
- Get Block
Retrieve a single block's type, content, and metadata by its block_id (does NOT return children — use get_block_children for nested content).
- Update Block
Modify an existing block's content (text, headings, to-dos, etc.) by block_id. ALWAYS call this after reading blocks when the user asks to change or update existing content. First use get_block_children to find the block_id and type, then call this action with the new content.
- Delete Block
Archive (soft-delete) a block by its block_id. The block is moved to trash, not permanently deleted — it can be restored by setting in_trash to false via update_block.
Comments
- Create Comment
Create a comment on a page or block, or reply to an existing discussion thread. Use the page_id directly from create_page or search results — no need to re-search after creation.
- List Comments
List all unresolved comments on a page or block, with pagination. Resolved comments are excluded from results.
- Retrieve Comment
Retrieve a single comment's full details (content, author, timestamps, parent) by its comment_id.
Databases
- Create Database
Create a new Notion database under a parent page, with an optional initial schema (columns/properties) defined via initial_data_source. Returns the database object including its data_sources list.
- Get Database
Retrieve a database's metadata and its list of data sources (with IDs) by database_id. Does NOT return rows — use query_data_source for that. Use retrieve_data_source to get a data source's schema.
- Update Database
Update database-level attributes (title, icon, cover, parent, archive status). To update columns/schema, use update_data_source instead.
Data Sources
- Create Data Source
Add a new data source (with its own schema/columns) to an existing database. Use this when a database needs multiple data sources with different property schemas.
- Retrieve Data Source
Retrieve a data source's schema (columns/properties) by its data_source_id. To get rows, use query_data_source instead. Get the data_source_id from get_database.
- Query Data Source
Query a database's data source to retrieve rows (pages) with optional filtering and sorting. This is how you list or search for rows in a Notion database.
- Update Data Source
Update a data source's schema (add, rename, or remove columns), title, icon, or trash status. To update row values, use update_page instead.
File Uploads
- Create File Upload
Step 1 of file upload — create a file upload session to get an upload URL. Then call send_file_upload (step 2), and complete_file_upload (step 3, multi_part only).
- Send File Upload
Step 2 of file upload — send the actual file data for a file upload session created by create_file_upload. For multi_part, call complete_file_upload after all parts are sent.
- List File Uploads
List all file uploads created by this bot integration, sorted most recent first. Filter by status (pending, uploaded, expired, failed) to find specific uploads.
- Retrieve File Upload
Retrieve a single file upload's metadata and status (pending, uploaded, expired, failed) by its file_upload_id. Use after send_file_upload to verify upload completion.
Unified Organizations
- List Unified Organizations
List unified organizations in Notion.
- Get Unified Organization
Get a unified Notion organization by ID.
Unified Users
- List Unified Users
List unified users in Notion.
- Get Unified User
Get a unified Notion user by ID.
Pages
- Create Page
Create a new page in a Notion workspace. After creation, the returned page object contains the new page_id — use it directly for follow-up actions (append_block_children, create_comment, move_page) without re-searching.
- Get Page
Retrieve a Notion page's properties and metadata by its page_id (does NOT return page content — use get_block_children for that).
- Update Page
Update page properties, icon, cover, or trash status by page ID. IMPORTANT — You must already have the page_id; if you only have a page name or title, you MUST call search first to find the page_id before calling this action. This action CANNOT look up pages by name. To change a page's parent location, use move_page instead.
- Move Page
Move a page to a different parent page or database. THIS IS THE ONLY ACTION that can change a page's parent location — update_page CANNOT do this. Use move_page whenever the user asks to "move", "relocate", "reparent", or "transfer" a page to a new location.
Users
- List Users
List ALL users (people and bots) in the Notion workspace. Returns the complete set of workspace members across all pages — always iterate through ALL results and report the full count. Guests are excluded by Notion.
- Get User
Retrieve a single Notion user's profile (name, email, avatar, type) by their user_id. Get user IDs from list_users results.
Other (6)
- List Data Source Templates
List all page templates available for a data source, including each template's ID, name, and default status. Useful before create_page with template parameter.
- Get Unified Credentials
Get the current Notion connection's unified credentials and identity.
- Get Page Property
Retrieve a single page property value by page_id and property_id, with pagination support for large properties (title, rich_text, relation, people) that exceed the 25-reference limit returned by get_page.
- Search
Search for pages and data sources by title text. Use this to find a page_id when you only have a page name — required before calling update_page, move_page, or any action that needs a page_id you do not already have. Once you have the ID from search results, proceed directly to the next action without searching again.
- Get Bot User
Retrieve the bot user (integration identity) associated with the current API token, including the workspace_id and the person who authorized the integration.
- Complete File Upload
Step 3 of multi_part file upload only — finalize after all parts are sent via send_file_upload. Not needed for single_part or external_url modes.
Set Up Your Notion MCP Server in Minutes
One endpoint. Any framework. Your agent is talking to Notion in under 10 lines of code.
Agent Frameworks
{
"mcpServers": {
"stackone": {
"command": "npx",
"args": [
"-y",
"mcp-remote@latest",
"https://api.stackone.com/mcp?x-account-id=<account_id>",
"--header",
"Authorization: Basic <YOUR_BASE64_TOKEN>"
]
}
}
}Check More Documents & Knowledge MCP Servers
134+ actions
101+ actions
96+ actions
95+ actions
92+ actions
80+ actions
80+ actions
Notion Resources
Notion MCP Server: Capabilities, Limitations, and Alternatives
The official Notion MCP server handles search and retrieval well. This post covers what it can't do and when the StackOne MCP server is the right alternative.
9 min
MCP Code Mode: Keeping Tool Responses Out of Agent Context
Anthropic's code_execution processes data already in context. Custom MCP code mode keeps raw tool responses in a sandbox. 14K tokens vs 500.
11 min
Comparing BM25, TF-IDF, and Hybrid Search for MCP Tool Discovery
Benchmarking BM25, TF-IDF, and hybrid search for MCP tool discovery across 916 tools. The 80/20 TF-IDF/BM25 hybrid hits 21% Top-1 accuracy in under 1ms.
10 min
Indirect Prompt Injection Defense for MCP Tools: A Technical Guide
MCP tools that read emails, CRM records, and tickets are indirect prompt injection vectors. Here's how we built a two-tier defense that scans tool results in ~11ms.
12 min
MCP vs A2A: Architecture, Security, and When to Use Each
MCP vs A2A: what each protocol standardizes, how they differ, their shared security risks including indirect prompt injection, and when to use one, both, or a hybrid architecture.
12 min
MCP vs API: What 200+ Connector Builds Taught Us
MCP wraps APIs, it doesn't replace them. After building 200+ connectors that serve both, here's when each approach wins.
14 min read
Notion MCP Server FAQ
Does StackOne have a Notion MCP server?
Notion MCP server vs direct API integration — what's the difference?
How does Notion authentication work for AI agents?
origin_owner_id.Are Notion MCP tools vulnerable to prompt injection?
What is the context bloat of a Notion agent and how do I avoid it?
Can I limit which actions my Notion agent can access?
Can I create custom agent actions for my Notion MCP server?
When should I NOT use a Notion MCP server?
What AI frameworks and AI clients does the StackOne Notion MCP server support?
Put your AI agents to work
All the tools you need to build and scale AI agent integrations, with best-in-class connectivity, execution, and security.