GranolaAI MCP Server
Bridges Granola.ai meeting intelligence with Claude Desktop, enabling natural language access to meeting transcripts, notes, and insights.
README
GranolaAI MCP Server
๐๏ธ AI-Powered Meeting Intelligence for Claude Desktop
An experimental Model Context Protocol (MCP) server that bridges Granola.ai meeting intelligence with Claude Desktop. Access your meeting transcripts, notes, and insights directly through natural language conversations.
โจ 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
- ๐ Pattern Analysis โ Analyze patterns across meetings (participants, frequency, topics)
- ๐ Timezone Intelligence โ All timestamps automatically display in your local timezone
- ๐ 100% Local Processing โ No external API calls; all data stays on your machine
๐๏ธ Architecture
flowchart TB
subgraph Client["๐ค Client Layer"]
CD[Claude Desktop]
end
subgraph MCP["๐ MCP Protocol Layer"]
MCP_STDIO[MCP stdio Transport]
end
subgraph Server["โ๏ธ Granola MCP Server"]
GMCS[GranolaMCPServer]
subgraph Handlers["Request Handlers"]
LIST[list_tools]
CALL[call_tool]
end
subgraph Tools["Available Tools"]
SEARCH[search_meetings]
DETAILS[get_meeting_details]
TRANSCRIPT[get_meeting_transcript]
DOCS[get_meeting_documents]
ANALYZE[analyze_meeting_patterns]
end
subgraph Cache["Cache Management"]
LOAD[_load_cache]
PARSE[_parse_cache_data]
EXTRACT[_extract_document_panel_content]
end
end
subgraph Data["๐พ Data Layer"]
CACHE_FILE[(Granola Cache<br/>cache-v*.json)]
MODELS[Pydantic Models<br/>MeetingMetadata<br/>MeetingDocument<br/>MeetingTranscript]
end
CD -->|stdio| MCP_STDIO
MCP_STDIO -->|MCP Protocol| GMCS
GMCS --> LIST
GMCS --> CALL
CALL --> SEARCH
CALL --> DETAILS
CALL --> TRANSCRIPT
CALL --> DOCS
CALL --> ANALYZE
GMCS --> LOAD
LOAD --> PARSE
PARSE --> EXTRACT
PARSE -->|reads| CACHE_FILE
PARSE --> MODELS
Data Flow
sequenceDiagram
participant User as ๐ค User
participant Claude as ๐ค Claude Desktop
participant Server as โ๏ธ MCP Server
participant Cache as ๐พ Granola Cache
User->>Claude: "Search for meetings about quarterly planning"
Claude->>Server: MCP: search_meetings(query)
Server->>Cache: Read cache file
Cache-->>Server: Raw JSON data
Server->>Server: Parse & validate with Pydantic
Server->>Server: Search across titles, participants, transcripts
Server-->>Claude: Matching meetings with metadata
Claude-->>User: Formatted meeting results
User->>Claude: "Get transcript from yesterday's meeting"
Claude->>Server: MCP: get_meeting_transcript(id)
Server->>Server: Lookup transcript in cache
Server-->>Claude: Full transcript with speakers
Claude-->>User: Readable conversation format
๐ ๏ธ Tech Stack
| Component | Technology |
|---|---|
| Language | Python 3.12+ |
| MCP SDK | mcp>=1.0.0 |
| Data Validation | Pydantic 2.x |
| Package Manager | uv (recommended) or pip |
| Build System | Hatchling |
| Release Automation | python-semantic-release |
๐ฆ Installation
Prerequisites
- uv package manager
- macOS with Granola.ai installed
Claude Desktop
Add to your claude_desktop_config.json:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
{
"mcpServers": {
"granola": {
"command": "uvx",
"args": ["granola-mcp-server"]
}
}
}
Then restart Claude Desktop.
Claude Code
claude mcp add granola -- uvx granola-mcp-server
Cursor
Updating
uvx caches the package after first run. To update to the latest version:
uvx --refresh granola-mcp-server
Then restart your MCP client.
Manual installation (alternative)
If you prefer to install from source:
cd ~
git clone https://github.com/proofgeist/granola-mcp-server
cd granola-mcp-server
uv sync
Then configure your MCP client to run the server directly:
{
"mcpServers": {
"granola": {
"command": "uv",
"args": ["--directory", "/Users/YOUR_USERNAME/granola-mcp-server", "run", "granola-mcp-server"]
}
}
}
To update a source install: git pull && uv sync
pip (alternative)
pip install granola-mcp-server
Then configure your MCP client to run granola-mcp-server.
Environment Variables
| Variable | Description | Default |
|---|---|---|
GRANOLA_PARSE_PANELS |
Enable parsing of document panels for rich notes | 1 (enabled) |
TZ |
Override local timezone detection | Auto-detected |
Set GRANOLA_PARSE_PANELS=0 to disable document panel parsing if you encounter issues.
๐ Usage
Once configured, restart Claude Desktop and start interacting with your Granola meetings using natural language:
Search & Discovery
- "Search for meetings about quarterly planning"
- "Show me yesterday's meetings"
- "Find meetings with David from this week"
- "List all my recent standup meetings"
Transcript Access
- "Get the transcript from yesterday's IA meeting"
- "What was discussed in the Float rollback planning meeting?"
- "Show me the full conversation from the David Tanner 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"
Available Tools
| Tool | Description | Parameters |
|---|---|---|
search_meetings |
Search meetings by title, content, participants | query (string), limit (int, optional) |
get_meeting_details |
Get detailed information about a meeting | meeting_id (string) |
get_meeting_transcript |
Get full transcript with speaker identification | meeting_id (string) |
get_meeting_documents |
Get documents and notes associated with a meeting | meeting_id (string) |
analyze_meeting_patterns |
Analyze patterns across meetings | pattern_type (enum: topics/participants/frequency), date_range (optional) |
๐งช Development
Running Tests
# Run panel parsing test
uv run python test_server.py
# Test with real cache file
uv run python test_real_cache.py
Running the Server Directly
uv run granola-mcp-server
Or using the run script:
uv run python run_server.py
Project Structure
granola-mcp-server/
โโโ granola_mcp_server/
โ โโโ __init__.py # Package initialization
โ โโโ server.py # Main MCP server implementation (~750 lines)
โ โโโ models.py # Pydantic data models
โโโ .github/
โ โโโ workflows/
โ โโโ release.yml # Semantic release automation
โโโ tests/
โ โโโ test_server.py # Unit tests with synthetic cache
โ โโโ test_real_cache.py # Integration tests with real data
โโโ pyproject.toml # Python package configuration + semantic-release config
โโโ run_server.py # Entry point wrapper
โโโ INSTALL.md # Detailed installation guide
โโโ LICENSE # MIT License
โโโ README.md # This file
๐ Security & Privacy
| Feature | Status |
|---|---|
| 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
- 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
- Production Ready: Successfully processes real Granola data (11.7MB cache files)
- Scalable: Handles large datasets with 500+ transcript segments per meeting
๐ Troubleshooting
Common Issues
"Cache file not found"
# Ensure Granola.ai is installed and has processed some meetings
ls -la ~/Library/Application\ Support/Granola/cache-v*.json
"uv command not found"
# Install uv
curl -LsSf https://astral.sh/uv/install.sh | sh
Server not appearing in Claude Desktop
- Check Claude Desktop logs:
~/Library/Logs/Claude/mcp-server-granola.log - Restart Claude Desktop after config changes
Meeting notes appear empty
- Granola sometimes stores rich notes inside
documentPanelsrather thannotes_plain - This server reads those panels by default; set
GRANOLA_PARSE_PANELS=0to disable
Manual installation issues
These apply only if you installed from source (git clone) rather than via uvx.
"Permission denied" or "Operation not permitted"
- This happens when the server is installed in
~/Documentsor other protected macOS folders - Move the installation to your home directory:
Then update the path inmv ~/Documents/granola-mcp-server ~/granola-mcp-server cd ~/granola-mcp-server uv syncclaude_desktop_config.json - Or grant Claude Desktop Full Disk Access in System Settings > Privacy & Security
"Current directory does not exist"
- This error occurs when using
uv runwith the--directoryflag - Ensure the path in your Claude config points to the actual clone location
"Failed to spawn process" or "No such file or directory"
- Run
uv syncin the project directory to rebuild the venv - Verify the script exists:
ls -la ~/granola-mcp-server/.venv/bin/granola-mcp-server
๐ค Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'feat: add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
Please ensure your code follows the existing style and includes appropriate tests.
๐ License
This project is licensed under the MIT License - see the LICENSE file for details.
Copyright (c) 2025 Proof+Geist
๐ Acknowledgments
- Granola.ai for the amazing meeting intelligence app
- Anthropic for Claude and the Model Context Protocol
- Astral for the uv package manager
โ ๏ธ Disclaimer: This is an experimental project. Granola's cache format may change without notice. Use at your own risk.
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.