Koskamo

Podgist MCP

Podgist MCP allows AI agents to search, ask questions about, and order podcast transcripts. It provides access to a library of over 236,000 episodes with speaker labels and timestamps. Agents can list podcasts, search transcripts, ask questions with citations, and order new transcriptions using prepaid API balances.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Podgist MCP logo, by PodgistVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-01Operated by Podgist
MCP endpoint (Streamable HTTP)
https://api.podgist.com/mcp
Vendor documentation

What you can do with it

  • Search transcripts across all shows
  • Ask questions answered from podcast transcripts
  • Order transcription for untranscribed episodes
  • Get podcast details and episode lists

Source and maintenance

Vendor evidenceRegistry 1.1.1

Protocol and capabilities

Server
podgist 1.1.0
MCP protocol
2025-06-18
Tools
35 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Podgist is a searchable, askable library of podcast transcripts: 236,000+ episodes from about 8,000 shows, with speaker labels and timestamps that link back to the audio. Answers come from what people actually said on those shows, cited to the episode and minute, not from a model's training data. Most of the catalogue is not transcribed yet: get_podcast and list_episodes show what is, and the price to transcribe what is not, which an agent can order (quote_episode or quote_index, then order) and pay from its account's API balance. list_services, find_podcasts, get_podcast, the first page of list_episodes, analyze_feed, list_credit_tiers, get_topics and get_news are free and need no key. The other tools need a Podgist API key sent as "Authorization: Bearer pgk_..."; search_transcripts, ask_question, get_transcript and later list_episodes pages are billed per call at the prices list_services shows (a transcript the account bought is free), orders cost their quoted price, and everything else is free. Tools that spend or change something say so. Keys and plans: https://www.podgist.com/api-docs. Transcript text is for reading and citing, not for bulk export, republication or model training.

Tools

35 advertised

list_services — What Podgist offers, and the price of each call
Advertised by the server during the last successful anonymous check.
Advertised read-only

Lists the tools, which need an API key, and the current price per call. Free; no key needed.

list_services input schema
{
  "type": "object",
  "required": [],
  "properties": {},
  "additionalProperties": false
}
list_services annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
find_podcasts — Find podcasts by name
Advertised by the server during the last successful anonymous check.
Advertised read-only

Public podcasts whose name contains the text, most-transcribed first, with their slug (for the podcast filter of search_transcripts). Free; no key needed. At most 20 results.

find_podcasts input schema
{
  "type": "object",
  "required": [
    "name"
  ],
  "properties": {
    "name": {
      "type": "string",
      "maxLength": 100,
      "minLength": 2
    }
  },
  "additionalProperties": false
}
find_podcasts annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
search_transcripts — Search every transcript
Advertised by the server during the last successful anonymous check.
Advertised read-only

Full-text search across transcripts: matching episodes with snippets, newest relevance first, 20 a page. Optional podcast slug and date range (YYYY-MM-DD). Needs an API key; billed per search (see list_services).

search_transcripts input schema
{
  "type": "object",
  "required": [
    "query"
  ],
  "properties": {
    "page": {
      "type": "integer",
      "maximum": 50,
      "minimum": 1
    },
    "query": {
      "type": "string",
      "maxLength": 500,
      "minLength": 1
    },
    "date_to": {
      "type": "string",
      "format": "date"
    },
    "podcast": {
      "type": "string",
      "description": "A slug from find_podcasts."
    },
    "date_from": {
      "type": "string",
      "format": "date"
    }
  },
  "additionalProperties": false
}
search_transcripts annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
ask_question — Ask the transcripts a question
Advertised by the server during the last successful anonymous check.

Starts a cited answer drawn only from what was said on podcasts. Returns a job_id; call get_answer with it until status is complete (usually under a minute). Needs an API key; billed per question (see list_services).

ask_question input schema
{
  "type": "object",
  "required": [
    "question"
  ],
  "properties": {
    "question": {
      "type": "string",
      "maxLength": 500,
      "minLength": 3
    }
  },
  "additionalProperties": false
}
ask_question annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false
}
get_answer — Get an answer
Advertised by the server during the last successful anonymous check.
Advertised read-only

The status and, once complete, the answer and its cited passages for a job from ask_question. Needs the API key that asked. Not billed.

get_answer input schema
{
  "type": "object",
  "required": [
    "job_id"
  ],
  "properties": {
    "job_id": {
      "type": "string",
      "maxLength": 64,
      "minLength": 8
    }
  },
  "additionalProperties": false
}
get_answer annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
get_transcript — Read one transcript
Advertised by the server during the last successful anonymous check.
Advertised read-only

One episode's transcript, with speaker turns and timestamps, by podcast and episode id (the sid and pid of a search result). Only what the key's account may read. Needs an API key; billed per transcript (see list_services).

get_transcript input schema
{
  "type": "object",
  "required": [
    "podcast_id",
    "episode_id"
  ],
  "properties": {
    "episode_id": {
      "type": "string",
      "format": "uuid"
    },
    "podcast_id": {
      "type": "string",
      "format": "uuid"
    }
  },
  "additionalProperties": false
}
get_transcript annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
get_usage — Balance and usage
Advertised by the server during the last successful anonymous check.
Advertised read-only

The key's account balance and monthly allowance, and its calls and cost per day over the last 30 days. Needs an API key. Not billed.

get_usage input schema
{
  "type": "object",
  "required": [],
  "properties": {},
  "additionalProperties": false
}
get_usage annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
get_podcast — A podcast's page
Advertised by the server during the last successful anonymous check.
Advertised read-only

Description, links, how many episodes are transcribed, the latest episode, and the price to transcribe an episode or subscribe. Free; no key needed.

get_podcast input schema
{
  "type": "object",
  "required": [
    "podcast"
  ],
  "properties": {
    "podcast": {
      "type": "string",
      "maxLength": 200,
      "minLength": 1,
      "description": "A slug or podcast_id from find_podcasts."
    }
  },
  "additionalProperties": false
}
get_podcast annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
list_episodes — A podcast's episodes
Advertised by the server during the last successful anonymous check.
Advertised read-only

Episodes newest first, 25 a page: title, date, length, whether transcribed (with its link) and, if not, the price to transcribe it. Page 1 is free with no key; each later page needs a key and is billed at the catalog rate (list_services).

list_episodes input schema
{
  "type": "object",
  "required": [
    "podcast"
  ],
  "properties": {
    "page": {
      "type": "integer",
      "maximum": 400,
      "minimum": 1
    },
    "podcast": {
      "type": "string",
      "maxLength": 200,
      "minLength": 1,
      "description": "A slug or podcast_id from find_podcasts."
    },
    "transcribed_only": {
      "type": "boolean"
    }
  },
  "additionalProperties": false
}
list_episodes annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
analyze_feed — Analyze a podcast feed for indexing
Advertised by the server during the last successful anonymous check.
Advertised read-only

Reads a public RSS feed (or Apple/Spotify link) and lists its episodes with which are already on Podgist and the price to transcribe the rest. Free; no key needed; at most 10 a minute.

analyze_feed input schema
{
  "type": "object",
  "required": [
    "url"
  ],
  "properties": {
    "url": {
      "type": "string",
      "format": "uri",
      "maxLength": 2000
    }
  },
  "additionalProperties": false
}
analyze_feed annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
list_credit_tiers — AI credit packs
Advertised by the server during the last successful anonymous check.
Advertised read-only

The AI-question credit packs and their prices. Free.

list_credit_tiers input schema
{
  "type": "object",
  "required": [],
  "properties": {},
  "additionalProperties": false
}
list_credit_tiers annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
get_topics — Topics
Advertised by the server during the last successful anonymous check.
Advertised read-only

This week's topics across podcasts, or one topic by slug. Free.

get_topics input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "topic": {
      "type": "string",
      "maxLength": 200
    }
  },
  "additionalProperties": false
}
get_topics annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
get_news — Podgist news
Advertised by the server during the last successful anonymous check.
Advertised read-only

Podgist's own news posts. Free.

get_news input schema
{
  "type": "object",
  "required": [],
  "properties": {},
  "additionalProperties": false
}
get_news annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
quote_episode — Price one episode
Advertised by the server during the last successful anonymous check.

The price for this account to transcribe one episode (or, if transcribed, to read it), held 30 minutes. Needs a key with the "order" scope. Not billed; nothing is bought until order.

quote_episode input schema
{
  "type": "object",
  "required": [
    "podcast",
    "episode"
  ],
  "properties": {
    "episode": {
      "type": "string",
      "format": "uuid",
      "description": "An episode_id from list_episodes."
    },
    "podcast": {
      "type": "string",
      "maxLength": 200,
      "minLength": 1,
      "description": "A slug or podcast_id from find_podcasts."
    }
  },
  "additionalProperties": false
}
quote_episode annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
quote_index — Price indexing a podcast
Advertised by the server during the last successful anonymous check.

The price to transcribe chosen episodes of a feed (episode ids from analyze_feed), with volume pricing. Needs a key with the "order" scope. Not billed until order.

quote_index input schema
{
  "type": "object",
  "required": [
    "feed_url",
    "episode_ids"
  ],
  "properties": {
    "feed_url": {
      "type": "string",
      "format": "uri",
      "maxLength": 2000
    },
    "episode_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "maxItems": 500,
      "minItems": 1
    }
  },
  "additionalProperties": false
}
quote_index annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
quote_credits — Price an AI credit pack
Advertised by the server during the last successful anonymous check.

A quote for one credit pack (tier from list_credit_tiers).

quote_credits input schema
{
  "type": "object",
  "required": [
    "tier"
  ],
  "properties": {
    "tier": {
      "type": "integer",
      "minimum": 1
    }
  },
  "additionalProperties": false
}
quote_credits annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
quote_subscription — Price a subscription term
Advertised by the server during the last successful anonymous check.

A prepaid term of one month or year, paid from the balance, that never renews by itself: "podcast" (every transcript of one show), "all" (every transcript) or "professional" (all access plus the API).

quote_subscription input schema
{
  "type": "object",
  "required": [
    "product",
    "interval"
  ],
  "properties": {
    "podcast": {
      "type": "string",
      "maxLength": 200,
      "minLength": 1,
      "description": "A slug or podcast_id from find_podcasts."
    },
    "product": {
      "enum": [
        "podcast",
        "all",
        "professional"
      ],
      "type": "string"
    },
    "interval": {
      "enum": [
        "month",
        "year"
      ],
      "type": "string"
    }
  },
  "additionalProperties": false
}
quote_subscription annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
order — Pay a quote from the API balance
Advertised by the server during the last successful anonymous check.

Buys what a quote is for, charging its price to the account's prepaid API balance (never a card). At most $50 an order and $200 a day. Episodes that are never transcribed are refunded automatically. Needs the "order" scope.

order input schema
{
  "type": "object",
  "required": [
    "quote_id",
    "idempotency_key"
  ],
  "properties": {
    "quote_id": {
      "type": "string",
      "format": "uuid"
    },
    "idempotency_key": {
      "type": "string",
      "maxLength": 200,
      "minLength": 8,
      "description": "Any unique string; retrying with the same one never pays twice."
    }
  },
  "additionalProperties": false
}
order annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_order — An order
Advertised by the server during the last successful anonymous check.
Advertised read-only

One order and each episode's status (waiting, transcribed, refunded). Free.

get_order input schema
{
  "type": "object",
  "required": [
    "order_id"
  ],
  "properties": {
    "order_id": {
      "type": "integer",
      "minimum": 1
    }
  },
  "additionalProperties": false
}
get_order annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
list_orders — Orders
Advertised by the server during the last successful anonymous check.
Advertised read-only

This account's orders paid from the API balance, newest first. Free.

list_orders input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "before": {
      "type": "integer",
      "minimum": 1
    }
  },
  "additionalProperties": false
}
list_orders annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
get_account — The account
Advertised by the server during the last successful anonymous check.
Advertised read-only

Plan, subscriptions, AI credits, follows, purchases and summary-email settings, as the account page shows them. Free.

get_account input schema
{
  "type": "object",
  "required": [],
  "properties": {},
  "additionalProperties": false
}
get_account annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
list_follows — Followed podcasts
Advertised by the server during the last successful anonymous check.
Advertised read-only

The podcasts this account follows. Free.

list_follows input schema
{
  "type": "object",
  "required": [],
  "properties": {},
  "additionalProperties": false
}
list_follows annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
follow_podcast — Follow a podcast
Advertised by the server during the last successful anonymous check.

Follow a podcast (as the Follow button does). Needs the "account" scope. Free.

follow_podcast input schema
{
  "type": "object",
  "required": [
    "podcast"
  ],
  "properties": {
    "podcast": {
      "type": "string",
      "maxLength": 200,
      "minLength": 1,
      "description": "A slug or podcast_id from find_podcasts."
    }
  },
  "additionalProperties": false
}
follow_podcast annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
unfollow_podcast — Unfollow a podcast
Advertised by the server during the last successful anonymous check.

Stop following a podcast. Needs the "account" scope. Free.

unfollow_podcast input schema
{
  "type": "object",
  "required": [
    "podcast"
  ],
  "properties": {
    "podcast": {
      "type": "string",
      "maxLength": 200,
      "minLength": 1,
      "description": "A slug or podcast_id from find_podcasts."
    }
  },
  "additionalProperties": false
}
unfollow_podcast annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
set_email_settings — Summary-email settings
Advertised by the server during the last successful anonymous check.

Turn the summary email on or off, set daily or weekly and the weekly day, or include one followed podcast (podcast + enabled). Needs the "account" scope. Free.

set_email_settings input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "start": {
      "type": "string"
    },
    "points": {
      "type": "integer",
      "minimum": 1
    },
    "enabled": {
      "type": "boolean"
    },
    "podcast": {
      "type": "string",
      "maxLength": 200,
      "minLength": 1,
      "description": "A slug or podcast_id from find_podcasts."
    },
    "frequency": {
      "enum": [
        "daily",
        "weekly"
      ],
      "type": "string"
    }
  },
  "additionalProperties": false
}
set_email_settings annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
list_ask_history — Ask history
Advertised by the server during the last successful anonymous check.
Advertised read-only

This account's questions, newest first, site and API alike. Free.

list_ask_history input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "q": {
      "type": "string",
      "maxLength": 200
    },
    "before": {
      "type": "string",
      "maxLength": 64
    }
  },
  "additionalProperties": false
}
list_ask_history annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
delete_ask — Delete a question
Advertised by the server during the last successful anonymous check.

Remove a question from the Ask history (restore_ask puts it back). Needs the "account" scope.

delete_ask input schema
{
  "type": "object",
  "required": [
    "job_id"
  ],
  "properties": {
    "job_id": {
      "type": "string",
      "maxLength": 64,
      "minLength": 8
    }
  },
  "additionalProperties": false
}
delete_ask annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
restore_ask — Restore a question
Advertised by the server during the last successful anonymous check.

Put a deleted question back in the Ask history. Needs the "account" scope.

restore_ask input schema
{
  "type": "object",
  "required": [
    "job_id"
  ],
  "properties": {
    "job_id": {
      "type": "string",
      "maxLength": 64,
      "minLength": 8
    }
  },
  "additionalProperties": false
}
restore_ask annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
share_ask — Share an answer
Advertised by the server during the last successful anonymous check.
Advertised read-only

The public link to one of this account's answered questions.

share_ask input schema
{
  "type": "object",
  "required": [
    "job_id"
  ],
  "properties": {
    "job_id": {
      "type": "string",
      "maxLength": 64,
      "minLength": 8
    }
  },
  "additionalProperties": false
}
share_ask annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
checkout_quote — Pay a quote by card instead
Advertised by the server during the last successful anonymous check.

A checkout link for a person to pay this quote by card (when the balance or a cap stops order). The quote can then only be paid by that link; asking again returns the same link. Needs the "billing" scope.

checkout_quote input schema
{
  "type": "object",
  "required": [
    "quote_id"
  ],
  "properties": {
    "quote_id": {
      "type": "string",
      "format": "uuid"
    }
  },
  "additionalProperties": false
}
checkout_quote annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
start_topup — Add funds (a link for a person)
Advertised by the server during the last successful anonymous check.

A checkout link for a person to add funds to the API balance by card; nothing is charged by the agent. Needs the "billing" scope.

start_topup input schema
{
  "type": "object",
  "required": [
    "amount",
    "idempotency_key"
  ],
  "properties": {
    "amount": {
      "type": "number",
      "minimum": 1
    },
    "idempotency_key": {
      "type": "string",
      "maxLength": 200,
      "minLength": 8,
      "description": "Any unique string; retrying with the same one never pays twice."
    }
  },
  "additionalProperties": false
}
start_topup annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
billing_portal_link — Card billing portal
Advertised by the server during the last successful anonymous check.

A link for a person to change the card, see invoices or cancel a card subscription. Needs the "billing" scope.

billing_portal_link input schema
{
  "type": "object",
  "required": [],
  "properties": {},
  "additionalProperties": false
}
billing_portal_link annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
cancel_subscription — Cancel a card subscription
Advertised by the server during the last successful anonymous check.
Advertised destructive

Cancel the account's card-paid Professional plan at period end (provider "stripe", undo to keep it), or its PayPal subscription (provider "paypal"), exactly as the account page does. Prepaid terms bought with the balance never renew, so need no cancelling. Needs the "billing" scope.

cancel_subscription input schema
{
  "type": "object",
  "required": [
    "provider"
  ],
  "properties": {
    "undo": {
      "type": "boolean"
    },
    "provider": {
      "enum": [
        "stripe",
        "paypal"
      ],
      "type": "string"
    }
  },
  "additionalProperties": false
}
cancel_subscription annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": true
}
request_password_reset — Password reset email
Advertised by the server during the last successful anonymous check.

Email the account's address a password-reset code, as "Forgot password" does; the person sets the new password. Needs the "account" scope.

request_password_reset input schema
{
  "type": "object",
  "required": [],
  "properties": {},
  "additionalProperties": false
}
request_password_reset annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
revoke_this_key — Revoke this key
Advertised by the server during the last successful anonymous check.
Advertised destructive

Revoke the API key making this call, for good. Other keys are managed only by the person.

revoke_this_key input schema
{
  "type": "object",
  "required": [],
  "properties": {},
  "additionalProperties": false
}
revoke_this_key annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": true
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
1012 ms
95th percentile latency
1012 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 1012 ms · metadata changed · 35 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http podgist-mcp https://api.podgist.com/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add podgist-mcp --url https://api.podgist.com/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable podgist-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "podgist-mcp": {
      "url": "https://api.podgist.com/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "podgist-mcp": {
      "type": "streamableHttp",
      "url": "https://api.podgist.com/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start podgist-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "podgist-mcp": {
      "type": "http",
      "url": "https://api.podgist.com/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http podgist-mcp https://api.podgist.com/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "podgist-mcp": {
      "url": "https://api.podgist.com/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "podgist-mcp": {
      "serverUrl": "https://api.podgist.com/mcp"
    }
  }
}

Let your agent find its tools

Find servers like Podgist MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run Podgist MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing