SyteCheck MCP Server
# 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
Scored across 6 tools
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.
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.
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.
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.