MCP server for joining online meetings (Zoom, Google Meet, Microsoft Teams) and capturing transcripts and audio recordings
Three tools are explicitly registered with Zod schemas and descriptions. However, the server exhibits significant quality gaps typical of early-stage MCP implementations: descriptions are present but minimal (averaging ~80 chars, below the 194 baseline), parameter validation is weak, output schemas are undocumented, error handling is generic without recovery guidance, and the summarizeMeeting tool does not actually implement summarization, it merely formats a prompt for downstream processing. The joinMeeting tool conflates multiple responsibilities (join + capture transcript + capture audio) but is not split. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) are present. Error responses use a custom isError flag and _meta field but lack actionable guidance for LLM recovery. Overall, these tools would function but do not meet production quality standards for agent tooling.
Get information about a meeting
Join a Zoom, Google Meet, or Microsoft Teams meeting using the provided meeting ID and password and capture transcript and audio recording
Generate a concise summary of a meeting's contents from its transcript
joinMeeting conflates multiple responsibilities: joining a meeting, capturing transcript, and recording audio. Should be split into separate tools (join_meeting, start_recording, get_transcript) so the agent can compose them independently.
Output schemas are undocumented. Tools return structured responses (joinMeeting returns {content, sessionId}, getMeetingInfo returns {content, recordingLink, startTime, endTime, transcript}), but the schema is not declared in tool metadata. LLMs cannot plan downstream calls or extract fields with confidence.
summarizeMeeting does not implement summarization. It returns a formatted prompt instructing the LLM to summarize, rather than returning an actual summary. This is a tool disguised as a prompt injection vector.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-21 | D | 50 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 54 | - | v1 |
Tool descriptions are too brief and lack dependency hints or prerequisites. 'Get information about a meeting' (40 chars) does not explain when to call this tool, what a sessionId is, or how to obtain one. Compare baseline: 194 chars average for A+ tools.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). joinMeeting is destructive (initiates a bot deployment) but is not marked. LLMs cannot distinguish safe read-only tools from side-effecting tools without annotations.
Error responses lack recovery guidance. handleApiError returns a generic error message without suggesting the next step. Pattern: 'API call failed. Try checking your API key and endpoint.' should be 'Session not found. Call joinMeeting with a valid platform (zoom, googlemeet, teams) first.'
meetingPassword parameter is optional but the code sets it to empty string ('') when omitted. This may cause API errors if the backend requires explicit null vs empty string. The description should clarify: 'Optional. Omit if the meeting does not require a password.'
getMeetingInfo response parsing is fragile. If data.transcript is missing or malformed, the code does not validate structure (data.transcript.map assumes array of {speaker, text}). Should validate: 'if (!Array.isArray(data.transcript)) return error.'