acai logo

Meeting Intelligence
for AI Agents

A Go CLI and MCP server that makes Granola meeting data a first-class citizen in AI agent workflows. Meetings, transcripts, summaries, and action items as structured MCP resources.

~
$ brew tap felixgeelhaar/tap && brew install acai
377 tests
82.7% coverage
MIT license

Meeting Knowledge Deserves an API

Granola captures high-quality transcripts, summaries, and action items. acai extends that intelligence into the MCP ecosystem so AI agents can use it too.

🔒

Knowledge Silos

Meeting insights live in the app where they were captured. Getting them into downstream tools means manual copy-paste.

⛓️‍💥

Missing Automation

Going from "meeting happened" to "ticket created, notes filed, follow-ups scheduled" still requires human glue.

🙈

Agent Blindness

AI agents can't yet reference past meetings, search transcripts, or act on action items without a bridge.

🍵

The Solution: Structured MCP Resources

A single binary — acai — that makes meeting intelligence a first-class citizen in the MCP ecosystem. For power users: a CLI. For agents: typed tools and resources. For teams: production-grade reliability and fine-grained access control.

Features

Everything you need to integrate meeting intelligence into your agent workflows.

MCP Server

13 typed tools and 5 resource URIs. Meetings, transcripts, action items, notes, and interactive dashboards — all queryable by AI agents.

acai serve
💻

CLI

Authenticate, sync, search, export, annotate, and manage meetings from the terminal. Table, JSON, and markdown output.

acai list meetings --format json
✏️

Write-Back

Agent-generated notes and action item updates persisted locally with outbox pattern for future upstream sync.

add_note / complete_action_item
🛡️

Agent Policies

Per-meeting ACL with allow/deny rules by tool and tags. Content redaction for emails, speakers, keywords, and patterns.

ACAI_POLICY_FILE=policy.yaml
🔄

Resilience

Circuit breaker, retry with exponential backoff, rate limiting, and timeouts on every API call via Fortify.

5 failures → circuit opens
💾

Caching

SQLite local cache reduces API calls and enables offline access. Configurable TTL with graceful stale-data fallback.

ACAI_CACHE_TTL=15m

How It Works

A decorator chain architecture with separate read, write, and policy paths.

☁️
Granola Cloud API
External data source
🔌
Granola Client
Anti-corruption layer: API DTOs → domain types
🔄
Resilient Repo
Circuit breaker, retry, rate limit, timeout
💾
Cached Repo
SQLite local cache (TTL 15min)
Use Cases → MCP Server / CLI
Application layer → Interface adapters

Quick Start

Up and running in under a minute.

1

Install

install
$ brew tap felixgeelhaar/tap
$ brew install acai
2

Configure

auth
$ export ACAI_GRANOLA_API_TOKEN=gra_xxxxx
$ acai auth login --method api_token
3

Use

use
$ acai list meetings
$ acai serve
# MCP server running on stdio

MCP Integration

Drop this into your Claude Code config and your AI agent instantly gains meeting intelligence.

~/.claude/mcp.json json
{
  "mcpServers": {
    "granola": {
      "command": "acai",
      "args": ["serve"],
      "env": {
        "ACAI_GRANOLA_API_TOKEN": "gra_xxxxx"
      }
    }
  }
}

13 Tools

list_meetings Search and filter meetings with date, source, and text filters
get_meeting Full meeting details including summary and action items
get_transcript Speaker-attributed transcript with timestamps
search_transcripts Full-text search across all meeting transcripts
get_action_items Action items from a specific meeting
meeting_stats Aggregated statistics with interactive D3.js dashboard
list_workspaces List all Granola workspaces
add_note Attach an agent note to a meeting
list_notes List agent notes for a meeting
delete_note Remove an agent note
complete_action_item Mark an action item as completed
update_action_item Update an action item's text
export_embeddings Export meeting content as chunks for embedding pipelines

5 Resources

meeting://{id} Full meeting details as JSON
transcript://{meeting_id} Transcript utterances as JSON
note://{meeting_id} Agent notes as JSON
workspace://{id} Workspace details as JSON
ui://meeting-stats Interactive D3.js dashboard (HTML)

Real-time Events

Domain events (MeetingCreated, TranscriptUpdated, NoteAdded) are dispatched to connected MCP sessions. Agents react to meeting updates as they happen.

Agent Policies

Fine-grained access control and content redaction. Control what data AI agents can see and how sensitive content is handled.

Policy Configuration

policy.yaml yaml
default_effect: allow
rules:
  - name: block-confidential-transcripts
    effect: deny
    tools: [get_transcript, export_embeddings]
    conditions:
      meeting_tags: [confidential]

redaction:
  enabled: true
  rules:
    - type: emails
      replacement: "[EMAIL]"
    - type: speakers
      replacement: "Speaker {n}"
    - type: keywords
      keywords: [salary, confidential]
      replacement: "[REDACTED]"
    - type: patterns
      pattern: '\d{3}-\d{2}-\d{4}'
      replacement: "[SSN]"

Redaction in Action

Before

"speaker": "Alice Johnson",

"text": "Send the salary report to alice@company.com and include SSN 123-45-6789"

After

"speaker": "Speaker 1",

"text": "Send the [REDACTED] report to [EMAIL] and include SSN [SSN]"

ACL

First-match-wins rule evaluation. Deny tools for tagged meetings.

Redaction

Emails, speakers, keywords, and custom regex patterns.

Architecture

Strict Domain-Driven Design with hexagonal architecture. Dependencies point inward — the domain has zero external dependencies.

DDD Layers

InterfacesMCP + CLI
ApplicationUse Cases
DomainPure Logic
InfrastructureAdapters
Hover over a layer to explore

Decorator Chain

Read Path
Granola API Resilient Cached Use Cases
Write Path
Use Cases Local Store Outbox Events

Key Libraries

mcp-go MCP server framework with typed tools, resources, and multi-transport
fortify Circuit breaker, retry, rate limit, timeout
cobra CLI framework for terminal commands
go-sqlite3 SQLite driver for local cache and store

Open Source

Production-grade quality, fully tested, MIT licensed.

377
Tests
82.7%
Coverage
0
Race Conditions
MIT
License
Layer Coverage
Domain 94-100%
Application 86-100%
Infrastructure 85-97%
Interfaces 74-81%