Best use case
Notion is best used when you need a repeatable AI agent workflow instead of a one-off prompt.
Use MCP Notion for documentation, task tracking, and knowledge management.
Teams using Notion should expect a more consistent output, faster repeated execution, less prompt rewriting.
When to use this skill
- You want a reusable workflow that can be run more than once with consistent structure.
When not to use this skill
- You only need a quick one-off answer and do not need a reusable workflow.
- You cannot install or maintain the underlying files, dependencies, or repository context.
Installation
Claude Code / Cursor / Codex
Manual Installation
- Download SKILL.md from GitHub
- Place it in
.claude/skills/notion/SKILL.mdinside your project - Restart your AI agent — it will auto-discover the skill
How Notion Compares
| Feature / Agent | Notion | Standard Approach |
|---|---|---|
| Platform Support | Not specified | Limited / Varies |
| Context Awareness | High | Baseline |
| Installation Complexity | Unknown | N/A |
Frequently Asked Questions
What does this skill do?
Use MCP Notion for documentation, task tracking, and knowledge management.
Where can I find the source code?
You can find the source code on GitHub using the link provided at the top of the page.
SKILL.md Source
<!-- NOTION:START -->
# Notion MCP Instructions
**CRITICAL**: Use MCP Notion for documentation, task tracking, and knowledge management.
## Core Operations
### Database Queries
```typescript
// Query database
notion.databases.query({
database_id: 'database-id',
filter: {
property: 'Status',
select: { equals: 'In Progress' }
},
sorts: [{ property: 'Created', direction: 'descending' }]
})
// Get database
notion.databases.retrieve({ database_id: 'database-id' })
```
### Page Operations
```typescript
// Create page
notion.pages.create({
parent: { database_id: 'database-id' },
properties: {
'Name': { title: [{ text: { content: 'New Task' } }] },
'Status': { select: { name: 'To Do' } },
'Priority': { select: { name: 'High' } }
}
})
// Update page
notion.pages.update({
page_id: 'page-id',
properties: {
'Status': { select: { name: 'Done' } }
}
})
// Get page
notion.pages.retrieve({ page_id: 'page-id' })
```
### Block Operations
```typescript
// Get blocks
notion.blocks.children.list({ block_id: 'page-id' })
// Append blocks
notion.blocks.children.append({
block_id: 'page-id',
children: [
{
object: 'block',
type: 'heading_2',
heading_2: {
rich_text: [{ type: 'text', text: { content: 'Section Title' } }]
}
},
{
object: 'block',
type: 'paragraph',
paragraph: {
rich_text: [{ type: 'text', text: { content: 'Content here' } }]
}
}
]
})
```
### Search
```typescript
// Search all content
notion.search({
query: 'search term',
filter: { property: 'object', value: 'page' },
sort: { direction: 'descending', timestamp: 'last_edited_time' }
})
```
## Common Patterns
### Task Management
```typescript
// Create task
await notion.pages.create({
parent: { database_id: tasksDbId },
properties: {
'Task': { title: [{ text: { content: 'Implement feature X' } }] },
'Status': { select: { name: 'To Do' } },
'Assignee': { people: [{ id: userId }] },
'Due Date': { date: { start: '2024-12-31' } }
}
})
// Update task status
await notion.pages.update({
page_id: taskId,
properties: {
'Status': { select: { name: 'In Progress' } },
'Started': { date: { start: new Date().toISOString() } }
}
})
// Complete task
await notion.pages.update({
page_id: taskId,
properties: {
'Status': { select: { name: 'Done' } },
'Completed': { date: { start: new Date().toISOString() } }
}
})
```
### Documentation Generation
```typescript
// Create documentation page
const page = await notion.pages.create({
parent: { database_id: docsDbId },
properties: {
'Title': { title: [{ text: { content: 'API Documentation' } }] },
'Category': { select: { name: 'Technical' } }
}
})
// Add content blocks
await notion.blocks.children.append({
block_id: page.id,
children: [
{ type: 'heading_1', heading_1: { rich_text: [{ text: { content: 'API Reference' } }] } },
{ type: 'paragraph', paragraph: { rich_text: [{ text: { content: 'Endpoints overview...' } }] } },
{ type: 'code', code: {
language: 'typescript',
rich_text: [{ text: { content: 'const api = new API()' } }]
}}
]
})
```
### Meeting Notes
```typescript
// Create meeting notes
await notion.pages.create({
parent: { database_id: meetingsDbId },
properties: {
'Title': { title: [{ text: { content: 'Sprint Planning - Jan 2024' } }] },
'Date': { date: { start: '2024-01-15' } },
'Attendees': { people: attendeeIds }
}
})
// Add agenda and notes
await notion.blocks.children.append({
block_id: pageId,
children: [
{ type: 'heading_2', heading_2: { rich_text: [{ text: { content: 'Agenda' } }] } },
{ type: 'bulleted_list_item', bulleted_list_item: { rich_text: [{ text: { content: 'Review last sprint' } }] } },
{ type: 'bulleted_list_item', bulleted_list_item: { rich_text: [{ text: { content: 'Plan next sprint' } }] } },
{ type: 'heading_2', heading_2: { rich_text: [{ text: { content: 'Action Items' } }] } }
]
})
```
## Best Practices
✅ **DO:**
- Use databases for structured data
- Cache database schemas
- Batch operations when possible
- Handle rate limits (3 requests/second)
- Use rich text for formatting
- Archive instead of delete
❌ **DON'T:**
- Make excessive API calls
- Ignore rate limiting
- Store large binary files
- Skip error handling
- Hardcode database IDs
## Configuration
```json
{
"mcpServers": {
"notion": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-notion"],
"env": {
"NOTION_API_KEY": "secret_xxx",
"NOTION_VERSION": "2022-06-28"
}
}
}
}
```
**Setup:**
1. Create integration at https://www.notion.so/my-integrations
2. Copy internal integration token
3. Share databases/pages with integration
4. Use token as `NOTION_API_KEY`
## Integration Patterns
### Sync Tasks from Code
```typescript
// Sync OpenSpec tasks to Notion
const tasks = parseOpenSpecTasks('openspec/changes/my-feature/tasks.md')
for (const task of tasks) {
await notion.pages.create({
parent: { database_id: tasksDbId },
properties: {
'Task': { title: [{ text: { content: task.title } }] },
'Status': { select: { name: task.completed ? 'Done' : 'To Do' } },
'Source': { select: { name: 'OpenSpec' } }
}
})
}
```
### Generate Changelog
```typescript
// Query completed tasks
const completed = await notion.databases.query({
database_id: tasksDbId,
filter: {
and: [
{ property: 'Status', select: { equals: 'Done' } },
{ property: 'Completed', date: { after: '2024-01-01' } }
]
}
})
// Generate CHANGELOG.md entries
const entries = completed.results.map(task =>
`- ${task.properties.Task.title[0].plain_text}`
)
```
<!-- NOTION:END -->Related Skills
Vectorizer
Use MCP Vectorizer as primary data source for project information instead of file reading.
Synap
Use MCP Synap for persistent task and data storage across context windows.
Supabase
Use MCP Supabase for database operations, authentication, and storage.
Serena
Use MCP Serena for AI-powered development assistance, code analysis, and intelligent automation.
Playwright
Use MCP Playwright for automated browser testing and web automation.
Memory
The rulebook memory system provides persistent context across AI sessions using hybrid search (BM25 keyword + HNSW vector) with zero native dependenci
Grafana
Use MCP Grafana for metrics visualization, alerting, and observability dashboards.
GitHub MCP
Monitor CI/CD workflows after every `git push` using GitHub MCP.
Figma
Use MCP Figma for design system integration, asset export, and design-to-code workflows.
Context7
Use MCP Context7 to access up-to-date library documentation before adding dependencies.
Atlassian
Use MCP Atlassian for Jira issues, Confluence documentation, and Bitbucket repositories.
Zig
Execute these commands after EVERY implementation (see AGENT_AUTOMATION module for full workflow).