The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the LLM Optimizer listing page.
LLM Optimizer is an AI visibility intelligence platform. It analyzes how large language models and AI search engines perceive, cite, and recommend brands — then provides research-backed optimization strategies to improve that visibility.
ChatGPT, Claude, Gemini, Perplexity, and Google AI Overviews are replacing traditional search for millions of people. The signals that determine whether an AI recommends your brand are fundamentally different from traditional SEO: earned media coverage, transcript quality, content structure, training data frequency, and citation network dynamics matter more than backlinks and keyword density. LLM Optimizer measures these signals across five analysis dimensions and produces a composite AI Visibility Score (0-100) with prioritized, actionable recommendations.
LLM Optimizer performs six types of analysis, each grounded in peer-reviewed research:
Answer Engine Optimization — Analyzes your website's content against the optimization strategies validated by the GEO (Generative Engine Optimization) research. Scores pages on quotation density (+41% visibility), statistical evidence (+33%), source citations (+28%), fluency, structural optimization, and machine readability. Produces per-question optimization scores with specific rewrite recommendations.
Video Authority Analysis — Two-phase analysis of YouTube presence. Phase 1 uses a fast model to assess individual videos for transcript quality, keyword alignment, and caption availability. Phase 2 feeds compact assessments into a reasoning model for four-pillar scoring: Transcript Authority, Topical Dominance, Citation Network, and Brand Narrative. Based on research showing YouTube is now the #1 social citation source for LLMs, appearing in 16% of AI answers.
Reddit Authority Analysis — Scrapes Reddit discussions mentioning your brand and analyzes community sentiment, competitive positioning, and training data signal strength. Uses Reddit's public .json endpoints with Cloudflare WARP proxy fallback. Scores four pillars: Presence, Sentiment, Competitive Position, and Training Signal.
Search Visibility Analysis — Evaluates your site's visibility across both Google AI Overviews and standalone LLMs. Checks robots.txt AI crawler policies, structured data, content freshness, brand search momentum, and earned media signals. Based on research showing only 12% overlap between Google top-10 results and ChatGPT/Perplexity citations.
LLM Knowledge Testing — Directly queries multiple LLM providers (Anthropic, OpenAI, Gemini, Grok) with your brand's target queries and analyzes how each model responds. Compares your brand's presence, accuracy, and recommendation likelihood across providers. Supports head-to-head competitor comparison.
Brand Intelligence — Aggregates all analysis dimensions into a composite AI Visibility Score weighted across Optimization (30%), Video Authority (20%), Reddit Authority (20%), Search Visibility (15%), and LLM Test (15%). Generates prioritized action items that track through to completion.
The analysis methodology is grounded in published research. Key findings that inform the scoring:
For the complete research synthesis with methodology details, scoring frameworks, and prompt architecture, see research.md.
Backend — Go 1.24, standard library net/http with gorilla/mux-style routing. No web framework. LLM provider abstraction supports Anthropic, OpenAI, Gemini, and Grok with streaming SSE responses. Each provider implements a common interface for Call, Stream, VerifyKey, and BuildStreamBody.
Frontend — React 19 + TypeScript + Vite + Tailwind CSS. Single-page application with SSE streaming for real-time analysis progress. The SaaS deployment uses a frontend overlay system that extends the base LastSaaS frontend with product-specific pages.
Multi-tenant SaaS — Built on LastSaaS, an open-source SaaS framework that provides authentication, billing (Stripe), tenant isolation, and user management. LLM Optimizer runs as a dependent application — LastSaaS handles the auth/billing plane while LLM Optimizer handles the product plane.
MCP Server — Model Context Protocol server using Streamable HTTP transport with OAuth 2.1 (PKCE + Dynamic Client Registration). Lets AI assistants like Claude access analysis data, visibility scores, and action items programmatically.
Cloudflare WARP — Integrated as a SOCKS5 proxy for Reddit scraping fallback (handles 429/403 rate limits).
Optional API keys for additional providers and features:
Clone the repository:
Copy the example environment file and fill in your values:
Required variables:
Build and run the backend:
Build and run the frontend (in a separate terminal):
Open http://localhost:5173 in your browser.
SaaS mode requires LastSaaS as a dependency. LastSaaS provides authentication (OAuth/SSO), Stripe billing, tenant management, and the admin interface.
Clone with the LastSaaS dependency:
Configure environment variables:
Additional variables required for SaaS mode:
See the LastSaaS README for the full set of auth/billing environment variables (Google OAuth, Stripe keys, etc.).
For local development, use the start script:
For production deployment on Fly.io:
See deploy.md for the full deployment guide.
| Variable | Required | Description |
|---|---|---|
ANTHROPIC_API_KEY | Yes | Anthropic API key for analysis engine |
MONGODB_URI | Yes | MongoDB connection string |
PORT | No | Server port (default: 8080) |
DATABASE_NAME | No | MongoDB database name (default: llmopt) |
LLMOPT_SAAS_ENABLED | SaaS only | Enable multi-tenant SaaS mode |
LLMOPT_ENCRYPTION_KEY | SaaS only | AES key for encrypting tenant API keys |
LLMOPT_JWT_ACCESS_SECRET | SaaS only | HMAC secret for JWT signing |
MCP_JWT_SECRET | No | MCP OAuth token signing key (derived from encryption key if not set) |
BASE_URL | No | Public URL for OAuth metadata (default: https://llmopt.metavert.io) |
YOUTUBE_API_KEY | No | YouTube Data API key for video analysis |
LLM Optimizer includes a Model Context Protocol (MCP) server that lets AI assistants like Claude access your brand intelligence and optimization data programmatically. The server uses Streamable HTTP transport with OAuth 2.1 authentication.
Server URL: https://llmopt.metavert.io/mcp
Listed on Smithery and awesome-mcp-servers (Glama). Official MCP Registry submission in progress.
The LLM Optimizer MCP server accesses only data already stored in your LLM Optimizer account (domains, reports, visibility scores, and action items). No data is shared with third parties. Read-only tools (llmopt_list_domains, llmopt_get_report, llmopt_get_visibility_score, llmopt_list_todos) do not modify any data. The llmopt_update_todo tool mutates only todo status fields. API keys and OAuth tokens are transmitted over HTTPS and stored hashed (SHA-256). For full details see the Privacy Policy.
Option 1 — Access Key (recommended): Create a personal lok_ access key at Settings → Access Keys in the app. Enter it in the OAuth prompt when connecting. Each key grants full access to your account's MCP tools.
Option 2 — OAuth 2.1: Full browser-based OAuth flow with PKCE. Claude Desktop handles this automatically when you add the server URL.
| Tool | Description | Parameters |
|---|---|---|
llmopt_list_domains | List all domains tracked for your account | (none) |
llmopt_get_report | Get a specific analysis report for a domain | domain (required), report_type (required): analysis, optimizations, video, reddit, search, summary, tests, brand |
llmopt_get_visibility_score | Get the composite AI visibility score (0-100) for a domain, weighted across 5 components | domain (required) |
llmopt_list_todos | List action items from optimization analyses | status (optional): todo, completed, backlogged, archived; domain (optional) |
llmopt_update_todo | Update a todo item's status (admin/owner only) | id (required), status (required): todo, completed, backlogged, archived |
1. Get a quick brand health summary
"What's the AI visibility score for acme.com and what are the top recommendations?"
Claude will call llmopt_get_visibility_score then llmopt_get_report (report_type: summary) to give you a snapshot of how well the brand appears in LLM outputs and what to fix first.
2. Triage your optimization backlog
"Show me all my open todo items across all domains, prioritized by domain."
Claude calls llmopt_list_todos with status: todo, groups results by domain, and presents them as a prioritized task list — ready to assign or schedule.
3. Competitive visibility comparison
"Compare the analysis reports for acme.com and competitorx.com and tell me where we're losing."
Claude fetches llmopt_get_report (report_type: analysis) for both domains, then synthesizes the differences — identifying topics where the competitor is mentioned and you're not.
4. Morning brand briefing
"Give me a daily briefing: any visibility score changes, new todos, and Reddit sentiment for mycompany.com."
Claude chains llmopt_get_visibility_score, llmopt_list_todos (status: todo), and llmopt_get_report (report_type: reddit) to create a concise morning summary you can drop into Slack.
5. Close out completed work
"I've finished all the meta-description updates. Mark all the meta-description todos for acme.com as completed."
Claude calls llmopt_list_todos filtered by domain to find relevant items, then calls llmopt_update_todo for each, confirming which were updated.
Add to ~/.claude.json under mcpServers:
On first use, Claude Code will open a browser to authorize. Enter your lok_ access key (create one at Settings → Access Keys).
Option A — OAuth (easiest, no key to manage):
Add to ~/Library/Application Support/Claude/claude_desktop_config.json:
On first launch, a browser window will open to authorize. Sign in at llmopt.metavert.io and enter your lok_ access key.
Option B — Direct key (no browser auth, simpler for power users):
Replace lok_your_access_key_here with a key from Settings → Access Keys.
| Endpoint | Description |
|---|---|
GET /.well-known/oauth-protected-resource | Protected Resource Metadata (RFC 9728) |
GET /.well-known/oauth-authorization-server | Authorization Server Metadata (RFC 8414) |
POST /oauth/register | Dynamic Client Registration (RFC 7591) |
GET /oauth/authorize | Authorization endpoint |
POST /oauth/token | Token endpoint (code exchange + refresh) |
A REST API is also available at /api/v1/. See the API Docs page for a formatted guide.
MIT - Copyright (c) 2026 Metavert LLC