protogrid

Search / io.github.spokenmd/spoken

Spoken

R0· no sign-in

Podcast transcripts as clean Markdown with real speaker names — via the Spoken API.

v0.4.3 · active · repository · website · descriptor JSON · versions

An agent can connect right now, no human step.Remote endpoint, no authentication, reachable on the last probe.
Quality90strong
Trust97of 100
Uptime, 30 days100%
Latency p50808 ms

Connect

8 clients · secrets stay placeholders
{
  "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.

Quality 90 / 100strong

protocol88 · weight 25
  • pass
    protocol.modernsupports 2026-07-28 (server/discover)
  • pass
    protocol.statelessanswers without a session
  • pass
    protocol.transportstreamable HTTP
  • warn
    protocol.list_ttltools/list declares ttlMs 0, so clients re-fetch it on every use
authorizationn/a · weight 15
  • n/a
    auth.prm, auth.as_metadata, auth.cimdno remote uses OAuth
  • n/a
    auth.secret_in_urlno templated URL
tool hygiene100 · weight 30
  • pass
    tools.descriptionsevery tool has a description
  • pass
    tools.description_lengthdescriptions are concise
  • pass
    tools.schemasevery tool has an object input schema
  • pass
    tools.annotations8 of 8 tools declare readOnlyHint or destructiveHint
  • pass
    tools.directory_hintsevery tool declares readOnlyHint, destructiveHint, idempotentHint and openWorldHint
  • pass
    tools.token_costabout 1,238 tokens to load every tool
  • pass
    tools.api_dumptools are not a one-to-one API dump
stability75 · weight 15
  • warn
    stability.changes8 tool changes in 30 days
  • pass
    stability.rug_pullno tool changed its meaning under the same name
dependenciesn/a · weight 15
  • n/a
    deps.known_vulns, deps.mcp_sdk_version, deps.resolvabledeps.dev does not know [email protected]

8 tools, about 1,238 tokens to load them all · tool set 70d3487c56d0 · tools last changed 2026-10-06 · checked 2026-10-19 10:20 UTC

Tool changes

  • list_new_episodeschangedinput schema, output schema, annotations
  • unfollow_podcastchangedoutput schema, annotations
  • follow_podcastchangedoutput schema, annotations
  • list_followingchangedinput schema, output schema, annotations
  • get_balancechangedinput schema, output schema, annotations
  • list_episodeschangedoutput schema, annotations
  • get_transcriptchangedannotations
  • search_podcastschangedoutput schema, annotations

Full 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.

Trust 97 / 100

provenance90
liveness100
freshness100
hygiene100

+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.

Dependencies

[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.

Endpoints

remoteauthreachableuptime 30dp50protocollast ok
https://spoken.md/mcp streamable-httpnoneyes100%808 ms2026-07-282026-10-19
packageregistryversionruntimesecrets
spoken-mcpnpm0.4.3–SPOKEN_API_KEY

Tools (8)

follow_podcastDeclare 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-onlyCheck the current Spoken credit balance, account email, and recent usage for the configured API key. Does not consume credits.
get_transcriptread-onlyFetch 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-onlyList 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-onlyThe 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-onlyWhat 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-onlySearch 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_podcastMute 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.

Similar MCP servers

Official server.json
{
  "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."
}