@jrpool/kilotest 41.1.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.
@@ -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/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/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/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
  {
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.1.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.