Ezeo CLI

Ezeo SEO from your terminal, and from your coding agent, as you.

Status: published on npm. Browser sign-in was verified live on 2026-09-30; the other commands are tested against recorded responses rather than live runs, so report any figure that looks wrong instead of trusting it.

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 whoami

Every 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.

    free
  • ezeo logout

    Sign out and remove the stored session.

    free
  • ezeo whoami

    Role, superadmin flag, organization and how many projects this account can see.

    free
  • ezeo use <project>

    Remember a default project for this machine.

    free

Projects, status, questions and briefing

  • ezeo projects

    Every project this account can see, with id, domain and status.

    free
  • ezeo status

    What is scheduled per service, and the last 10 sync attempts.

    free
  • ezeo ask "<question>"

    An answer built from the project's live data via tool calls.

    llm
  • ezeo 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.

    free
  • ezeo 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.

    free
  • ezeo articles list [--status s]

    Recent articles and every run in flight.

    free
  • ezeo articles waiting

    Every run waiting for a person, across all your projects.

    free
  • ezeo articles show <id>

    One run or article, the full body and its content_hash.

    free
  • ezeo articles watch <run>

    Follow one run until it finishes.

    free
  • ezeo articles request [--count N]

    Start N article runs for this ISO week.

    pipeline
  • ezeo articles approve <run> --hash <content_hash>

    Approve at the human article gate, using the content_hash you read.

    pipeline
  • ezeo articles approve-images <run> --hash <image_set_hash>

    Approve at the human image gate, using the image_set_hash.

    pipeline
  • ezeo articles retry <run> --reason "…"

    Hand a parked or failed run back to the pipeline.

    pipeline
  • ezeo 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.

    llm
  • ezeo cro audit [--url]

    Conversion-rate audit of one page: seven category scores, findings and quick wins.

    scrape
  • ezeo cro hypotheses [--status s] [--limit N]

    The project's A/B test hypotheses, highest ICE score first, with page, success metric and status.

    free
  • ezeo cro brief <id>

    The design-ready brief for one A/B hypothesis: page evidence plus handoff steps for Figma or Paper.

    free
  • ezeo crawl status

    The latest full-site crawl: phase, pages, links and findings (superadmin).

    free
  • ezeo crawl findings [--type t] [--limit N]

    The pages behind those counts: broken links, 404s, duplicates and noindex.

    free
  • ezeo 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.

    free
  • ezeo keywords suggest [--count] [--focus]

    AI keyword suggestions, each with its reason.

    llm
  • ezeo keywords research <mode> [--keywords|--domain]

    DataForSEO Labs research in several modes, for keywords or a domain.

    dfs
  • ezeo keywords volume <kw…>

    Google search volume for named keywords.

    dfs
  • ezeo keywords trends <kw…>

    Google search trend for named keywords.

    dfs
  • ezeo rankings check [--keywords|--due|--all]

    Live SERP check, priced per keyword.

    dfs
  • ezeo backlinks <mode> [--competitor] [--refresh]

    Backlink profile in several modes; --refresh is what forces a fetch.

    dfs
  • ezeo 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 mcp

    Serve every non-meta command to an MCP client over stdio.

    free
  • ezeo setup claude|codex|grok|gemini|cursor

    Register "ezeo mcp" with a supported coding agent; the supported agents are shown in the usage.

    free
  • ezeo help [--agent]

    List every command with its cost; --agent prints the full agent reference.

    free
  • ezeo skill install [--dry-run]

    Write the agent reference to ~/.claude/skills/ezeo/SKILL.md.

    free

Cost classes

  • free Reads data Ezeo already holds. Nothing is spent.
  • llm One OpenRouter call, billed to the project.
  • dfs DataForSEO spend against the shared monthly caps.
  • scrape One Firecrawl page scrape, billed to Ezeo.
  • pipeline Starts or resumes article runs, each with LLM and image spend.

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-run

Install 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-run

Over 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.

Stuck? Write to us. A person answers.llms.txtcli.md