Bridge between Apple Podcasts and Obsidian with AI-powered features. Provides tools for semantic search, keyword search, episode management, and podcast subscription management with transcript processing via Whisper and embeddings via sentence-transformers.
Podsidian provides well-structured tool definitions with complete input schemas and descriptions for all 8 tools. Naming follows verb_noun conventions (search_semantic, search_keyword, list_episodes, get_episode, list_subscriptions, mute_subscription, unmute_subscription, generate_briefing). Descriptions are generally clear (avg ~150 chars) and explain the purpose and use case. However, there are notable gaps: (1) No output schemas are documented anywhere in the codebase, LLMs cannot plan what fields to expect from responses. (2) Parameter descriptions lack validation constraints (e.g., relevance is 0-100 but no min/max in schema, limit has no bounds). (3) Error handling guidance is absent, tools provide no recovery hints. (4) Some descriptions could be more precise about when to use one tool vs another (search_semantic vs search_keyword distinction is clear, but list_episodes vs get_episode boundary is vague). (5) No tool annotations present (no readOnlyHint, destructiveHint, or idempotentHint). The server demonstrates solid fundamentals but lacks production-grade polish around output documentation and error handling.
Generate a personalized news briefing from recent podcast episodes. Searches across interest categories using semantic search, then synthesizes a briefing via LLM.
Get specific episode details and full transcript. Use this to retrieve complete episode information including the full transcript text.
List processed podcast episodes. Returns a paginated list of episodes that have been transcribed, ordered by publication date (newest first).
List all podcast subscriptions with their mute state. Shows information about all podcasts you're subscribed to in Apple Podcasts, along with their processing status in Podsidian.
Mute a podcast subscription by title. Muted podcasts will not be processed during ingestion.
Search podcast transcripts for exact keyword matches. Performs case-insensitive exact text matching within transcripts. Use this when you need to find specific words or phrases.
No output schemas documented. LLMs cannot predict response structure, making multi-step tool chains fragile. search_semantic returns what? A list of episodes with transcript snippets? Relevance scores? This forces agents to guess or discover via trial and error.
Missing parameter validation constraints in schemas. 'relevance' is described as 0-100 but schema lacks minValue/maxValue. 'limit' has no upper bound, LLM could pass 10000 and cause memory issues. Search tools need documented limits.
No error recovery guidance. If mute_subscription fails (e.g., podcast not found), the tool returns nothing that helps the agent. No message like 'Podcast not found. Call list_subscriptions to see available podcasts.' Error handling should guide next steps.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 66 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 45 | - | v1 |
Search podcast transcripts using semantic similarity. Uses AI embeddings to find semantically similar content even if exact words don't match. Perfect for finding episodes about specific topics or concepts.
Unmute a podcast subscription by title. Allows the podcast to be processed during ingestion.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). mute_subscription and unmute_subscription have side effects but are not marked as destructive. LLMs should know these modify state and may have consequences.
Parameter descriptions lack format/constraint documentation. 'categories' in generate_briefing is 'comma-separated custom search categories' but no schema validation, no examples of valid categories, no guidance on whether empty categories trigger a default behavior.
get_episode vs list_episodes boundary unclear. Description of get_episode says 'Get specific episode details and full transcript', but list_episodes doesn't clarify whether it returns transcript snippets or just metadata. Agents will struggle to know which to call for transcript content.