Ezeo CLI
Ezeo SEO from your terminal, and from your coding agent, as you.
What it is
One package, one command registry. "ezeo <command>" is the CLI and "ezeo mcp" serves the same commands to any MCP-capable agent, so a command that works in the terminal works identically inside Claude Code or Codex.
It is for anyone who owns, administers or belongs to an Ezeo organization: the Ezeo team and self-serve customers alike. Client accounts use the web app. The CLI acts as the logged-in user, so row-level security, organization membership and the spend caps gate every call, and it never uses a service-role key. "ezeo login" refuses a client account and stores nothing.
If "ezeo whoami" says your organization holds zero projects, add your site at https://ezeo.ai/app, or, if you installed Ezeo through the Ezeo Shopify app, claim your store at https://ezeo.ai/app/shopify/link.
Install
Requires Node 22 or newer. Install the package from npm, then sign in:
npm i -g @ezeo/cli
ezeo login
ezeo whoamiEvery command then runs as "ezeo <command>". Run the same install command again to update.
Sign in
"ezeo login" with no flag opens the browser sign-in (Google). Google always shows its account chooser, so pick the account whose Ezeo access you want the CLI to have. The terminal then prints who you are signed in as.
ezeo login
ezeo login --password
ezeo whoami"ezeo login --password" asks for email and password in the terminal, for a machine with no browser; they are never read from argv or the environment. The session is stored at ~/.config/ezeo/credentials.json (mode 0600). "ezeo logout" removes it.
Choose a project, highest wins: --project, then the EZEO_PROJECT variable, then project = "Name" in a .ezeo.toml searched upward from the working directory, then whatever "ezeo use" stored. Names match by prefix; an ambiguous prefix is an error that lists the candidates.
Command reference
Every command accepts --json. Absence renders as a dash in tables and as null in JSON, never as 0.
Account and project
ezeo login [--password]Sign in with the browser (Google), or with email and password using --password.
freeezeo logoutSign out and remove the stored session.
freeezeo whoamiRole, superadmin flag, organization and how many projects this account can see.
freeezeo use <project>Remember a default project for this machine.
free
Projects, status, questions and briefing
ezeo projectsEvery project this account can see, with id, domain and status.
freeezeo statusWhat is scheduled per service, and the last 10 sync attempts.
freeezeo ask "<question>"An answer built from the project's live data via tool calls.
llmezeo brief [--mode] [--refresh]The project briefing, synthesised. "ezeo brief --no-synthesize" is free and uses no LLM pass.
llm
Reports and weekly readout
ezeo readout [--week YYYY-MM-DD]The weekly "what changed" document, with its coverage.
freeezeo metrics search [--days 28]Search Console totals and the coverage behind them.
free
Articles and content ideas
ezeo ideas [--limit] [--status]The content topic backlog, best opportunity first.
freeezeo articles list [--status s]Recent articles and every run in flight.
freeezeo articles waitingEvery run waiting for a person, across all your projects.
freeezeo articles show <id>One run or article, the full body and its content_hash.
freeezeo articles watch <run>Follow one run until it finishes.
freeezeo articles request [--count N]Start N article runs for this ISO week.
pipelineezeo articles approve <run> --hash <content_hash>Approve at the human article gate, using the content_hash you read.
pipelineezeo articles approve-images <run> --hash <image_set_hash>Approve at the human image gate, using the image_set_hash.
pipelineezeo articles retry <run> --reason "…"Hand a parked or failed run back to the pipeline.
pipelineezeo articles cancel <run> --reason "…"Abandon a parked or waiting run. Spends nothing and cannot be undone.
free
Audits, crawl and conversion
ezeo audit [--url] [--type]Technical, content or GEO audit of one page plus site signals.
llmezeo cro audit [--url]Conversion-rate audit of one page: seven category scores, findings and quick wins.
scrapeezeo cro hypotheses [--status s] [--limit N]The project's A/B test hypotheses, highest ICE score first, with page, success metric and status.
freeezeo cro brief <id>The design-ready brief for one A/B hypothesis: page evidence plus handoff steps for Figma or Paper.
freeezeo crawl statusThe latest full-site crawl: phase, pages, links and findings (superadmin).
freeezeo crawl findings [--type t] [--limit N]The pages behind those counts: broken links, 404s, duplicates and noindex.
freeezeo crawl start [--max-pages N] [--force]Start a full-site crawl (superadmin), priced per page.
dfs
Keywords, rankings, backlinks and competitors
ezeo keywords opportunities [--min-pos …]Strike-distance queries, scored, with whether content exists.
freeezeo keywords suggest [--count] [--focus]AI keyword suggestions, each with its reason.
llmezeo keywords research <mode> [--keywords|--domain]DataForSEO Labs research in several modes, for keywords or a domain.
dfsezeo keywords volume <kw…>Google search volume for named keywords.
dfsezeo keywords trends <kw…>Google search trend for named keywords.
dfsezeo rankings check [--keywords|--due|--all]Live SERP check, priced per keyword.
dfsezeo backlinks <mode> [--competitor] [--refresh]Backlink profile in several modes; --refresh is what forces a fetch.
dfsezeo competitors analyze <domain> [--keywords]Read one competitor page and compare it to the project.
llm
Spend
ezeo spend [--month YYYY-MM]The organization's AI spend this month, DataForSEO spend this month, and the per-project AI breakdown for the chosen month when your role allows it.
free
Agents and tooling
ezeo mcpServe every non-meta command to an MCP client over stdio.
freeezeo setup claude|codex|grok|gemini|cursorRegister "ezeo mcp" with a supported coding agent; the supported agents are shown in the usage.
freeezeo help [--agent]List every command with its cost; --agent prints the full agent reference.
freeezeo skill install [--dry-run]Write the agent reference to ~/.claude/skills/ezeo/SKILL.md.
free
Cost classes
freeReads data Ezeo already holds. Nothing is spent.llmOne OpenRouter call, billed to the project.dfsDataForSEO spend against the shared monthly caps.scrapeOne Firecrawl page scrape, billed to Ezeo.pipelineStarts or resumes article runs, each with LLM and image spend.
Paid commands: dry run, then confirm
Every llm, dfs, scrape and pipeline command prints what it will cost before it runs. In a terminal it then runs, so press Ctrl-C if the cost is not what you want; when stdin is not a terminal, the command needs --yes. If the cost policy refuses a command it exits with code 5 before any network call, so nothing was spent.
Inside an MCP client there is nobody to prompt, so a paid tool first returns a dry run and a confirm code, and runs only when called again with the same input and that code. The code is bound to the tool and its exact input and dies with the server process. It is not single-use, so each confirmed call can spend again.
The two approve commands take a required --hash taken from "ezeo articles show", which prints it beside the article body. There is no default and no lookup, so an article cannot be approved without having been read. "ezeo articles cancel" spends nothing but cannot be undone.
Using it inside agents
"ezeo mcp" serves the registry over stdio. "ezeo setup" registers it with an agent for you and prints exactly what it runs; add --dry-run to print without changing anything.
ezeo setup claude
ezeo setup codex
ezeo setup grok
ezeo setup gemini
ezeo setup cursor
ezeo setup claude --dry-runInstall the agent reference as a Claude skill so an agent knows the rules before it calls anything. "ezeo help --agent" prints the reference and "ezeo skill install" writes it to ~/.claude/skills/ezeo/SKILL.md.
ezeo help --agent
ezeo skill install
ezeo skill install --dry-runOver MCP a tool call still working after 45 seconds returns STILL RUNNING and a job id; the ezeo_job tool collects the result.
Exit codes
- 0: ok
- 1: usage, such as a bad flag or an ambiguous project
- 2: not logged in, or the role is refused
- 3: the server answered and said no
- 4: the request never reached the server
- 5: refused locally by cost policy; nothing was spent
Source of truth: ezeo-cli/README.md and ezeo-cli/docs/AGENT.md in the Ezeo repository.