Announcing CIMD support for MCP Client registration
Learn more

Fireflies MCP vs API - what's best for your AI Agent?

TL;DR

  • The Fireflies MCP server and the Fireflies GraphQL API have overlapping but not identical coverage. The MCP server exposes around 19 read and write tools over transcripts, summaries, soundbites, channels, sharing, and analytics. The GraphQL API additionally exposes uploadAudio, addToLiveMeeting, deleteTranscript, setUserRole, AskFred threads, and webhooks, none of which the MCP server surfaces.
  • Auth is not symmetric here. The MCP server accepts OAuth (with the user's Fireflies account) or a Bearer API key. The raw GraphQL API accepts only a Bearer API key, and that key is a static, per-user secret with no refresh or rotation built in.
  • For a multi-tenant B2B agent, neither path solves per-user credential isolation. One API key equals one user's blast radius, and N users means N credentials to store, refresh, and revoke.
  • MCP is the faster path for interactive, read-heavy meeting agents; the GraphQL API is the right foundation for ingestion, live-meeting dispatch, deletion, and event-driven pipelines the MCP server does not cover.
  • Scalekit's Fireflies connector handles OAuth 2.1 authorization, the token vault, per-user scoping, and a full audit trail on every tool call, so the MCP-versus-API decision does not change your auth infrastructure.

Your agent needs to read and act on Fireflies meeting data. Fireflies ships two distinct paths: a remote MCP server introduced in beta in 2026, and the GraphQL API your integrations have probably been calling for a while. They cover overlapping but not identical territory. They put you on different auth paths. They make different operational demands once you run them for more than one user. Here is how to pick.

What Fireflies MCP and Fireflies API actually are

Both paths hit the same Fireflies backend and the same meeting data. What differs is the surface each exposes and the auth each expects.

The Fireflies MCP server

The Fireflies MCP server is a remote, vendor-hosted server at https://api.fireflies.ai/mcp. It was built for LLM consumption: curated tool descriptions, a token-efficient default response format (toon), and structured parameters your agent can call without hand-writing schemas. It exposes around 19 tools spanning search and retrieval, summaries, soundbites, channels, sharing, and analytics, some read-only and some that take actions like sharing a meeting or creating a soundbite.

A note on maturity: fireflies_search and fireflies_fetch are experimental and progressively rolled out, so treat them as feature-flagged rather than guaranteed. You can read the official setup and tool reference in the Fireflies MCP Server documentation.

How an agent connects to the MCP server

The MCP server accepts OAuth against the user's Fireflies account, or a Bearer API key passed as a header. The API-key path is the quick local setup that most MCP clients document:

{ "mcpServers": { "fireflies": { "command": "npx", "args": [ "mcp-remote", "https://api.fireflies.ai/mcp", "--header", "Authorization: Bearer YOUR_API_KEY_HERE" ] } } }

The Fireflies GraphQL API

The Fireflies API is a single GraphQL endpoint: POST https://api.fireflies.ai/graphql. Reads are queries (transcripts, transcript, user, bites, analytics, channels), and writes are mutations (uploadAudio, addToLiveMeeting, createBite, shareMeeting, deleteTranscript, and more). Every call carries Authorization: Bearer your_api_key, and list queries page with limit (max 50) and skip.

How an agent authenticates to the API

The GraphQL API supports one auth method: a Bearer API key. The key is generated from the user's Fireflies Developer settings, belongs to that one user, and carries exactly that user's access. There is no OAuth path and no version to pin; you follow the changelog for schema changes. The full reference lives in the official Fireflies GraphQL API documentation.

What your agent can actually do

The MCP server covers the retrieval-and-organize surface well. The GraphQL API owns ingestion, live-meeting control, and deletion. The gap is real, and it is architectural, not a temporary rollout delay.

Capability
Fireflies MCP
Fireflies GraphQL API
Search transcripts (mini-grammar)
Yes, experimental
Yes
Query multiple transcripts with filters
Yes
Yes
Fetch a full transcript by ID
Yes
Yes
Fetch a meeting summary and action items
Yes
Yes
Team and per-user analytics
Yes
Yes
List and read channels
Yes
Yes
Create and list soundbites
Yes
Yes
Share and revoke meeting access
Yes
Yes
Rename, move, and set meeting privacy
Yes
Yes
Upload audio for transcription
No
Yes, uploadAudio
Dispatch the bot to a live meeting
No
Yes, addToLiveMeeting
Delete a transcript
No
Yes, deleteTranscript
Change a user's role
No
Yes, setUserRole
AskFred conversation threads
No
Yes
Real-time webhooks
No
Yes

The capability gap that matters

If your agent only reads, searches, summarizes, and organizes meetings, the MCP surface is close to complete. The moment your agent has to create data or react to it, the gap opens. Ingesting a recorded call (uploadAudio), putting the notetaker into a live meeting (addToLiveMeeting), deleting a transcript for compliance, or reacting the instant a transcript finishes (webhooks) all live only in the GraphQL API. These are not tools that ship next month; they sit outside the MCP server's read-and-organize design.

What MCP makes easier

The MCP server removes work the GraphQL API leaves to you. Tool schemas and descriptions arrive ready for the model, the toon default format trims token usage on large transcripts, and the mini-grammar search tool wraps filtering you would otherwise assemble by hand. For an interactive assistant querying meetings in natural language, that curation is the point.

The auth path each one puts you on

This is where the two paths diverge in a way that shapes your production posture, and where Fireflies differs from the usual MCP-versus-API story.

MCP: OAuth or API key

The MCP server takes OAuth against the user's Fireflies account, which is the natural path for interactive clients where a browser consent flow is available. It also accepts a Bearer API key for local or headless setups. Either way, the agent inherits what the authorizing user can see and do.

The GraphQL API: one static key per user

The GraphQL API has no OAuth path. It authenticates with a single Bearer API key per user, and that key is a long-lived static secret: no expiry, no refresh, no rotation built in. It should live in a secret store, never in client code, and it carries the full access of the user who minted it.

The per-user isolation problem

Here is the point that determines your architecture. In a multi-tenant B2B meeting agent, which is the default rather than the exception, every user has their own Fireflies credential. On the MCP path you hold one OAuth grant per user; on the API path you hold one API key per user. The token type differs, but the requirement is identical: per-user credential isolation. Neither path gives you storage, refresh, or revocation. For the background on why this is delegated authority and not a login, see OAuth for AI agents: production architecture.

What you own in production

The path you pick shifts where the operational weight lands, but it never removes the weight.

On the MCP path

Fireflies maintains the server, the tool schemas, and the response formatting. You still own per-user token storage, refresh where OAuth is used, and revocation. You also inherit the server's shape: when Fireflies updates the MCP tool surface, your available tools change under you, so you track the server's evolution rather than a pinned contract.

On the GraphQL API path

You own the full surface: query construction, pagination with limit and skip, error handling, and rate limits such as the three-requests-per-twenty-minutes cap on addToLiveMeeting. You also own the API key lifecycle end to end. Because there is no version to pin, schema changes arrive through the changelog and you adapt on your side.

The maintenance trajectory

MCP trades control for lower schema maintenance; the API trades higher maintenance for complete control. Both leave the credential layer to you, which is the part that actually breaks at scale.

When to use MCP, when to use the API

The decision is about what your agent does, not about which is newer.

Use Fireflies MCP when

  • Your agent is interactive and user-facing: a meeting assistant, a call-prep helper, or a coding-tool integration where OAuth consent is natural.
  • The work is read-and-organize: summarizing calls, searching past conversations, pulling action items, tidying meetings into channels.
  • You want LLM-native tool descriptions and token-efficient responses without writing or maintaining schemas.
  • You are prototyping and want the shortest path from account to first useful answer.

Use the Fireflies GraphQL API when

  • Your agent ingests audio and starts transcriptions with uploadAudio.
  • Your agent dispatches the notetaker into live meetings with addToLiveMeeting.
  • Your agent must delete transcripts, manage roles, or drive AskFred threads.
  • Your pipeline is event-driven and needs webhooks for transcription-complete or audio-upload events.
  • You need deterministic control over queries, fields, pagination, and error handling at volume.

The credential problem that exists on both paths

Both paths hand you a credential per user. Neither hands you a vault, a rotation policy, or a revocation flow. That infrastructure is yours to build regardless of which path you chose.

One API key is one user's blast radius

A Fireflies API key is a static secret that carries its owner's full access. Store it unencrypted, log it once, or leak it through a stack trace, and the exposure is that entire user's meeting history. Because the key never expires on its own, a leaked key stays valid until someone manually rotates it. This is exactly the kind of risk covered in depth in OAuth vs API keys for AI agents: why static credentials break in production.

The N-credential problem

Run the agent for one user and a single credential in a .env file feels fine. Run it for a team and you have N credentials to store, refresh, and revoke. Offboarding is the sharp edge: the identity provider account gets disabled, but a Fireflies key or OAuth grant issued months ago is still live, and the agent keeps using it because nothing told it to stop. For a detailed look at this problem, see when an employee leaves, who revokes their AI agent's access.

Where Scalekit fits

Scalekit's Fireflies connector authorizes each user through OAuth 2.1 against the vendor MCP server, stores the credential in an encrypted token vault, refreshes it, and resolves the right per-user credential on every tool call. Credentials never touch your agent runtime. The same auth layer works whether you lean on the MCP surface or, for API-only capabilities, add them through bring your own connector. The path decision does not change what you need at the credential layer. For the deeper contrast between the two approaches, see MCP vs APIs: how they are different.

Connect Fireflies to your agent with Scalekit

The Scalekit path is the same three steps for every connector: authorize the user, discover the tools that user is allowed to call, then run the agent loop. The example below uses Python and the Claude SDK against the firefliesmcp connector. Set your credentials first, following the AgentKit quickstart.

Authorize a user

The identifier represents the current person in your own system, resolved from your authenticated session and never accepted from the client. Scalekit looks up or creates that user's connected account and, if it is not yet active, returns an authorization link for the Fireflies OAuth flow.

import os import scalekit.client from dotenv import load_dotenv load_dotenv() scalekit_client = scalekit.client.ScalekitClient( client_id=os.getenv("SCALEKIT_CLIENT_ID"), client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"), env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"), ) actions = scalekit_client.actions CONNECTION = "firefliesmcp" # must match the connection name in your dashboard IDENTIFIER = "user_123" # resolved from your authenticated session account = actions.get_or_create_connected_account( connection_name=CONNECTION, identifier=IDENTIFIER, ) if account.connected_account.status != "ACTIVE": link = actions.get_authorization_link( connection_name=CONNECTION, identifier=IDENTIFIER ) print("Authorize Fireflies:", link.link) input("Press Enter after authorizing...")

Discover the scoped tool surface

The agent does not load a flat catalog of every Fireflies tool. It loads the tools this user's connected account is authorized to call, returned in the model's native format. That distinction is what separates a per-user agent from a shared-credential one. The connection name in the filter is case-sensitive; a mismatch returns an empty list with no error.

from google.protobuf.json_format import MessageToDict scoped_response, _ = actions.tools.list_scoped_tools( identifier=IDENTIFIER, filter={"connection_names": [CONNECTION]}, page_size=100, ) llm_tools = [ { "name": MessageToDict(t.tool).get("definition", {}).get("name"), "description": MessageToDict(t.tool).get("definition", {}).get("description", ""), "input_schema": MessageToDict(t.tool).get("definition", {}).get("input_schema", {}), } for t in scoped_response.tools ] print(f"Discovered {len(llm_tools)} Fireflies tools")

Run the agent loop

This is the standard Claude tool-use loop. Claude decides which tool to call; your code runs it through execute_tool with the user's identifier; Scalekit resolves that user's credential from the vault and calls Fireflies as them. The token never enters your code or the model context.

import anthropic client = anthropic.Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY")) messages = [{ "role": "user", "content": "Find last week's sales calls that mentioned pricing objections and summarize the objections.", }] while True: response = client.messages.create( model=os.getenv("ANTHROPIC_MODEL", "claude-sonnet-4-6"), max_tokens=1024, tools=llm_tools, messages=messages, ) if response.stop_reason == "end_turn": print(response.content[0].text) break tool_results = [] for block in response.content: if block.type == "tool_use": print(f" -> Calling: {block.name}") result = actions.execute_tool( tool_name=block.name, # e.g. firefliesmcp_fireflies_search identifier=IDENTIFIER, tool_input=block.input, ) tool_results.append({ "type": "tool_result", "tool_use_id": block.id, "content": str(result.data), }) messages.append({"role": "assistant", "content": response.content}) messages.append({"role": "user", "content": tool_results})

The framework is not the hard part

The same connected-account pattern works with LangChain, CrewAI, Google ADK, and others; only the tool-binding call changes. What stays constant is the flow: one connection created once, per-user tokens resolved on every call, and no OAuth handler in your codebase. Browse the full tool list and parameters on the Fireflies connector page.

Scope tools with a Virtual MCP server

A summarizer agent does not need all 20 Fireflies tools. Handing it the full server means it can share, move, revoke, and create soundbites when all you asked for was retrieval, and every unused tool widens the blast radius if something goes wrong.

Least privilege at the tool level

Scalekit's Virtual MCP servers let you declare exactly which tools an agent role can see and whose credentials it acts with. A meeting-summary agent gets firefliesmcp_fireflies_search, firefliesmcp_fireflies_get_summary, and firefliesmcp_fireflies_get_transcript, and nothing else. The agent cannot act beyond the surface you granted. This is least-privilege in practice — the same principle explored in access control for multi-tenant AI agents.

Token bloat and multi-tenant isolation

Every tool loaded into context costs tokens before the agent does any work; scoping a server from twenty tools to a handful trims that overhead materially across thousands of runs. Isolation is handled with session tokens: one server definition serves every user, and each run receives a short-lived token scoped to that user's connected accounts. This is what makes Virtual MCP servers a fit for multi-tool, multi-tenant meeting agents.

Observability on every tool call

When an agent acts on Fireflies as a user, you need to prove what it did and under whose authorization. That is an infrastructure concern, not something either raw path gives you.

What gets logged

Scalekit records full attribution on every downstream tool call: who authorized the connection, which agent ran it, which tool executed, the scope it ran under, and what came back. The auth logs are queryable and exportable to your SIEM, with failures separated by source so an expired grant does not hide inside a wall of successes.

Why it matters for Fireflies agents

Meeting transcripts are sensitive, and actions like sharing or deleting a meeting are exactly what an auditor will ask about. A per-user audit trail answers "which human authorized this share, and can we revoke it" without reconstructing state from application logs. For the compliance framing behind this, see audit trails for agent auth and the practitioner view in agent tool observability.

Which one to build against

If your Fireflies agent is interactive and read-heavy, summarizing calls, searching conversations, pulling action items, build against the MCP server; the tool surface is curated for exactly that. If your agent ingests audio, dispatches the bot to live meetings, deletes transcripts, or reacts to webhooks, build against the GraphQL API, because those capabilities live only there. Many production meeting agents end up using both: the MCP surface for retrieval and organization, the API for ingestion and events.

The credential management problem is identical either way. That is the part that needs production-grade infrastructure, and it is the part Scalekit owns so you do not have to.

Build Fireflies agents with Scalekit

Start from a working pattern rather than a blank file. The meeting prep agent template, the sales call prep agent, and the deal intelligence agent all pair Fireflies-style meeting data with per-user auth out of the box. See the Fireflies connector docs, browse the full connector catalog, and check AgentKit pricing when you are ready to scale.

Building now and want a hand? Join the Scalekit Slack community or talk to us for immediate help.

No items found.
Agent
Auth Quickstart
On this page
Share this article
Agent
Auth Quickstart

Acquire enterprise customers with
zero upfront cost.

Every feature unlocked. No hidden fees.