FastMCP Server for exposing search functionality including general web search, YouTube video search, web content fetching, YouTube transcription, and Reddit content fetching via SearxNG and Reddit OAuth Data API
WebIntel MCP demonstrates solid tool definition quality with complete input schemas, descriptive documentation, and proper tool annotations. All 9 tools are explicitly registered with `@mcp.tool()` decorators in `src/server/mcp_server.py`, include comprehensive docstrings (50-250 characters), and parameter descriptions. Tool names follow verb-noun conventions (search, fetch, list variants). Output types are declared via Pydantic models (SearchResultOutput, FetchContentOutput, etc.), though output schemas are not inline-documented in descriptions. Most parameters have proper type constraints (minLength, maxLength, ge, le). Notable strengths: tool annotations are present on all tools (readOnlyHint, openWorldHint, idempotentHint); parameters use Annotated with Field() for clarity. Gaps: parameter descriptions lack explicit format guidance for complex inputs (e.g., YouTube video_id accepts both 'dQw4w9WgXcQ' and full URLs but this is buried in description); time_filter parameters lack enum constraints and instead use free-form nullable strings; error handling is not evident in tool definitions (no guidance on recovery scenarios); no explicit output schema documentation in docstrings beyond the return type annotation.
Fetch and parse content from a webpage URL with pagination support. Content is retrieved in chunks of 30,000 characters. If content is truncated, use the returned 'next_offset' value in a subsequent call to retrieve the next chunk. Returns: FetchContentOutput with parsed content and pagination metadata
Expand omitted comments using IDs returned by a post fetch.
Fetch a Reddit post and comments from a URL, share URL, permalink, or post ID.
Fetch posts from a subreddit using Reddit's OAuth Data API. Retrieves a list of posts with title, author, score, comments count, and other metadata. Supports pagination via the 'after' cursor. Returns: SubredditPostsOutput with posts list and pagination info
Fetch public metadata describing a subreddit.
Time-filter and sort parameters use free-form nullable strings instead of enums. Allows LLM to hallucinate invalid values like 'fortnight', 'weekly', 'trending' when only 'day', 'month', 'year', 'hour', 'week' etc. are valid.
Output schemas are declared via Pydantic return type annotations (SearchResultOutput, FetchContentOutput, etc.) but NOT documented inline in tool docstrings. LLMs cannot see the actual output fields without inspecting the Pydantic models, forcing them to guess at the response structure and whether required chaining IDs (e.g., post_id, url) are included.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 69 | 2026-07-28+ | v2 |
| 2026-03-09 | B | 72 | - | v1 |
Fetch and transcribe YouTube video content using STT. Downloads the audio from a YouTube video and transcribes it using a speech-to-text service. Accepts either a video ID or full YouTube URL. Returns: YouTubeContentOutput with video_id, transcript, and metadata
Perform a general web search using SearxNG. Supports filtering by category, time range, and language. Returns: List of search results with title, url, content, score, sorted by score descending. Results are quality-filtered before max_results is applied, so fewer than max_results may be returned.
Search public Reddit posts globally or within one subreddit.
Search for YouTube videos using SearxNG. Returns: List of video results with url, title, author, content, and length
No error handling guidance in tool definitions. Tools operating on external APIs (YouTube transcription, Reddit OAuth, SearxNG) lack recovery instructions. E.g., fetch_youtube_content does not document what happens on 'video not found', 'age-restricted', or 'transcript unavailable', LLM cannot plan fallbacks.
Ambiguous parameter documentation for fetch_youtube_content 'video_id' parameter. Description says it accepts 'dQw4w9WgXcQ' or 'https://www.youtube.com/watch?v=dQw4w9WgXcQ' but does not specify the resolution logic, does the tool parse URLs, or does the LLM? LLMs will not reliably extract video IDs from URLs.
search_reddit and related Reddit tools accept pagination cursors ('after' parameter) but do not document whether they are opaque or human-readable, or what structure to expect from the previous response. LLMs may not understand how to chain paginated calls.
fetch_content accepts an 'offset' parameter for pagination but the description only mentions 'Use next_offset from previous response', it does not specify whether offset is a byte offset, character offset, or result index, or how the pagination works with content truncation.
fetch_subreddit 'time_filter' parameter defaults to None but description says 'optional' without clarifying when it applies. For 'top' sort, it is required; for 'hot', it is ignored. LLMs will not know when to supply it.