mcp-granola
# mcp-granola
[](https://opensource.org/licenses/MIT)
[](https://nodejs.org)
[](https://modelcontextprotocol.io)
An [MCP (Model Context Protocol)](https://modelcontextprotocol.io) server that gives AI agents access to your [Granola](https://granola.ai) meeting notes. Search notes, retrieve full content with transcripts, and paginate through your meeting history.
## Features
- **List notes** with date filtering and cursor-based pagination
- **Get full note content** including AI summaries and meeting transcripts
- **Search notes** by title or summary keywords
- Works with **Claude Code**, **Gemini CLI**, and any MCP-compatible client
- Zero external dependencies beyond the MCP SDK
## Quick Start
### 1. Install
```bash
npm install @devli13/mcp-granola
```
Or clone and install locally:
```bash
git clone https://github.com/devli13/mcp-granola.git
cd mcp-granola
npm install
```
### 2. Get a Granola API key
1. Open the Granola desktop app
2. Go to **Settings > API**
3. Click **Create new key**
4. Copy the key (starts with `grn_`)
### 3. Configure
Add to your `.mcp.json` (Claude Code) or `.gemini/settings.json` (Gemini CLI):
```json
{
"mcpServers": {
"granola": {
"command": "npx",
"args": ["-y", "@devli13/mcp-granola"],
"env": {
"GRANOLA_API_KEY": "grn_your_api_key_here"
}
}
}
}
```
Or run directly:
```bash
GRANOLA_API_KEY=grn_your_key node server.js
```
## Configuration
| Environment Variable | Required | Description |
|---|---|---|
| `GRANOLA_API_KEY` | Yes | Your Granola API key (starts with `grn_`). Get it from Granola app > Settings > API. |
## Tools
| Tool | Description | Key Parameters |
|---|---|---|
| `list_notes` | List notes, most-recent first | `limit`, `created_after`, `created_before`, `cursor` |
| `get_note` | Fetch a single note by ID | `id` (required), `include_transcript` |
| `search_notes` | Search notes by title/summary keywords | `query` (required), `limit` |
### Example: list recent notes
```json
{
"name": "list_notes",
"arguments": {
"limit": 5,
"created_after": "2025-01-01T00:00:00Z"
}
}
```
### Example: get a note with transcript
```json
{
"name": "get_note",
"arguments": {
"id": "not_abc123def456",
"include_transcript": true
}
}
```
## Limitations
- **Granola API is in beta** — endpoints and response shapes may change.
- **Personal API keys** only access notes you own or that are shared with you directly.
- **`search_notes`** performs client-side substring matching over the 200 most recent notes. It is not a full-text search engine. For large note volumes, use `list_notes` with date filters instead.
- The API only returns notes with generated AI summaries and transcripts. Notes still being processed won't appear.
## Rate Limits
Granola enforces rate limits per workspace:
| Metric | Value |
|---|---|
| Burst capacity | 25 requests |
| Time window | 5 seconds |
| Sustained rate | 5 req/s (300/min) |
## Contributing
Issues and pull requests are welcome! Please open an issue first to discuss any significant changes.
## License
MIT
TDQS
Scored across 3 tools
Each tool has a clearly distinct purpose: get_note retrieves a single note by ID, list_notes lists notes with filtering and pagination, and search_notes performs substring searches over note content. There is no overlap in functionality, making tool selection straightforward for an agent.
All tool names follow a consistent verb_noun pattern (get_note, list_notes, search_notes) with clear, descriptive verbs. The naming is uniform and predictable, enhancing usability and reducing confusion.
With only 3 tools, the server feels thin for a note management domain, as it lacks essential CRUD operations like create, update, or delete. While the tools are well-defined, the count is borderline low for comprehensive functionality.
The tool surface is significantly incomplete for note management, covering only read and search operations. There are no tools for creating, updating, or deleting notes, which are critical for a full lifecycle, leading to potential agent failures in workflows requiring modification.