Skip to main content
Glama
README.md
# visprobe

How does an answer engine see your site? visprobe reads a site
the way one does — the crawler policy in `robots.txt`, the
identity files an engine looks for, the signals in the page
itself — and, through the hosted analyzer, whether Claude,
ChatGPT, Gemini and Perplexity actually name the site.

Three tools run entirely on your machine; seven forward to the
hosted analyzer at `https://inite.ai/api/mcp/analyzer`.

## Local tools (no account)

- `check_ai_access(url)` — which AI crawlers `robots.txt` lets
  in, split into the answer-engine crawlers (they fetch a page
  to answer a live question) and the training crawlers.
  Blocking the first kind is what makes a site invisible;
  blocking the second costs nothing. The robots rules are
  applied properly: the most specific user-agent group wins,
  the longest matching rule wins, `Allow` breaks a tie.
- `check_identity_files(url)` — which of the ten identity
  files exist at the site root: `/llms.txt`, `/llms-full.txt`,
  `/ai.txt`, `/ai.json`, `/identity.json`, `/agent.json`,
  `/.well-known/ai.json`, `/.well-known/llms.txt`,
  `/.well-known/agent.json`, `/.well-known/ai-plugin.json`.
  A file exists when it is served with a 2xx status.
- `check_page_signals(url)` — the page's title, meta
  description, canonical, hreflang alternates, and the
  Schema.org types in its JSON-LD.

## Remote tools (hosted analyzer)

- `check_identity(url)` — the identity reading with a score out
  of 100 and what it says to fix. No model asked.
- `visibility_fixes(url)` — the fix plan, most important first.
- `compare_sites(url, other)` — your site and a competitor's,
  read the same way, side by side.
- `visibility_history(url)` — how the reading moved over time.
- `analyze_site(url)` — starts the audit that also asks the
  answer engines; returns a `run_id`.
- `get_analysis(run_id)` — progress, then the score out of 100
  and what to fix first.
- `my_reports()` — signed in: your audits, newest first.

Remote calls are forwarded as JSON-RPC `tools/call` to the
analyzer endpoint. Set `INITE_MCP_URL` to point at a different
endpoint and `INITE_TOKEN` to send a Bearer token. Without an
account the open tools answer under a per-address allowance
(two a day, per the upstream service's terms).

## CLI

```bash
npx @reneturcios/visprobe check-ai-access stripe.com
npx @reneturcios/visprobe check-identity-files stripe.com
npx @reneturcios/visprobe check-page-signals stripe.com/pricing
npx @reneturcios/visprobe --version
```

Output is the report as JSON. Exit codes: `0` on success, `1`
on a runtime error (including an unreachable site), `2` on a
usage error.

## MCP server

```bash
npx -y @reneturcios/visprobe mcp
```

MCP client config:

```json
{
  "mcpServers": {
    "visprobe": {
      "command": "npx",
      "args": ["-y", "@reneturcios/visprobe", "mcp"]
    }
  }
}
```

## Docker

```bash
docker run -i ghcr.io/cloudcorprecords/visprobe
docker run --rm ghcr.io/cloudcorprecords/visprobe check-page-signals example.com
```

## Development

```bash
npm install
npm run build   # tsc -> dist/
npm test        # tsx --test test/*.test.ts (fake fetch, no network)
npm run dev     # run the CLI from source
```

## License

MIT — Copyright (c) 2026 Rene Turcios