Search / io.github.spokenmd/spoken
Spoken
R0· no sign-inPodcast transcripts as clean Markdown with real speaker names — via the Spoken API.
v0.4.3 · active · repository · website · descriptor JSON · versions
Search / io.github.spokenmd/spoken
R0· no sign-inPodcast transcripts as clean Markdown with real speaker names — via the Spoken API.
v0.4.3 · active · repository · website · descriptor JSON · versions
{
"mcpServers": {
"spoken": {
"type": "http",
"url": "https://spoken.md/mcp",
"headers": {
"Authorization": "Bearer ${SPOKEN_TOKEN}"
}
}
}
}claude mcp add --transport http spoken https://spoken.md/mcp --header "Authorization: Bearer ${SPOKEN_TOKEN}"[mcp_servers.spoken]
url = "https://spoken.md/mcp"
bearer_token_env_var = "SPOKEN_TOKEN"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"spoken": {
"type": "remote",
"url": "https://spoken.md/mcp",
"enabled": true,
"headers": {
"Authorization": "Bearer {env:SPOKEN_TOKEN}"
}
}
}
}{
"mcpServers": {
"spoken": {
"type": "http",
"url": "https://spoken.md/mcp",
"headers": {
"Authorization": "Bearer ${SPOKEN_TOKEN}"
}
}
},
"deeplink": "cursor://anysphere.cursor-deeplink/mcp/install?name=spoken&config=eyJ0eXBlIjoiaHR0cCIsInVybCI6Imh0dHBzOi8vc3Bva2VuLm1kL21jcCIsImhlYWRlcnMiOnsiQXV0aG9yaXphdGlvbiI6IkJlYXJlciAke1NQT0tFTl9UT0tFTn0ifX0%3D"
}{
"servers": {
"spoken": {
"type": "http",
"url": "https://spoken.md/mcp",
"headers": {
"Authorization": "Bearer ${SPOKEN_TOKEN}"
}
}
}
}{
"mcpServers": {
"spoken": {
"httpUrl": "https://spoken.md/mcp",
"headers": {
"Authorization": "Bearer ${SPOKEN_TOKEN}"
}
}
}
}extensions:
"spoken":
enabled: true
name: "spoken"
type: streamable_http
uri: "https://spoken.md/mcp"
headers:
"Authorization": "Bearer ${SPOKEN_TOKEN}"
timeout: 300
Placeholders to fill from your own secret store: ${SPOKEN_TOKEN}. The registry never accepts secret values.
protocol.modernsupports 2026-07-28 (server/discover)protocol.statelessanswers without a sessionprotocol.transportstreamable HTTPprotocol.list_ttltools/list declares ttlMs 0, so clients re-fetch it on every useauth.prm, auth.as_metadata, auth.cimdno remote uses OAuthauth.secret_in_urlno templated URLtools.descriptionsevery tool has a descriptiontools.description_lengthdescriptions are concisetools.schemasevery tool has an object input schematools.annotations8 of 8 tools declare readOnlyHint or destructiveHinttools.directory_hintsevery tool declares readOnlyHint, destructiveHint, idempotentHint and openWorldHinttools.token_costabout 1,238 tokens to load every tooltools.api_dumptools are not a one-to-one API dumpstability.changes8 tool changes in 30 daysstability.rug_pullno tool changed its meaning under the same namelist_new_episodeschangedinput schema, output schema, annotationsunfollow_podcastchangedoutput schema, annotationsfollow_podcastchangedoutput schema, annotationslist_followingchangedinput schema, output schema, annotationsget_balancechangedinput schema, output schema, annotationslist_episodeschangedoutput schema, annotationsget_transcriptchangedannotationssearch_podcastschangedoutput schema, annotationsFull history: list_changes · trend: quality JSON.
Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed. How it is computed.
+repository +namespace-matches-repo +website +reachable +uptime-100% +updated-13d-ago
Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed. How it is computed.
[email protected] npmthis version is not known to the dependency resolver
Dependency graphs from deps.dev; advisories from OSV.dev, including the GitHub Advisory Database and the PyPI Advisory Database; all CC BY 4.0. The graph is what a clean install of this version resolves today; nothing was installed or run. How it is checked.
| remote | auth | reachable | uptime 30d | p50 | protocol | last ok |
|---|---|---|---|---|---|---|
https://spoken.md/mcp streamable-http | none | yes | 100% | 808 ms | 2026-07-28 | 2026-10-19 |
| package | registry | version | runtime | secrets |
|---|---|---|---|---|
spoken-mcp | npm | 0.4.3 | – | SPOKEN_API_KEY |
follow_podcast | 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. |
get_balanceread-only | Check the current Spoken credit balance, account email, and recent usage for the configured API key. Does not consume credits. |
get_transcriptread-only | 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_episodesread-only | 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. |
list_followingread-only | 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. |
list_new_episodesread-only | 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. |
search_podcastsread-only | 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. |
unfollow_podcast | 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. |
Schemas: list_tools.
{
"name": "io.github.spokenmd/spoken",
"title": "Spoken",
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
"remotes": [
{
"url": "https://spoken.md/mcp",
"type": "streamable-http",
"headers": [
{
"name": "Authorization",
"isSecret": true,
"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."
}
]
}
],
"version": "0.4.3",
"packages": [
{
"version": "0.4.3",
"transport": {
"type": "stdio"
},
"identifier": "spoken-mcp",
"registryType": "npm",
"environmentVariables": [
{
"name": "SPOKEN_API_KEY",
"isSecret": true,
"description": "API key from spoken.md (starts with pt_). Defaults to pt_demo (search works fully; transcripts limited to the demo episode)."
}
]
}
],
"repository": {
"url": "https://github.com/spokenmd/spoken",
"source": "github"
},
"websiteUrl": "https://spoken.md",
"description": "Podcast transcripts as clean Markdown with real speaker names — via the Spoken API."
}