Self-hostable MCP server for AI visibility tracking across ChatGPT, Claude, Perplexity, Gemini, Grok, Google AI Overviews, and Google AI Mode. Free OSS with an optional EUR 99 one-time AI Visibility Audit for teams that want a client-ready baseline.
The server implements 12 well-structured tools with consistent naming patterns and mostly complete schemas. All tools start with action verbs (get_, check_, list_, create_, update_, refresh_, compare_, generate_, set_, track_). Tool descriptions are present and moderately detailed (average ~120-180 chars), though some lack critical examples or prerequisite guidance. Input schemas are explicit with proper JSON Schema typing and enums for constrained values (engines, granularity, suggested_format). However, descriptions sometimes embed example values (brand_id='acme'), which can mislead LLMs into reusing literals. Output schemas are partially documented via Zod objects in the source, but not all are visible in the excerpt. Error handling is minimal, there are no recovery guides, actionable error messages, or categorization of retryable vs fatal failures. Security is reasonable (read-only tools marked, write tools distinguished, no secrets in params), but permission gates and audit trail declarations are absent. The tool composition is logical, each tool has a single responsibility, and related tools chain well (refresh_brand → check_visibility). Overall, this is solid foundational work that would benefit from error-message improvements and more explicit output documentation.
Read the latest stored visibility snapshot, including scores and winning/losing prompts; call refresh_brand first for fresh data. Example: brand_id='acme', engines=['chatgpt','perplexity'].
Compare your brand's share of voice against specified competitor domains over N days. Returns prompts your brand wins, and which competitors appear alongside you. Example: brand_id='acme', days=30, competitor_domains=['asana.com','monday.com'].
Generate a fresh set of LLM-powered prompts for a brand based on its name, domain, category, and competitors (local CLI only).
Retrieve individual citations (prompts where brand was cited with links) across stored runs, optionally filtered by engine. Example: brand_id='acme', days=30, engine='chatgpt'.
Analyze which topics and content formats your brand is missing relative to competitors, ranked by priority. Returns suggestions for comparison pages, how-to guides, FAQs, etc. Example: brand_id='acme'.
Embedded example values in descriptions (brand_id='acme', engines=['chatgpt','perplexity']) risk LLM literal reuse. Replace with parameter constraints (enums, formats) instead of examples in prose.
Error responses have no recovery guidance. When a brand is not found, the tool returns a static message ('Brand not found. Create it first...') but does not suggest tryable alternatives or next steps that an LLM can execute.
Output schemas for most tools are inferred from Zod definitions in src/core/tools.ts but not fully visible in the excerpt. The visibilityOutputSchema, historyOutputSchema, compareOutputSchema, and citationsOutputSchema are defined but their complete structure is not shown. This makes it unclear whether all output fields are documented for LLM consumption.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 68 | 2026-07-28+ | v2 |
Fetch historical AI visibility scores over N days with daily or weekly granularity. Example: brand_id='acme', days=30, granularity='daily'.
List all tracked brands in the local database (local CLI only). Returns brand metadata, competitor domains, aliases, exclusions, and active prompt counts.
List all active prompts for a given brand (local CLI only). Returns prompt text, intent stage, shape, and creation time.
Start a fresh scan on selected configured engines using the brand's active prompts. Returns run IDs immediately; results usually populate in 30-60 seconds. Example: brand_id='acme', engines=['chatgpt','gemini'].
Replace a brand's active prompt set with an exact list (local CLI only). Deactivates old prompts and inserts new ones.
Create a new tracked brand (local CLI only). Seeds prompts via LLM generation or fallback. Example: brand_id='acme', name='Acme Corp', domain='acme.com', category='Project management', competitors=['asana.com','monday.com'].
Update a brand's metadata (name, domain, category, competitors, aliases, exclusions, refresh frequency) while preserving prompts and run history (local CLI only).
No explicit permission gates or scope declarations (e.g., 'read:visibility', 'write:brand') documented. Destructive tools like refresh_brand, set_prompts, track_brand, update_brand, and generate_prompts should declare required permissions and be gated to authorized agents.
Descriptions lack clear WHEN/WHY guidance. For example, 'Compare your brand's share of voice against specified competitor domains over N days' explains WHAT but not WHEN to call compare_competitors vs check_visibility. LLMs need explicit disambiguation.
No dry-run or confirmation mechanism for destructive operations (refresh_brand, set_prompts, update_brand, generate_prompts). Agents could inadvertently overwrite brand configuration or refresh data on the wrong brand. A confirmation_before_execute pattern would mitigate this.
Parameter 'days' (1-365) across multiple tools lacks explicit min/max bounds in descriptions. While 1-365 is documented for some, the bound is not consistently stated in all tool descriptions, leaving ambiguity.