Meet MCP Server
Provides OAuth2 authentication and user identity management for Google services, enabling secure access to Google APIs with automatic token refresh and user profile retrieval.
Enables listing and retrieving Google Calendar events, specifically filtering for Meet-enabled meetings to access upcoming conference information and join details.
Integrates with Google Cloud Pub/Sub for event-driven notifications, allowing creation and management of subscriptions that publish Google Meet events to user-owned topics for external consumption.
Provides comprehensive Google Meet API integration including listing past conference records, retrieving participant lists, accessing recordings and transcripts, and managing Meet spaces with support for transcript rendering in Markdown format.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Meet MCP Serverget transcripts from yesterday's team meeting"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
@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
Create or pick a project.
Enable the Google Calendar API, Google Meet API, Google Workspace Events API, and Cloud Pub/Sub API.
Create a service account; download its JSON key.
In your Google Workspace Admin Console:
Security → Access and data control → API controls → Domain-wide delegation → Add new.
Paste the service account's Client ID (the numeric one in the JSON key, field
client_id).Grant these OAuth scopes:
https://www.googleapis.com/auth/userinfo.emailhttps://www.googleapis.com/auth/calendarhttps://www.googleapis.com/auth/drive.readonlyhttps://www.googleapis.com/auth/meetings.space.readonlyhttps://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.jsonThat'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.comConfiguration 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 bysetupSubscribeAll --users=a,b,cor edited manually.watcher— persisted watcher config, written bytranscriptWatchStart.cursors— per-user polling cursors foreventPullTranscripts.openai— optional. Enables vector/hybrid search over the persisted transcript archive.OPENAI_API_KEYandOPENAI_EMBEDDING_MODELenv 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.mspholds the searchable metadata (subject, description, attendees, date range, file path, embedding). It is the source of truth fortranscriptList/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 bytranscriptId.mcpStatus— health & status.
Upcoming meetings — Calendar* (CLI-only)
Tool | Purpose |
| List Calendar events on the user's primary calendar (optionally filtered to Meet-enabled ones). |
| 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 |
| MCP + CLI | List transcripts for a conference. |
| MCP + CLI | Fetch a full transcript; returns Markdown by default, |
| CLI | List past |
| CLI | Fetch a single conference record. |
| CLI | List participants of a conference. |
| CLI | List recording artifacts (Drive links). |
| CLI | Resolve a space by |
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 |
| MCP + CLI | List persisted transcripts, newest first, filterable by organizer, attendee, and date range. |
| MCP + CLI | Fetch a single persisted transcript by id (or full resource name); returns metadata plus the rendered markdown body read from disk. |
| MCP + CLI | Keyword search over subject / description / full transcript body. With |
| MCP + CLI | Iterate every configured user, list conferences since |
Notifications — Event* (CLI-only)
Tool | Purpose |
| Polling. Returns transcripts generated since the user's stored cursor, advances it. No Pub/Sub needed. |
| Create a Workspace Events subscription for a specific Meet space (requires |
| Create a user-level Workspace Events subscription for the impersonated user. Covers meetings they own or attend. |
| List existing subscriptions owned by the impersonated user. |
| 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 |
| Start the watcher (and persist config). Pass |
| Stop the watcher. Pass |
| 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 |
| Report, for each user in the config, whether DWD impersonation succeeds and which Workspace Events subscriptions they own. With |
| Create a user-level subscription for every user in the config. Optional |
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 |
| 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=trueUser-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 |
| Absolute path to the saved Markdown file |
| Full rendered Markdown as a string (subject to shell env size limits) |
|
|
|
|
| Meeting code (e.g. |
| Transcript start/end (RFC3339) |
| Number of transcript entries |
|
|
| Calendar event subject if matched, else empty |
| 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/meetimport { 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 toolsMcpStatusMcp 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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | markdown | |
| userEmail | Yes | Workspace user email to impersonate via DWD | |
| transcriptId | No | Bare transcript ID or full `conferenceRecords/{c}/transcripts/{t}` name. Defaults to the first available. | |
| conferenceRecordId | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| pageSize | No | ||
| pageToken | No | ||
| userEmail | Yes | Workspace user email to impersonate via DWD | |
| conferenceRecordId | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| startTime | No | RFC3339 lower bound on conference start time. Defaults to now - 30 days. | |
| userEmails | No | Restrict backfill to this subset of configured users. Defaults to all config.users. | |
| concurrency | No | Parallel transcript fetches (Meet + Calendar + OpenAI). | |
| generateEmbedding | No | If OpenAI is configured, compute and store embeddings for newly-ingested transcripts. | |
| maxConferencesPerUser | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| includeBody | No | Include the markdown body read from the persisted file. | |
| transcriptId | Yes | Bare transcriptId. Accepts the full `conferenceRecords/{c}/transcripts/{t}` name; only the last segment is used. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No | ||
| attendee | No | Email that must appear in the attendee list. | |
| startTimeTo | No | RFC3339 upper bound on conference start time. | |
| startTimeFrom | No | RFC3339 lower bound on conference start time. | |
| organizerEmail | No |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Re-embed every record, even those already carrying an embedding. | |
| limit | No | Maximum records to (re-)embed this run. Omit to process everything eligible. | |
| concurrency | No | Parallel OpenAI embedding requests. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Search mode. `vector` and `hybrid` require OPENAI_API_KEY (or openai config in ~/.silkweave-meet/config.json). | fulltext |
| limit | No | ||
| query | No | Free-text search query. Omit to list without keyword filter (still honours the other filters). | |
| offset | No | ||
| attendee | No | Only match transcripts that include this attendee email. | |
| similarity | No | Minimum cosine similarity for vector/hybrid mode (default 0.8). | |
| startTimeTo | No | RFC3339 upper bound on the conference start time. | |
| startTimeFrom | No | RFC3339 lower bound on the conference start time. | |
| organizerEmail | No | Only match transcripts whose organiser is this user. |
TDQS
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.
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.
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.
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.
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.
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
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.
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.
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.
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
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
Search meetings, export summaries and transcripts, and manage recordings from any AI tool.
Search and edit Talkenda meeting transcripts, notes, decisions and action items through OAuth.
Send AI bots to attend meetings on your behalf. Get recordings, transcripts, and summaries.
Hosted Google Calendar MCP server for AI agents. No self-hosting or Google Cloud setup.
Related MCP Servers
- FlicenseBqualityDmaintenanceEnables comprehensive Google Meet and Calendar management through Google Calendar API v3 and Google Meet API v2, supporting calendar event creation with Meet links, space management, transcription, recording, attendance tracking, and meeting moderation controls.242
- AlicenseAqualityDmaintenanceEnables access to Fireflies.ai meeting transcripts with capabilities to retrieve, search, filter, and generate AI-powered summaries of meeting content through the Fireflies API.41721MIT
- AlicenseNot gradedqualityBmaintenanceOpen-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.02,748Apache 2.0
- AlicenseNot gradedqualityFmaintenanceProvides read-only access to Google Drive meeting transcripts and Google Calendar events, enabling AI assistants to search, analyze, and retrieve meeting insights.3653MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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