Competitor analysis platform exposing 15+ data sources (SEO, traffic, social media, Product Hunt, GitHub, Wayback Machine, AI insights) as MCP tools for AI agents via Streamable HTTP transport
Analook has 5 tools with clear verb-noun naming (analyze_competitor, get_report_status, get_report, get_report_markdown, list_my_reports). Descriptions are present and moderately detailed (100-250 chars), explaining what each tool does and when to use it. However, input schemas lack type definitions for most parameters, only 'url' and 'job_id' are visible with type strings, but no enum constraints, format specs, or validation rules. Output schemas are not documented in the tool definitions. Error handling is minimal, no recovery guidance, no categorization of retryable vs fatal errors. The analyze_competitor tool description mentions a 2-5 minute typical duration and credit deduction, which is good context, but lacks guidance on what to do if analysis fails or times out. Parameter descriptions are sparse (e.g., 'ID returned from analyze_competitor()' for job_id is minimal). No tool annotations (readOnlyHint, destructiveHint, idempotentHint) are present despite analyze_competitor being a WRITE operation.
Submit a competitor analysis job. Analyzes a competitor's website across 15+ data sources (SEO, traffic, social, Product Hunt, GitHub, Wayback Machine history, AI-generated insights, etc.) and returns a job_id. Use get_report_status(job_id) to poll and get_report(job_id) to retrieve results when status='completed'. Typical analysis takes 2-5 minutes. Requires authentication (deducts 1 credit from your Analook balance).
Fetch the full competitor analysis report as structured JSON. Reports contain: website snapshot, Wayback Machine history, SEO/traffic data (DataForSEO), social media presence, Product Hunt launches, GitHub stats, pricing, funding, AI-generated business insights, growth playbooks, and more.
Fetch the full competitor analysis report as Markdown text (human-readable format).
Poll an analysis job's status.
List authenticated user's analysis history (job IDs, URLs, product names, timestamps).
Input schemas lack type definitions and constraints. Parameters are declared as strings with minimal descriptions, but no enums, format specs, min/max bounds, or regex patterns. This invites LLM hallucination of invalid values.
Output schemas are not documented. Tool descriptions mention what data is returned (e.g., 'structured JSON', 'Markdown text'), but the actual field names, types, and structure are not specified. LLMs cannot plan downstream calls or extract data reliably.
No error handling guidance. If analyze_competitor fails or times out after 5 minutes, the tool provides no recovery path. No distinction between retryable errors (network timeout) and user-fixable errors (invalid URL).
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 55 | <=2025-11-25 | v2 |
Missing tool annotations. analyze_competitor is a WRITE operation (deducts credits, submits job), but lacks destructiveHint annotation. get_report_status and get_report are READ_ONLY but lack readOnlyHint. This prevents clients from optimizing caching and retry logic.
Parameter descriptions are minimal. 'ID returned from analyze_competitor()' for job_id is too terse. No guidance on format, length, or what happens if an invalid job_id is passed. 'product_name' description lacks context on when to override vs use domain default.