Atlas / MCP servers / jrpool / kilotest

kilotestCAUTION

mcp/jrpool/kilotest

An ensemble testing service with a focus on accessibility

Verdict
CAUTION
Grade
C
Trust score
78 /100
Exposed tools
12 12r · 0w · 0d
Transport
streamable-http
License
MIT
Stars
4
01

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:

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

Read from source at commit c7ce1778ca69OBSERVED · 2026-10-11
02

Connect

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-code
claude mcp add kilotest --env ALERT_API_KEY=${ALERT_API_KEY} --env AUTH_CODE=${AUTH_CODE} --env KEY=${KEY} -- npx -y @jrpool/[email protected]
claude-desktop
{
  "mcpServers": {
    "kilotest": {
      "command": "npx",
      "args": [
        "-y",
        "@jrpool/[email protected]"
      ],
      "env": {
        "ALERT_API_KEY": "${ALERT_API_KEY}",
        "AUTH_CODE": "${AUTH_CODE}",
        "KEY": "${KEY}"
      }
    }
  }
}
03

Exposed tools (12)

12 read · 0 write · 0 destructive.

ToolRiskDescription
awaitTestread
getKilotestOverviewread
getReportread
listDiagnosesread
listIssuesread
listPagesread
listViolatorsread
orderNewTestread
orderRetestread
requestFeatureread
requestNewTestread
requestRetestread
04

Trust audit

CAUTIONgrade C · trust 78/100 Install with care. The audit found things worth knowing before you trust its output.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codePASS
L2Instruction surface (what it tells the agent)WARN
L3Class-specific surfacePASS
L4Behavioural (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)

MEDIUMPrompt injection · prompt.hidden_style · CWE-94, CWE-1427
docs/IDEAS.md:52
<span style="display:none">[^1_12][^1_13][^1_14][^1_15][^1_16][^1_17][^1_18][^1_19][^1_20]</span>
MEDIUMPrompt injection · prompt.hidden_style · CWE-94, CWE-1427
docs/IDEAS.md:135
<span style="display:none">[^2_15][^2_16][^2_17][^2_18][^2_19][^2_20]</span>
MEDIUMPrompt injection · prompt.hidden_style · CWE-94, CWE-1427
docs/IDEAS.md:201
<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>
MEDIUMPrompt injection · prompt.hidden_style · CWE-94, CWE-1427
docs/IDEAS.md:279
<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>
MEDIUMPrompt injection · prompt.hidden_style · CWE-94, CWE-1427
docs/IDEAS.md:377
<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>
LOWInventory / provenance · inv.hidden_file · CWE-1104
.markdownlint-cli2.jsonc
.markdownlint-cli2.jsonc
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
web/ai0BalanceForm/index.ts:9
import {balancePath} from '../../balances.ts';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
web/ai0BalanceForm/index.ts:10
import {getJSON, isValidAuthCode, populateTemplate} from '../../util.ts';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
web/deleteNotesForm/deleteNotesForm.test.ts:15
const testDir = path.join(import.meta.dirname, '../../test/fixtures/deleteNotesForm');
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
web/deleteNotesForm/index.ts:16
} from '../../util.ts';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
web/deleteNotesForm/index.ts:47
path.join(import.meta.dirname, '../../db/comments/tutorialWeb.json')
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
util.test.ts:390
assert.equal(await isAllowedTarget('https://example.com/page', fakeLookup('169.254.169.254')), false);
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
api/orderNewTest.test.ts:93
const body = await response(['Internal Page', 'https://192.168.1.1/page', 'A reason that is long enough.']);
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
api/orderNewTest.test.ts:103
t.mock.method(globalThis, 'fetch', async () => ({url: 'https://10.0.0.5/page'}) as Response);
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
api/requestNewTest.test.ts:87
const body = await response(['Internal Page', 'https://192.168.1.1/page', 'A reason that is long enough.']);
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
api/requestNewTest.test.ts:98
t.mock.method(globalThis, 'fetch', async () => ({url: 'https://10.0.0.5/page'}) as Response);
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
docs/IDEAS.md:1815
curl -v http://127.0.0.1:3000
LOWObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
docs/SERVICE.md:190
kilotest.com,resend._domainkey.kilotest.com,TXT,"p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDWjPkYLQ+xYcmMRODdXoXl7QTXK5TkhNQXjl5HcPvk1D5A5eqtjuw17lgZOQy1wiUq8BGId+Iq3BWO32kYTJo+lWMQJ8/Me4M0xQ0qaYPmtTJ9c
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
package.json
@modelcontextprotocol/sdk, dotenv, ipaddr.js, testaro-issues, zod, @eslint/css, @eslint/js, @eslint/json
Why it matters. 21 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
docs/BACKLOG.md:70
- **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
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
docs/SERVICE.md:444
Kilotest uses [Resend](https://resend.com/) as its transactional email delivery service. Resend is configured through the environment variables above.
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
web/privacy/index.html:16
<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
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
web/privacy/index.html:28
<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
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
INFOPrompt injection · prompt.authority_framing · CWE-94, CWE-1427
web/tutorialWeb/index.html:268
<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&rsquo;t have full access to that web pag

Gates applied: no_behavioural_pass.

Audited 2026-10-11 · audit v0.4.1 · source sha c7ce1778ca69full audit observations/trust-audit/mcp-server/jrpool__kilotest.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-11c7ce1778ca69CAUTIONC78first audit
06

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.

Advertisement