npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@mimicai/adapter-granola

v0.13.0

Published

Mimic mock adapter for the [Granola API](https://docs.granola.ai/introduction) v1 — read-only meeting notes, transcripts, and workspace folders.

Readme

@mimicai/adapter-granola

Mimic mock adapter for the Granola API v1 — read-only meeting notes, transcripts, and workspace folders.

Built primarily to power Step 3 of the Briefing Agent's flow (conversation history): given an upcoming-call attendee, find recent Granola meetings and read what was said. See private/briefing-agent.md.

Install

npm install @mimicai/adapter-granola

Coverage

Granola's public API is intentionally minimal. All 3 spec endpoints are implemented — there is no curation/trimming because there's nothing to trim.

| Method | Path | Notes | |---|---|---| | GET | /v1/notes | List meeting notes (newest first); filter by created_after/created_before/updated_after; cursor pagination via cursor/page_size | | GET | /v1/notes/{note_id} | Retrieve a single note; ?include=transcript bundles the speaker-turn transcript array | | GET | /v1/folders | List workspace folders alphabetically with cursor pagination |

Spec source: https://docs.granola.ai/api-reference/openapi.json (OpenAPI 3.1).

Granola idioms the adapter implements

| Idiom | How | |-------|-----| | List envelope | { notes: [...], hasMore: boolean, cursor: string \| null } (folders use { folders, hasMore, cursor }) — distinct from a data-wrapped envelope | | Single note | Flat object — no data wrapper | | Cursor pagination | Cursor is the id of the last item on the previous page; hasMore indicates more items exist; nextCursor is null on the final page | | Transcript inclusion | ?include=transcript toggles the transcript array on single-note responses; list responses never include transcripts (Granola behaviour); 404 if the note has no transcript | | ID prefixes | Notes are not_<14-char>, folders are fol_<14-char> | | Timestamps | ISO 8601 with UTC (2026-04-20T15:00:00Z) for created_at, updated_at, transcript start_time/end_time, and date filter params | | Error envelope | { error: { type, code, message } } — Granola's docs only describe natural-language status codes; we pick a sensible JSON shape compatible with most SDKs |

Auth

Granola tokens are formatted grn_<key>. For Mimic test traffic, encode the persona id between underscores:

curl http://localhost:4100/v1/notes \
  -H "Authorization: Bearer grn_northwind-priya_aaaaaaaaaaaa"

The mock accepts any Bearer token (real Granola enforces validity); persona extraction matches the grn_<persona-id>_* pattern.

MCP tools (5)

Designed for the Briefing Agent's pre-call synthesis flow:

  1. list_granola_notes — Newest-first list with date filters; transcripts excluded (call get_granola_note_transcript per note).
  2. get_granola_note — Cheap fetch (no transcript) — title, summary, attendees, calendar event, folder.
  3. get_granola_note_transcript — Full transcript with speaker turns; Step 3 of the briefing-agent flow ("LAST CALL highlights"). Returns 404 if the meeting wasn't transcribed.
  4. find_granola_notes_by_attendee — Convenience filter for "recent meetings with [email protected]" — the bread-and-butter briefing lookup.
  5. list_granola_folders — Alphabetical workspace folders for scoping list_granola_notes with folder_id.

Running

Standalone

pnpm --filter @mimicai/adapter-granola build
node dist/bin/mcp.js

With mimic host

# mimic.json
apis:
  granola:
    enabled: true
    mcp: true

Regeneration

The OpenAPI spec is gitignored. To regenerate after a Granola spec update:

curl -fsSL https://docs.granola.ai/api-reference/openapi.json \
  -o packages/adapters/adapter-granola/granola-spec.json

pnpm --filter @mimicai/adapter-granola generate
pnpm --filter @mimicai/adapter-granola test

Why so small?

Granola's public API is genuinely 3 endpoints. The Mimic adapter quality bar typically asks for ≥8 routes; Granola is a deliberate exception because the upstream surface is what it is. Padding with fake endpoints would damage the "swap the URL, not the code" promise. If/when Granola expands their API, the codegen will pick up new paths automatically.