Optifeed Radar

Open-source AI visibility checker. Now on npm - run it with npx optifeed-radar.
Is your brand recommended when buyers ask AI? Optifeed Radar checks whether the
models behind ChatGPT, Perplexity, Gemini and Claude actually recommend you, and
tells you where you stand against competitors. It runs locally, uses your own
API keys, and has no Optifeed-hosted backend.
It is built for two kinds of AI agents at once: it measures how AI agents
see and recommend you, and it can be run by your own AI agents (CLI, JSON,
and an MCP server). People also call this AI visibility, generative engine
optimization (GEO), answer engine optimization (AEO), or AI-SEO.
60-second setup
No install needed - npx fetches and runs it. The zero-key audit runs end
to end with no API keys and no AI calls:
npx optifeed-radar audit yourbrand.com
It checks AI-crawler access (robots.txt), llms.txt, schema.org structured
data, meta basics, and your sitemap, then prints a 0-100 AI-readiness score.
The check pipeline runs once you set at least one engine API key. Put it in a
.env file in the directory you run from, or export it:
echo "OPENAI_API_KEY=sk-..." > .env # any one engine key gets you started
npx optifeed-radar check yourbrand.com
The CLI loads .env from the directory you run it in, so there is no shell
setup step. Exporting the keys works too (export OPENAI_API_KEY=...), and an
exported key always wins over the same key in .env. config shows which
keys were found and which file they came from, never the values.
It discovers your brand, generates a buyer-prompt pack, asks the engines, and
scores recommendation, position, and share of voice into one AI Visibility
Score. The score reads only the unbranded buyer questions (did the AI surface
you unprompted); questions that name your brand are reported separately as
reputation. All four engines are verified live against their production APIs
(2026-07-20).
Working from a clone instead? Run npx tsx src/cli/index.ts <command> so flags
reach the CLI unchanged, or use the npm run dev script with -- before the
arguments (npm run dev -- check yourbrand.com --report out.html).
Install the Agent Skill
Radar also ships as an open Agent Skill for Codex, Claude Code, Cursor, and
other compatible AI agents. Install it directly from this repository:
npx skills add optifeed/optifeed-radar --skill optifeed-radar
Add -g to make it available across your projects. Then ask, for example:
Use $optifeed-radar to run the free AI-readiness audit on yourbrand.com,
explain the three highest-impact findings, and do not start a paid check.
The MCP server supplies executable tools. The Agent Skill supplies the working
method around them: start with the zero-key audit, confirm scope and cost before
paid engine calls, use a cap, and report sampling limits with the result. The
skill can also drive the CLI when MCP is not configured.
Install the Claude Code plugin
The Claude plugin bundles the same skill and starts Radar's MCP server from the
published npm package. In Claude Code, run:
/plugin marketplace add https://github.com/optifeed/optifeed-radar.git
/plugin install optifeed-radar@optifeed
Restart Claude Code or run /reload-plugins, then invoke
/optifeed-radar:optifeed-radar or ask Claude to audit a domain in plain
language. Node 20 or newer is required. The free audit needs no provider keys;
paid visibility checks use provider keys from Claude Code's environment.
The standalone skill and Claude plugin do not create a public ChatGPT app.
ChatGPT support will be marketed separately after Radar is packaged and tested
against OpenAI's plugin and MCP distribution route.
See it in action
Run a full visibility check from the terminal, from brand discovery and buyer
prompt generation through live engine queries and scoring.
Watch the 15-second CLI demo
What it does
Optifeed Radar asks real AI engines real buyer questions and measures whether
your brand gets recommended - not whether you rank in a search index, but
whether the answer an AI gives a buyer names you. Grounded engines (which cite
web sources) are reported separately from parametric ones (which answer from
model weights alone), because they behave differently. An engine counts as
grounded only for the answers where it actually searched: asking for grounded
mode is a request a model can decline, so the report says when an engine
searched on only some of its answers. METHODOLOGY.md has the
formula.
The questions match what you sell. If you make your own products, buyers are
asked what to buy and you are measured against rival makers. If you are a shop
selling other companies' products, buyers are asked where to buy and you are
measured against rival shops - product questions get answered with
manufacturers, so scoring a shop on them reports a zero that says nothing about
the shop. The tool works this out from your site and stores it as
businessType in profile.json; edit it if it guessed wrong.
One level down, shopping does the same thing for individual products you
name (beta). Each product gets its own 0-100 visibility score, and the report
is ordered by what the engines did: any product they answered about but never
recommended leads, since that is the finding worth reading, then the rest by
visibility, and last anything the run could not measure at all. The order you
list your products in carries no ranking meaning; it only breaks ties between
identical scores. Each product is checked twice over - category
buying questions that never name it, and questions that do - and when a
product is absent the report leads with the rival products the engines named
instead, which is the more useful half of a zero. Because every product is
asked its own questions, the scores say how decisively each one wins its own
shelf, not that one product beats another. You name the products; nothing is
imported or crawled.
Use it from your AI agents (MCP)
The optifeed-mcp server exposes the same capability to AI agents. It runs
over stdio, and npx fetches it on demand - no clone or build needed.
Claude Desktop (claude_desktop_config.json). The fastest way to open it is
Settings -> Developer -> Edit Config, which creates the file if it does not
exist yet. On disk it lives at:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json
- Windows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"optifeed-radar": {
"command": "npx",
"args": ["-y", "--package=optifeed-radar", "optifeed-mcp"],
"env": {
"OPENAI_API_KEY": "sk-..."
}
}
}
}
Claude Desktop reads that file at startup, so quit and reopen it after editing.
Claude Code (.mcp.json in your project):
{
"mcpServers": {
"optifeed-radar": {
"command": "npx",
"args": ["-y", "--package=optifeed-radar", "optifeed-mcp"]
}
}
}
Cursor (.cursor/mcp.json) and Windsurf (mcp_config.json) use the same
shape:
{
"mcpServers": {
"optifeed-radar": {
"command": "npx",
"args": ["-y", "--package=optifeed-radar", "optifeed-mcp"]
}
}
}
Working from a clone instead? Build first (npm install && npm run build),
then run the server with node pointed at the built entrypoint - replace
/path/to/optifeed-radar with your clone path:
{
"mcpServers": {
"optifeed-radar": {
"command": "node",
"args": ["/path/to/optifeed-radar/dist/mcp/index.js"]
}
}
}
Example prompts
Once it is connected, ask your AI agent in plain language. These map onto the
five tools and the arguments they accept: