MCP server for Spoken — fetch podcast transcripts as clean Markdown with real speaker names. Built for AI agents.
Spoken MCP demonstrates solid fundamentals: all 4 tools have clear verb-noun names (search_podcasts, get_transcript, list_episodes, get_balance), descriptions of 150-250 chars (within baseline 194 avg), and explicit input schemas with Zod validation. Error handling is notably strong, describeError() provides context-aware recovery guidance (e.g., 'No SPOKEN_API_KEY is set, so this server is using the free pt_demo key'). However, output schemas are undocumented in the tool registration, responses are returned as TextResult with unstructured text content, not structured objects. Parameter descriptions are present but minimal (e.g., 'Episode id returned by search_podcasts' lacks format/constraint details). No tool annotations (readOnlyHint, idempotentHint) despite all tools being read-only. Missing pagination guidance for list_episodes despite potential for large result sets.
Check the current Spoken credit balance, account email, and recent usage for the configured API key. Does not consume credits.
Fetch a podcast episode's transcript as clean Markdown with real speaker names and timestamps. Pass an episode id from search_podcasts. Costs 1 credit on the first fetch of an episode; repeat fetches are free and errors are never charged.
List a podcast's entire back-catalog (every episode, newest first). Pass a podcast_id from a search_podcasts result. Returns each episode's id, title, and date — fetch any with get_transcript. Use this to transcribe a whole show. Does not consume credits itself; transcribing the returned episodes costs 1 credit each (repeat fetches are free), so make sure the key has enough credits before looping.
Search published podcast episodes by text query, or paste an episode URL (Spotify, YouTube, etc.). Returns matching episodes with their id, title, podcast, podcast_id, and date. Use the id with get_transcript, or the podcast_id with list_episodes to get the show's whole back-catalog. Does not consume credits.
Output schemas undocumented. Tools return TextResult with unstructured text content instead of typed, structured objects. LLMs cannot plan downstream operations or extract specific fields reliably.
No tool annotations. All 4 tools are read-only and idempotent, but lack readOnlyHint and idempotentHint annotations. Agents cannot infer safety properties without explicit hints.
list_episodes lacks pagination guidance. Tool can return unbounded episode lists (e.g., 500+ episodes for long-running shows), risking context window exhaustion. No limit, offset, or cursor parameters documented.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 65 | 2026-07-28+ | v2 |
Parameter descriptions are minimal. 'Episode id returned by search_podcasts' lacks format constraints, length bounds, or character restrictions. LLMs cannot validate inputs before calling.
Error responses include credit balance in footer (X-Credits-Remaining header). While helpful, this leaks internal API details into agent context. Consider abstracting to 'credits_remaining' field in structured response.