# Podcast Commerce Intelligence MCP [![npm](https://img.shields.io/npm/v/podcast-commerce-mcp)](https://www.npmjs.com/package/podcast-commerce-mcp) [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) [![Stars](https://img.shields.io/github/stars/teamsincetoday/podcast-commerce-mcp?style=social)](https://github.com/teamsincetoday/podcast-commerce-mcp) **Turn podcast transcripts into affiliate revenue.** Give any episode transcript to an AI agent — get back every product mentioned, who said it, how strongly they recommended it, and which affiliate network carries it. F1=100% on eval suite. Free tier: 200 calls/day. ⭐ **If this saves you time, please star the repo** — it helps other developers find it. > **Live endpoint**: `https://podcast-commerce-mcp.sincetoday.workers.dev/mcp` · [See examples](https://podcast-commerce-mcp.sincetoday.workers.dev/examples) Extract product mentions, sponsor segments, and product trends from podcast transcripts. Built on x402, the open payment standard backed by Shopify, Google, Microsoft, Visa, and the Linux Foundation. ## Tools | Tool | Description | |------|-------------| | `extract_podcast_products` | Extract products/brands from a transcript with confidence scores | | `analyze_episode_sponsors` | Identify sponsor segments and estimate read-through rates | | `track_product_trends` | Compare product mentions across multiple episodes | | `compare_products_across_shows` | Cross-show product ranking with entity resolution across multiple shows | | `generate_show_notes_section` | Format extracted products as a shoppable show notes section | ## Quick Start ```bash # Install npm install podcast-commerce-mcp # Configure cp .env.example .env # Edit .env: set OPENAI_API_KEY # Run (stdio MCP server) npx podcast-commerce-mcp ``` ## Connect in Claude Code — No Install Required Add to your `claude_desktop_config.json` or use `/add-mcp` in Claude Code. Free tier: 200 calls/day, no API key needed: ```json { "mcpServers": { "podcast-commerce": { "url": "https://podcast-commerce-mcp.sincetoday.workers.dev/mcp" } } } ``` ## MCP Client Config (local/stdio) ```json { "mcpServers": { "podcast-commerce": { "command": "npx", "args": ["podcast-commerce-mcp"], "env": { "OPENAI_API_KEY": "sk-..." } } } } ``` ## Tool Reference ### `extract_podcast_products` ```json { "transcript": "Raw text or URL to a .txt file", "episode_id": "optional-cache-key", "category_filter": ["saas", "physical_goods"], "api_key": "optional-paid-key" } ``` Returns: ```json { "episode_id": "...", "products": [ { "name": "Notion", "category": "saas", "mention_context": "I use Notion every day...", "speaker": "Host", "confidence": 0.9, "recommendation_strength": "strong", "affiliate_link": null, "mention_count": 2 } ], "sponsor_segments": [...], "_meta": { "processing_time_ms": 1200, "ai_cost_usd": 0.001, "cache_hit": false } } ``` ### `analyze_episode_sponsors` ```json { "transcript": "...", "episode_id": "optional", "api_key": "optional" } ``` ### `track_product_trends` ```json { "episode_ids": ["ep1", "ep2", "ep3"], "category_filter": ["saas"] } ``` Requires episodes to be previously extracted and cached. Returns `trends[]` with `brand`, `trend` (rising/stable/falling), `avg_recommendation_strength`, and `top_category`. ### `compare_products_across_shows` ```json { "show_ids": ["show-a", "show-b"], "min_show_count": 2, "min_confidence": 0.85 } ``` Ranks products by how many shows mention them. Returns `products[]` with `brand`, `show_count`, `avg_confidence`, `recommendation_consensus` (unanimous/majority/mixed/rare). ### `generate_show_notes_section` ```json { "episode_id": "previously-extracted-id", "format": "markdown", "style": "full" } ``` Formats cached product data as a shoppable show notes block. Returns a formatted string ready to paste into episode notes. ## Example Output Real extraction from a Huberman Lab episode transcript (live eval: **F1=89%**, 96/100 score, $0.00046/call, 8100ms): ```json { "episode_id": "huberman-ep-312", "products": [ { "name": "AG1 (Athletic Greens)", "brand": "AG1", "category": "supplement", "mention_context": "today's episode is brought to you by AG1. I've been taking it every morning for six months", "confidence": 0.97, "recommendation_strength": "strong" }, { "name": "Oura Ring", "category": "physical_goods", "mention_context": "I've been wearing it for sleep tracking for two years. They're not a sponsor, just a genuine rec", "confidence": 0.95, "recommendation_strength": "strong" } ], "sponsor_segments": [ { "sponsor_name": "AG1", "read_type": "host_read", "estimated_read_through": 0.72, "call_to_action": "code HUBERMAN for a free year's supply of Vitamin D" } ] } ``` See `/examples` endpoint for full output with value narrative: `https://podcast-commerce-mcp.sincetoday.workers.dev/examples` ## Pricing - Free tier: 200 calls/day per agent (no API key required) - Paid: $0.01/call — set `MCP_API_KEYS` with valid keys ## Environment Variables | Variable | Required | Default | Description | |----------|----------|---------|-------------| | `OPENAI_API_KEY` | Yes | — | OpenAI API key | | `AGENT_ID` | No | `anonymous` | Agent identifier for rate limiting | | `MCP_API_KEYS` | No | — | Comma-separated paid API keys | | `CACHE_DIR` | No | `./data/cache.db` | SQLite cache path | | `PAYMENT_ENABLED` | No | `false` | Set `true` to enforce limits | ## Development ```bash npm install npm run typecheck # Zero type errors npm test # All tests pass npm run build # Compile to dist/ ``` ## License MIT — Since Today Studio