Skip to main content
Glama

@silkweave/meet

Google Meet API client exposed as both an MCP server and a CLI. Built with silkweave.

Authentication is exclusively through a Google Workspace service account with domain-wide delegation (DWD). There is no OAuth flow, no per-user token registry, no interactive login. One service-account JSON on disk and a list of Workspace user emails in a config file is the entire setup.

Features

  • List upcoming meetings from Google Calendar and past Google Meet conference records

  • Retrieve conference details, participants, recordings, and transcripts (impersonating any Workspace user via DWD)

  • Render transcripts as clean Markdown (consecutive utterances per speaker merged)

  • Persistent transcript archive with full-text (and optional OpenAI-powered vector/hybrid) search — every saved transcript is enriched with its Calendar event (subject, description, attendees) and indexed into a local Orama database

  • Two ways to consume new-transcript notifications:

    • eventPullTranscripts — on-demand polling with a persisted cursor (idempotent)

    • Built-in background watcher (transcriptWatch*) — streams from Pub/Sub and writes Markdown files, with optional per-save shell command

  • transcriptBackfill — one-shot catch-up across all users for the past N days

Related MCP server: Fireflies MCP Server

Quick Start

1. Provision a service account with DWD

In Google Cloud Console:

  1. Create or pick a project.

  2. Enable the Google Calendar API, Google Meet API, Google Workspace Events API, and Cloud Pub/Sub API.

  3. Create a service account; download its JSON key.

In your Google Workspace Admin Console:

  1. Security → Access and data control → API controls → Domain-wide delegation → Add new.

  2. Paste the service account's Client ID (the numeric one in the JSON key, field client_id).

  3. Grant these OAuth scopes:

    • https://www.googleapis.com/auth/userinfo.email

    • https://www.googleapis.com/auth/calendar

    • https://www.googleapis.com/auth/drive.readonly

    • https://www.googleapis.com/auth/meetings.space.readonly

    • https://www.googleapis.com/auth/meetings.space.created

2. Install the key locally

mkdir -p ~/.silkweave-meet
cp /path/to/sa-key.json ~/.silkweave-meet/service-account.json
chmod 600 ~/.silkweave-meet/service-account.json

That's all the auth configuration. No env vars, no OAuth flow.

3. Register the MCP server (optional, for Claude Code)

{
  "mcpServers": {
    "meet": {
      "command": "npx",
      "args": ["-y", "-p", "@silkweave/meet", "meet-mcp"]
    }
  }
}

The package ships two bins: meet-mcp (stdio MCP server) and meet-cli (same action set as direct commands).

4. Try a call

npx -p @silkweave/meet meet-cli calendar-event-list --user-email=you@your-workspace.com

Configuration file

Everything non-secret lives in ~/.silkweave-meet/config.json:

{
  "users": ["alice@company.com", "bob@company.com"],
  "watcher": {
    "pubsubSubscriptions": ["projects/my-project/subscriptions/meet-transcripts-sub"],
    "transcriptDir": "/Users/alice/meet-transcripts",
    "onTranscriptCommand": "osascript -e 'display notification ...'",
    "autoStart": true
  },
  "cursors": {
    "alice@company.com": "2026-04-22T14:30:00Z"
  },
  "openai": {
    "apiKey": "sk-...",
    "embeddingModel": "text-embedding-3-small"
  }
}
  • users — Workspace user emails the tool is allowed to impersonate. Populated by setupSubscribeAll --users=a,b,c or edited manually.

  • watcher — persisted watcher config, written by transcriptWatchStart.

  • cursors — per-user polling cursors for eventPullTranscripts.

  • openai — optional. Enables vector/hybrid search over the persisted transcript archive. OPENAI_API_KEY and OPENAI_EMBEDDING_MODEL env vars are used as fallbacks.

Archive files & database

  • Ingested transcripts are written to <transcriptDir>/<organizerEmail>/YYYY-MM-DD_{meetCodeOrConferenceId}_{transcriptId}.md. Because each saved file is fetched via the organizer's own subscription, the top-level folder makes it easy to browse "meetings I ran".

  • A companion Orama index at ~/.silkweave-meet/transcripts.msp holds the searchable metadata (subject, description, attendees, date range, file path, embedding). It is the source of truth for transcriptList / transcriptGet / transcriptSearch.

Tools Reference

Every action that reads Google data takes a required userEmail — the Workspace user the service account impersonates for that call. Permissions match exactly what that user can see.

The MCP surface is intentionally narrow: only the read-only transcript tools plus transcriptBackfill and mcpStatus are exposed over MCP. Everything that manages configuration, subscriptions, or the background watcher is CLI-only (via meet-cli).

MCP-exposed tools:

  • meetTranscriptList / meetTranscriptGet — live lookup against the Google Meet API.

  • transcriptList / transcriptGet / transcriptSearch — read from the persisted local archive (no Google round-trip; works offline for previously-ingested transcripts).

  • transcriptBackfill — catch-up ingest across all configured users (default: last 30 days). Dedupes by transcriptId.

  • mcpStatus — health & status.

Upcoming meetings — Calendar* (CLI-only)

Tool

Purpose

calendarEventList

List Calendar events on the user's primary calendar (optionally filtered to Meet-enabled ones).

calendarEventGet

Get one event with Meet join info.

Past meetings & transcripts — Meet* (live Google API)

meetTranscriptList and meetTranscriptGet are available on both MCP and CLI. The rest are CLI-only.

Tool

Surface

Purpose

meetTranscriptList

MCP + CLI

List transcripts for a conference.

meetTranscriptGet

MCP + CLI

Fetch a full transcript; returns Markdown by default, format=json for raw entries.

meetConferenceList

CLI

List past conferenceRecords the user participated in (optional EBNF filter).

meetConferenceGet

CLI

Fetch a single conference record.

meetParticipantList

CLI

List participants of a conference.

meetRecordingList

CLI

List recording artifacts (Drive links).

meetSpaceGet

CLI

Resolve a space by spaces/{id} or meeting code.

Persisted transcript archive — Transcript* (local Orama DB)

Reads from ~/.silkweave-meet/transcripts.msp; populated by the background watcher (live) and transcriptBackfill (historical). Every record is enriched with its Calendar event (subject, description, attendees) — matching is deterministic via conferenceData.conferenceId → Meet space meetingCode, never time-guessing.

Tool

Surface

Purpose

transcriptList

MCP + CLI

List persisted transcripts, newest first, filterable by organizer, attendee, and date range.

transcriptGet

MCP + CLI

Fetch a single persisted transcript by id (or full resource name); returns metadata plus the rendered markdown body read from disk.

transcriptSearch

MCP + CLI

Keyword search over subject / description / full transcript body. With mode=vector or mode=hybrid and an OpenAI key configured, runs semantic or hybrid search.

transcriptBackfill

MCP + CLI

Iterate every configured user, list conferences since startTime (default: 30 days ago), ingest any transcripts not already in the database. Dedupes by transcriptId.

Notifications — Event* (CLI-only)

Tool

Purpose

eventPullTranscripts

Polling. Returns transcripts generated since the user's stored cursor, advances it. No Pub/Sub needed.

eventSubscriptionCreate

Create a Workspace Events subscription for a specific Meet space (requires meet-api-event-push@system.gserviceaccount.com to have Pub/Sub Publisher on the topic).

eventSubscriptionCreateForUser

Create a user-level Workspace Events subscription for the impersonated user. Covers meetings they own or attend.

eventSubscriptionList

List existing subscriptions owned by the impersonated user.

eventSubscriptionDelete

Delete a subscription.

Background watcher — TranscriptWatch* (CLI-only)

Singleton consumer that streams events from a Pub/Sub subscription (Pub/Sub auth from the same service-account key), and for each message impersonates (via DWD) the user whose Workspace Events subscription produced it — identified by the message's ce-source attribute — to fetch the transcript via the Meet API. One watcher covers every user listed in the config.

Tool

Purpose

transcriptWatchStart

Start the watcher (and persist config). Pass pubsubSubscriptions, transcriptDir, onTranscriptCommand, autoStart.

transcriptWatchStop

Stop the watcher. Pass disableAutoStart=true to also disable boot-time auto-start.

transcriptWatchStatus

Current status: running flag, per-subscription counters, known subscription owners, recent saved files.

When autoStart: true is persisted, the MCP server resumes the watcher on every boot. Each saved file is written to <transcriptDir>/<organizerEmail>/YYYY-MM-DD_{meetCodeOrConferenceId}_{transcriptId}.md and simultaneously inserted into the local search index.

Multi-user setup — Setup* (CLI-only)

Tool

Purpose

setupStatus

Report, for each user in the config, whether DWD impersonation succeeds and which Workspace Events subscriptions they own. With --pubsub-topic, flag which users are subscribed to it.

setupSubscribeAll

Create a user-level subscription for every user in the config. Optional --users=a,b,c also appends those emails to the config. Idempotent — re-running skips users already subscribed.

These are registered only in src/cli.ts (not the MCP action list), because they orchestrate the whole config rather than a single user.

Operational — Mcp*

Tool

Surface

Purpose

mcpStatus

MCP + CLI

Lightweight status: version/uptime/pid, service-account key presence, watcher running state, configured users with per-user subscription coverage, and the 10 most recent saved transcripts.

Multi-user setup walkthrough

# 1. Create the shared Pub/Sub topic and let Meet publish to it.
gcloud pubsub topics create meet-transcripts
gcloud pubsub topics add-iam-policy-binding meet-transcripts \
  --member=serviceAccount:meet-api-event-push@system.gserviceaccount.com \
  --role=roles/pubsub.publisher

# 2. Register the users and create one user-level subscription per person
#    (idempotent). The --users flag appends to ~/.silkweave-meet/config.json.
npx -p @silkweave/meet meet-cli setup-subscribe-all \
  --pubsub-topic=projects/<project>/topics/meet-transcripts \
  --users=alice@company.com,bob@company.com,carol@company.com,dave@company.com

# 3. Confirm every user is subscribed.
npx -p @silkweave/meet meet-cli setup-status \
  --pubsub-topic=projects/<project>/topics/meet-transcripts

# 4. Create the pull subscription the watcher will stream from, and grant the
#    service account Subscriber on it.
gcloud pubsub subscriptions create meet-transcripts-sub --topic=meet-transcripts
SA_EMAIL=$(jq -r .client_email ~/.silkweave-meet/service-account.json)
gcloud pubsub subscriptions add-iam-policy-binding meet-transcripts-sub \
  --member="serviceAccount:${SA_EMAIL}" --role=roles/pubsub.subscriber

# 5. Start the watcher. Routes each incoming event to the right user's
#    impersonation context based on the message's ce-source.
npx -p @silkweave/meet meet-cli transcript-watch-start \
  --pubsub-subscriptions=projects/<project>/subscriptions/meet-transcripts-sub \
  --transcript-dir=~/meet-transcripts \
  --auto-start=true

User-level subscriptions expire (Google's max TTL applies). Re-run setup-subscribe-all on a schedule (cron / launchd) to refresh any that have expired; existing valid ones are skipped.

User-level subscriptions capture transcript.v2.fileGenerated events for meetings the user owns or is merely invited to — that is the only non-owner event the Workspace Events API delivers, and it's exactly the one we want. Expect duplicates when multiple team members are in the same meeting; the watcher dedupes by transcriptId in memory per run.

Shell command env vars

The onTranscriptCommand runs via spawn(..., { shell: true }) with these environment variables exposed:

Var

Meaning

$TRANSCRIPT_PATH

Absolute path to the saved Markdown file

$TRANSCRIPT_RAW

Full rendered Markdown as a string (subject to shell env size limits)

$TRANSCRIPT_NAME

conferenceRecords/{c}/transcripts/{t} resource name

$CONFERENCE_RECORD

conferenceRecords/{c} resource name

$MEET_CODE

Meeting code (e.g. abc-mnop-xyz), if resolvable

$START_TIME / $END_TIME

Transcript start/end (RFC3339)

$ENTRY_COUNT

Number of transcript entries

$DATE

YYYY-MM-DD prefix used in the filename

$SUBJECT

Calendar event subject if matched, else empty

$CALENDAR_EVENT_ID

Calendar event id if matched, else empty

For very long transcripts, prefer reading from $TRANSCRIPT_PATH — environment size is bounded (~256KB on macOS).

Library usage

pnpm add @silkweave/meet
import { MeetClient } from '@silkweave/meet'
import { google } from 'googleapis'

const conferences = await MeetClient.withAuth('alice@company.com', async (auth) => {
  const { data } = await google.meet({ version: 'v2', auth }).conferenceRecords.list()
  return data.conferenceRecords ?? []
})

MeetClient.withAuth creates a DWD-impersonating JWT for that user using the key at ~/.silkweave-meet/service-account.json.

Development

pnpm install
pnpm tsx src/mcp.ts     # MCP server in dev
pnpm tsx src/cli.ts     # CLI in dev
pnpm build              # build to build/
pnpm lint               # eslint
pnpm typecheck          # tsc --noEmit
pnpm clean              # rm -rf build/

When iterating through the MCP in Claude Code, the server is a child process — after code changes, restart the MCP connection (or kill the process) so changes are picked up. Claude Code caches the tool list at connection time, so any change to the MCP action set also requires a full reconnect.

License

MIT

Available Tools

8 tools
McpStatusMcp StatusA

Lightweight MCP server status: health, the configured Workspace users (flagged with whether the transcript watcher has mapped a subscription to them), and the 10 most recent saved transcripts.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses the content returned (health, users, recent transcripts) and hints at lightweight behavior, but it does not explicitly state that the operation is read-only or side-effect free. This is a minor gap for a status tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-structured sentence that front-loads the tool's purpose ('MCP server status') and then lists the key components. It contains no redundant information and is appropriately sized for the tool's simplicity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has no parameters and no output schema, the description covers the main return values: health, workspace users with flags, and recent transcripts. It is sufficiently complete for a read-only status tool, though it could add a brief note about intended use cases like checking system health.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema is empty with zero parameters, and the baseline for zero parameters is 4. The description does not need to explain parameters, and it adds context about the output instead, which is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as providing MCP server status, listing specific content: health, configured Workspace users with a flag about transcript watcher subscription mapping, and the 10 most recent saved transcripts. It is distinct from sibling tools, which all focus on transcript operations, though it lacks an explicit verb like 'get' or 'retrieve'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies this is the tool to use for checking server status, but it does not explicitly state when to use it versus alternatives or mention any exclusions. Since no sibling tools overlap with status checking, the contextual signal is sufficient, but explicit guidance is missing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

MeetTranscriptGetMeet Transcript GetA

Retrieve a full Google Meet transcript (all entries aggregated) rendered as Markdown or JSON. Defaults to the first transcript of the conference if no transcriptId is given. Impersonates userEmail via DWD.

ParametersJSON Schema
NameRequiredDescriptionDefault
formatNomarkdown
userEmailYesWorkspace user email to impersonate via DWD
transcriptIdNoBare transcript ID or full `conferenceRecords/{c}/transcripts/{t}` name. Defaults to the first available.
conferenceRecordIdYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description discloses important behaviors: impersonation via DWD for userEmail, default selection of the first transcript when transcriptId is omitted, and aggregation of all entries. It does not mention error conditions or whether it is read-only, but the key behaviors are surfaced.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, both information-dense. The first sentence states the primary action and output formats; the second covers default behavior and authentication context. No redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is adequate for a straightforward read tool but falls short on return value structure (no output schema) and potential edge cases like multiple transcripts or errors. It does not describe what 'full transcript' includes (e.g., speaker labels, timestamps), leaving the user to infer from the output format.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%, with conferenceRecordId missing a description. The description adds meaning to userEmail (impersonation) and transcriptId (default selection rule), but does not clarify conferenceRecordId beyond the schema name. The format parameter is already self-explanatory via its enum values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description unambiguously names the action ('Retrieve'), the resource ('a full Google Meet transcript'), and the scope ('all entries aggregated'). It also states the output formats (Markdown or JSON), which distinguishes it from sibling tools like MeetTranscriptList or TranscriptSearch.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear usage context: use this tool to get the complete transcript, defaulting to the first transcript if none specified. However, it does not explicitly compare against siblings (e.g., 'use MeetTranscriptList to list available transcripts'), so it lacks explicit when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

MeetTranscriptListMeet Transcript ListB

List transcripts for a Google Meet conference. Each transcript has a state indicating whether its file has been generated. Impersonates userEmail via DWD.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageSizeNo
pageTokenNo
userEmailYesWorkspace user email to impersonate via DWD
conferenceRecordIdYes

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does add useful context: each transcript has a state indicating whether its file has been generated, and it impersonates userEmail via DWD. However, it does not mention read-only nature, pagination behavior, or error scenarios.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences front-load the core purpose and pack in relevant behavioral and auth context with no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema or annotations, the description covers the core listing operation, the state field, and impersonation, but it omits pagination semantics and the expected return shape. This is adequate for a simple list tool but leaves gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 25% (only userEmail described). The description adds context that conferenceRecordId identifies the conference and reinforces DWD for userEmail, but it does not explain pageSize, pageToken, or the format of conferenceRecordId.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists transcripts for a Google Meet conference, providing a specific verb and resource. It mentions the state attribute but does not explicitly distinguish itself from sibling tools like TranscriptList or TranscriptSearch.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies use when transcripts for a Meet conference are needed and mentions DWD impersonation, but it does not explicitly state when to use this tool over alternatives or provide exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

TranscriptBackfillTranscript BackfillA

Backfill persisted Meet transcripts for every configured user (or the subset in userEmails). Lists past conferences since startTime (default: 30 days ago), fetches each transcript in parallel, enriches with Calendar, writes a YAML-frontmatter Markdown file to <transcriptDir>/<organizerEmail>/, and indexes into the local search database. Dedupes by transcriptId — already-ingested transcripts are skipped.

ParametersJSON Schema
NameRequiredDescriptionDefault
startTimeNoRFC3339 lower bound on conference start time. Defaults to now - 30 days.
userEmailsNoRestrict backfill to this subset of configured users. Defaults to all config.users.
concurrencyNoParallel transcript fetches (Meet + Calendar + OpenAI).
generateEmbeddingNoIf OpenAI is configured, compute and store embeddings for newly-ingested transcripts.
maxConferencesPerUserNo

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully carries the burden of behavioral disclosure. It explicitly mentions writing files to a specific directory, indexing into the search database, parallel fetching, and deduplication by transcriptId with skipping of already-ingested transcripts. This is rich, non-obvious behavioral detail.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences, each earning its place: the first gives scope, the second details the pipeline, and the third explains deduplication. It is information-dense without being verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex tool with no output schema, the description covers the main side effects (file writes, indexing, dedupe) and key parameters. However, it omits the behavior of generateEmbedding (OpenAI embedding generation) and the maxConferencesPerUser cap, which are part of the tool's behavior. Still, the core functionality is well-described.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 80% (4 of 5 parameters have descriptions). The description adds minimal meaning beyond the schema: it reiterates startTime and userEmails but does not clarify behavior for concurrency or generateEmbedding, and maxConferencesPerUser remains undocumented in both description and schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Backfill persisted Meet transcripts') and a clear scope ('for every configured user or the subset in userEmails'). It also outlines the process steps (list conferences, fetch, enrich, write, index), distinguishing it from sibling tools that likely focus on individual retrieval or re-embedding.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly implies when to use this tool (for bulk backfilling past transcripts) and describes the process in a way that contrasts with more targeted operations. However, it does not explicitly name alternatives or state when not to use it, so it falls short of the highest bar.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

TranscriptGetTranscript GetA

Fetch a previously-persisted Meet transcript by its transcriptId (not live from Google). Returns the enriched metadata and the rendered markdown body read from disk.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeBodyNoInclude the markdown body read from the persisted file.
transcriptIdYesBare transcriptId. Accepts the full `conferenceRecords/{c}/transcripts/{t}` name; only the last segment is used.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well by disclosing the read source (disk, persisted file), clarifying it is not a live Google call, and summarizing the return contents (enriched metadata and markdown body). It does not cover error cases or the effect of includeBody=false, but core behavior is transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two coherent sentences, front-loaded with the action and resource. Every phrase earns its place; no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple 2-parameter read tool without an output schema, the description covers the essential scenario: what is fetched, from where, and what is returned. It is sufficient for basic usage, though it could be slightly stronger by explicitly contrasting with the sibling MeetTranscriptGet or TranscriptList tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and includes a thorough transcriptId explanation (accepts full name, uses last segment) plus includeBody default. The description adds no additional parameter meaning beyond what the schema already provides, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description starts with a specific action ('Fetch') and resource ('previously-persisted Meet transcript'), and names the key identifier (transcriptId). The clarification 'not live from Google' distinguishes it from possible live transcript siblings, making purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly implies when to use this tool: when you have a transcriptId and want the persisted copy rather than a live one. It does not explicitly name alternatives or state when not to use it, but the 'not live from Google' and 'read from disk' phrasing gives practical usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

TranscriptListTranscript ListA

List previously-persisted Meet transcripts (not live from Google), ordered by most recent first. Optional filters for organizer, attendee, and date range.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
attendeeNoEmail that must appear in the attendee list.
startTimeToNoRFC3339 upper bound on conference start time.
startTimeFromNoRFC3339 lower bound on conference start time.
organizerEmailNo

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry the transparency burden. It usefully discloses the data source scope, ordering, and filter options, which are meaningful behavioral traits. It stops short of mentioning pagination, default limits, or returned shape, so not fully transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence with clear front-loading: action, object, scope, ordering, then filters. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given there is no output schema and no annotations, the description covers the core purpose, sorting, and filter capabilities. However, it omits pagination behavior and any mention of the limit/offset parameters, leaving a gap for a 6-parameter tool with no required fields.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds meaning for organizer, attendee, and date range filters, helping map to organizerEmail, attendee, and startTimeFrom/startTimeTo beyond the sparse schema. It does not mention limit or offset, and those parameters lack schema descriptions, so coverage remains incomplete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('List') and the resource ('previously-persisted Meet transcripts'), and adds a useful scope qualifier ('not live from Google') plus ordering. It is specific, though it does not explicitly call out how it differs from the sibling MeetTranscriptList tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use it: for persisted transcripts, not live ones, with optional filters. It does not name alternative tools for live transcripts, retrieval, or search, so the guidance is more implicit than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

TranscriptReembedTranscript ReembedA

Compute or recompute OpenAI embeddings for persisted transcripts. By default operates on records that were ingested without an embedding (typical after adding the OpenAI key to an already-populated archive). Pass force=true to re-embed every record. Requires OPENAI_API_KEY (or openai.apiKey in ~/.silkweave-meet/config.json).

ParametersJSON Schema
NameRequiredDescriptionDefault
forceNoRe-embed every record, even those already carrying an embedding.
limitNoMaximum records to (re-)embed this run. Omit to process everything eligible.
concurrencyNoParallel OpenAI embedding requests.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

In the absence of annotations, the description discloses important behavioral traits: the default operation (only missing embeddings), the force=true behavior (re-embed every record), and the API key requirement. It does not mention rate limits, output, or error handling, but it covers the key safe-operation aspects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences long with the core action front-loaded. Every sentence provides necessary information: purpose, default scope, force flag, and environmental prerequisite. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (3 parameters, no output schema), the description adequately covers purpose, default behavior, force mode, and prerequisites. It could mention the return value or side effects, but the parameter schema covers the configurable aspects, making this a sufficient and complete description for an AI agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% for all 3 parameters, and the description adds context beyond the schema by explaining the default behavior associated with force=false and the typical use case. The limit and concurrency parameters are already well-described in the schema, so the description doesn't need to duplicate them.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function with a specific verb+resource ('Compute or recompute OpenAI embeddings for persisted transcripts') and distinguishes it from sibling retrieval/search tools by explaining the default scope (records ingested without an embedding) and the force option.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides clear context for when to use the tool (typical after adding the OpenAI key to an already-populated archive) and explains the force parameter's behavior. However, it does not explicitly name alternative tools or state when not to use it, so it lacks explicit exclusionary guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

TranscriptSearchTranscript SearchA

Search previously-persisted Meet transcripts (not live from Google). Combines full-text over subject/description/transcript body with optional vector/hybrid search when OpenAI embeddings are configured. Results are scoped to transcripts already ingested by the watcher or backfill.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoSearch mode. `vector` and `hybrid` require OPENAI_API_KEY (or openai config in ~/.silkweave-meet/config.json).fulltext
limitNo
queryNoFree-text search query. Omit to list without keyword filter (still honours the other filters).
offsetNo
attendeeNoOnly match transcripts that include this attendee email.
similarityNoMinimum cosine similarity for vector/hybrid mode (default 0.8).
startTimeToNoRFC3339 upper bound on the conference start time.
startTimeFromNoRFC3339 lower bound on the conference start time.
organizerEmailNoOnly match transcripts whose organiser is this user.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. It discloses that the search operates over subject/description/transcript body, supports optional vector/hybrid modes, and is scoped to ingested transcripts. This adds meaningful behavioral context beyond the schema, though it doesn't explicitly state read-only or return format.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the core purpose and scope. No redundant wording; every clause adds information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has 9 parameters and no output schema. The description explains the search scope and modes but does not describe the return value or result shape. While limit/offset in the schema imply pagination, the description leaves the output unspecified, which is a notable gap for a search tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 78%, so baseline is 3. The description adds meaning by specifying the full-text fields (subject/description/transcript body) and the OpenAI embedding prerequisite for vector/hybrid, which supplements the schema's mode descriptions. This elevates the score above the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states 'Search previously-persisted Meet transcripts' with a specific verb and resource. It distinguishes from siblings by noting 'not live from Google' and scoping to 'ingested by the watcher or backfill', which clearly separates it from MeetTranscriptGet/List and TranscriptList.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use: searching already-persisted transcripts, not live ones. It also notes vector/hybrid only when OpenAI embeddings are configured. While it doesn't name sibling tools explicitly, the 'not live from Google' exclusion and persistence scope imply alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

TDQS

A3.9/5.0
Disambiguation4/5

The live vs persisted transcript distinction is clear between MeetTranscriptGet/List and TranscriptGet/List, though the names are similar enough to cause slight hesitation. Backfill, Reembed, Search, and Status are distinct services.

Naming Consistency4/5

All names use camelCase and follow an object-action pattern, but the prefix varies (McpStatus vs MeetTranscript* vs Transcript*). The 'Meet' prefix inconsistently indicates live Google data, while plain 'Transcript' indicates persisted data.

Tool Count5/5

Eight tools is a well-scoped count for managing Meet transcript ingestion, retrieval, search, and embedding. Each tool addresses a distinct stage in the transcript lifecycle without bloat.

Completeness4/5

The toolset covers the core lifecycle: list, get, backfill, persist, search, and embed. Missing delete/update operations for persisted transcripts are minor gaps, as they may not be core to the server's purpose.

Maintenance

ActivityInactive
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Open-source meeting bot API with MCP server. Search, retrieve, and analyze meeting transcripts from Google Meet, Zoom, and Microsoft Teams directly from your AI tools.
    0
    2,748
    Apache 2.0

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/silkweave/meet'

If you have feedback or need assistance with the MCP directory API, please join our Discord server