Claude Code + Notion MCP

Control Notion with Claude

Use natural language to search, create, and manage your Notion workspace directly from Claude Code via the Notion MCP Server.

Getting Started

1

Create a Notion Integration

Go to notion.so/my-integrations and create a new internal integration. Copy the API key.

2

Configure MCP Server

Add the Notion MCP server to your ~/.claude/.mcp.json:

~/.claude/.mcp.json
{
  "mcpServers": {
    "notion": {
      "command": "npx",
      "args": ["-y", "@notionhq/notion-mcp-server"],
      "env": {
        "NOTION_API_KEY": "your-api-key-here"
      }
    }
  }
}
3

Share Pages with the Integration

In Notion, open any page or database you want Claude to access. Click ...Connections → add your integration. Claude can only access pages explicitly shared.

4

Start Using It

Launch Claude Code and ask it to interact with Notion. Claude will automatically use the MCP tools when needed.

Available Functions

The Notion MCP Server exposes these tools to Claude. Click any function to see details and examples.

🔍 Search

notion_search
Search across all pages and databases in your workspace

Parameters

querystringSearch text to find matching pages or databases
filterobjectOptional. Filter by "page" or "database"
sortobjectOptional. Sort by "last_edited_time" ascending or descending

Example Prompt

Search my Notion for anything related to "Q1 Marketing Plan"

What Claude Does

notion_search({
  query: "Q1 Marketing Plan",
  filter: { property: "object", value: "page" },
  sort: { direction: "descending", timestamp: "last_edited_time" }
})

📄 Pages

notion_get_page
Retrieve a page and its properties by ID

Parameters

page_idstringThe ID of the page to retrieve

Example Prompt

Get the details of my project roadmap page

What Claude Does

// First searches for the page
notion_search({ query: "project roadmap" })
// Then retrieves it by ID
notion_get_page({ page_id: "abc123-..." })
notion_create_page
Create a new page inside a parent page or database

Parameters

parentobjectParent page or database ID
propertiesobjectPage title and other properties
childrenarrayOptional. Block content for the page body

Example Prompt

Create a new meeting notes page in my "Work" database with today's date and attendees: Alice, Bob

What Claude Does

notion_create_page({
  parent: { database_id: "work-db-id" },
  properties: {
    "Name": { title: [{ text: { content: "Meeting Notes - 2026-03-22" }}] },
    "Attendees": { multi_select: [{ name: "Alice" }, { name: "Bob" }] }
  },
  children: [
    { heading_2: { rich_text: [{ text: { content: "Agenda" }}] } },
    { bulleted_list_item: { rich_text: [{ text: { content: "Item 1" }}] } }
  ]
})
notion_update_page
Update properties of an existing page (title, status, tags, etc.)

Parameters

page_idstringThe page to update
propertiesobjectProperties to change

Example Prompt

Mark the "Homepage Redesign" task as Done

What Claude Does

notion_search({ query: "Homepage Redesign" })
notion_update_page({
  page_id: "page-id-here",
  properties: {
    "Status": { select: { name: "Done" } }
  }
})

🧩 Blocks (Content)

notion_get_block
Retrieve a specific block by its ID

Parameters

block_idstringThe block ID to retrieve

Example Prompt

Read the first paragraph of my "Design Principles" page

What Claude Does

// Gets the page's child blocks, then reads a specific one
notion_get_block_children({ block_id: "page-id" })
notion_get_block({ block_id: "first-paragraph-id" })
notion_get_block_children
List all child blocks of a page or block (read page content)

Parameters

block_idstringThe parent block or page ID
page_sizenumberOptional. Number of results (max 100)

Example Prompt

Show me all the content on my "Weekly Standup" page

What Claude Does

notion_search({ query: "Weekly Standup" })
notion_get_block_children({ block_id: "page-id" })
notion_append_block_children
Add new content blocks to a page or existing block

Parameters

block_idstringThe page or block to append to
childrenarrayArray of block objects to add

Example Prompt

Add a new section called "Action Items" to my meeting notes with three bullet points

What Claude Does

notion_append_block_children({
  block_id: "meeting-notes-page-id",
  children: [
    { heading_2: { rich_text: [{ text: { content: "Action Items" }}] } },
    { bulleted_list_item: { rich_text: [{ text: { content: "Follow up with design team" }}] } },
    { bulleted_list_item: { rich_text: [{ text: { content: "Update project timeline" }}] } },
    { bulleted_list_item: { rich_text: [{ text: { content: "Send recap email" }}] } }
  ]
})
notion_delete_block
Delete (archive) a block from a page

Parameters

block_idstringThe block to delete

Example Prompt

Remove the outdated "Q4 Goals" section from my planning page

What Claude Does

// Finds the block, then deletes it
notion_get_block_children({ block_id: "planning-page-id" })
notion_delete_block({ block_id: "q4-goals-block-id" })

🗃 Databases

notion_get_database
Retrieve database schema (columns, property types, options)

Parameters

database_idstringThe database to retrieve

Example Prompt

What columns does my "Task Tracker" database have?

What Claude Does

notion_search({ query: "Task Tracker", filter: { property: "object", value: "database" } })
notion_get_database({ database_id: "db-id" })
// Returns: Name (title), Status (select), Priority (select),
//          Due Date (date), Assignee (people)
notion_query_database
Query a database with filters and sorts

Parameters

database_idstringThe database to query
filterobjectOptional. Filter conditions
sortsarrayOptional. Sort criteria

Example Prompt

Show me all high-priority tasks that are still in progress

What Claude Does

notion_query_database({
  database_id: "task-db-id",
  filter: {
    and: [
      { property: "Priority", select: { equals: "High" } },
      { property: "Status", select: { equals: "In Progress" } }
    ]
  },
  sorts: [{ property: "Due Date", direction: "ascending" }]
})
notion_create_database
Create a new database inside a page

Parameters

parentobjectParent page ID
titlearrayDatabase title
propertiesobjectColumn definitions

Example Prompt

Create a bug tracker database with columns for title, severity, status, and assignee

What Claude Does

notion_create_database({
  parent: { page_id: "parent-page-id" },
  title: [{ text: { content: "Bug Tracker" } }],
  properties: {
    "Name": { title: {} },
    "Severity": { select: { options: [
      { name: "Critical", color: "red" },
      { name: "High", color: "orange" },
      { name: "Medium", color: "yellow" },
      { name: "Low", color: "green" }
    ]}},
    "Status": { select: { options: [
      { name: "Open" }, { name: "In Progress" }, { name: "Resolved" }
    ]}},
    "Assignee": { people: {} }
  }
})
notion_update_database
Modify database title or add/update columns

Parameters

database_idstringThe database to update
titlearrayOptional. New title
propertiesobjectOptional. Column changes

Example Prompt

Add a "Due Date" column to my bug tracker database

What Claude Does

notion_update_database({
  database_id: "bug-tracker-db-id",
  properties: {
    "Due Date": { date: {} }
  }
})

💬 Comments

notion_create_comment
Add a comment to a page or discussion thread

Parameters

parentobjectPage ID to comment on
rich_textarrayComment content

Example Prompt

Leave a comment on the "API Design" page saying "Reviewed - looks good to ship"

What Claude Does

notion_create_comment({
  parent: { page_id: "api-design-page-id" },
  rich_text: [{ text: { content: "Reviewed - looks good to ship" } }]
})
notion_get_comments
Retrieve all comments on a page

Parameters

block_idstringThe page or block ID

Example Prompt

Show me all the comments on the "Sprint Planning" page

What Claude Does

notion_search({ query: "Sprint Planning" })
notion_get_comments({ block_id: "sprint-planning-page-id" })

👤 Users

notion_list_users
List all users in the workspace

Parameters

No parameters required

Example Prompt

Who has access to my Notion workspace?

What Claude Does

notion_list_users()
// Returns: list of users with names, emails, and avatars
notion_get_user
Get details about a specific user

Parameters

user_idstringThe user ID to look up

Example Prompt

Get the details for user who last edited the roadmap page

What Claude Does

notion_get_page({ page_id: "roadmap-page-id" })
// Extracts last_edited_by user ID from response
notion_get_user({ user_id: "user-id-from-page" })

Tips & Best Practices

💡

Use Natural Language

You don't need to know the API. Just describe what you want: "Create a task called Fix Login Bug with high priority in my project tracker."

🔗

Share Pages First

Claude can only access pages connected to the integration. If a search returns nothing, check that the page is shared with your Notion integration.

Chain Operations

Claude can combine multiple operations: "Find all overdue tasks, mark them as urgent, and add a comment explaining why."

🛠

Database Power

Databases are where Notion shines with Claude. Query, filter, sort, create entries, and update properties - all through conversation.