{
  "markdown": "# Optifeed Radar\n\n[![npm version](https://img.shields.io/npm/v/optifeed-radar.svg)](https://www.npmjs.com/package/optifeed-radar)\n[![CI](https://github.com/optifeed/optifeed-radar/actions/workflows/ci.yml/badge.svg)](https://github.com/optifeed/optifeed-radar/actions/workflows/ci.yml)\n[![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)\n[![Node](https://img.shields.io/node/v/optifeed-radar.svg)](https://nodejs.org)\n[![Glama MCP server](https://glama.ai/mcp/servers/optifeed/optifeed-radar/badge)](https://glama.ai/mcp/servers/optifeed/optifeed-radar)\n[![skills.sh](https://skills.sh/b/optifeed/optifeed-radar)](https://skills.sh/optifeed/optifeed-radar/optifeed-radar)\n\n**Open-source AI visibility checker. Now on npm - run it with `npx optifeed-radar`.**\n\nIs your brand recommended when buyers ask AI? Optifeed Radar checks whether the\nmodels behind ChatGPT, Perplexity, Gemini and Claude actually recommend you, and\ntells you where you stand against competitors. It runs locally, uses your own\nAPI keys, and has no Optifeed-hosted backend.\n\nIt is built for two kinds of AI agents at once: it measures how **AI agents**\nsee and recommend you, and it can be **run by your own AI agents** (CLI, JSON,\nand an MCP server). People also call this AI visibility, generative engine\noptimization (GEO), answer engine optimization (AEO), or AI-SEO.\n\n<p align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/optifeed/optifeed-radar/main/docs/assets/optifeed-radar-overview.png\" alt=\"Optifeed Radar AI visibility dashboard and report\" width=\"900\">\n</p>\n\n## 60-second setup\n\nNo install needed - `npx` fetches and runs it. The zero-key `audit` runs end\nto end with no API keys and no AI calls:\n\n```bash\nnpx optifeed-radar audit yourbrand.com\n```\n\nIt checks AI-crawler access (robots.txt), llms.txt, schema.org structured\ndata, meta basics, and your sitemap, then prints a 0-100 AI-readiness score.\n\nThe `check` pipeline runs once you set at least one engine API key. Put it in a\n`.env` file in the directory you run from, or export it:\n\n```bash\necho \"OPENAI_API_KEY=sk-...\" > .env      # any one engine key gets you started\nnpx optifeed-radar check yourbrand.com\n```\n\nThe CLI loads `.env` from the directory you run it in, so there is no shell\nsetup step. Exporting the keys works too (`export OPENAI_API_KEY=...`), and an\nexported key always wins over the same key in `.env`. `config` shows which\nkeys were found and which file they came from, never the values.\n\nIt discovers your brand, generates a buyer-prompt pack, asks the engines, and\nscores recommendation, position, and share of voice into one AI Visibility\nScore. The score reads only the unbranded buyer questions (did the AI surface\nyou unprompted); questions that name your brand are reported separately as\nreputation. All four engines are verified live against their production APIs\n(2026-07-20).\n\nWorking from a clone instead? Run `npx tsx src/cli/index.ts <command>` so flags\nreach the CLI unchanged, or use the `npm run dev` script with `--` before the\narguments (`npm run dev -- check yourbrand.com --report out.html`).\n\n## Install the Agent Skill\n\nRadar also ships as an open Agent Skill for Codex, Claude Code, Cursor, and\nother compatible AI agents. Install it directly from this repository:\n\n```bash\nnpx skills add optifeed/optifeed-radar --skill optifeed-radar\n```\n\nAdd `-g` to make it available across your projects. Then ask, for example:\n\n> Use $optifeed-radar to run the free AI-readiness audit on yourbrand.com,\n> explain the three highest-impact findings, and do not start a paid check.\n\nThe MCP server supplies executable tools. The Agent Skill supplies the working\nmethod around them: start with the zero-key audit, confirm scope and cost before\npaid engine calls, use a cap, and report sampling limits with the result. The\nskill can also drive the CLI when MCP is not configured.\n\n### Install the Claude Code plugin\n\nThe Claude plugin bundles the same skill and starts Radar's MCP server from the\npublished npm package. In Claude Code, run:\n\n```text\n/plugin marketplace add https://github.com/optifeed/optifeed-radar.git\n/plugin install optifeed-radar@optifeed\n```\n\nRestart Claude Code or run `/reload-plugins`, then invoke\n`/optifeed-radar:optifeed-radar` or ask Claude to audit a domain in plain\nlanguage. Node 20 or newer is required. The free audit needs no provider keys;\npaid visibility checks use provider keys from Claude Code's environment.\n\nThe standalone skill and Claude plugin do not create a public ChatGPT app.\nChatGPT support will be marketed separately after Radar is packaged and tested\nagainst OpenAI's plugin and MCP distribution route.\n\n### See it in action\n\nRun a full visibility check from the terminal, from brand discovery and buyer\nprompt generation through live engine queries and scoring.\n\n<p align=\"center\">\n  <a href=\"https://github.com/optifeed/optifeed-radar/blob/main/docs/assets/optifeed-radar-cli.mp4\">\n    <img src=\"https://raw.githubusercontent.com/optifeed/optifeed-radar/main/docs/assets/optifeed-radar-cli-preview.png\" alt=\"Watch the Optifeed Radar CLI demo\" width=\"760\">\n  </a>\n</p>\n\n<p align=\"center\"><a href=\"https://github.com/optifeed/optifeed-radar/blob/main/docs/assets/optifeed-radar-cli.mp4\"><strong>Watch the 15-second CLI demo</strong></a></p>\n\n## What it does\n\nOptifeed Radar asks real AI engines real buyer questions and measures whether\nyour brand gets recommended - not whether you rank in a search index, but\nwhether the answer an AI gives a buyer names you. Grounded engines (which cite\nweb sources) are reported separately from parametric ones (which answer from\nmodel weights alone), because they behave differently. An engine counts as\ngrounded only for the answers where it actually searched: asking for grounded\nmode is a request a model can decline, so the report says when an engine\nsearched on only some of its answers. [METHODOLOGY.md](METHODOLOGY.md) has the\nformula.\n\nThe questions match what you sell. If you make your own products, buyers are\nasked what to buy and you are measured against rival makers. If you are a shop\nselling other companies' products, buyers are asked where to buy and you are\nmeasured against rival shops - product questions get answered with\nmanufacturers, so scoring a shop on them reports a zero that says nothing about\nthe shop. The tool works this out from your site and stores it as\n`businessType` in `profile.json`; edit it if it guessed wrong.\n\nOne level down, `shopping` does the same thing for individual products you\nname (beta). Each product gets its own 0-100 visibility score, and the report\nis ordered by what the engines did: any product they answered about but never\nrecommended leads, since that is the finding worth reading, then the rest by\nvisibility, and last anything the run could not measure at all. The order you\nlist your products in carries no ranking meaning; it only breaks ties between\nidentical scores. Each product is checked twice over - category\nbuying questions that never name it, and questions that do - and when a\nproduct is absent the report leads with the rival products the engines named\ninstead, which is the more useful half of a zero. Because every product is\nasked its own questions, the scores say how decisively each one wins its own\nshelf, not that one product beats another. You name the products; nothing is\nimported or crawled.\n\n## Use it from your AI agents (MCP)\n\nThe `optifeed-mcp` server exposes the same capability to AI agents. It runs\nover stdio, and `npx` fetches it on demand - no clone or build needed.\n\n<p align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/optifeed/optifeed-radar/main/docs/assets/optifeed-radar-claude-desktop.png\" alt=\"Optifeed Radar running through Claude Desktop via MCP\" width=\"760\">\n</p>\n\nClaude Desktop (`claude_desktop_config.json`). The fastest way to open it is\nSettings -> Developer -> Edit Config, which creates the file if it does not\nexist yet. On disk it lives at:\n\n- macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`\n- Windows: `%APPDATA%\\Claude\\claude_desktop_config.json`\n\n```json\n{\n  \"mcpServers\": {\n    \"optifeed-radar\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"--package=optifeed-radar\", \"optifeed-mcp\"],\n      \"env\": {\n        \"OPENAI_API_KEY\": \"sk-...\"\n      }\n    }\n  }\n}\n```\n\nClaude Desktop reads that file at startup, so quit and reopen it after editing.\n\nClaude Code (`.mcp.json` in your project):\n\n```json\n{\n  \"mcpServers\": {\n    \"optifeed-radar\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"--package=optifeed-radar\", \"optifeed-mcp\"]\n    }\n  }\n}\n```\n\nCursor (`.cursor/mcp.json`) and Windsurf (`mcp_config.json`) use the same\nshape:\n\n```json\n{\n  \"mcpServers\": {\n    \"optifeed-radar\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"--package=optifeed-radar\", \"optifeed-mcp\"]\n    }\n  }\n}\n```\n\nWorking from a clone instead? Build first (`npm install && npm run build`),\nthen run the server with `node` pointed at the built entrypoint - replace\n`/path/to/optifeed-radar` with your clone path:\n\n```json\n{\n  \"mcpServers\": {\n    \"optifeed-radar\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/optifeed-radar/dist/mcp/index.js\"]\n    }\n  }\n}\n```\n\n### Example prompts\n\nOnce it is connected, ask your AI agent in plain language. These map onto the\nfive tools and the arguments they accept:\n\n- \"Run a free AI-readiness audit on yourbrand.com.\" -> `audit_store`, no keys,\n  no cost.\n- \"What buyer questions should yourbrand.com be visible for?\" ->\n  `generate_buyer_queries`, so you can review the pack before paying for a run.\n- \"Check yourbrand.com's AI visibility, quick mode, cap it at 20 cents.\" ->\n  `check_visibility` with `quick` and `max_cost`.\n- \"Check yourbrand.com on OpenAI and Perplexity only.\" -> `check_visibility`\n  with `engines`.\n- \"Check whether AI recommends my products: Aria 2, Presto X, Brew Mini, in\n  that order, for yourbrand.com.\" -> `shopping_check`. Input order is not a\n  ranking; it only breaks ties between products with identical scores.\n- \"Check the Aria 2, a quiet home espresso machine, and the Presto X, a fast\n  dual-boiler, on yourbrand.com. Cap it at one dollar.\" -> `shopping_check`\n  with a descriptor per product and `max_cost`. Saying what each product IS is\n  what rescues an opaque model name: without it the questions are guessed from\n  the store category.\n- \"What changed since the last visibility run on yourbrand.com?\" ->\n  `get_snapshot_diff`, free, and it needs two saved runs before it can compare.\n\nStart with the audit prompt: it needs no keys, so it confirms the server is\nwired up before anything spends API credit. `check_visibility` runs\nnon-interactively (no confirmation prompt over MCP), so the `max_cost` cap is\nwhat bounds a run your AI agent starts - it defaults to $0.50.\n`shopping_check` is bigger, so its default cap scales with the list, at $0.20\nper product you name.\n\n## Tools and cost\n\n| Surface | Name                     | What it does                                                    | Cost                           |\n| ------- | ------------------------ | --------------------------------------------------------------- | ------------------------------ |\n| CLI     | `audit`                  | Zero-key AI-readiness check (robots, llms.txt, schema, sitemap) | Free, no AI calls              |\n| CLI     | `check`                  | Full pipeline: buyer prompts, engines, AI Visibility Score      | BYO keys                       |\n| CLI     | `shopping`               | Products you name: your ranking vs AI's, and the rival shelf    | BYO keys                       |\n| CLI     | `diff`                   | What changed between your last two runs                         | Free (reads a saved snapshot)  |\n| CLI     | `sources`                | Domains the AI cited, and your share of voice                   | Free (reads a saved snapshot)  |\n| CLI     | `queries`                | Show or export your buyer-prompt pack                           | Free                           |\n| CLI     | `config`                 | Which engine keys are set, where state is stored                | Free                           |\n| MCP     | `check_visibility`       | Run a visibility check for a domain                             | BYO keys                       |\n| MCP     | `audit_store`            | Run the zero-key readiness audit                                | Free                           |\n| MCP     | `generate_buyer_queries` | Produce the buyer-prompt pack                                   | BYO keys (usually under $0.05) |\n| MCP     | `shopping_check`         | Same product check, for your AI agents                          | BYO keys                       |\n| MCP     | `get_snapshot_diff`      | Compare two saved runs                                          | Free                           |\n\nCost transparency: `audit` queries no AI engines and costs nothing. `check`\nspends your own API credit. Measured on real runs (2026-07-20, `--quick` =\n8 buyer prompts):\n\n| run                              | measured cost  |\n| -------------------------------- | -------------- |\n| `audit`                          | free           |\n| `check --quick`, one engine      | about $0.09    |\n| `check --quick`, all four        | $0.41 to $0.46 |\n| `check --quick --grounded`, four | $0.85 to $1.09 |\n\nYour cost varies with engine, prompt-pack size, and provider pricing. Grounded\nruns cost roughly 3x parametric ones, because web search is billed on top of\ntokens: Google charges per search query, and one answer can trigger several.\nThe grounded range spans three real runs: two finished clean at about $0.85,\nand one that was reined in by its own cap spent $1.09, so treat the top of the\nrange as the planning number.\n\n`shopping` was measured on 2026-07-23: two products across all four engines in\n`--grounded` mode, 32 answers, **$0.70 for the run - about $0.35 per product**.\nThat is the expensive corner (grounded runs cost roughly 3x parametric ones),\nso a parametric four-engine run lands well under it. Each product costs about\n4 prompts on every engine with a key, and products in the same category share\ntheir category questions, which are asked once and scored for each product.\nThe MCP tool's default cap is $0.20 per product, which a grounded run will\nreach, so raise `max_cost` when you want grounded across four engines. Use\n`--max-cost` and start with two or three products.\n\nHow long it takes, measured the same way (2026-07-22):\n\n| run                              | measured time      |\n| -------------------------------- | ------------------ |\n| first `npx` (install, once)      | about 8 seconds    |\n| `audit`                          | 0.3 to 1.7 seconds |\n| `check --quick`, four engines    | 47 to 51 seconds   |\n| `check --quick --grounded`, four | about 97 seconds   |\n\nThe install figure was measured from the packed tarball with an empty npm\ncache, so a cold `npx optifeed-radar audit yourbrand.com` from the registry\nshould finish in about ten seconds. A `check` takes as long as the\nengines take to answer: it queries\nseveral of them across a whole prompt pack, and that wait is provider latency\nwe do not control. `check` reports live progress while it runs, so you can see\nwhich phase it is in rather than watching a blank terminal.\n\nEvery run reports what it actually spent, split into setup (brand discovery\nand prompt generation) and engine calls, so you can reconcile it against your\nprovider bill. Declining at the confirmation prompt still reports the setup\ncost, because discovery runs before that prompt.\n\n`--max-cost 0.20` caps spend. The cap is checked before every call and hitting\nit returns a partial result flagged as capped, never an error. It is a strong\nbound rather than an absolute ceiling: an engine's cost is not known until its\ncall returns, so a run can exceed the cap by at most the cost of one\nunmeasured call per engine. Any overshoot is always reported, never hidden.\n\nUseful `check` flags: `--json` (raw envelope), `--report report.html`\n(self-contained report), `--max-cost 0.50`, `--quick` (smaller prompt pack),\n`--grounded` (web-search mode where engines support it), `--fail-under 50`\n(exit non-zero below a threshold, for CI), `--yes` (skip the cost prompt so an\nAI agent can run it unattended).\n\nA `check` that could not measure anything exits non-zero and prints why. Buyer\nprompts come from one call to the judge model, so if that call fails - no API\ncredit, a rate limit, an unusable response - there is nothing to ask the\nengines, and the run stops before spending on them rather than reporting an\nempty result as a finished one. Declining the cost prompt yourself is a choice,\nnot a failure, and still exits zero.\n\n## Example\n\n```bash\nnpx optifeed-radar audit example.com      # free readiness score\nnpx optifeed-radar check example.com --quick --yes\nnpx optifeed-radar shopping example.com --products \"Aria 2, Presto X\" --yes\nnpx optifeed-radar diff example.com        # what changed since last run\nnpx optifeed-radar sources example.com     # who the AI cited\nnpx optifeed-radar config                  # which keys are set\n```\n\n`config` reports only whether each key is present, never the key value.\n\nFor `shopping`, list up to 10 products per run in any order; only the first 10\nare checked, and the report is ordered by what the engines did, not by what\nyou typed. A file\ngives each product a descriptor, which is what rescues an opaque product\nname - \"Aria 2\" tells an engine nothing, \"quiet home espresso machine\" tells\nit everything:\n\n```yaml\nproducts:\n  - name: Aria 2\n    aliases: [Aria II]\n    descriptor: quiet home espresso machine\n  - name: Presto X\n    descriptor: fast dual-boiler espresso machine\n```\n\n```bash\nnpx optifeed-radar shopping example.com --products-file products.yml --yes\n```\n\n## FAQ\n\n**What is AI visibility?** Whether AI engines recommend your brand when a buyer\nasks them a question, rather than whether you rank in a traditional search\nindex. It is also called generative engine optimization (GEO) or answer engine\noptimization (AEO).\n\n**Is there an MCP server?** Yes. The `optifeed-mcp` server exposes\n`check_visibility`, `audit_store`, `generate_buyer_queries`, `shopping_check`\nand `get_snapshot_diff` to your AI agents over stdio.\n\n**What does it cost?** The `audit` command is free and needs no keys. The\n`check` pipeline spends your own engine API credit: measured at about $0.09 for\na quick single-engine run, $0.41 to $0.46 across all four, and $0.85 to $1.09\nwith `--grounded`. Every run reports what it spent, and `--max-cost` caps it. You\nbring your own keys; there is no Optifeed-hosted billing.\n\n**Where is my data stored?** Optifeed Radar runs locally, saves snapshots on\nyour machine, and has no Optifeed-hosted backend. Each key is sent only to its\ncorresponding AI provider as required to make API calls and is never logged;\nprompts and responses are handled under that provider's data policies.\n\n**Which engines does it support?** OpenAI (ChatGPT), Anthropic (Claude), Google\n(Gemini), and Perplexity. Set any one key to start; set more for broader\ncoverage.\n\n**Which model does each engine ask?** `gpt-5.6-sol`, `claude-sonnet-5`,\n`gemini-flash-latest` and `sonar`, through each provider's API rather than the\nconsumer chat product. Every answer records the model that produced it, so a\nsaved run always says what it measured. The OpenAI model is a pinned snapshot:\na floating `-latest` alias can be repointed without notice, which would let a\n`diff` show movement that came from the engine changing rather than from your\nvisibility changing.\n\n**How is the score computed?** From sampling real engine answers to unbranded\nbuyer questions, scoring recommendation, position, and share of voice. Scores\nare estimates and vary between runs. See [METHODOLOGY.md](METHODOLOGY.md) for\nthe full method.\n\n## For directory maintainers\n\nOne-liners for awesome-mcp-servers, ClawHub, and Smithery listings:\n\n- **Optifeed Radar** - Ask real AI engines real buyer questions and score\n  whether a brand gets recommended. CLI plus MCP server, runs locally, BYO keys.\n- **Optifeed Radar (MCP)** - `check_visibility`, `audit_store`,\n  `generate_buyer_queries`, `shopping_check`, and `get_snapshot_diff` for\n  measuring brand and product AI visibility (GEO / AEO) from your AI agents.\n\nSearch intents this serves: AI visibility checker, does AI recommend my brand,\ngenerative engine optimization (GEO) tool, answer engine optimization (AEO),\nChatGPT brand visibility, AI-SEO, MCP server for brand visibility.\n\n## What this does NOT do\n\n- It is a point-in-time check, not continuous monitoring.\n- Scores are estimates from sampling and vary between runs - they are not a\n  guaranteed ranking.\n- It does not find your products for you. `shopping` checks the products you\n  name, up to 10 per run; there is no catalog or feed import.\n- `check` and `shopping` spend your own API credit; only `audit` is free.\n- It is not a traditional SEO rank tracker.\n\nCatalog discovery (pulling your products from a store or a feed) and feed\nlinting against the Agentic Commerce Protocol (ACP) and the Universal Commerce\nProtocol (UCP) will arrive in later releases - join the waitlist at\n[optifeed.com](https://www.optifeed.com/).\n\n## Status\n\nUnder active development, and the repo is public so you can follow along. If\nthis is useful to you, a star genuinely helps. Scores are estimates and say so.\nYour API keys are used only to call their corresponding providers and are never\nlogged or stored by Optifeed Radar.\n\n## License\n\nMIT\n\nMore at optifeed.com: <https://www.optifeed.com/>\n",
  "bytes": 21606,
  "sha": "7744f21c7da82b82831f1e055f84ed0eee41ada8cb1c558d1dcab4786ccfb938",
  "repo_slug": "optifeed/optifeed-radar",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_optifeed_optifeed_radar_52e419da/readme"
}