nehiljain/granola-ai-mcp-server
If you are the rightful owner of granola-ai-mcp-server and would like to certify it and/or have it hosted online, please leave a comment on the right or send an email to dayong@mcphub.com.
Granola MCP Server is an experimental Model Context Protocol server designed to integrate Granola.ai meeting intelligence with Claude Desktop, leveraging local cache for data processing.
Granola MCP Server (Experimental)
An experimental Model Context Protocol (MCP) server for integrating Granola.ai meeting intelligence with Claude Desktop. This uses Granola's local cache. I don't have any idea how Granola updates or maintains that cache. My guess is that it's doing a rolling context window, but storing long term notes up in AWS. So, YMMV. Use at your own risk. I will likely add a cache shipper at some point since we don't have access to Gronala's data in the cloud.
Features
- Meeting Search: Search meetings by title, content, participants, and transcript content
- Meeting Details: Get comprehensive meeting metadata with local timezone display
- Full Transcript Access: Retrieve complete meeting conversations with speaker identification
- Rich Document Content: Access actual meeting notes, summaries, and structured content
- Meeting Export: Export meetings to markdown files with auto-generated filenames
- Pattern Analysis: Analyze patterns across meetings (participants, frequency, topics)
- Timezone Intelligence: All timestamps automatically display in your local timezone
- Real-time Integration: Seamlessly connects to your actual Granola meeting data
Quick Start
Prerequisites
- Python 3.12+
- uv package manager
- macOS with Granola.ai installed
- Claude Desktop application
- Granola cache file at
~/Library/Application Support/Granola/cache-v3.json
Installation
-
Clone and navigate to the project:
git clone <repository-url> cd granola-ai-mcp -
Install dependencies with uv:
uv sync -
Test the installation:
uv run granola list -
Configure Claude Desktop by adding to your
claude_desktop_config.json:{ "mcpServers": { "granola": { "command": "uv", "args": ["--directory", "/absolute/path/to/granola-ai-mcp", "run", "granola-mcp-server"], "env": {} } } }Important: Replace
/absolute/path/to/granola-ai-mcpwith your actual project path. -
Restart Claude Desktop to load the MCP server
Global Installation & Upgrading
To install the Granola CLI globally so you can run granola commands from anywhere:
# Install globally with uv (from anywhere)
uv tool install granola-ai-mcp-server
# Or install from local source
uv tool install --editable /path/to/granola-ai-mcp-server
To upgrade to the latest version:
# Upgrade to latest version
uv tool install --upgrade granola-ai-mcp-server
# Or upgrade from local source
uv tool install --upgrade --editable /path/to/granola-ai-mcp-server
After installing/upgrading, you can run granola commands from anywhere:
# These commands now work from any directory
granola list
granola search "meeting topic"
granola get
granola export --output-dir ./meetings/
granola clean
Note: For the MCP server integration with Claude Desktop, you'll still need to use the local project path in your claude_desktop_config.json:
{
"mcpServers": {
"granola": {
"command": "uv",
"args": ["--directory", "/absolute/path/to/granola-ai-mcp-server", "run", "granola-mcp-server"],
"env": {}
}
}
}
CLI Tool
The Granola CLI provides powerful command-line access to your meeting data with rich formatting and interactive features.
Installation & Setup
The CLI is automatically available after installing the project:
# Install dependencies
uv sync
# Test CLI is working
uv run granola --help
Available Commands
granola list - List All Meetings
Display meetings in a beautiful formatted table with key information.
# List all meetings
uv run granola list
# Show ignored meetings
uv run granola list --show-ignored
# Use custom cache path
uv run granola --cache-path /path/to/cache.json list
# Set timezone for display
uv run granola --timezone America/Los_Angeles list
Output includes:
- Meeting title, date, duration, platform
- Transcript statistics (word count)
- Participant count
- Meeting ID
granola get - Get Meeting Details
Retrieve comprehensive meeting information including full transcripts.
# Interactive meeting selection
uv run granola get
# Get specific meeting by ID
uv run granola get c96cbb7e-b0ab-40e8-bbad-bd4efc449af3
# Copy output to clipboard
uv run granola get --clipboard
# Save to file
uv run granola get --output meeting_notes.md
# Combine options
uv run granola get --clipboard --output backup.md
Output includes:
- Complete meeting metadata (ID, title, date, duration, platform)
- Organizer and creator information
- Participant list
- Full transcript with speaker identification
- Meeting notes and documents
- Transcript statistics (word count, duration)
granola search - Fuzzy Search Meetings
Search meetings using fuzzy matching on titles, attendees, or transcripts with multiple output formats.
# Basic title search (default behavior)
uv run granola search "project planning"
# Search participant names
uv run granola search "john" --attendees
# Search transcript content (slower but comprehensive)
uv run granola search "budget discussion" --transcript
# Combine search types
uv run granola search "meeting" --attendees --transcript
# Include ignored meetings
uv run granola search "test" --show-ignored
# JSON output for programmatic use
uv run granola search "quarterly review" --json
# YAML output for configuration files
uv run granola search "team sync" --yaml
# Include meetings with no transcript content
uv run granola search "standup" --include-empty-transcripts
# Complex search with multiple options
uv run granola search "architecture" --attendees --transcript --json --include-empty-transcripts
Search Features:
- Fuzzy Matching: Uses intelligent fuzzy matching (60%+ threshold)
- Multiple Fields: Search titles, attendees, or transcript content
- Smart Filtering: By default excludes meetings with no transcript content
- Flexible Output: Table (default), JSON, or YAML formats
- Match Scoring: Shows what matched and confidence score
- Date Sorting: Results sorted by date (most recent first)
Output Formats:
- Table: Compact table view with key information
- JSON: Structured data for scripts and APIs
- YAML: Human-readable format for configuration
granola clean - Clean Up Meetings
Identify and manage meetings with minimal content or missing transcripts.
# Dry run (default) - see what would be cleaned
uv run granola clean
# Actually clean meetings
uv run granola clean --confirm
# Custom word threshold
uv run granola clean --min-words 1000
# Duration threshold
uv run granola clean --min-duration 30
# Reset ignore list
uv run granola clean --reset
# Combine criteria
uv run granola clean --min-words 500 --min-duration 15 --confirm
Cleaning criteria:
- Meetings with no transcript
- Meetings with transcript below word threshold
- Meetings below duration threshold
- All criteria can be combined
granola export - Export Meeting to Markdown File
Export a meeting to a formatted markdown file with auto-generated filename.
# Interactive meeting selection
uv run granola export --output-dir ./meetings/
# Export specific meeting by ID
uv run granola export c96cbb7e-b0ab-40e8-bbad-bd4efc449af3 --output-dir ~/Documents/meetings/
# Short flag
uv run granola export -o ./output/
# Export to home directory
uv run granola export --output-dir ~/meetings/
Features:
- Auto-generated filename: Files are named
YYYY-MM-DD-meeting-title.md - Three sections: Metadata, Notes, and Transcript
- Overwrite protection: Asks for confirmation if file exists
- Directory creation: Prompts to create output directory if it doesn't exist
- Validation: Loudly errors if meeting has no notes content
Output format:
# Meeting Title
## Metadata
- **ID:** meeting-id
- **Title:** Meeting Title
- **Date:** 2025-10-09 14:30
- **Duration:** 60 minutes
- **Platform:** Zoom
- **Participants:**
- John Doe
- Sarah Smith
## Notes
[Meeting notes and documents from Granola]
## Transcript
**Speakers:** John Doe, Sarah Smith
**Word Count:** 2,500
[Full transcript content]
Filename examples:
2025-10-09-quarterly-planning-sync.md2025-10-08-weekly-team-standup.md2025-10-07-architecture-review.md
CLI Usage Examples
Basic Operations
# Quick meeting overview
uv run granola list
# Search for specific meetings
uv run granola search "project planning"
# Get details for most recent meeting
uv run granola get
# Find meetings to clean up
uv run granola clean
Advanced Usage
# Export meeting with auto-generated filename
uv run granola export --output-dir ./meetings/
# Export specific meeting to directory
uv run granola export abc123 -o ~/Documents/meetings/
# Copy meeting details to clipboard for sharing
uv run granola get --clipboard
# Clean up meetings with less than 100 words
uv run granola clean --min-words 100 --confirm
# Show only ignored meetings
uv run granola list --show-ignored
Search Examples
# Find meetings by title
uv run granola search "quarterly review"
uv run granola search "standup"
uv run granola search "architecture"
# Search by participant names
uv run granola search "john" --attendees
uv run granola search "sarah" --attendees
uv run granola search "team lead" --attendees
# Search transcript content
uv run granola search "budget" --transcript
uv run granola search "deadline" --transcript
uv run granola search "technical debt" --transcript
# Combined searches
uv run granola search "planning" --attendees --transcript
uv run granola search "review" --attendees --transcript --json
# Include empty transcripts
uv run granola search "meeting" --include-empty-transcripts
uv run granola search "sync" --include-empty-transcripts --yaml
# Programmatic output
uv run granola search "project" --json > search_results.json
uv run granola search "team" --yaml > team_meetings.yaml
Batch Operations
# Clean up short meetings (less than 15 minutes)
uv run granola clean --min-duration 15 --confirm
# Reset all ignored meetings
uv run granola clean --reset
# Export multiple meetings (run multiple times)
uv run granola get --output meeting1.md
uv run granola get --output meeting2.md
Quick CLI Workflows
Daily Meeting Review
# See today's meetings
uv run granola list
# Search for specific topics
uv run granola search "project planning"
uv run granola search "john" --attendees
# Get details of most recent meeting
uv run granola get
# Export important meeting to file
uv run granola get --output important_meeting.md
Meeting Search & Discovery
# Find meetings by topic
uv run granola search "architecture" --transcript
uv run granola search "budget" --attendees --transcript
# Search for specific people
uv run granola search "sarah" --attendees
uv run granola search "team lead" --attendees --json
# Find meetings with specific content
uv run granola search "deadline" --transcript --yaml
uv run granola search "technical debt" --transcript --include-empty-transcripts
# Export search results
uv run granola search "quarterly review" --json > q4_reviews.json
uv run granola search "standup" --yaml > daily_standups.yaml
Meeting Cleanup
# See what can be cleaned
uv run granola clean
# Clean up meetings with no transcripts
uv run granola clean --confirm
# Clean up short meetings
uv run granola clean --min-duration 10 --confirm
Meeting Export
# Export meeting with auto-generated filename
uv run granola export --output-dir ./meetings/
# Export specific meeting
uv run granola export abc123 -o ~/Documents/meetings/
# Copy meeting to clipboard for sharing
uv run granola get --clipboard
# Export multiple meetings to a directory
uv run granola export meeting_id_1 -o ./archive/
uv run granola export meeting_id_2 -o ./archive/
# Export with manual filename (using get)
uv run granola get --output custom_name.md
CLI Features
Interactive Selection
When using granola get without a meeting ID, you'll see an interactive menu:
? Select a meeting: (Use arrow keys)
» ⏸ Nehil / Brent | 2025-10-09 15:30 | 1 participants
Ray POC on AWS Questions from Fahri and Nehil and Soma | 2025-10-09 14:01 | 3 participants
Anyscale platform demo for PayPal machine learning infrastructure | 2025-10-09 13:30 | 0 participants
Rich Output Formatting
- Tables: Beautiful formatted tables with colors and alignment
- Markdown: Structured output with headers, lists, and formatting
- Statistics: Word counts, character counts, duration information
- Timezone: Automatic local timezone display
- Search Results: Multiple output formats (table, JSON, YAML)
- Fuzzy Matching: Intelligent search with confidence scores
Clipboard Integration
- macOS: Uses
pbcopyfor clipboard functionality - Fallback: Graceful fallback if clipboard tools unavailable
- Confirmation: Clear feedback when content is copied
File Output
- Markdown format: Structured, readable meeting notes
- UTF-8 encoding: Proper character encoding for all content
- Large files: Handles transcripts with 25,000+ characters
Search Output Examples
Table Output (Default):
Search Results for 'project planning'
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━┓
┃ Title ┃ Date ┃ Dur ┃ Platform ┃ Transcr… ┃ Ppl ┃ Match ┃ ID ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━┩
│ Q4 Planning Meeting │ 10/09 │ 60m │ Zoom │ 2.5k │ 5 │ Tit (95%) │ abc123… │
│ Project Kickoff Discussion │ 10/08 │ 45m │ Teams │ 1.8k │ 3 │ Tit (87%) │ def456… │
└───────────────────────────────────────────┴──────────┴─────┴──────────┴──────────┴─────┴───────────┴──────────┘
JSON Output:
{
"query": "project planning",
"total_results": 2,
"meetings": [
{
"id": "abc123...",
"title": "Q4 Planning Meeting",
"date": "2025-10-09 14:30",
"duration_minutes": 60,
"platform": "Zoom",
"participants": ["john", "sarah", "mike"],
"participant_count": 3,
"transcript_stats": "2,500 words",
"match": {
"type": "Title",
"score": 95
}
}
],
"search_options": {
"attendees": false,
"transcript": false,
"show_ignored": false,
"include_empty_transcripts": false
}
}
YAML Output:
query: project planning
total_results: 2
meetings:
- id: abc123...
title: Q4 Planning Meeting
date: 2025-10-09 14:30
duration_minutes: 60
platform: Zoom
participants:
- john
- sarah
- mike
participant_count: 3
transcript_stats: 2,500 words
match:
type: Title
score: 95
search_options:
attendees: false
transcript: false
show_ignored: false
include_empty_transcripts: false
CLI Configuration
Environment Variables
# Custom cache path
export GRANOLA_CACHE_PATH="/custom/path/cache.json"
# Custom timezone
export GRANOLA_TIMEZONE="America/Los_Angeles"
Command Line Options
# Global options (available for all commands)
--cache-path TEXT Path to Granola cache file
--timezone TEXT Timezone for date display
--help Show help message
# List command options
--show-ignored Show ignored meetings
# Get command options
--clipboard, -c Copy output to clipboard
--output, -o TEXT Write output to file
# Search command options
--attendees, -a Search participant names
--transcript, -t Search transcript content (slower)
--show-ignored Include ignored meetings
--include-empty-transcripts Include meetings with no transcript content (default: False)
--json Output results in JSON format
--yaml Output results in YAML format
# Clean command options
--dry-run Show what would be removed (default)
--confirm Actually mark meetings for removal
--min-words INTEGER Minimum word count threshold (default: 10)
--min-duration INTEGER Minimum duration in minutes
--reset Reset ignore list
Available MCP Tools
search_meetings
Search meetings by query string.
Parameters:
- query (string): Search query for meetings
- limit (integer, optional): Maximum number of results (default: 10)
get_meeting_details
Get detailed information about a specific meeting.
Parameters:
- meeting_id (string): Meeting ID to retrieve details for
get_meeting_transcript
Get transcript for a specific meeting.
Parameters:
- meeting_id (string): Meeting ID to get transcript for
get_meeting_documents
Get documents associated with a meeting.
Parameters:
- meeting_id (string): Meeting ID to get documents for
analyze_meeting_patterns
Analyze patterns across multiple meetings.
Parameters:
- pattern_type (string): Type of pattern to analyze ('topics', 'participants', 'frequency')
- date_range (object, optional): Date range for analysis with start_date and end_date
Usage Examples
Once configured with Claude Desktop, you can use natural language to interact with your Granola meetings:
Basic Queries
- "Search for meetings about quarterly planning"
- "Show me yesterday's meetings"
- "Find meetings with David from this week"
Transcript Access
- "Get the transcript from yesterday's ProofChat meeting"
- "What was discussed in the Float rollback planning meeting?"
- "Show me the full conversation from the David Tibbi meeting"
Content Analysis
- "Analyze participant patterns from last month"
- "What documents are associated with the product review meeting?"
- "Search for mentions of 'schema labeling' in meeting transcripts"
Recent Meeting Intelligence
The server automatically detects and provides access to:
- Full transcripts from recent meetings (25,000+ characters)
- Meeting content including notes and summaries
- Participant information and speaker identification
- Local timezone display for all meeting times
Development
Running the CLI
# List meetings
uv run granola list
# Get meeting details
uv run granola get
# Clean up meetings
uv run granola clean
Running the MCP Server Directly
uv run granola-mcp-server
Adding Dependencies
uv add package-name
Configuration
Claude Desktop Config Locations
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json - Linux:
~/.config/Claude/claude_desktop_config.json
Granola Cache Location
The server reads from Granola's cache file at:
~/Library/Application Support/Granola/cache-v3.json
Security & Privacy
- ✅ 100% Local Processing - All data stays on your machine
- ✅ No External API Calls - No data sent to external services
- ✅ Granola Permissions Respected - Uses existing Granola.ai access controls
- ✅ Read-Only Access - Server only reads from Granola's cache
Performance & Capabilities
- Fast Loading: Sub-2 second cache loading for hundreds of meetings
- Rich Content: Extracts 25,000+ character transcripts and meeting notes
- Efficient Search: Multi-field search across titles, content, participants, and transcripts
- Memory Optimized: Lazy loading with intelligent content parsing
- Timezone Smart: Automatic local timezone detection and display
- Production Ready: Successfully processes real Granola data (11.7MB cache files)
- Scalable: Handles large datasets with 500+ transcript segments per meeting
Current Status
🚀 PRODUCTION READY - Successfully tested with real Granola.ai data including:
- ✅ 39+ meetings parsed and searchable
- ✅ 28 full transcripts with complete conversations
- ✅ Rich meeting content from notes, summaries, and structured data
- ✅ Timezone intelligence showing times like "17:04" instead of "21:04 UTC"
- ✅ Speaker identification and conversation flow
- ✅ Yesterday's meetings fully accessible with detailed content
Troubleshooting
Common Issues
"Cache file not found"
- Ensure Granola.ai is installed and has processed some meetings
- Check that the cache file exists:
ls -la "~/Library/Application Support/Granola/cache-v3.json"
"uv command not found"
- Install uv:
curl -LsSf https://astral.sh/uv/install.sh | sh - Or use pip fallback in Claude config:
"command": "python"
"Permission denied"
- Ensure the cache file is readable:
chmod 644 "~/Library/Application Support/Granola/cache-v3.json"
Server not appearing in Claude Desktop
- Verify the absolute path in your Claude config
- Check Claude Desktop logs for MCP server errors
- Restart Claude Desktop after config changes
CLI-Specific Issues
"No meetings found"
- Run
uv run granola listto see if meetings are loaded - Check cache file size:
ls -lh "~/Library/Application Support/Granola/cache-v3.json" - Verify Granola.ai has processed recent meetings
"Interactive selection not working"
- Ensure you're running in a terminal that supports interactive prompts
- Try using a specific meeting ID:
uv run granola get <meeting-id>
"Clipboard not working"
- On macOS, ensure
pbcopyis available:which pbcopy - Use file output as fallback:
uv run granola get --output file.md
"Clean command shows no results"
- Check current ignore list:
uv run granola list --show-ignored - Reset ignore list:
uv run granola clean --reset - Adjust thresholds:
uv run granola clean --min-words 5