Skip to content

Storyflo

by Alisammour · remote · no sign-in to list tools · v1.2.0 · published by GitHub user Alisammour

Curated audio news, daily briefings, the Declassified library + market-linked signals.

Changes · 12

37 tools: 12 change things and 25 only read.

Scanned Oct 21, 2026

4 checks matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.

claude mcp add --transport http storyflo https://api.storyflo.com/mcp/v1

Findings

Matches of fixed checks, with the text they matched.

3 warn1 info
  • The server marks "subscribe_declassified_topic" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "subscribe_declassified_topic" says "subscribe": a word for a change.

    What this check looks for
  • The server marks "get_my_private_feed" as not read-only (readOnlyHint: false), and its words say it reads.

    Matched text

    annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "get_my_private_feed" says "get": a word for reading.

    What this check looks for
  • The server marks "stream_briefing_render_events" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}; The description's first verb is "subscribe": a word for a change.

    What this check looks for
  • The description mentions "credential".

    Matched text

    description: "...Public — the listener_token arg is the credential, no OAuth required."

    What this check looks for

Tools

Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.

37 tools

Changes things 12Claude Code: ask
  • digestAggregate the top-N articles across selected verticals for the requested window.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Aggregate the top-N articles across selected verticals for the requested window. Heaviest action — counts more against the per-agent rate limit. Use this for 'read me today's tech news' style prompts.

    Annotations the server declares

    • title: Build a daily digest
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
  • fm_close_positionClose a call when the divergence resolves or goes stale.No findings

    Why it is in this group

    • The name "fm_close_position" says "close": a word for a change.
    Description, as the server wrote it
    Close a call when the divergence resolves or goes stale. The position stays on the book as closed rather than being deleted.

    Annotations the server declares

    • title: Close a position
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • fm_open_positionRecord a new call on your book: the event, which way you lean, and why.No findings

    Why it is in this group

    • The name "fm_open_position" says "open": a word for a change.
    Description, as the server wrote it
    Record a new call on your book: the event, which way you lean, and why. Idempotent — opening a call you already hold repositions it instead of creating a duplicate, so an agent may safely re-run its loop. Lean and rationale must be QUALITATIVE: a percentage, odds or implied probability is refused, because a number attached to a market view reads as investment advice.

    Annotations the server declares

    • title: Open a position
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • fm_repositionUpdate your view on an open call as the signal evolves.No findings

    Why it is in this group

    • The description's first verb is "update": a word for a change.
    Description, as the server wrote it
    Update your view on an open call as the signal evolves. Same qualitative rule as opening one.

    Annotations the server declares

    • title: Reposition a call
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • get_my_private_feedReturn the caller's PRIVATE per-user podcast feed URL — a personalized daily brief (the stories from the topics the listener follows) delivered to whatever podcast app they already…2 findings

    Why it is in this group

    • The name "get_my_private_feed" says "get": a word for reading.
    • The server marks it as not read-only (readOnlyHint: false).

    Findings

    • Info

      The description mentions "credential".

      Matched text

      description: "...Public — the listener_token arg is the credential, no OAuth required."

      What this check looks for
    • Warn

      The server marks "get_my_private_feed" as not read-only (readOnlyHint: false), and its words say it reads.

      Matched text

      annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "get_my_private_feed" says "get": a word for reading.

      What this check looks for
    Description, as the server wrote it
    Return the caller's PRIVATE per-user podcast feed URL — a personalized daily brief (the stories from the topics the listener follows) delivered to whatever podcast app they already use (Apple Podcasts, Overcast, Pocket Casts, Snipd). This is the Substack/Patreon private-feed model: the token lives in the URL path (unguessable, fetchable over HTTPS) — paste the returned feed_url into the app's "Add a show by URL". Pass the listener's existing listener_token (from the storyflo /listen page) as identity; the private feed token is minted on first call and stable thereafter. Keep the URL private — anyone with it can subscribe. Public — the listener_token arg is the credential, no OAuth required.

    Annotations the server declares

    • title: Get my private podcast feed URL
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • publisher_attach_audioConfirm a finished upload and mark that episode live.No findings

    Why it is in this group

    • The name "publisher_attach_audio" says "attach": a word for a change.
    Description, as the server wrote it
    Confirm a finished upload and mark that episode live. Verifies the file really landed in storage before changing anything, then points the episode at it so it appears in your RSS feed on the next build. Attaches ONE upload to ONE episode you own.

    Annotations the server declares

    • title: Attach uploaded audio
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • publisher_connect_folderConnect a Google Drive folder of recordings so storyflo can match them to episodes automatically — the alternative to uploading a back catalogue file by file.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Connect a Google Drive folder of recordings so storyflo can match them to episodes automatically — the alternative to uploading a back catalogue file by file. Call with NO folder argument first to get the setup instructions, including the address to share the folder with. Then call again with folder=<the Drive URL>. Recording the connection moves no audio; the scan happens afterwards.

    Annotations the server declares

    • title: Connect a recordings folder
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • publisher_statsPlays over a window (default 30 days, max 365) plus the episodes driving them.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Plays over a window (default 30 days, max 365) plus the episodes driving them. Answers 'how did last month go' and 'which episode is working'. Zero plays on a new feed is normal — directories take days to index a fresh RSS URL.

    Annotations the server declares

    • title: My listening stats
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • publisher_upload_audioGet a one-time upload URL for an episode's source audio — your own recording (StreamYard, Riverside, Zoom, a local file).No findings

    Why it is in this group

    • The name "publisher_upload_audio" says "upload": a word for a change.
    Description, as the server wrote it
    Get a one-time upload URL for an episode's source audio — your own recording (StreamYard, Riverside, Zoom, a local file). Use this when an episode shows as 'awaiting': storyflo knows it exists but has no audio for it. Returns a presigned PUT URL plus a ready-to-paste curl command. Nothing changes in storyflo until you upload and then call publisher_attach_audio — this tool alone moves no bytes and mutates nothing.

    Annotations the server declares

    • title: Upload source audio
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • stream_briefing_render_eventsSubscribe to real-time briefing-render events.1 finding

    Why it is in this group

    • The description's first verb is "subscribe": a word for a change.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "stream_briefing_render_events" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}; The description's first verb is "subscribe": a word for a change.

      What this check looks for
    Description, as the server wrote it
    Subscribe to real-time briefing-render events. Returns the SSE endpoint URL with the chosen filters as query params — the agent's MCP client should open it with EventSource (browser), httpx.stream / aiohttp (Python), or `curl -N` (CLI). Event types: `briefing.rendered` (daily-brief lands), `declassified.published` (new Declassified episode), `persona_briefing.rendered` (persona brief synthesised / audio rendered). Frame shape: {event_type, seq, slug, vertical, persona_slug, audio_url, published_at, metadata}. The endpoint replays the last ~1000 events on connect; a heartbeat is emitted every 30s. Public-anon read.

    Annotations the server declares

    • title: Stream briefing render events (SSE)
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • subscribe_declassified_topicResolve a podcast-feed URL the user can paste into Apple Podcasts, Overcast, Pocket Casts, or Spotify to receive every new Declassified case automatically.1 finding

    Why it is in this group

    • The name "subscribe_declassified_topic" says "subscribe": a word for a change.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "subscribe_declassified_topic" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "subscribe_declassified_topic" says "subscribe": a word for a change.

      What this check looks for
    Description, as the server wrote it
    Resolve a podcast-feed URL the user can paste into Apple Podcasts, Overcast, Pocket Casts, or Spotify to receive every new Declassified case automatically. Also returns a JSON `episodes_url` the agent can poll, plus a `matched_so_far` count of cases that already mention the topic. Read-only — does NOT store the user's email or any PII; the RSS feed is the subscription. Public — no auth required.

    Annotations the server declares

    • title: Subscribe to Declassified topic
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • subscribe_topicMint or update the human's personal Storyflo podcast feed.No findings

    Why it is in this group

    • The name "subscribe_topic" says "subscribe": a word for a change.
    Description, as the server wrote it
    Mint or update the human's personal Storyflo podcast feed. Pass 1–6 vertical slugs from `tech`, `finance`, `science`, `media`, `sports`, `culture`. The server creates a private RSS feed scoped to those verticals — or updates the existing feed in place if the listener already has one. Returns the RSS URL the listener can paste into Spotify, Apple Podcasts, Pocket Casts, or any podcast client. Behavior • Persistent server-side side-effect — a `ListenerSubscription` row is created or updated. The returned RSS URL stays stable across calls for the same listener (the listener doesn't need to re-paste it). • Idempotent on identical input — calling twice with the same verticals leaves state unchanged. • REPLACES on different input — calling with a different verticals set OVERWRITES the previous selection rather than adding to it. Use this to switch a listener's feed; do NOT call to add verticals incrementally (read the current set via `list_subscriptions` first and pass the union if you want additive behavior). • Single feed per listener — call `list_subscriptions` first to avoid clobbering an existing feed the listener explicitly chose. When to use Use after the agent has been asked to set up audio news for the human across a defined set of topics. Do NOT use to FETCH articles or audio — that's `search_articles` + `get_audio_url`.

    Annotations the server declares

    • title: Subscribe to topic feed
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
Only reads 25Claude Code: allow
  • digest_declassifiedReturn the most-recently-published Declassified cases over a rolling window.No findings

    Why it is in this group

    • The description's first verb is "return": a word for reading.
    Description, as the server wrote it
    Return the most-recently-published Declassified cases over a rolling window. Use for 'what's new in Declassified this week' style prompts. window=today (~24h) | week (default) | month. Public — no auth required.

    Annotations the server declares

    • title: Recent Declassified cases
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • fm_book_statusA signalflo fund manager's own book: which calls are open, how many have closed, and the deep links to the desk and dashboard.No findings

    Why it is in this group

    • The name "fm_book_status" says "status": a word for reading.
    Description, as the server wrote it
    A signalflo fund manager's own book: which calls are open, how many have closed, and the deep links to the desk and dashboard. Use this first when a manager asks what is on their book right now.

    Annotations the server declares

    • title: My desk book
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • get_articleFetch the full record for an article by slug, including body_text + audio_url.No findings

    Why it is in this group

    • The name "get_article" says "get": a word for reading.
    Description, as the server wrote it
    Fetch the full record for an article by slug, including body_text + audio_url.

    Annotations the server declares

    • title: Get article
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • get_audio_urlResolve the playable audio URL for an article.No findings

    Why it is in this group

    • The name "get_audio_url" says "get": a word for reading.
    Description, as the server wrote it
    Resolve the playable audio URL for an article. Returns a stitched-with-ad URL on free tier or the bare audio for plus/pro.

    Annotations the server declares

    • title: Get audio URL
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • get_declassified_caseFetch the full record for a Declassified case by slug.No findings

    Why it is in this group

    • The name "get_declassified_case" says "get": a word for reading.
    Description, as the server wrote it
    Fetch the full record for a Declassified case by slug. Returns title, summary, transcript_excerpt, episode_date, duration_sec, agency, audio_url, source_doc_url, and up to 5 related cases. Use after `search_declassified` when the agent needs the full case body to summarize, narrate, or hand off audio playback. Public — no auth required.

    Annotations the server declares

    • title: Get Declassified case
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • get_divergence_indexThe Storyflo Divergence Index — Storyflo's own computed metric for where prediction markets disagree with the press.No findings

    Why it is in this group

    • The name "get_divergence_index" says "get": a word for reading.
    Description, as the server wrote it
    The Storyflo Divergence Index — Storyflo's own computed metric for where prediction markets disagree with the press. For each event Storyflo holds both a liquid prediction-market contract and a set of narrated news stories, it computes the gap between the market-implied probability and the probability the NEWS NARRATIVE implies for the same event, then ranks events by the absolute divergence. Each item carries Storyflo's divergence value, Storyflo's news-narrative probability, a qualitative market descriptor, the matched story links, and a link-out to the market venue. This is ORIGINAL ANALYSIS computed by Storyflo, not market-data redistribution: it never returns raw external market odds. Cite as 'per Storyflo's Divergence Index'. Filter by source (kalshi|polymarket). Public — no auth required. Not investment advice.

    Annotations the server declares

    • title: Get the Storyflo Market-vs-Media Divergence Index
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • get_embedder_manifestWrap the public ``/embed/<slug>/manifest.json`` — an agent-discoverable JSON bundle of creative formats, voice options, payout config, and beacon URLs for a registered embedder.No findings

    Why it is in this group

    • The name "get_embedder_manifest" says "get": a word for reading.
    Description, as the server wrote it
    Wrap the public ``/embed/<slug>/manifest.json`` — an agent-discoverable JSON bundle of creative formats, voice options, payout config, and beacon URLs for a registered embedder. Use after `register_embedder` or when an agent is reading another partner's manifest to plan an ad buy. Public — no auth required.

    Annotations the server declares

    • title: Get per-embedder agent manifest
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • get_embedder_network_manifestWrap the public ``/embed/network-manifest.json`` — the platform-level DSP/SSP onboarding bundle: supported creative formats, payout rails, attribution URLs, integration patterns.No findings

    Why it is in this group

    • The name "get_embedder_network_manifest" says "get": a word for reading.
    Description, as the server wrote it
    Wrap the public ``/embed/network-manifest.json`` — the platform-level DSP/SSP onboarding bundle: supported creative formats, payout rails, attribution URLs, integration patterns. Use when an agent is evaluating whether to wire storyflo into its surface, or when a DSP partner needs the canonical integration shape. Public — no auth required.

    Annotations the server declares

    • title: Get platform-wide embedder network manifest
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • get_market_linked_storiesStoryflo stories that match an actively traded event contract on Kalshi (a CFTC-regulated exchange).No findings

    Why it is in this group

    • The name "get_market_linked_stories" says "get": a word for reading.
    Description, as the server wrote it
    Storyflo stories that match an actively traded event contract on Kalshi (a CFTC-regulated exchange). Each item carries qualitative signal tags (high_velocity, genuine_uncertainty) plus a link-out to Kalshi's own page where the live market data lives. Editorial sourcing surface, not market-data redistribution: Storyflo never returns raw prices, market-implied probabilities, volumes, or open interest in this payload. Use this when the agent needs to know which Storyflo stories are about news themes that have an actively traded event contract — e.g. World Cup matches, political mention contracts, corporate events. Filter by story vertical, Kalshi category (Politics, Economics, Companies, Science and Technology, Sports), or by signal tag.

    Annotations the server declares

    • title: Get stories with active matched event-contract markets
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • get_mcp_usage_selfReturn the caller's own trailing 30-day MCP tool-usage summary: total calls, success rate, p50 latency, and per-tool call/error counts.No findings

    Why it is in this group

    • The name "get_mcp_usage_self" says "get": a word for reading.
    Description, as the server wrote it
    Return the caller's own trailing 30-day MCP tool-usage summary: total calls, success rate, p50 latency, and per-tool call/error counts. Identity is resolved from the OAuth bearer token on this request — anonymous callers receive a zeroed shape. Use this to self-budget against rate limits, audit which tools your agent actually uses, or decide whether a paid tier is worth the spend. Read-only, no side effects.

    Annotations the server declares

    • title: Get my MCP tool usage (last 30 days)
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • get_personasReturn the storyflo 6-host persona catalog (Theo, Mason, Jessica, etc.) — each entry includes slug, name, voice_id, owned verticals, tone archetype, sign-off line, and the listener…No findings

    Why it is in this group

    • The name "get_personas" says "get": a word for reading.
    Description, as the server wrote it
    Return the storyflo 6-host persona catalog (Theo, Mason, Jessica, etc.) — each entry includes slug, name, voice_id, owned verticals, tone archetype, sign-off line, and the listener-facing URLs for sample audio + RSS. Use this to pick a voice for the agent's use case before rendering audio or briefing the user on which host covers which vertical. Public — no auth required.

    Annotations the server declares

    • title: Get host persona catalog
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • get_vertical_briefingFetch a stitched audio briefing of the top-25 trending articles in a single vertical from the last 24h.No findings

    Why it is in this group

    • The name "get_vertical_briefing" says "get": a word for reading.
    Description, as the server wrote it
    Fetch a stitched audio briefing of the top-25 trending articles in a single vertical from the last 24h. Premium — settles in USDC on Base via x402. Vertical must be one of the canonical 7 buckets: tech, finance, news, science, health, young_moms, yoga. First call without an X-Payment header returns the x402 challenge; sign + retry.

    Annotations the server declares

    • title: Get per-vertical premium briefing
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • get_vertical_landscapeReturn everything an agent needs to onboard a listener for a single vertical in one tool call: top stories, the named host persona (with sample-audio URL and tone), the premium-bri…No findings

    Why it is in this group

    • The name "get_vertical_landscape" says "get": a word for reading.
    Description, as the server wrote it
    Return everything an agent needs to onboard a listener for a single vertical in one tool call: top stories, the named host persona (with sample-audio URL and tone), the premium-briefing URL the agent can deep-link (x402-gated), and the public RSS feed the listener can paste into any podcast player. Use after the agent has decided which vertical to set up — saves a follow-up `get_personas` + `search_articles` + `get_premium_briefing` round trip. Public — no auth required.

    Annotations the server declares

    • title: Get one-shot vertical landscape
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • list_podcastsReturn the public catalog of Storyflo podcast shows — the Declassified archive plus 6 daily-brief shows hosted by Theo (tech), Mason (markets), Jessica (news), Chloe (health), Broc…No findings

    Why it is in this group

    • The name "list_podcasts" says "list": a word for reading.
    Description, as the server wrote it
    Return the public catalog of Storyflo podcast shows — the Declassified archive plus 6 daily-brief shows hosted by Theo (tech), Mason (markets), Jessica (news), Chloe (health), Brock (sports), and Wit (comedy). Each entry includes the show title, host name, vertical, RSS feed URL (paste into Apple Podcasts / Spotify / Overcast), and a deep-link to the storyflo.com listen surface. Use to surface every audio show an agent can offer its user without re-deriving the catalog from /v1/podcasts/* URL patterns. Public — no auth required.

    Annotations the server declares

    • title: List all Storyflo podcast shows
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • list_subscriptionsReturn the listener feed(s) this agent has minted on the human's behalf.No findings

    Why it is in this group

    • The name "list_subscriptions" says "list": a word for reading.
    Description, as the server wrote it
    Return the listener feed(s) this agent has minted on the human's behalf.

    Annotations the server declares

    • title: List active subscriptions
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • publisher_episodesList a publisher's episodes newest-first with their real state: 'live' (has finished audio and appears in the RSS feed) or 'awaiting' (storyflo knows the episode exists but has no …No findings

    Why it is in this group

    • The description's first verb is "list": a word for reading.
    Description, as the server wrote it
    List a publisher's episodes newest-first with their real state: 'live' (has finished audio and appears in the RSS feed) or 'awaiting' (storyflo knows the episode exists but has no finished audio yet). Filter with status=live or status=awaiting to answer 'what is still pending?'.

    Annotations the server declares

    • title: My episodes
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • publisher_folder_statusWhat the connected folder has produced: files seen, files matched and attached, and — most usefully — the files storyflo could read but would NOT auto-attach because the filename d…No findings

    Why it is in this group

    • The name "publisher_folder_status" says "status": a word for reading.
    Description, as the server wrote it
    What the connected folder has produced: files seen, files matched and attached, and — most usefully — the files storyflo could read but would NOT auto-attach because the filename did not clearly identify an episode. Those are listed with the reason so they can be renamed and picked up on the next scan.

    Annotations the server declares

    • title: Connected folder status
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • publisher_statusWhere a publisher stands right now: their RSS feed URL (the one to submit to Apple Podcasts and Spotify), how many episodes storyflo holds, how many already have finished audio, an…No findings

    Why it is in this group

    • The name "publisher_status" says "status": a word for reading.
    Description, as the server wrote it
    Where a publisher stands right now: their RSS feed URL (the one to submit to Apple Podcasts and Spotify), how many episodes storyflo holds, how many already have finished audio, and how many are still awaiting source audio. Use this for 'what is my feed URL', 'is anything stuck', or as the first call when a publisher asks how things are going.

    Annotations the server declares

    • title: My storyflo status
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • quote_partnershipReturn the indicative partnership tier (starter / growth / scale / enterprise) + monthly fee + storyflo revenue-share bps for a partner integrating storyflo into their agent produc…No findings

    Why it is in this group

    • The description's first verb is "return": a word for reading.
    Description, as the server wrote it
    Return the indicative partnership tier (starter / growth / scale / enterprise) + monthly fee + storyflo revenue-share bps for a partner integrating storyflo into their agent product. Pure pricing-matrix lookup; no contract is created. The agent should hand the returned contact_url to the human to open a formal partnership thread. Public — no auth required.

    Annotations the server declares

    • title: Quote a partnership tier
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • register_embedderResolve the storyflo embedder onboarding URL prefilled with the partner's name + email + optional vertical.No findings

    Why it is in this group

    • The description's first verb is "resolve": a word for reading.
    Description, as the server wrote it
    Resolve the storyflo embedder onboarding URL prefilled with the partner's name + email + optional vertical. Returns the URL the human must visit to complete signup (storyflo emails a magic link to verify ownership; the embedder slug + ref_token are minted on verification). DOES NOT create a DB row + DOES NOT send email — the MCP tool is a discovery + handoff surface so an agent can call it speculatively without triggering inbox-bound email to the human. Public — no auth required.

    Annotations the server declares

    • title: Get embedder onboarding URL
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • search_articlesSearch Storyflo's article corpus.No findings

    Why it is in this group

    • The name "search_articles" says "search": a word for reading.
    Description, as the server wrote it
    Search Storyflo's article corpus. Returns slug, title, publisher, vertical, snippet, audio_url, and listen_seconds for each match. Use vertical to scope (tech / finance / science / media / sports / culture).

    Annotations the server declares

    • title: Search Storyflo articles
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • search_declassifiedSearch Storyflo's Declassified archive — narrated cases drawn from FBI, CIA, NSA, NASA, DOJ, AARO, war.gov and other publicly-released government documents.No findings

    Why it is in this group

    • The name "search_declassified" says "search": a word for reading.
    Description, as the server wrote it
    Search Storyflo's Declassified archive — narrated cases drawn from FBI, CIA, NSA, NASA, DOJ, AARO, war.gov and other publicly-released government documents. Substring match across case title + synopsis. Use when the agent needs to find a Declassified case matching a topic (e.g. 'UAP', 'JFK', 'COINTELPRO', 'Roswell') before fetching the full case via `get_declassified_case` or handing the audio_url to a player. Public — no auth required.

    Annotations the server declares

    • title: Search Declassified library
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • search_unifiedSearch ALL of Storyflo in one call and get results back as separate per-corpus buckets: `news` (the narrated article archive), `declassified` (government-document cases), and `sign…No findings

    Why it is in this group

    • The name "search_unified" says "search": a word for reading.
    Description, as the server wrote it
    Search ALL of Storyflo in one call and get results back as separate per-corpus buckets: `news` (the narrated article archive), `declassified` (government-document cases), and `signals` (Atlas's book of positions off the Divergence Index). Use this when you do not already know which corpus holds the answer, or when a topic spans several — e.g. a macro question with both coverage and a live position. Results are ranked WITHIN each corpus and never blended, so a large corpus cannot drown a small one. `profile=desk` leads with signals (news/declassified as supporting evidence); `profile=publisher` leads with news and declassified carrying attribution for citation. Signals are qualitative only — no raw market odds, not investment advice.

    Annotations the server declares

    • title: Unified search
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Install

Pinned to version 1.2.0. Values in angle brackets are yours to fill in.

claude mcp add --transport http storyflo https://api.storyflo.com/mcp/v1

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__storyflo__search_articles",
      "mcp__storyflo__get_article",
      "mcp__storyflo__get_audio_url",
      "mcp__storyflo__list_subscriptions",
      "mcp__storyflo__get_vertical_briefing",
      "mcp__storyflo__get_market_linked_stories",
      "mcp__storyflo__get_crypto_market_link",
      "mcp__storyflo__publisher_folder_status",
      "mcp__storyflo__fm_book_status",
      "mcp__storyflo__publisher_status",
      "mcp__storyflo__publisher_episodes",
      "mcp__storyflo__search_unified",
      "mcp__storyflo__search_declassified",
      "mcp__storyflo__get_declassified_case",
      "mcp__storyflo__digest_declassified",
      "mcp__storyflo__get_trending_topics",
      "mcp__storyflo__get_personas",
      "mcp__storyflo__get_vertical_landscape",
      "mcp__storyflo__list_podcasts",
      "mcp__storyflo__get_divergence_index",
      "mcp__storyflo__register_embedder",
      "mcp__storyflo__get_embedder_manifest",
      "mcp__storyflo__get_embedder_network_manifest",
      "mcp__storyflo__quote_partnership",
      "mcp__storyflo__get_mcp_usage_self"
    ],
    "ask": [
      "mcp__storyflo__subscribe_topic",
      "mcp__storyflo__digest",
      "mcp__storyflo__publisher_connect_folder",
      "mcp__storyflo__publisher_upload_audio",
      "mcp__storyflo__publisher_attach_audio",
      "mcp__storyflo__fm_open_position",
      "mcp__storyflo__fm_reposition",
      "mcp__storyflo__fm_close_position",
      "mcp__storyflo__publisher_stats",
      "mcp__storyflo__subscribe_declassified_topic",
      "mcp__storyflo__get_my_private_feed",
      "mcp__storyflo__stream_briefing_render_events"
    ],
    "deny": []
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as storyflo. Review it before you use it.