Skip to main content
Glama
devli13
by devli13
README.md
# mcp-granola

[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![Node.js](https://img.shields.io/badge/node-%3E%3D18-brightgreen)](https://nodejs.org)
[![MCP](https://img.shields.io/badge/MCP-compatible-blue)](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

A3.8/5.0

Scored across 3 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count3/5

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.

Completeness2/5

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.

Maintenance

ActivityInactive
ResponsivenessNo issues