Skip to main content
Glama
BertPC

SyteCheck MCP Server

README.md
# SyteCheck MCP Server

Run website audits from Claude, ChatGPT, Cursor, or any other MCP client, and get
the findings back as text you can act on.

[SyteCheck](https://sytecheck.app) scans a page across ten dimensions — HTML
validity, SEO, broken links, accessibility (WCAG 2.2 AA via axe-core), performance
(a real Lighthouse run), security headers, responsive layout, AI visibility,
content freshness, and an AI critique of the visual design — and returns a scored,
plain-language report.

**A free account works.** No card, no trial clock: the free tier includes three
scans a month across three categories, which is enough to wire this up and see a
real report before deciding whether to pay for more.

## Quickstart

1. **Create an account** at [sytecheck.app](https://sytecheck.app) and verify your
   email.
2. **Mint a key** at Account → API keys. Choose **`scans:read` only** if you want
   the model to read existing scans but never spend quota. The secret is shown
   once.
3. **Add the server** to your client, using one of the recipes below.

### Claude Code

```bash
claude mcp add sytecheck --env SYTECHECK_API_KEY=sck_your_key_here \
  -- npx -y @ascentws/sytecheck-mcp
```

### Claude Desktop

Edit `claude_desktop_config.json` (Settings → Developer → Edit Config):

```json
{
  "mcpServers": {
    "sytecheck": {
      "command": "npx",
      "args": ["-y", "@ascentws/sytecheck-mcp"],
      "env": { "SYTECHECK_API_KEY": "sck_your_key_here" }
    }
  }
}
```

### Cursor

Add to `.cursor/mcp.json` in your project, or the global equivalent:

```json
{
  "mcpServers": {
    "sytecheck": {
      "command": "npx",
      "args": ["-y", "@ascentws/sytecheck-mcp"],
      "env": { "SYTECHECK_API_KEY": "sck_your_key_here" }
    }
  }
}
```

### Gemini CLI / Antigravity CLI

Add to `~/.gemini/settings.json` (or the Antigravity equivalent):

```json
{
  "mcpServers": {
    "sytecheck": {
      "command": "npx",
      "args": ["-y", "@ascentws/sytecheck-mcp"],
      "env": { "SYTECHECK_API_KEY": "sck_your_key_here" }
    }
  }
}
```

### OpenAI Agents SDK

```python
from agents import Agent
from agents.mcp import MCPServerStdio

sytecheck = MCPServerStdio(
    params={
        "command": "npx",
        "args": ["-y", "@ascentws/sytecheck-mcp"],
        "env": {"SYTECHECK_API_KEY": "sck_your_key_here"},
    }
)

agent = Agent(
    name="Site auditor",
    instructions="Audit sites with SyteCheck and explain what to fix.",
    mcp_servers=[sytecheck],
)
```

Then ask: _"Scan https://example.com and tell me what to fix first."_

## Tools

| Tool                | What it does                                                                    |
| ------------------- | ------------------------------------------------------------------------------- |
| `run_scan`          | Submit a URL and wait for the report. **Spends quota.**                         |
| `get_scan_report`   | Full findings for a scan id — the way to collect a scan `run_scan` left running |
| `list_scans`        | Scan history, newest first, with filters                                        |
| `get_scan_trends`   | Score history per URL across repeat scans                                       |
| `list_categories`   | What SyteCheck can check, and what your plan includes                           |
| `get_account_usage` | Scans remaining this month, and when the quota resets                           |

There is also a **`scan-and-remediate` prompt** that scans a URL and turns the
findings into a prioritized fix plan.

### A note on cost

`run_scan` is the only tool that spends anything, and it spends real money: a scan
opens a browser, runs Lighthouse, and calls a vision model. It is marked
non-read-only so your client asks before running it, and its description tells the
model to check remaining quota first and not to re-scan an unchanged page. **On a
free account you have three scans a month** — an agent looping over `run_scan`
would exhaust that in one turn.

If you are handing a key to something unattended, mint a `scans:read` key. It
cannot create scans at all.

## Configuration

| Variable                     | Default                     | Purpose                                              |
| ---------------------------- | --------------------------- | ---------------------------------------------------- |
| `SYTECHECK_API_KEY`          | _(required)_                | Your `sck_` API key                                  |
| `SYTECHECK_API_URL`          | `https://api.sytecheck.app` | API base URL                                         |
| `SYTECHECK_WAIT_TIMEOUT_MS`  | `60000`                     | How long `run_scan` waits before returning a scan id |
| `SYTECHECK_POLL_INTERVAL_MS` | `3000`                      | Gap between status checks while waiting              |

Note the API host is **`api.sytecheck.app`**, not `sytecheck.app` — the latter
serves the web app and answers API paths with its "page not found" screen.

## Using the API directly

The MCP server is a thin client over a plain HTTP API you can call yourself.

- **[docs/API.md](docs/API.md)** — the full developer guide: authentication,
  submitting scans, polling, webhooks and their signature verification, rate
  limits, and versioning.
- **[public-openapi.json](public-openapi.json)** — the OpenAPI 3.1 spec, for
  generating a client.
- **[examples/](examples/)** — runnable clients in curl, Python, Node, Java, and
  C#, plus a webhook receiver that verifies the delivery signature.
- Interactive docs: [Swagger UI](https://api.sytecheck.app/api/docs) ·
  [ReDoc](https://api.sytecheck.app/api/redoc)

## Development

```bash
npm install
npm run build
npm test
npm run lint
```

To run against a local SyteCheck instance:

```bash
SYTECHECK_API_KEY=sck_… SYTECHECK_API_URL=http://localhost:8000 node dist/index.js
```

The server speaks JSON-RPC over stdin and stdout, so **nothing may be written to
stdout except protocol messages** — a stray `console.log` corrupts the stream and
the client disconnects with an unhelpful parse error. Diagnostics go to stderr.

## Security

See [SECURITY.md](SECURITY.md) for how the key is handled, what a leaked key can
and cannot do, and how to report a vulnerability.

## License

MIT — see [LICENSE](LICENSE). The licence covers this code; the SyteCheck name and
mark are trademarks of Ascent Web Solutions, and use of the service is governed by
its [Terms of Service](https://sytecheck.app/terms). See [TRADEMARK.md](TRADEMARK.md)
for the full terms.

TDQS

A4.3/5.0

Scored across 6 tools

Disambiguation5/5

Each tool targets a distinct concern: running scans, fetching reports, listing scans, viewing trends, listing categories, and checking quota. There is no overlap between them.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern: run_scan, get_scan_report, list_scans, get_scan_trends, list_categories, get_account_usage. The pattern is uniform and predictable.

Tool Count5/5

Six tools is well-scoped for a scan-oriented service: the set covers the full workflow without redundancy or bloat. Each tool earns its place.

Completeness4/5

The surface covers the full scan lifecycle: quota check, category discovery, scan initiation, result retrieval, history listing, and trend analysis. A minor gap is the lack of a cancel/delete operation, but that is not essential for the domain.

Maintenance

ActivityMaintained
ResponsivenessNo issues