@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.
- package/.github/workflows/publish-mcp.yml +57 -0
- package/api/version.js +8 -0
- package/docs/SERVICE.md +1 -1
- package/index.html +18 -10
- package/index.js +1 -3
- package/mcp.js +2 -1
- package/openapi.yaml +2 -2
- package/package.json +8 -2
- package/scripts/generate-openapi.js +2 -1
- package/server.json +18 -0
- package/util.js +1 -1
|
@@ -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
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/* /
|
|
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
|
|
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
|
|
68
|
-
<p><strong>Ensemble testing</strong>, instead of choosing
|
|
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’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>
|
|
73
|
-
<p>Kilotest
|
|
74
|
-
<
|
|
75
|
-
<
|
|
76
|
-
<p>
|
|
77
|
-
<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
|
|
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
|
|
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:
|
|
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
|
-
|
|
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": "
|
|
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
|
|
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.
|