The MCP server
Let an agent run the audit itself - four tools on stdio, the same pipeline, the same cost guard.
saylent mcp runs a Model Context Protocol
server on stdio, so an agent can audit a brand, verify a fix, check bot access
and read an existing report itself. It is the same pipeline the CLI runs: same
key resolution, same cost estimate before the spend, same max_usd refusal,
same summary blocks - handed to the agent as JSON instead of rendered to HTML.
The four tools
| Tool | What it does | Cost |
|---|---|---|
audit | Full audit of a domain. Writes run.json, report.html, report.md; returns the verdict, the recommended band, the summary blocks, the file paths and the real cost | Your own credits: about $0.60 to $1.20 with four engines (smoke; our recorded runs cost $0.93 and $1.11) or $3.70 to $5.50 (full) |
verify | Re-asks the frozen questions of an existing run.json and writes movement.html | Your own credits: about the same as the audit it re-runs |
gate_check | robots.txt per bot class, a live per-user-agent probe, JSON-LD, meta directives | $0 - no keys, no model calls |
read_report | The summary blocks of a run.json already on disk, whole or one named section | $0 - no network, no model calls |
Every tool states its cost range in its own description, so the agent knows
before it calls. audit and verify check the estimate against max_usd and
the daily spend cap before anything reaches a provider, and refuse with the
same message the CLI prints.
audit and verify arguments
audit and verify are built from ONE shared argument schema, the same one
saylent audit/saylent verify's own flags are generated from (see the CLI
reference's --flag column) - the two surfaces can never accept a different
argument set. Only domain is required; everything else is optional. Pass
dry_run: true on audit for a $0, no-keys, no-network preflight: the
question set it would ask and the cost estimate, nothing sent to any provider.
| Argument | Tool(s) | CLI flag | Description |
|---|---|---|---|
domain | audit | (positional) | The brand's domain, for example example.com |
brand | audit | --brand | Brand name (default: the domain) |
competitors | audit | --competitors | Competitor domains/names |
profile | audit | --profile | smoke (default, 6 questions) or full (23 questions) |
engines | audit | --engines | Which answer engines to ask: chatgpt, claude, gemini, perplexity |
questions_file | audit | --questions | Path to a run.json bundle, a questions.json (from saylent questions), or a text file with one question per line, to reuse instead of generating a new set |
questions | audit | (none - MCP only) | Inline question rows to ask instead of generating a set ({id?, type?, text, samples?}). The CLI takes a file path via the same --questions flag (questions_file above) |
samples | audit, verify | --samples | How many times each scored question is asked (1-5) |
judge | audit, verify | --judge | Judge model; its provider family is inferred from the name |
judge_family | audit, verify | --judge-family | anthropic | openai, when the judge model name is ambiguous |
models | audit, verify | --model | Per-role model overrides: brand, drafter, chatgpt, claude, gemini, perplexity |
locale | audit, verify* | --locale | Translate the generated question set into this language once (e.g. "de", "pt-BR"), via the drafter model. No effect when a question set is reused (questions_file/questions) |
user_agent | audit, verify* | --user-agent | Override the crawler's User-Agent for this run's fetches (crawl, corpus, domain checks) |
max_pages | audit, verify* | --max-pages | Cap how many crawled pages feed the brand model and corpus (1-200) |
allow_private | audit, verify* | --allow-private | Allow the audited site's own host (and its www/apex sibling) to resolve to a private/internal address, for a staging server on your own network. Never on by default |
skip | audit, verify* | --skip | Skip costly stages: drafts, corpus, gates ({drafts,corpus,gates} or a list of stage names) |
max_usd | audit, verify | --max-usd | Refuse to run if the high cost estimate exceeds this many dollars |
out_dir | audit | --out | Output directory (default: ./<domain>/<YYYY-MM-DD>/) |
format | audit | --format | Which report files to write: md, html, json (default: all three) |
dry_run | audit | --dry-run | Print the plan, the questions it would ask (template defaults, $0, no crawl) and the cost estimate. Spends nothing |
no_brand_model | audit | --no-brand-model | Documented for parity with saylent questions; a dry run already always previews with template defaults, so this has no further effect on audit |
bundle_path | verify | (positional) | Path to the baseline run.json (or the directory containing it) |
* Accepted on verify for parity with audit (a client that always passes
the same argument set to both tools shouldn't error), but have no effect: a
verify re-asks the SAME frozen questions and never crawls, fetches corpus,
checks gates, or generates a fresh question set.
read_report's section argument also accepts "questions", returning the
run's frozen question set alongside the Brief's "hero" and card sections.
Keys are never tool arguments. There is no key parameter on any tool. The
server resolves provider keys exactly like the CLI: environment variables, then
a .env in its working directory, then ~/.saylent/config.json. Put them in
the server definition's env block, or run saylent keys once and leave the
definition clean.
Claude Code
claude mcp add saylent -- npx saylent mcpThe server inherits your shell environment, so OPENAI_API_KEY and
ANTHROPIC_API_KEY exported in your profile (or already saved by
saylent keys) are picked up automatically - no key ever needs to go on the
command line, where your shell history would keep it. To pin keys to this
server only, run saylent keys set openai / saylent keys set anthropic
once so ~/.saylent/config.json holds them, or add them to this server's own
config entry as an env block, the same shape the Claude Desktop and Cursor
examples below use.
Claude Desktop
Edit claude_desktop_config.json (macOS:
~/Library/Application Support/Claude/claude_desktop_config.json, Windows:
%APPDATA%\Claude\claude_desktop_config.json), then restart the app:
{
"mcpServers": {
"saylent": {
"command": "npx",
"args": ["-y", "saylent", "mcp"],
"env": {
"OPENAI_API_KEY": "sk-...",
"ANTHROPIC_API_KEY": "sk-ant-..."
}
}
}
}Cursor
Same shape, in ~/.cursor/mcp.json (every project) or .cursor/mcp.json (this
project only):
{
"mcpServers": {
"saylent": {
"command": "npx",
"args": ["-y", "saylent", "mcp"],
"env": {
"OPENAI_API_KEY": "sk-...",
"ANTHROPIC_API_KEY": "sk-ant-..."
}
}
}
}What you say to the agent
Free, ask any time:
Use saylent to gate-check example.com and tell me which AI bots are blocked.
Read the saylent report in ./example.com/2026-09-09/ and summarize the "who wins instead" section.
These two spend your own provider credits: about $0.60 to $1.20 with four engines for a smoke audit (our recorded runs cost $0.93 and $1.11) and about $3.70 to $5.50 for a full one. Say the profile you want and set a ceiling:
Run a saylent smoke audit of example.com with max_usd 1, then tell me the verdict and the top three fixes.
Ship the JSON-LD fix, then run saylent verify on ./example.com/2026-09-09/run.json with max_usd 1 and tell me what moved.
A long audit narrates itself: the server streams its stages (crawl, brand model, questions, engines, judge, cited pages, site gates, fixes, score) as MCP log notifications while it runs.