@jrpool/kilotest 41.0.0 → 42.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,12 @@
1
1
  {
2
2
  "permissions": {
3
3
  "allow": [
4
- "Exec(git status)"
4
+ "Exec(git status)",
5
+ "Exec(git log)",
6
+ "Exec(cat)",
7
+ "Exec(ls)",
8
+ "Exec(find)",
9
+ "Exec(git show)"
5
10
  ]
6
11
  }
7
12
  }
@@ -0,0 +1,57 @@
1
+ name: Publish to MCP Registry
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ paths:
7
+ - 'server.json'
8
+ - 'api/version.js'
9
+
10
+ jobs:
11
+ publish:
12
+ runs-on: ubuntu-latest
13
+ permissions:
14
+ id-token: write # Required for GitHub OIDC authentication with the MCP Registry
15
+ contents: read
16
+
17
+ steps:
18
+ - name: Checkout code
19
+ uses: actions/checkout@v7
20
+
21
+ - name: Set Node.js version
22
+ uses: actions/setup-node@v4
23
+ with:
24
+ node-version: '>=22.12.0'
25
+
26
+ - name: Verify server.json version matches api/version.js
27
+ run: |
28
+ FILE_VERSION=$(node -e "console.log(require('./api/version').version)")
29
+ JSON_VERSION=$(node -e "console.log(require('./server.json').version)")
30
+ if [ "$FILE_VERSION" != "$JSON_VERSION" ]; then
31
+ echo "::error::server.json version ($JSON_VERSION) does not match api/version.js version ($FILE_VERSION)"
32
+ exit 1
33
+ fi
34
+ echo "Versions match: $FILE_VERSION"
35
+
36
+ - name: Install mcp-publisher
37
+ run: |
38
+ set -euo pipefail
39
+ OS="$(uname -s | tr '[:upper:]' '[:lower:]')"
40
+ ARCH="$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/')"
41
+ ASSET_NAME="mcp-publisher_${OS}_${ARCH}.tar.gz"
42
+ RELEASE_JSON="$(curl -fsSL https://api.github.com/repos/modelcontextprotocol/registry/releases/latest)"
43
+ EXPECTED_SHA256="$(echo "$RELEASE_JSON" | jq -r --arg name "$ASSET_NAME" '.assets[] | select(.name == $name) | .digest' | sed 's/^sha256://')"
44
+ [ -n "$EXPECTED_SHA256" ]
45
+ curl -fsSL -o "$ASSET_NAME" "https://github.com/modelcontextprotocol/registry/releases/latest/download/${ASSET_NAME}"
46
+ echo "${EXPECTED_SHA256} ${ASSET_NAME}" | sha256sum -c -
47
+ tar xz -f "$ASSET_NAME" mcp-publisher
48
+ chmod +x ./mcp-publisher
49
+
50
+ - name: Authenticate to MCP Registry
51
+ run: ./mcp-publisher login github-oidc
52
+
53
+ - name: Validate server.json
54
+ run: ./mcp-publisher validate
55
+
56
+ - name: Publish to MCP Registry
57
+ run: ./mcp-publisher publish
package/README.md CHANGED
@@ -47,4 +47,16 @@ See the `SERVICE.md` file for instructions on how to make Kilotest a service.
47
47
 
48
48
  ## Using Kilotest as an AI tool
49
49
 
50
- See the `AI-TOOLS.md` file for information about the configuration of Kilotest as a collection of AI tools.
50
+ Kilotest is not only a web application but also an API and an MCP server. AI platforms and models can use Kilotest via those interfaces.
51
+
52
+ The URL for models using the MCP server is `http://kilotest.com/mcp`. The MCP server is listed at these services:
53
+
54
+ - [Smithery](https://smithery.ai/servers/pool/kilotest)
55
+ - [Glama](https://glama.ai/mcp/connectors/com.kilotest/kilotest)
56
+
57
+ There is additional documentation at:
58
+
59
+ - [AI-TOOLS.md](AI-TOOLS.md)
60
+ - [llms.txt](llms.txt)
61
+ - [llms-full.txt](llms-full.txt)
62
+ - [QAI](https://kilotest.com/qai)
package/api/version.js ADDED
@@ -0,0 +1,8 @@
1
+ /*
2
+ version.js
3
+ Single source of truth for the version of the Kilotest API and MCP tool contract, consumed by mcp.js and scripts/generate-openapi.js.
4
+ */
5
+
6
+ // CONSTANTS
7
+
8
+ exports.version = '2.1.0';
package/docs/AI-TOOLS.md CHANGED
@@ -43,9 +43,11 @@ The internal changes that have been made in the Kilotest codebase to support the
43
43
  The external actions that have been taken to support the use of Kilotest as a collection of AI tools are:
44
44
 
45
45
  - A [pull request](https://github.com/public-apis/public-apis/pull/6346/changes) to add Kilotest to the list of public APIs in the `public-apis` repository.
46
- - A [request](https://rapidapi.com/studio/api_91f2ce07-2572-48bd-a34d-ff01ed6cd039/publish/general) to add Kilotest to the Rapid API Hub.
47
46
  - An [issue](https://github.com/APIs-guru/openapi-directory/issues/2677) to add Kilotest to `openapi-directory`.
48
47
  - A [pull request](https://github.com/w3c/wai-evaluation-tools-list/pull/1153) to add Kilotest to the WAI evaluation tools list.
48
+ - Registration of Kilotest with the [Smithery](https://smithery.ai/servers/pool/kilotest) MCP server registry.
49
+ - Registration of Kilotest with the [Glama](https://glama.ai/mcp/connectors/com.kilotest/kilotest) MCP server registry.
50
+ - Registration of Kilotest with the [RapidAPI](https://rapidapi.com/jrpool/api/kilotest/playground/apiendpoint_0f03577a-ff9a-472a-a0ed-533bd198981a) Hub.
49
51
  - Deployment of an MCP server in HTTP mode on the Kilotest service host.
50
52
  - Configuration of Claude Desktop on the local development host and the `claude.ai` web application to connect Claude Desktop models to the Kilotest MCP server. The configuration was performed in the UI of each platform with the addition of Kilotest as a _connector_. The user used the `Customize/Connectors/Add connector/Add custom connector` interface, providing these data before activating the `Add` button:
51
53
 
package/docs/SERVICE.md CHANGED
@@ -203,7 +203,7 @@ kilotest.com {
203
203
  }
204
204
  @allowedPOST {
205
205
  method POST
206
- path /mcp /retestRec.html/* /testRec.html /recAction.html /reannotate.html /wcagRenew.html /api/* /worker/* /tutorialComment.html
206
+ path /mcp /retestRec.html/* /testRec.html /recAction.html /reannotate.html /wcagRenew.html /api/* /tutorialComment.html
207
207
  }
208
208
  # Respond to OPTIONS requests.
209
209
  @allowedOPTIONS method OPTIONS
package/index.html CHANGED
@@ -15,6 +15,7 @@
15
15
  "name": "Kilotest",
16
16
  "sameAs": "https://github.com/jrpool/kilotest",
17
17
  "datePublished": "2025-10-14",
18
+ "dateModified": "2026-08-26",
18
19
  "applicationCategory": "Front-end quality (i.e. web accessibility, usability, and standards conformity) testing and reporting service",
19
20
  "isAccessibleForFree": true,
20
21
  "description": "Testing of web pages for front-end quality (i.e. web accessibility, usability, and standards conformity) with an ensemble of 10 rule engines and provision of results at selectable levels of detail.",
@@ -58,23 +59,30 @@
58
59
  <main>
59
60
  <h1>Kilotest</h1>
60
61
  <p>Kilotest performs more than a thousand tests on a web page.</p>
61
- <p>New to accessibility testing? <a href="/tutorial.html">Start with the tutorial.</a></p>
62
62
  <details>
63
63
  <summary>More than a thousand? Really?</summary>
64
64
  <h2>Ensemble testing</h2>
65
- <p>Kilotest does <strong>ensemble testing</strong> of web pages for <a href="https://www.w3.org/mission/accessibility/">accessibility</a>, usability, and conformity to HTML standards.</p>
65
+ <p>Kilotest does <strong>ensemble testing</strong> of web pages for <a href="https://www.w3.org/mission/accessibility/">accessibility</a>, usability, and standards conformity.</p>
66
66
  <p>Efficient testing <strong>first</strong> leverages <strong>automated rule engines</strong> and corrects the defects that they discover, <strong>then</strong> employs human testers.</p>
67
- <p>Choosing an automated rule engine is hard, because they <a href="https://www.w3.org/WAI/test-evaluate/tools/list/">are numerous</a> and <a href="https://arxiv.org/pdf/2304.07591">vary in what and how they test</a>.</p>
68
- <p><strong>Ensemble testing</strong>, instead of choosing a rule engine, combines multiple rule engines. It can discover more issues than single-rule-engine testing, and the rule engines can check one another&rsquo;s quality.</p>
67
+ <p>Choosing among the <a href="https://www.w3.org/WAI/test-evaluate/tools/list/">many automated rule engines</a> is hard, because they <a href="https://arxiv.org/pdf/2304.07591">vary in what and how they test</a>.</p>
68
+ <p><strong>Ensemble testing</strong>, instead of choosing only one, combines <strong>multiple rule engines</strong>. It can discover more issues than single-rule-engine testing, and the rule engines can check one another&rsquo;s quality.</p>
69
69
  <h2>The rule engines</h2>
70
70
  <p>The Kilotest ensemble is <a href="https://github.com/jrpool/testaro?tab=readme-ov-file#dependencies">10 rule engines</a> developed by teams in the USA, Canada, Denmark, Australia, and Portugal.</p>
71
71
  <p>The rule engines perform about 1,300 tests in total. <a href="https://medium.com/cvs-health-tech-blog/how-to-run-a-thousand-accessibility-tests-63692ad120c3">Open-source software</a> developed initially at CVS Health drives the rule engines, tries to weed out invalid results, and distills the findings into about 350 <q>issues</q>.</p>
72
- <h2>Status</h2>
73
- <p>Kilotest is a proof of concept, launched in October 2025 and being actively developed. Your suggestions, bug reports, and collaboration proposals are welcome! Post them on <a href="https://github.com/jrpool/kilotest/issues">GitHub</a> or email them to <a href="mailto:info@kilotest.com">info@kilotest.com</a>.</p>
74
- <p>In the current version, users can get results of already performed tests and can recommend new tests. Kilotest managers can approve recommendations.</p>
75
- <h2 id="a11y">Accessibility</h2>
76
- <p>Kilotest intends to be accessible. At a minimum, Kilotest intends to conform to the rules of the rule engines in the Kilotest ensemble. Those rules enforce various standards and best practices, including many success criteria of conformance levels AA and AAA of the <a href="https://www.w3.org/WAI/standards-guidelines/wcag/">Web Content Accessibility Guidelines (WCAG)</a>.</p>
77
- <p>Humans and automated agents encountering any accessibility barriers during the use of Kilotest are encouraged to report them on <a href="https://github.com/jrpool/kilotest/issues">GitHub</a> or by email to <a href="mailto:info@kilotest.com">info@kilotest.com</a>.</p>
72
+ <h2>Features</h2>
73
+ <p>With Kilotest, you can get results of already performed tests and propose web pages for testing. (Immediate testing on request may become available in a future version.)</p>
74
+ <h2>How to use Kilotest</h2>
75
+ <h3>If you are a human user on the web</h3>
76
+ <p>You can use Kilotest starting on this page.</p>
77
+ <p>If your main interest is accessibility, feel free to learn more about it with our <a href="/tutorial.html">tutorial</a>.</p>
78
+ <h3>If you are a human user of AI</h3>
79
+ <p>An AI assistant can use the Kilotest MCP server to give you precise answers about the front-end quality of a web page. If the AI assistant does not already have permission to use Kilotest, you can grant that permission. <a href="https://kilotest.com/qai/">Learn how to connect AI platforms to Kilotest</a>.</p>
80
+ <h3>If you are an AI agent or model</h3>
81
+ <p>Go to the <a href="/mcp">Kilotest MCP server</a>.</p>
82
+ <h3>If you are developing an application</h3>
83
+ <p>Your application can use the Kilotest API, which has an <a href="/openapi.yaml">OpenAPI specification</a>.</p>
84
+ <h2>Comments?</h2>
85
+ <p>Your suggestions, bug reports, and collaboration proposals are welcome! Post them on <a href="https://github.com/jrpool/kilotest/issues">GitHub</a> or email them to <a href="mailto:info@kilotest.com">info@kilotest.com</a>.</p>
78
86
  </details>
79
87
  <h2>What do you want to know?</h2>
80
88
  <ul class="nav">
package/index.js CHANGED
@@ -220,9 +220,7 @@ const getBasicAuth = request => {
220
220
  }
221
221
  return {id: decoded.slice(0, sepIndex), secret: decoded.slice(sepIndex + 1)};
222
222
  };
223
- // Gets the published name of the Testaro worker that made a request, or null if it is not
224
- // authenticated. The ID authenticates the worker and is never published; the name is a
225
- // non-secret label safe to write into job/report data and log messages.
223
+ // Gets the published name of a Testaro worker or null if not authenticated.
226
224
  const getAuthorizedWorkerName = request => {
227
225
  const credentials = getBasicAuth(request);
228
226
  if (credentials) {
package/llms-full.txt CHANGED
@@ -6,18 +6,18 @@ Kilotest is an application that performs ensemble testing of web pages for front
6
6
 
7
7
  ## What Kilotest does for language models
8
8
 
9
- Kilotest is deployed on the public Internet as a service at `kilotest.com`. Kilotest can test only web pages that can be accessed from the public Internet and that are not protected by authentication or other access controls. Kilotest has not implemented any mechanism for testing private, internal, password-protected, or otherwise restricted pages.
9
+ Kilotest is deployed on the public Internet as a service at `https://kilotest.com`. Kilotest can test only web pages that can be accessed from the public Internet and that are not protected by authentication or other access controls. Kilotest has not implemented any mechanism for testing private, internal, password-protected, or otherwise restricted pages.
10
10
 
11
- An LLM can, under some conditions, load web pages and use its knowledge to assess successes and failures of front-end quality. But such an assessment is almost always:
11
+ Without calling any tool, an LLM can, under some conditions, load web pages and use its knowledge to assess successes and failures of front-end quality. But such an assessment is almost always:
12
12
 
13
13
  - expensive, substituting inference for deterministic rule application
14
14
  - fragmentary, because of capability limitations, such as inability to run browsers and interact with web pages
15
15
  - inaccurate, because of the tendency to replace missing information with hallucinations
16
16
 
17
- To provide a more inexpensive, thorough, and accurate assessment, the agent could ask an ensemble of specialized rule engines to test the page. However, selecting and running such rule engines and consolidating their results is itself expensive and difficult. Kilotest assumes responsibility for these functions. Kilotest:
17
+ To provide a more inexpensive, thorough, and accurate assessment, the agent could, in principle, ask an ensemble of specialized rule engines to test the page. However, selecting and running such rule engines and consolidating their results is itself expensive and difficult, and most available rule engines are not callable as MCP tools. Kilotest assumes responsibility for assembling, integrating, and running several rule engines. Kilotest:
18
18
 
19
- - defines a tool that tests web pages for front-end quality
20
- - defines tools that report the test results
19
+ - defines an MCP tool that tests web pages for front-end quality
20
+ - defines MCP tools that report the test results
21
21
  - defines connectors to those tools, compatible with major AI platforms
22
22
 
23
23
  The tool that tests web pages for front-end quality has attributes that no other such tool has. It:
@@ -27,7 +27,7 @@ The tool that tests web pages for front-end quality has attributes that no other
27
27
  - combines the reports of the rule engines into a single integrated report
28
28
  - consolidates the 1000+ rules having 10 different naming systems into 300+ “issues” with a uniform naming system
29
29
 
30
- The tools that report test results extract from reports statistics and details at various levels of granularity, as required by an agent to fulfill particular requests.
30
+ The tools that report test results extract from reports statistics and details at various levels of granularity, as required by an agent to fulfill particular user requests.
31
31
 
32
32
  ## What Kilotest does **not** do for language models
33
33
 
@@ -48,7 +48,7 @@ The rule engines in the Kilotest ensemble take responsibility for determining wh
48
48
 
49
49
  In the marketplace for MCP servers that test for front-end quality, all servers other than that of Kilotest leverage at most 1 rule engine, most often `axe-core`. The Kilotest testing tool leverages `axe-core` plus 9 other rule engines. This has these main effects:
50
50
 
51
- - For web pages that have not yet been tested, a single-rule-engine MCP can provide faster results than Kilotest. A tool running only the `axe-core` tests can complete its work in about 5 seconds or less. The testing tool of Kilotest usually completes its work in 2 to 3 minutes, because all 10 rule engines are run, and some of the tests involve navigation and interaction with the page and LLM inference. Moreover, in its current alpha phase, the Kilotest testing tool allows users (both humans and models) to **recommend** new pages for testing but authorizes only Kilotest managers to make the tool proceed with the testing. The wait for manager action can take up to a day. A feature permitting immediate testing ordered by AI agents is planned, but, until it is implemented, Kilotest will be useful for not-yet-tested pages only in long-running workflows.
51
+ - For web pages that have not yet been tested, a single-rule-engine MCP can provide faster results than Kilotest. A tool running only the `axe-core` tests can complete its work in about 5 seconds or less. The testing tool of Kilotest usually completes its work in 2 to 3 minutes, because all 10 rule engines are run, and some of the tests involve navigation and interaction with the page and LLM inference. Moreover, Kilotest currently allows users (both humans and models) to **recommend** new pages for testing but authorizes only Kilotest managers to make the tool proceed with the testing. The wait for manager action can take up to a day. A feature permitting immediate testing ordered by AI agents is planned, but, until it is implemented, Kilotest will be useful for not-yet-tested pages only in long-running (multi-day) workflows.
52
52
  - For web pages about which reports are already available, Kilotest can provide faster results than a single-rule-engine MCP server, because Kilotest stores test results for subsequent retrieval. A retrieval from a Kilotest reporting tool can be completed in less than 2 seconds.
53
53
  - Kilotest results are more comprehensive than single-rule-engine MCP server results. Every rule engine provides limited coverage of front-end quality, so false negatives (missed defects) are more common with single-rule-engine MCP servers. This difference [has been documented in research](https://arxiv.org/pdf/2304.07591).
54
54
 
@@ -68,83 +68,90 @@ Kilotest offers a comprehensive suite of capabilities to users via its web UI:
68
68
  - [Get statistics about frequently reported issues across all pages](https://kilotest.com/issues.html)
69
69
  - [Get a list of the operations that Kilotest managers are authorized to request](https://kilotest.com/manage.html)
70
70
  - [Tutorial, “Accessibility testing strategies”](https://kilotest.com/tutorial.html)
71
+ - [Tutorial, “QAI tutorial”](https://kilotest.com/qai/)
71
72
 
72
73
  ### API
73
74
 
74
- Kilotest is implementing a richer suite of capabilities optimized for language models. In the specifications below, the term `report` refers to the records of one session in which a web page is tested.
75
+ In the specifications below, the term `report` refers to the records of one session in which a web page is tested.
75
76
 
76
- The implementation is currently in an alpha phase and offers these tools:
77
+ Kilotest offers these tools:
77
78
 
78
- - `summarizeQualityOfMatchingWebPages`
79
- - method: `POST`
80
- - purpose: summarize front-end quality test results from available reports about web pages whose descriptions or hostnames match those that you specify
81
- - path: `/api/target`
82
- - payload properties
83
- - `description of the web page`: all or part of a description of the page
84
- - `hostname of the web page`: all or part of the hostname of the page
85
- - `listAllAvailableReports`
79
+ - `listReports`
86
80
  - method: `GET`
87
81
  - purpose: list all available reports
88
- - path: `/api/reportList`
82
+ - path: `/api/listReports`
89
83
  - caveat: Cached results are likely to be stale and should not be used
90
- - `summarizeOneReport`
84
+ - `listIssues`
91
85
  - method: `GET`
92
- - purpose: summarize one report
93
- - path: `/api/reportFacts/{timeStamp}/{jobID}`
86
+ - purpose: list all issues in one report
87
+ - path: `/api/listIssues/{timeStamp}/{jobID}`
94
88
  - parameters
95
89
  - `timeStamp`: initial segment of report identifier
96
90
  - `jobID`: final segment of report identifier
97
- - source of parameters: response to a `listAllAvailableReports` request
98
- - `describeOneIssueFromOneReport`
91
+ - source of parameters: response to a `listReports` request
92
+ - `listViolators`
99
93
  - method: `GET`
100
- - purpose: provide details about one issue from one report
101
- - path: `/api/reportIssue/{issueID}/{timeStamp}/{jobID}`
94
+ - purpose: list all elements exhibiting one issue in one report
95
+ - path: `/api/listViolators/{issueID}/{timeStamp}/{jobID}`
102
96
  - parameters
103
97
  - `issueID`: identifier of the issue
104
98
  - `timeStamp`: initial segment of report identifier
105
99
  - `jobID`: final segment of report identifier
106
- - source of parameters: response to a `summarizeOneReport` request
107
- - `describeOneViolatorOfOneIssueFromOneReport`
100
+ - source of parameters: response to a `listIssues` request
101
+ - `listDiagnoses`
108
102
  - method: `GET`
109
- - purpose: provide diagnoses about one issue exhibited by one HTML element in one report [NOT YET IMPLEMENTED]
110
- - path: `/api/diagnoses/{issueID}/{timeStamp}/{jobID}/{catalogIndex}`
103
+ - purpose: list all diagnoses of one issue exhibited by one element in one report
104
+ - path: `/api/listDiagnoses/{catalogIndex}/{issueID}/{timeStamp}/{jobID}`
111
105
  - parameters
106
+ - `catalogIndex`: index of the catalog entry of the element
112
107
  - `issueID`: identifier of the issue
113
108
  - `timeStamp`: initial segment of report identifier
114
109
  - `jobID`: final segment of report identifier
115
- - `catalogIndex`: index of the catalog entry
116
- - source of parameters: response to a `describeOneIssueFromOneReport` request
117
- - `recommendQualityTestingOfOneWebPage`
110
+ - source of parameters: response to a `listViolators` request
111
+ - `requestTest`
118
112
  - method: `POST`
119
- - purpose: recommend quality testing of one web page about which no report is available
120
- - path: `/api/testRecForm`
113
+ - purpose: request testing of one web page about which no report is available
114
+ - path: `/api/requestTest`
121
115
  - payload properties
116
+ - `description`: description of the page to be tested
117
+ - `URL`: URL of the page to be tested
118
+ - `reason`: reason for testing the page
119
+ - `requestRetest`
120
+ - method: `POST`
121
+ - purpose: request retesting of one web page about which a report is available
122
+ - path: `/api/requestRetest/{timeStamp}/{jobID}`
123
+ - parameters
124
+ - `timeStamp`: initial segment of report identifier
125
+ - `jobID`: final segment of report identifier
126
+ - source of parameters: response to a `listIssues` request
127
+ - payload properties
128
+ - `reason`: reason for retesting the page
129
+ - `requestFeature`
130
+ - method: `POST`
131
+ - purpose: request a feature improvement or a new feature
132
+ - path: `/api/requestFeature`
133
+ - payload properties
134
+ - `feature`: description and motivation of the feature improvement or the new feature
122
135
 
123
- - `description of the web page`: description of the page to be tested
124
- - `hostname of the web page`: URL of the page to be tested
125
- - `reason for testing the web page`: reason for testing the page
126
-
127
- - possible responses:
128
-
129
- - acknowledgment of a successful recommendation
130
- - error message stating that a report about the recommended page is already available
131
- - error message stating that the recommendation is invalid
132
-
133
- - possible Kilotest manager actions after a recommendation:
134
-
135
- - approval followed by the recommended testing
136
- - rejection
136
+ ## After a test, retest, or feature request
137
137
 
138
- - possible next step if your recommendation succeeds:
138
+ When you request a test or a retest:
139
139
 
140
- - You end the workflow by advising the user to check in approximately 1 day for the test results on the Kilotest website, starting at `https://kilotest.com/targets.html`, and drill down as desired for more detailed results. You offer to help interpret the results if needed.
141
- - You continue the workflow by advising the user to resubmit the same request to you in approximately 1 day.
140
+ - possible responses
141
+ - acknowledgment of a successful request
142
+ - error message
143
+ - possible Kilotest manager actions after a request
144
+ - approval followed by the requested testing
145
+ - rejection
146
+ - how to confirm approval
147
+ - check test completion by calling `listReports` and looking for the page and completion date in the list
148
+ - you advise the user to check in approximately 1 day for the test results on the Kilotest website, starting at `https://kilotest.com/targets.html`
142
149
 
143
150
  An [OpenAPI specification for Kilotest](https://kilotest.com/openapi.yaml) is available.
144
151
 
145
- ## How to report results to users
152
+ ## How to report results honestly to users
146
153
 
147
- When you use Kilotest tools, you are free to perform any appropriate interpretation and condensation of the results for presentation to users. However, users expect the sources of facts and interpretations to be truthfully represented. Do not meld facts from Kilotest tools with interpretations of your own in a manner that implies attribution of both to Kilotest.
154
+ When you use Kilotest tools, you are free to perform any appropriate interpretation and condensation of the results, and action recommendations, for users. However, users expect the sources of facts and interpretations to be truthfully represented. Do not meld facts from Kilotest tools with interpretations of your own in a manner that misattributes your interpretations to Kilotest.
148
155
 
149
156
  An example of a **poor** attribution is “Here are the results from Kilotest: …. The page is at risk of …. Among all the issues, … are critical and require immediate attention.” This attribution is poor because it incorrectly implies that Kilotest produced the interpretations and advice.
150
157
 
@@ -156,14 +163,15 @@ More information about Kilotest features and internals:
156
163
 
157
164
  ### For language models and AI platforms
158
165
 
159
- - [AI-TOOLS file](https://github.com/jrpool/kilotest/blob/main/docs/AI-TOOLS.md)
166
+ - [Kilotest as connector to and collection of AI Tools](https://github.com/jrpool/kilotest/blob/main/docs/AI-TOOLS.md)
160
167
  - [OpenAPI specification for Kilotest](https://kilotest.com/openapi.yaml)
161
- - [Tool caller for testing](https://github.com/jrpool/kilotest/blob/main/researchAgent.js)
168
+ - [Tool caller for testing](https://github.com/jrpool/kilotest/blob/main/api/testSuite.js)
162
169
 
163
170
  ### General
164
171
 
165
172
  - [Introduction to Kilotest](https://kilotest.com/)
166
173
  - [Tutorial, “Accessibility testing strategies”](https://kilotest.com/tutorial.html)
174
+ - [Tutorial on authorizing language models to use Kilotest](https://kilotest.com/qai/)
167
175
  - [README file](https://github.com/jrpool/kilotest/blob/main/README.md)
168
176
  - [Testaro rule-engine orchestrator](https://github.com/jrpool/testaro)
169
177
  - [Testilo rule classifier](https://github.com/jrpool/testilo/blob/main/procs/score/tic.js)
package/llms.txt CHANGED
@@ -1,22 +1,21 @@
1
1
  # Kilotest
2
2
 
3
- Kilotest helps language models and AI platforms to give thorough, accurate and truthful answers when users ask about the front-end quality (i.e. accessibility, usability, and standards conformity) of web pages. Kilotest integrates ten independent rule engines to test any public web page and creates a structured report of the results. Kilotest tools can provide multipage, single-page, and element-level test results.
3
+ Kilotest helps language models and AI platforms to give thorough, accurate and truthful answers when users ask about the front-end quality (i.e. accessibility, usability, and standards conformity) of web pages. Kilotest integrates an ensemble often independent rule engines to test any public web page. Kilotest creates a structured report of the results and saves the report for future reference. Kilotest API endpoints and MCP tools can provide multipage, single-page, and element-level test results.
4
4
 
5
- In the API section below, all endpoints require `GET` requests except as noted.
5
+ ## API
6
6
 
7
- There is a [detailed explanation of Kilotest and its capabilities for LLMs](https://kilotest.com/llms-full.txt).
7
+ - [List all available reports](/api/listReports) (`GET`)
8
+ - List all issues in one report: `/api/listIssues/{timeStamp}/{jobID}` (`GET`)
9
+ - List all elements exhibiting one issue in one report: `/api/listViolators/{issueID}/{timeStamp}/{jobID}` (`GET`)
10
+ - List all diagnoses of one element exhibiting one issue in one report: `/api/listDiagnoses/{catalogIndex}/{issueID}/{timeStamp}/{jobID}` (`GET`)
11
+ - Get one full report in JSON: `/api/getReport/{timeStamp}/{jobID}` (`GET`)
12
+ - Request testing of a web page: `/api/requestTest` (`POST`)
13
+ - Request retesting of a web page: `/api/requestRetest/{timeStamp}/{jobID}` (`POST`)
14
+ - Request adding or improving a feature: `/api/requestFeature` (`POST`)
8
15
 
9
- ## API
16
+ ## MCP Server
10
17
 
11
- - [List all available reports](/api/listReports)
12
- - List all issues in one report: `/api/listIssues/{timeStamp}/{jobID}`
13
- - List all elements exhibiting one issue in one report: `/api/listViolators/{issueID}/{timeStamp}/{jobID}`
14
- - List all diagnoses of one element exhibiting one issue in one report: `/api/listDiagnoses/{catalogIndex}/{issueID}/{timeStamp}/{jobID}`
15
- - Get one full report in JSON: `/api/getReport/{timeStamp}/{jobID}`
16
- - Request testing of a web page: `/api/requestTest` (requires `POST` request)
17
- - Request retesting of a web page: `/api/requestRetest/{timeStamp}/{jobID}` (requires `POST` request)
18
- - Request adding or improving a feature: `/api/requestFeature` (requires `POST` request)
19
- - [OpenAPI specification for Kilotest](https://kilotest.com/openapi.yaml)
18
+ - [MCP server for Kilotest](https://kilotest.com/mcp)
20
19
 
21
20
  ## Web UI
22
21
 
@@ -30,3 +29,10 @@ There is a [detailed explanation of Kilotest and its capabilities for LLMs](http
30
29
  - [List the operations that Kilotest managers are authorized to request](https://kilotest.com/manage.html)
31
30
  - [Provide statistics about frequently reported issues across all pages](https://kilotest.com/issues.html)
32
31
  - [Tutorial, “Accessibility testing strategies”](https://kilotest.com/tutorial.html)
32
+
33
+ ## More documents
34
+
35
+ - [Detailed explanation of Kilotest and its capabilities for LLMs](https://kilotest.com/llms-full.txt)
36
+ - [OpenAPI specification for Kilotest](https://kilotest.com/openapi.yaml)
37
+ - [Kilotest as connector to and collection of AI Tools](https://github.com/jrpool/kilotest/blob/main/docs/AI-TOOLS.md)
38
+ - [Tutorial on authorizing language models to use Kilotest](https://kilotest.com/qai/)
package/mcp.js CHANGED
@@ -17,6 +17,7 @@ const listDiagnosesAPI = require('./api/listDiagnoses');
17
17
  const requestTestAPI = require('./api/requestTest');
18
18
  const requestRetestAPI = require('./api/requestRetest');
19
19
  const requestFeatureAPI = require('./api/requestFeature');
20
+ const {version} = require('./api/version');
20
21
 
21
22
  const {
22
23
  getReportSchema,
@@ -46,7 +47,7 @@ exports.mcpPath = '/mcp';
46
47
  const createMCPServer = () => {
47
48
  const server = new McpServer({
48
49
  name: 'Kilotest',
49
- version: '2.0.0',
50
+ version,
50
51
  description: 'Tools that test web pages for front-end quality (accessibility, usability, and standards conformity) and make test results available'
51
52
  },
52
53
  {
@@ -199,8 +200,8 @@ const createMCPServer = () => {
199
200
  openWorldHint: false
200
201
  }
201
202
  },
202
- async ({request}) => {
203
- const result = await requestFeatureAPI.response([request]);
203
+ async ({feature}) => {
204
+ const result = await requestFeatureAPI.response([feature]);
204
205
  return {content: [{type: 'text', text: JSON.stringify(result)}], structuredContent: result};
205
206
  }
206
207
  );
package/openapi.yaml CHANGED
@@ -2,7 +2,7 @@ openapi: 3.1.0
2
2
  info:
3
3
  title: Kilotest API
4
4
  description: 'Kilotest is an ensemble testing and reporting service for front-end web quality. It uses an ensemble of 10 rule engines to test public web pages for front-end quality (accessibility, usability, and standards conformity). Kilotest acts as a web server for human users, an MCP server for AI platforms, and an API for programmatic access. With this API you can request that a page be tested or retested, discover available reports, incrementally retrieve facts from a report: from what reports are available, to what issues were reported in one report, to what elements violated one issue, to what diagnoses rule engines gave for one violation.'
5
- version: 39.0.3
5
+ version: 2.1.0
6
6
  license:
7
7
  name: MIT
8
8
  identifier: MIT
@@ -1100,7 +1100,7 @@ paths:
1100
1100
  - closest ancestor request
1101
1101
  additionalProperties: false
1102
1102
  URLs of similar requests for web users:
1103
- $ref: '#/components/schemas/SimilarWebRequests'
1103
+ type: 'null'
1104
1104
  response metadata:
1105
1105
  $ref: '#/components/schemas/ResponseMetadata'
1106
1106
  response content:
package/package.json CHANGED
@@ -1,8 +1,11 @@
1
1
  {
2
2
  "name": "@jrpool/kilotest",
3
- "version": "41.0.0",
3
+ "version": "42.0.2",
4
4
  "description": "Ensemble testing for front-end web quality",
5
5
  "main": "index.js",
6
+ "engines": {
7
+ "node": ">=22.12.0"
8
+ },
6
9
  "scripts": {
7
10
  "start": "node index",
8
11
  "lint": "npx eslint && npx markdownlint-cli2",
@@ -17,7 +20,10 @@
17
20
  "keywords": [
18
21
  "accessibility",
19
22
  "a11y",
20
- "testing"
23
+ "testing",
24
+ "mcp",
25
+ "mcp-server",
26
+ "modelcontextprotocol"
21
27
  ],
22
28
  "author": "Jonathan Robert Pool <pool@jpdev.pro>",
23
29
  "license": "MIT",
@@ -9,8 +9,9 @@ const fs = require('fs');
9
9
  const path = require('path');
10
10
  const yaml = require('js-yaml');
11
11
  const {createDocument} = require('zod-openapi');
12
- const {license, version} = require('../package.json');
12
+ const {license} = require('../package.json');
13
13
  const routes = require('../api/routes');
14
+ const {version} = require('../api/version');
14
15
 
15
16
  // CONSTANTS
16
17
 
package/server.json ADDED
@@ -0,0 +1,18 @@
1
+ {
2
+ "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
3
+ "name": "io.github.jrpool/kilotest",
4
+ "description": "Ensemble testing of web pages for accessibility, usability, and standards conformity",
5
+ "repository": {
6
+ "url": "https://github.com/jrpool/kilotest",
7
+ "source": "github"
8
+ },
9
+ "version": "2.1.0",
10
+ "remotes": [
11
+ {
12
+ "type": "streamable-http",
13
+ "url": "https://kilotest.com/mcp"
14
+ }
15
+ ],
16
+ "title": "Kilotest",
17
+ "websiteUrl": "https://kilotest.com"
18
+ }
package/util.js CHANGED
@@ -693,7 +693,7 @@ exports.getPageDataStrings = async (timeStamp, jobID, pageData) => {
693
693
  what,
694
694
  url,
695
695
  urlLink: `<a href="${url}">${url}</a>`,
696
- testInfo: `Tested ${daysAgo} days ago by job <code>${jobID}</code> on ${when}`
696
+ testInfo: `Tested ${daysAgo === 1 ? '1 day' : `${daysAgo} days`} ago by job <code>${jobID}</code> on ${when}`
697
697
  };
698
698
  };
699
699
  // Returns the creation time and size of a report.