Measure how AI answer engines (Claude, ChatGPT, Gemini) recommend your product. Web dashboard + CLI for generative engine optimization (GEO) radar.
Critical gaps across naming, descriptions, and schemas. Tool names lack action verbs (askClaude, askOpenAI, askGemini should be query_claude, query_openai, query_gemini). Descriptions are present but generic (avg ~80 chars, below 194-char baseline). Input schemas visible in code but lack proper JSON Schema structure with type definitions and constraints. Parameters like 'model' and 'question' have minimal guidance. No output schemas documented. Error handling is absent, no recovery guidance or categorization. Tools 8-11 (findBrands, statusOf, brandQuote, isCited) are inferred from CLI/public files, not explicitly registered in server.js, capping their scores at 50. The 'ingest' tool accepts an 'apiKey' parameter (security anti-pattern: credentials in params). No tool declares idempotency, destructiveness, or read-only hints.
Query Claude API with web search capability to answer a question and extract text and URLs from the response
Query Google Gemini API with web search capability to answer a question and extract text and URLs from the response
Query OpenAI API with web search capability to answer a question and extract text and URLs from the response
Extract the sentence from text where a brand is mentioned
Turn ingested user data into 20-24 natural buyer questions split into contested and uncontested buckets using Claude, with full provenance tracking
Extract all brand names mentioned in text, ordered by first appearance position
Pull raw voice-of-the-user data from sources (demo fixtures or live Windsor connectors), aggregate repeated text, and compute week-over-week trend analysis
Tool names lack action verbs. 'askClaude', 'askOpenAI', 'askGemini' should follow verb_noun pattern: 'query_claude', 'query_openai', 'query_gemini'. LLMs infer intent from names, weak names cause misselection.
Credentials exposed as tool parameters. 'ingest' and 'extract' accept 'apiKey' parameters. This violates secret-injection pattern, API keys in params leak into logs and traces. Use server-side environment variable injection instead.
No output schemas documented. Tools return {text, urls} or {data, file} but LLMs cannot plan downstream calls without knowing field names and types. Document return types for all tools.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 34 | 2026-07-28+ | v2 |
Check if a brand's website is cited as a source in the URLs
Run the radar against freshly extracted questions across AI engines (Claude, OpenAI, Gemini) and save results with scoring
Diff current run against previous run and generate 5 concrete actions using Claude
Determine brand status in answer: 'g' (top-2), 'a' (mentioned in group), 'r' (absent)
Tools 8-11 (findBrands, statusOf, brandQuote, isCited) are inferred from CLI/public files, not explicitly registered in server.js MCP handler. Cannot verify actual schemas or registration.
No error handling or recovery guidance. Tools fail silently or return raw HTTP errors. LLMs need actionable error messages: 'Invalid model: got "gpt-5". Valid models: gpt-4o, gpt-4-turbo, gpt-3.5-turbo'.