A Model Context Protocol server that enables Claude and other LLMs to interact with Notion workspaces, providing capabilities like searching, retrieving, creating and updating pages, as well as managing databases.
A Model Context Protocol server for Notion integration, allowing Claude and other LLMs to interact with your Notion workspace.
Clone this repository
Install dependencies
npm install
Configure your Notion API key
.env
file and replace your_notion_api_key_here
with your actual API key, orBuild the server
npm run build
Running the server
npm start
Install Claude for Desktop (if not already installed)
Open your Claude for Desktop App configuration:
~/Library/Application Support/Claude/claude_desktop_config.json
Add the Notion server to your configuration:
{ "mcpServers": { "notion": { "command": "node", "args": [ "/Users/shaheerahmad/Documents/notion-mcp-server/dist/index.js", "--notion-api-key=YOUR_ACTUAL_API_KEY_HERE" ] } } }
Replace:
/Users/shaheerahmad/Documents/notion-mcp-server
with the full path to your project directoryYOUR_ACTUAL_API_KEY_HERE
with your actual Notion API keyRestart Claude for Desktop
Once connected to Claude for Desktop, you can use the server by asking Claude questions like:
Claude will automatically use the appropriate tools based on your request.
Search for "meeting notes" in my Notion workspace
Get the content of my Notion page with ID 1aaada269d1b8003adceda69cf7bcd97
Create a new page in Notion with title "Weekly Report" and content "This week we accomplished the following tasks..."
Update my Notion page with ID 1aaada269d1b8003adceda69cf7bcd97 with content "Adding this new information to the page."
You can also update the title:
Update my Notion page with ID 1aaada269d1b8003adceda69cf7bcd97 with title "New Title" and content "New content to add."
Create a new database in my Notion page with ID 1aaada269d1b8003adceda69cf7bcd97 with title "Task Tracker" and properties {
"Task Name": { "title": {} },
"Status": {
"select": {
"options": [
{ "name": "Not Started", "color": "red" },
{ "name": "In Progress", "color": "yellow" },
{ "name": "Completed", "color": "green" }
]
}
},
"Priority": {
"select": {
"options": [
{ "name": "Low", "color": "blue" },
{ "name": "Medium", "color": "yellow" },
{ "name": "High", "color": "red" }
]
}
},
"Due Date": { "date": {} }
}
Query my Notion database with ID 1aaada269d1b8003adceda69cf7bcd97 with filter {
"property": "Status",
"select": {
"equals": "Completed"
}
}
You can also add sorting:
Query my Notion database with ID 1aaada269d1b8003adceda69cf7bcd97 with sort {
"property": "Due Date",
"direction": "ascending"
}
Update properties of an existing database entry (page within a database).
{ "tool_name": "update-database-entry", "tool_params": { "pageId": "page_id_of_database_entry", "properties": { "Status": { "select": { "name": "Completed" } }, "Priority": { "select": { "name": "High" } }, "Due Date": { "date": { "start": "2023-12-31" } } } } }
The properties
parameter should match the structure expected by the Notion API for the specific property types in your database. Different property types (text, select, date, etc.) require different formats.
Add a new row to an existing database with custom properties.
{ "tool_name": "create-database-row", "tool_params": { "databaseId": "your_database_id_here", "properties": { "Name": { "title": [ { "text": { "content": "New Task" } } ] }, "Status": { "select": { "name": "Not Started" } }, "Priority": { "select": { "name": "Medium" } }, "Due Date": { "date": { "start": "2023-12-15" } }, "Notes": { "rich_text": [ { "text": { "content": "This is a new task created via the API" } } ] } } } }
The properties
parameter must include all required properties for the database and follow the Notion API structure for each property type.
If tools aren't showing up, check the Claude for Desktop logs:
tail -n 20 -f ~/Library/Logs/Claude/mcp*.log
Make sure your Notion API key is correctly set and that your integration has been granted access to the pages you want to interact with.
If you see "Unexpected token" errors in the logs, it's likely that console.log statements are interfering with the MCP protocol. This version of the server has been updated to avoid those issues.
Discover shared experiences
Shared threads will appear here, showcasing real-world applications and insights from the community. Check back soon for updates!