MCP server for web scraping. Supports ChatGPT conversations, Claude shares, Twitter/X posts, Spotify playlists, NYT podcasts, and Metacast episodes via extensible plugin architecture. Multiple scraping methods: Playwright, Apify, requests.
Server has 6 tools with complete input schemas and descriptions, but quality is inconsistent. Tool names follow verb_noun convention (scrape_*, list_*, get_*), which is good. However, descriptions lack LLM-optimization guidance (e.g., 'when to use this vs similar tools'), parameter descriptions are present but generic, and output schemas are not documented. Error handling is minimal, no recovery guidance or actionable error messages visible in the code. The scrape_content tool is overly broad (6 sources in one tool), violating single-responsibility. No tool annotations (readOnlyHint, destructiveHint) despite clear WRITE vs READ_ONLY semantics.
Get details about a specific scraped ChatGPT conversation
Get details about specific scraped content
List previously scraped content from the data directory
List previously scraped ChatGPT conversations from the data directory
Scrape a ChatGPT conversation from a share URL. Supports both /share/ and /c/ URLs. Uses Playwright (default), Apify, or requests methods.
Scrape content from supported sources. Currently supports: chatgpt, claude, twitter, spotify, nyt_podcast, metacast. Automatically detects source from URL. Supports multiple methods: Playwright, Apify, requests.
scrape_content tool violates single-responsibility principle: handles 6 different sources (ChatGPT, Claude, Twitter, Spotify, NYT Podcast, Metacast) in one tool. Should split into source-specific tools (scrape_twitter, scrape_spotify, etc.) so LLM can select the right tool by name.
No output schemas documented. Tools return JSON but LLM cannot know what fields to expect (e.g., does list_scraped_conversations return 'title' or 'name'? 'date' or 'created_at'?). This forces LLMs to guess field names for downstream operations.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). scrape_* tools are destructive (WRITE risk), but LLM has no signal to avoid retrying them. list_* and get_* are read-only but unmarked.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 52 | 2026-07-28+ | v2 |
Error handling is absent from visible code. No recovery guidance (e.g., 'If scrape fails, try a different method'). No actionable error messages. LLM cannot self-correct on failure.
Descriptions lack LLM-optimization: no 'when to use this' guidance, no dependency hints, no distinction between similar tools (e.g., scrape_chatgpt_conversation vs scrape_content with ChatGPT URL). Descriptions average ~60 chars; baseline for A+ is 50-200 chars with context.