kilotestCAUTION
An ensemble testing service with a focus on accessibility
Overview
From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.
[](https://www.npmjs.com/package/@jrpool/kilotest) [](LICENSE) [](https://registry.modelcontextprotocol.io/v0/servers?search=kilotest) [](https://github.com/jrpool/kilotest/stargazers) [](https://tensorblock.co/mcp/servers/github-jrpool-kilotest-f518ba36)
An ensemble testing and reporting service for front-end web quality
Features
This application uses an ensemble of 12 rule engines to test web pages for front-end quality (i.e. accessibility, usability, and standards conformity).
The testing paradigm employed by Kilotest is discussed in these papers:
- How to run a thousand accessibility tests
- Testaro: Efficient Ensemble Testing for Web Accessibility
- Accessibility Metatesting: Comparing Nine Testing Tools
Kilotest acts as a web server for human users, an MCP server for AI platforms, and an API for programmatic access.
Testing for Kilotest is performed by one or more workers (testing agents) that obtain jobs from Kilotest, perform them, and send reports of the results back to Kilotest. Those agents are instances of the Testaro package. Thus, the pages that Kilotest tests need not be on the public Internet. They need only be reachable by the Testaro workers that do the testing for Kilotest. So, one or more Testaro workers running inside a private intranet can test internal pages, as well as any external ones reachable
c7ce1778ca69OBSERVED · 2026-10-11Connect
Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.
claude mcp add kilotest --env ALERT_API_KEY=${ALERT_API_KEY} --env AUTH_CODE=${AUTH_CODE} --env KEY=${KEY} -- npx -y @jrpool/[email protected]{
"mcpServers": {
"kilotest": {
"command": "npx",
"args": [
"-y",
"@jrpool/[email protected]"
],
"env": {
"ALERT_API_KEY": "${ALERT_API_KEY}",
"AUTH_CODE": "${AUTH_CODE}",
"KEY": "${KEY}"
}
}
}
}Exposed tools (12)
12 read · 0 write · 0 destructive.
| Tool | Risk | Description |
|---|---|---|
awaitTest | read | |
getKilotestOverview | read | |
getReport | read | |
listDiagnoses | read | |
listIssues | read | |
listPages | read | |
listViolators | read | |
orderNewTest | read | |
orderRetest | read | |
requestFeature | read | |
requestNewTest | read | |
requestRetest | read |
Trust audit
CAUTIONgrade C · trust 78/100 Install with care. The audit found things worth knowing before you trust its output.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | PASS |
| L1 | Static analysis of the code | PASS |
| L2 | Instruction surface (what it tells the agent) | WARN |
| L3 | Class-specific surface | PASS |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- declared (4 observation(s))
- Network
- none-observed
- Shell
- declared (1 observation(s))
- Dependencies
- not all pinned
- Secrets in source
- none-found
Findings (24)
<span style="display:none">[^1_12][^1_13][^1_14][^1_15][^1_16][^1_17][^1_18][^1_19][^1_20]</span>
<span style="display:none">[^2_15][^2_16][^2_17][^2_18][^2_19][^2_20]</span>
<span style="display:none">[^3_10][^3_11][^3_12][^3_13][^3_14][^3_15][^3_16][^3_17][^3_18][^3_19][^3_20][^3_7][^3_8][^3_9]</span>
<span style="display:none">[^4_11][^4_12][^4_13][^4_14][^4_15][^4_16][^4_17][^4_18][^4_19][^4_20]</span>
<span style="display:none">[^5_10][^5_11][^5_12][^5_13][^5_14][^5_15][^5_16][^5_17][^5_18][^5_19][^5_20][^5_8][^5_9]</span>
.markdownlint-cli2.jsonc
import {balancePath} from '../../balances.ts';import {getJSON, isValidAuthCode, populateTemplate} from '../../util.ts';const testDir = path.join(import.meta.dirname, '../../test/fixtures/deleteNotesForm');
} from '../../util.ts';
path.join(import.meta.dirname, '../../db/comments/tutorialWeb.json')
assert.equal(await isAllowedTarget('https://example.com/page', fakeLookup('169.254.169.254')), false);const body = await response(['Internal Page', 'https://192.168.1.1/page', 'A reason that is long enough.']);
t.mock.method(globalThis, 'fetch', async () => ({url: 'https://10.0.0.5/page'}) as Response);const body = await response(['Internal Page', 'https://192.168.1.1/page', 'A reason that is long enough.']);
t.mock.method(globalThis, 'fetch', async () => ({url: 'https://10.0.0.5/page'}) as Response);curl -v http://127.0.0.1:3000
kilotest.com,resend._domainkey.kilotest.com,TXT,"p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDWjPkYLQ+xYcmMRODdXoXl7QTXK5TkhNQXjl5HcPvk1D5A5eqtjuw17lgZOQy1wiUq8BGId+Iq3BWO32kYTJo+lWMQJ8/Me4M0xQ0qaYPmtTJ9c
@modelcontextprotocol/sdk, dotenv, ipaddr.js, testaro-issues, zod, @eslint/css, @eslint/js, @eslint/json
- **MCP server usage**: `mcp.ts`’s `handleMCP` creates a new, stateless `McpServer` and `StreamableHTTPServerTransport` per POST request (no session ID), registers all 8 tools, and hands off to the SD
Kilotest uses [Resend](https://resend.com/) as its transactional email delivery service. Resend is configured through the environment variables above.
<p>This policy applies to the Kilotest web site, API, and MCP server at <code>kilotest.com</code>, and does not apply to any other deployment of Kilotest. Kilotest does not require an account, does no
<p>Kilotest sends its maintainer an email notice, through the transactional email service <a href="https://resend.com/">Resend</a>, when a submission arrives. The notice contains the submission. The s
<p>The most commonly used AI agents are powered by large language models. Such a model is trained to give you answers that are highly probable. <q>Sorry, I don’t have full access to that web pag
Gates applied: no_behavioural_pass.
c7ce1778ca69full audit observations/trust-audit/mcp-server/jrpool__kilotest.json · Report an issue / request a re-scanAudit history
Every audit this server has had. A grade with a past is a grade somebody is still checking.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-11 | c7ce1778ca69 | CAUTION | C | 78 | first audit |
Questions
What is the kilotest MCP server?
An ensemble testing service with a focus on accessibility
What tools does kilotest expose?
12 in total: 12 read-only, 0 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.
Is kilotest safe to connect to an agent?
With care. The audit graded it C (78/100) and found 24 things worth knowing before you trust this server, listed below with the exact line each was found on.
What credentials does kilotest need?
It reads ALERT_API_KEY, AUTH_CODE and KEY from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.
How does kilotest run?
It speaks streamable-http, so it runs as a service you connect to over the network. It is published on npm as @jrpool/kilotest at 59.0.1.
How current is this page?
The grade is for one exact copy of the source (c7ce1778ca69), read on 2026-10-11. The repository is watched and re-audited when it changes.