--- description: notion allowed-tools: Bash, Read, Edit, Write, Glob, Grep --- # notion Export AgileFlow epics, stories, and ADRs to Notion with detailed summaries via Model Context Protocol (MCP). **Key Feature**: Automatically generates comprehensive summaries for EVERY epic, story, and ADR exported to Notion, including full content, metadata, relationships, and progress tracking. ## Prompt ROLE: Notion Integration Agent (MCP-based) OBJECTIVE Bidirectional sync between AgileFlow markdown docs and Notion databases using Model Context Protocol. **Automatically generates detailed summaries for ALL epics, stories, and ADRs** during export, ensuring complete context is available in Notion. Supports initial setup, export with summaries, import, and incremental sync. **CRITICAL**: Every item exported to Notion includes a comprehensive summary with: - Full content from markdown files (descriptions, acceptance criteria, technical notes, etc.) - Metadata (status, dates, owners, estimates) - Relationships (epic-story links, related ADRs) - Progress tracking (for epics: story completion percentage) This ensures Notion serves as a complete, searchable knowledge base for stakeholders and team members. --- ## PREREQUISITES ### 1. Notion Integration Token **CRITICAL**: You need a Notion API token before using this command. ```bash # Create integration at https://www.notion.so/my-integrations # 1. Click "New integration" # 2. Give it a name (e.g., "AgileFlow") # 3. Copy the "Internal Integration Token" (starts with secret_) # 4. Share your databases with this integration ``` ### 2. Environment Setup **CRITICAL**: Add your token to .env (gitignored, never commit): ```bash # Add to .env file in project root echo "NOTION_TOKEN=secret_your_token_here" >> .env # Verify .env is in .gitignore grep -q "^\.env$" .gitignore || echo ".env" >> .gitignore ``` ### 3. MCP Server Configuration **CRITICAL**: MCP config must be in PROJECT ROOT (.mcp.json): ```bash # Check if MCP is configured cat .mcp.json 2>/dev/null || echo "MCP not configured" # If missing, run setup /AgileFlow:setup-system # Select "yes" for Notion integration ``` Your `.mcp.json` should contain: ```json { "mcpServers": { "notion": { "command": "npx", "args": ["-y", "@notionhq/notion-mcp-server"], "env": { "NOTION_TOKEN": "${NOTION_TOKEN}" } } } } ``` **IMPORTANT**: - .mcp.json must be in **project root** (not ~/.claude-code/ or ~/.config/) - Uses `@notionhq/notion-mcp-server` package (NOT mcp-remote) - Token referenced via `${NOTION_TOKEN}` from .env - .mcp.json should be gitignored - .mcp.json.example committed as template for teams ### 4. Restart Claude Code **CRITICAL**: MCP servers only load on startup: ```bash # After creating/updating .mcp.json, restart Claude Code # Tools will be available as mcp__notion__* after restart ``` ### 5. Database Setup (First Time Only) Run this command with `MODE=setup` to create the three required databases: ```bash /AgileFlow:notion MODE=setup ``` This will: - Use MCP tools to create **AgileFlow Epics** database - Create **AgileFlow Stories** database - Create **AgileFlow ADRs** database - Store database IDs in `docs/08-project/notion-sync-map.json` --- ## USAGE ```bash # Initial setup (create databases) /AgileFlow:notion MODE=setup # Preview export without writing to Notion # Shows detailed summaries that will be created for each item /AgileFlow:notion DRY_RUN=true # Export all docs to Notion WITH DETAILED SUMMARIES # Automatically generates comprehensive summaries for ALL epics, stories, and ADRs /AgileFlow:notion # Export specific type only (with summaries) /AgileFlow:notion TYPE=epics # Exports all epics with full content summaries /AgileFlow:notion TYPE=stories # Exports all stories with AC, notes, testing strategy /AgileFlow:notion TYPE=adrs # Exports all ADRs with context, decisions, consequences # Import from Notion back to markdown /AgileFlow:notion MODE=import # Bidirectional sync (smart merge) /AgileFlow:notion MODE=sync # Force overwrite (export wins - includes updated summaries) /AgileFlow:notion MODE=export FORCE=true # Force overwrite (import wins) /AgileFlow:notion MODE=import FORCE=true ``` **Note on Summaries**: Every export automatically includes detailed summaries. You don't need any special flags - summaries are generated for ALL items by default. ### Environment Variables - `MODE`: `setup` | `export` | `import` | `sync` (default: export) - `TYPE`: `epics` | `stories` | `adrs` | `all` (default: all) - `DRY_RUN`: `true` | `false` (default: false) - Preview only - `FORCE`: `true` | `false` (default: false) - Overwrite without merge --- ## MCP TOOLS REFERENCE This command uses the following Notion MCP tools (via @notionhq/notion-mcp-server): ### Database Operations - **mcp__notion__create_database** - Create AgileFlow databases during setup - **mcp__notion__update_database** - Modify database properties - **mcp__notion__query_database** - Read database structure and pages ### Page Management - **mcp__notion__create_page** - Export stories/epics/ADRs to Notion - **mcp__notion__update_page** - Sync changes back to existing pages - **mcp__notion__retrieve_page** - Read page content for import ### Search & Retrieval - **mcp__notion__search** - Find existing AgileFlow databases - **mcp__notion__retrieve_block_children** - Read page content blocks --- ## ARCHITECTURE ### File Structure ``` docs/08-project/ ├── notion-sync-map.json # Database IDs and sync state └── notion-sync-log.jsonl # Audit trail (created on first sync) ``` ### Sync Map Schema ```json { "last_sync": "2025-01-15T10:30:00Z", "databases": { "epics": "notion-database-id-1", "stories": "notion-database-id-2", "adrs": "notion-database-id-3" }, "pages": { "docs/05-epics/AG-001-authentication.md": { "notion_id": "page-id-1", "last_synced": "2025-01-15T10:30:00Z", "checksum": "abc123def456" }, "docs/06-stories/AG-API-001-login-endpoint.md": { "notion_id": "page-id-2", "last_synced": "2025-01-15T10:30:00Z", "checksum": "xyz789uvw012" } }, "config": { "auto_sync": false, "conflict_resolution": "manual", "workspace_url": "https://www.notion.so/your-workspace" } } ``` --- ## IMPLEMENTATION ### Key Features **1. Detailed Summary Generation** For EVERY epic, story, and ADR exported to Notion, the command automatically generates a comprehensive summary that includes: **Epics**: - Epic ID and title - Description (full text) - Goals and objectives - All linked stories with their status - Progress percentage (completed vs total stories) - Key dates (created, updated) - Dependencies - Related ADRs **Stories**: - Story ID and title - Epic parent (linked) - Description and acceptance criteria (full text) - Status, priority, estimate - Owner/assignee - Technical notes - Testing strategy - All files modified (from implementation) - Dependencies - Created/updated dates **ADRs (Architecture Decision Records)**: - ADR ID and title - Status (proposed, accepted, superseded) - Context (why this decision was needed) - Decision (what was decided) - Consequences (positive and negative) - Alternatives considered - Related epics/stories - Created/updated dates **Why Detailed Summaries?** - Notion pages are searchable - full content makes finding information easier - Team members can review details without switching to markdown files - Stakeholders can read complete context in Notion - Better integration with Notion's AI features (Q&A, summarization) - Preserves all critical information even if markdown files are updated **How It Works**: 1. Command reads each markdown file (epic/story/ADR) 2. Extracts frontmatter metadata (YAML) 3. Parses markdown content sections 4. Builds comprehensive summary with all relevant details 5. Creates/updates Notion page with summary as page content 6. Links related items (epic ↔ stories, ADR ↔ epics) ### Export Process ```bash # For each file type (epics, stories, ADRs): # 1. Find all markdown files in docs/05-epics/, docs/06-stories/, docs/03-decisions/ # 2. Read file content and parse frontmatter # 3. Extract all sections (Description, AC, Technical Notes, etc.) # 4. Generate detailed summary with full content # 5. Check if page exists in Notion (via sync map) # 6. Create new page OR update existing page with summary # 7. Update sync map with page ID and checksum # 8. Link related items (epic-story relationships, etc.) ``` ### Summary Format Example **Epic Summary in Notion**: ``` 📋 Epic: EP-0001 - User Authentication System Status: In Progress (3/5 stories completed) Created: 2025-01-15 Updated: 2025-01-20 ## Description [Full description from markdown file] ## Goals - Enable secure user login - Support password reset - Implement session management ## Stories (5 total, 3 completed) ✅ US-0001: User Login API ✅ US-0002: Password Reset Flow ✅ US-0003: Session Token Management 🔄 US-0004: OAuth Integration 📝 US-0005: Multi-Factor Authentication ## Dependencies - Depends on: None - Blocks: EP-0002 (User Profile Management) ## Related ADRs - ADR-0001: JWT vs Session-based Auth (Accepted) - ADR-0002: Password Hashing Strategy (Accepted) ``` ### Implementation Details The command uses MCP tools to interact with Notion: **Setup Phase** (MODE=setup): - Use `mcp__notion__create_database` to create three databases - Store database IDs in `docs/08-project/notion-sync-map.json` **Export Phase** (default): - Use `mcp__notion__query_database` to find existing pages - Use `mcp__notion__create_page` for new items with full summary - Use `mcp__notion__update_page` for existing items with updated summary - All summaries include complete content from markdown files **Import Phase** (MODE=import): - Use `mcp__notion__retrieve_page` to read Notion page content - Parse Notion blocks back to markdown format - Update local markdown files with changes **Sync Phase** (MODE=sync): - Compare checksums between local and Notion - Detect conflicts (both changed since last sync) - Offer merge strategies or manual resolution ### Parallel Execution Architecture **🚀 NEW: Parallel Export with Specialized Agents** The `/AgileFlow:notion` command now uses parallel agent execution for significantly faster exports: **How It Works**: 1. **Scan Phase**: Main command scans `docs/` for all epics, stories, and ADRs 2. **Spawn Phase**: Spawns one `agileflow-notion-exporter` agent per item 3. **Parallel Execution**: All agents run simultaneously (haiku model for speed) 4. **Collection Phase**: Collect results from all agents 5. **Sync Map Update**: Update `notion-sync-map.json` with all page IDs **Performance**: - **Sequential (old)**: ~2-3 seconds per item = 100 items in 3-5 minutes - **Parallel (new)**: All items processed simultaneously = 100 items in 10-30 seconds **Batching for Rate Limits**: - Notion API has rate limits (~3 requests/second) - Command batches agents in groups of 10 - Batch 1: Items 1-10 (spawn, wait for completion) - Batch 2: Items 11-20 (spawn, wait for completion) - etc. **Agent Specification**: - **Agent**: `agileflow-notion-exporter` - **Model**: haiku (fast for summarization) - **Tools**: Read, Bash (+ MCP tools automatically available) - **Input**: item_path, item_type, database_id, dry_run flag - **Output**: JSON with page_id, status, checksum **Error Handling**: - If agent fails: Logged and reported, other agents continue - After all batches complete: Report failed items for retry - Partial success: Update sync map for successful items only **Progress Tracking**: ``` 📤 Exporting to Notion... Batch 1/5 (items 1-10): ✅ EP-0001-authentication.md → Notion ✅ EP-0002-authorization.md → Notion ... Batch 1 complete: 10/10 successful Batch 2/5 (items 11-20): ✅ US-0001-login-api.md → Notion ❌ US-0002-logout-api.md → Error: Rate limit ... Batch 2 complete: 9/10 successful ... 📊 Export Summary: ✅ Successful: 48/50 items ❌ Failed: 2/50 items ⏱️ Time: 25 seconds ``` **DRY_RUN with Parallel Agents**: - Each agent generates summary but doesn't export - Shows what WOULD be created in Notion - Validates file parsing and summary generation - No API calls made (fast preview) **Example Orchestration Flow**: ```bash # Main command execution /AgileFlow:notion # 1. Scan docs/ for all items Found 50 items: 10 epics, 35 stories, 5 ADRs # 2. Load database IDs from sync map Epics DB: abc123 Stories DB: def456 ADRs DB: ghi789 # 3. Spawn agents in batches of 10 Spawning batch 1 (10 agents)... → agileflow-notion-exporter (EP-0001) → agileflow-notion-exporter (EP-0002) → agileflow-notion-exporter (US-0001) ... # 4. Wait for batch completion Batch 1: 10/10 complete (8 seconds) # 5. Spawn next batch Spawning batch 2 (10 agents)... ... # 6. Collect all results Collected 50 results: 48 success, 2 failed # 7. Update sync map Updated notion-sync-map.json with 48 page IDs # 8. Report summary ✅ Export complete: 48/50 items (96% success rate) ``` --- ## EXAMPLE WORKFLOWS ### First-Time Setup ```bash # 1. Create Notion integration # Visit https://www.notion.so/my-integrations # Create new integration, copy token # 2. Add token to .env echo "NOTION_TOKEN=secret_your_token_here" >> .env # 3. Run system setup /AgileFlow:setup-system # Select "yes" for Notion integration # This creates .mcp.json.example and copies to .mcp.json # 4. Restart Claude Code # MCP server loads on startup # 5. Create databases /AgileFlow:notion MODE=setup # 6. Share databases with integration # In Notion: Click "..." → "Add connections" → Select your integration # 7. Preview export /AgileFlow:notion DRY_RUN=true # 8. Perform initial export /AgileFlow:notion # 9. Visit Notion to verify # Open https://notion.so/your-workspace ``` ### Daily Workflow ```bash # Export new/changed docs to Notion /AgileFlow:notion # Or just export stories /AgileFlow:notion TYPE=stories # Import changes from Notion (team members edited in Notion) /AgileFlow:notion MODE=import # Bidirectional sync (smart merge) /AgileFlow:notion MODE=sync ``` ### Team Member Onboarding ```bash # 1. Pull latest code (includes .mcp.json.example) git pull # 2. Create their own Notion integration # Visit https://www.notion.so/my-integrations # 3. Copy template to active config cp .mcp.json.example .mcp.json # 4. Add their token to .env echo "NOTION_TOKEN=secret_their_token_here" >> .env # 5. Restart Claude Code # 6. Share databases with their integration # In Notion: Click "..." → "Add connections" → Select their integration # 7. Start syncing! /AgileFlow:notion ``` ### Conflict Resolution ```bash # Check for conflicts first /AgileFlow:notion MODE=sync DRY_RUN=true # Manual conflict resolution (default) # Script will list conflicts and prompt for each # Or force local version to win /AgileFlow:notion MODE=export FORCE=true # Or force Notion version to win /AgileFlow:notion MODE=import FORCE=true ``` --- ## ADVANTAGES OF MCP APPROACH ### 🚀 Developer Experience - ✅ **Standardized tool interface** - MCP provides unified API across services - ✅ **Better error handling** - Improved over raw Notion API calls - ✅ **Automatic rate limiting** - MCP handles throttling - ✅ **Native Claude Code integration** - Tools available as mcp__notion__* ### 👥 Team Collaboration - ✅ **Template-based setup** - .mcp.json.example committed to git - ✅ **Individual tokens** - Each team member uses their own NOTION_TOKEN - ✅ **No token sharing** - Tokens stay in .env (gitignored) - ✅ **Consistent setup** - Same .mcp.json template for everyone ### 🔒 Security - ✅ **Tokens in .env** - Gitignored, never committed - ✅ **Project-level config** - .mcp.json in repo root (not user-level) - ✅ **Easy revocation** - Just delete token from Notion integrations page ### 🛠️ Maintenance - ✅ **Standard protocol** - MCP is consistent across tools - ✅ **Better debugging** - Clearer error messages from MCP tools - ✅ **No API version pinning** - MCP package handles compatibility ### ⚡ Parallel Execution (NEW in v2.19.3) - ✅ **10-30x faster exports** - Process 100 items in 10-30 seconds instead of 3-5 minutes - ✅ **Parallel agent architecture** - One `agileflow-notion-exporter` agent per item - ✅ **Haiku model for speed** - Fast summarization without sacrificing quality - ✅ **Batched rate limiting** - Respects Notion API limits with automatic batching - ✅ **Resilient error handling** - Failed items don't block successful exports - ✅ **Detailed progress tracking** - See real-time batch completion status - ✅ **Scalable architecture** - Handles 10 items or 1000 items efficiently --- ## MIGRATION FROM DIRECT API APPROACH If you previously used direct Notion API calls (curl-based): ### Step 1: Backup ```bash # Backup your sync map (database IDs are preserved!) cp docs/08-project/notion-sync-map.json docs/08-project/notion-sync-map.json.backup ``` ### Step 2: Set Up MCP ```bash # Your NOTION_TOKEN can stay in .env (no change needed!) # Run setup to create .mcp.json /AgileFlow:setup-system # Select "yes" for Notion integration # This creates .mcp.json with: # { # "mcpServers": { # "notion": { # "command": "npx", # "args": ["-y", "@notionhq/notion-mcp-server"], # "env": { # "NOTION_TOKEN": "${NOTION_TOKEN}" # } # } # } # } ``` ### Step 3: Restart Claude Code ```bash # MCP servers only load on startup # Restart Claude Code to load @notionhq/notion-mcp-server ``` ### Step 4: Verify and Resume ```bash # Your existing database IDs work with MCP! # No need to recreate databases # Verify connection /AgileFlow:notion DRY_RUN=true # Resume syncing /AgileFlow:notion ``` --- ## TROUBLESHOOTING ### MCP Server Not Configured **Error**: "notion MCP server not found" or "mcp__notion__* tools not available" **Fix**: ```bash # Run setup /AgileFlow:setup-system # Or manually create .mcp.json in project root: cat > .mcp.json <<'EOF' { "mcpServers": { "notion": { "command": "npx", "args": ["-y", "@notionhq/notion-mcp-server"], "env": { "NOTION_TOKEN": "${NOTION_TOKEN}" } } } } EOF # CRITICAL: Restart Claude Code after creating .mcp.json ``` ### Token Not Found **Error**: "NOTION_TOKEN not set" or "Unauthorized" **Fix**: ```bash # Add token to .env in project root echo "NOTION_TOKEN=secret_your_token_here" >> .env # Verify it's there grep NOTION_TOKEN .env # Restart Claude Code ``` ### Wrong MCP Package **Error**: "mcp-remote not found" or connection errors **Fix**: ```bash # Check .mcp.json uses correct package cat .mcp.json # Should say "@notionhq/notion-mcp-server" # NOT "mcp-remote" # If wrong, update .mcp.json and restart Claude Code ``` ### Project-Level Config Not Working **Error**: MCP config not loading **Fix**: ```bash # CRITICAL: .mcp.json must be in PROJECT ROOT pwd # Should show /path/to/your/project ls -la .mcp.json # Should exist in current directory # NOT in ~/.claude-code/ or ~/.config/claude-code/ # Those locations won't work for project-specific MCP servers ``` ### Databases Not Found **Error**: "Database IDs missing in sync map" **Fix**: ```bash /AgileFlow:notion MODE=setup ``` ### Rate Limiting **Error**: "Rate limit exceeded" **Fix**: MCP handles this automatically with exponential backoff. Wait a few seconds and retry. ### Sync Conflicts **Error**: "Conflict detected: both local and Notion changed" **Fix**: ```bash # Review conflict details /AgileFlow:notion MODE=sync DRY_RUN=true # Choose resolution strategy /AgileFlow:notion MODE=sync # Manual prompts # or /AgileFlow:notion MODE=export FORCE=true # Local wins # or /AgileFlow:notion MODE=import FORCE=true # Notion wins ``` ### Database Not Shared With Integration **Error**: "object not found" or "insufficient permissions" **Fix**: ```bash # In Notion, for each database: # 1. Click "..." (three dots) in top right # 2. Click "Add connections" # 3. Select your integration name # 4. Try sync again ``` --- ## FUTURE ENHANCEMENTS - [ ] Auto-sync on file changes (watch mode) - [ ] Conflict resolution UI in Claude Code - [ ] Comment syncing (mcp__notion__create_comment) - [ ] Attachment support - [ ] Webhook integration (Notion → AgileFlow) - [ ] Multi-workspace support - [ ] Custom property mappings - [ ] Rollback support (restore from log) --- ## RELATED COMMANDS - `/AgileFlow:setup-system` - Initial AgileFlow + MCP configuration - `/AgileFlow:github-sync` - Sync with GitHub Issues (uses GitHub CLI) - `/AgileFlow:story-new` - Create new story (auto-exports if Notion enabled) - `/AgileFlow:epic-new` - Create new epic (auto-exports if Notion enabled) - `/AgileFlow:adr-new` - Create new ADR (auto-exports if Notion enabled) - `/AgileFlow:board` - Visualize status (can pull from Notion) ## RELATED AGENTS - `agileflow-notion-exporter` - Parallel export agent (spawned by this command) - Haiku model for fast summarization - Processes one epic/story/ADR at a time - Generates detailed summaries with full content - Uses MCP tools to export to Notion - Returns JSON with page ID and status --- ## REFERENCES - [@notionhq/notion-mcp-server](https://www.npmjs.com/package/@notionhq/notion-mcp-server) - Notion MCP Package - [MCP Documentation](https://modelcontextprotocol.io/docs/getting-started/intro) - Model Context Protocol - [MCP Supported Tools](https://developers.notion.com/docs/mcp-supported-tools) - Notion MCP Tools List - [Claude Code MCP Guide](https://docs.claude.com/en/docs/claude-code/mcp) - MCP in Claude Code - [Notion API Reference](https://developers.notion.com/reference/intro) - Notion API Docs - [Create Notion Integration](https://www.notion.so/my-integrations) - Get Your Token --- ## KEY LEARNINGS (Historical: v2.3.0 Correction) **Note**: This section documents a correction made during the v2.3.0 release (October 2025). It is preserved for historical context. See [CHANGELOG.md](../../CHANGELOG.md#230---2025-10-18) for full details. **What We Got Wrong Initially**: - ❌ Claimed OAuth authentication via /mcp command - ❌ Said "no manual token management" - ❌ Used wrong package (mcp-remote instead of @notionhq/notion-mcp-server) - ❌ Suggested committing .mcp.json to git (should be gitignored) **What's Actually Correct**: - ✅ Still uses NOTION_TOKEN in .env (token-based) - ✅ Uses @notionhq/notion-mcp-server package - ✅ Project-level .mcp.json in repo root (not user-level) - ✅ .mcp.json gitignored, .mcp.json.example committed as template - ✅ MCP provides standardized tool interface, NOT authentication - ✅ Each team member needs their own token **Credit**: Thank you to the user who discovered the correct approach through testing!