{"name":"io.github.spokenmd/spoken","slug":"spokenmd-spoken","title":"Spoken","description":"Podcast transcripts as clean Markdown with real speaker names — via the Spoken API.","url":"https://mcp.market/server/spokenmd-spoken","rating":null,"grade":"A","score":90,"certified":false,"status":"active","category":"media","tags":["media"],"presence":{"score":41,"stars":5,"forks":0,"downloads_week":138,"last_push_at":"2026-10-06T13:38:45.000Z","license":"MIT"},"uptime":{"percent":100,"checks":28,"ok":28,"last_checked_at":"2026-11-15T09:05:53.651Z","last_ok_at":"2026-11-15T09:05:53.651Z","latency_ms":259},"claimed":false,"transport":"mixed","callable_via_gateway":true,"default_price_micros":0,"repository":"https://github.com/spokenmd/spoken","website":"https://spoken.md","version":"0.4.3","remotes":[{"type":"streamable-http","url":"https://spoken.md/mcp","headers":[{"description":"Bearer followed by an API key from spoken.md (Bearer pt_...). Optional: without it only the free tools work, and a client that supports OAuth is asked to sign in.","isSecret":true,"name":"Authorization"}]}],"packages":[{"registryType":"npm","identifier":"spoken-mcp","version":"0.4.3","transport":{"type":"stdio"},"environmentVariables":[{"description":"API key from spoken.md (starts with pt_). Defaults to pt_demo (search works fully; transcripts limited to the demo episode).","isSecret":true,"name":"SPOKEN_API_KEY"}]}],"tools":[{"name":"follow_podcast","description":"Declare a follow for a show, or clear a mute. Pass a podcast_id from search_podcasts. A declared follow stays until unfollow_podcast, regardless of fetch activity, and does not use one of the five automatic slots. For a show never fetched, what counts as new starts from its newest episode now. Does not consume credits.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"podcast_id":{"type":"string","minLength":1,"description":"Show id (the podcast_id field from a search_podcasts result)."}},"required":["podcast_id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"get_balance","description":"Check the current Spoken credit balance, account email, and recent usage for the configured API key. Does not consume credits.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"get_transcript","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"episode_id":{"type":"string","minLength":1,"description":"Episode id returned by search_podcasts."}},"required":["episode_id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"list_episodes","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"podcast_id":{"type":"string","minLength":1,"description":"Show id (the podcast_id field from a search_podcasts result)."}},"required":["podcast_id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"list_following","description":"The shows this key is kept current on. Every charged fetch makes its show a follow: the five most-fetched shows from the last 180 days are followed automatically (source 'fetch'), and up to 25 more can be declared with follow_podcast (source 'explicit'). Muted shows are listed separately. Use list_new_episodes to see what is new on them. Does not consume credits; the demo key has nothing to follow with.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"list_new_episodes","description":"What is new on the shows this key follows: for each show, the episodes released in the last 90 days that are newer than the newest one already fetched from it (up to 10 per show), each with a transcript_url. Episodes with no transcript are left out. Fetch any with get_transcript (1 credit each on first fetch); a fetch raises that show's floor, so the next call lists only what came after. Refreshed hourly, so a show followed moments ago may be empty until its first poll. Does not consume credits.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"search_podcasts","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"type":"string","minLength":1,"description":"Free text (e.g. 'huberman sleep') or a pasted episode URL."}},"required":["query"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"unfollow_podcast","description":"Mute a show: it leaves the followed list and later fetches do not re-add it. follow_podcast reverses it. Pass a podcast_id from list_following. Does not consume credits.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"podcast_id":{"type":"string","minLength":1,"description":"Show id, from list_following or search_podcasts."}},"required":["podcast_id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}}],"scan":{"score":90,"grade":"A","scanned_at":"2026-11-03T23:30:55.153Z","report":{"scannerVersion":"0.1.10","scannedAt":"2026-11-03T23:30:55.100Z","components":{"code":{"score":25,"max":25,"notes":["5 source files scanned"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 1722ms"]},"poisoning":{"score":15,"max":15,"notes":["8 tool descriptions checked"]},"auth":{"score":8,"max":15,"notes":["API key sent as a header"]},"maintenance":{"score":15,"max":15,"notes":["last push 28 days ago"]},"identity":{"score":7,"max":10,"notes":["registry namespace matches repository owner"]}},"findings":[],"inputs":{"probes":[{"url":"https://spoken.md/mcp","reachable":true,"authRequired":false,"latencyMs":1722,"serverInfo":{"name":"spoken","version":"0.4.3"}}],"packages":[{"registryType":"npm","identifier":"spoken-mcp","version":"0.4.3","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":2,"publishedAt":"2026-10-06T13:41:37.673Z","repositoryUrl":"git+https://github.com/spokenmd/spoken.git","weeklyDownloads":138}],"repo":{"found":true,"owner":"spokenmd","repo":"spoken","archived":false,"pushedAt":"2026-10-06T13:38:45Z","stars":5,"forks":0,"openIssues":0,"ownerType":"Organization","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/290832240?v=4","ownerCreatedAt":"2026-06-04T19:12:06Z","license":"MIT"},"icon":{"url":"https://avatars.githubusercontent.com/u/290832240?v=4&s=128","source":"registry","width":128,"height":128},"presence":{"stars":5,"forks":0,"downloadsWeek":138,"license":"MIT","lastPushAt":"2026-10-06T13:38:45.000Z","score":41}}}},"grade_history":[{"kind":"restore","fromGrade":"B","toGrade":"A","reason":"score 90","createdAt":"2026-11-03T23:30:56.935Z"}],"reviews":[]}