mcp-accessibility-scanner 3.3.2 → 3.5.0
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/README.md +146 -11
- package/config.d.ts +48 -3
- package/lib/browserContextFactory.js +15 -313
- package/lib/browserContextFactory.js.map +1 -1
- package/lib/browserServerBackend.js +11 -0
- package/lib/browserServerBackend.js.map +1 -1
- package/lib/browserSessions.js +3 -0
- package/lib/browserSessions.js.map +1 -1
- package/lib/config.js +70 -12
- package/lib/config.js.map +1 -1
- package/lib/context.js +463 -57
- package/lib/context.js.map +1 -1
- package/lib/extension/cdpRelay.js +82 -14
- package/lib/extension/cdpRelay.js.map +1 -1
- package/lib/extension/extensionContextFactory.js +15 -8
- package/lib/extension/extensionContextFactory.js.map +1 -1
- package/lib/index.js +2 -0
- package/lib/index.js.map +1 -1
- package/lib/mcp/http.js +115 -41
- package/lib/mcp/http.js.map +1 -1
- package/lib/mcp/server.js +16 -8
- package/lib/mcp/server.js.map +1 -1
- package/lib/mcp/tool.js +11 -9
- package/lib/mcp/tool.js.map +1 -1
- package/lib/program.js +28 -8
- package/lib/program.js.map +1 -1
- package/lib/response.js +22 -5
- package/lib/response.js.map +1 -1
- package/lib/sessionLog.js +66 -20
- package/lib/sessionLog.js.map +1 -1
- package/lib/tab.js +13 -7
- package/lib/tab.js.map +1 -1
- package/lib/tools/auditKeyboard.js +27 -25
- package/lib/tools/auditKeyboard.js.map +1 -1
- package/lib/tools/auditScreenReader.js +27 -18
- package/lib/tools/auditScreenReader.js.map +1 -1
- package/lib/tools/auditSite.js +88 -56
- package/lib/tools/auditSite.js.map +1 -1
- package/lib/tools/axe.js +32 -7
- package/lib/tools/axe.js.map +1 -1
- package/lib/tools/common.js +39 -1
- package/lib/tools/common.js.map +1 -1
- package/lib/tools/files.js +60 -3
- package/lib/tools/files.js.map +1 -1
- package/lib/tools/install.js +1 -1
- package/lib/tools/install.js.map +1 -1
- package/lib/tools/pdf.js +4 -2
- package/lib/tools/pdf.js.map +1 -1
- package/lib/tools/recorder.js +52 -0
- package/lib/tools/recorder.js.map +1 -0
- package/lib/tools/report.js +13 -0
- package/lib/tools/report.js.map +1 -0
- package/lib/tools/scanPageMatrix.js +20 -33
- package/lib/tools/scanPageMatrix.js.map +1 -1
- package/lib/tools/screenshot.js +7 -3
- package/lib/tools/screenshot.js.map +1 -1
- package/lib/tools/snapshot.js +10 -3
- package/lib/tools/snapshot.js.map +1 -1
- package/lib/tools.js +5 -1
- package/lib/tools.js.map +1 -1
- package/lib/vscode/browserContextFactory.js +16 -12
- package/lib/vscode/browserContextFactory.js.map +1 -1
- package/lib/vscode/host.js +25 -2
- package/lib/vscode/host.js.map +1 -1
- package/lib/vscode/main.js +15 -0
- package/lib/vscode/main.js.map +1 -1
- package/lib/vscode/validation.js +78 -0
- package/lib/vscode/validation.js.map +1 -0
- package/package.json +9 -8
package/lib/tools.js
CHANGED
|
@@ -25,6 +25,7 @@ import mouse from './tools/mouse.js';
|
|
|
25
25
|
import navigate from './tools/navigate.js';
|
|
26
26
|
import network from './tools/network.js';
|
|
27
27
|
import pdf from './tools/pdf.js';
|
|
28
|
+
import recorder from './tools/recorder.js';
|
|
28
29
|
import session from './tools/session.js';
|
|
29
30
|
import snapshot from './tools/snapshot.js';
|
|
30
31
|
import tabs from './tools/tabs.js';
|
|
@@ -49,6 +50,7 @@ export const allTools = [
|
|
|
49
50
|
...network,
|
|
50
51
|
...mouse,
|
|
51
52
|
...pdf,
|
|
53
|
+
...recorder,
|
|
52
54
|
...screenshot,
|
|
53
55
|
...session,
|
|
54
56
|
...snapshot,
|
|
@@ -61,7 +63,9 @@ export const allTools = [
|
|
|
61
63
|
...auditScreenReader,
|
|
62
64
|
];
|
|
63
65
|
export function filteredTools(config) {
|
|
64
|
-
return allTools.filter(tool => tool.capability.startsWith('core')
|
|
66
|
+
return allTools.filter(tool => tool.capability.startsWith('core')
|
|
67
|
+
|| config.capabilities?.includes(tool.capability)
|
|
68
|
+
|| (tool.capability === 'install' && config.capabilities?.includes('core-install')));
|
|
65
69
|
}
|
|
66
70
|
export const serverInstructions = [
|
|
67
71
|
'This server runs automated web accessibility audits (axe-core / WCAG) and drives a real browser via Playwright.',
|
package/lib/tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,MAAM,MAAM,mBAAmB,CAAC;AACvC,OAAO,OAAO,MAAM,oBAAoB,CAAC;AACzC,OAAO,OAAO,MAAM,oBAAoB,CAAC;AACzC,OAAO,QAAQ,MAAM,qBAAqB,CAAC;AAC3C,OAAO,KAAK,MAAM,kBAAkB,CAAC;AACrC,OAAO,IAAI,MAAM,iBAAiB,CAAC;AACnC,OAAO,OAAO,MAAM,oBAAoB,CAAC;AACzC,OAAO,QAAQ,MAAM,qBAAqB,CAAC;AAC3C,OAAO,KAAK,MAAM,kBAAkB,CAAC;AACrC,OAAO,QAAQ,MAAM,qBAAqB,CAAC;AAC3C,OAAO,OAAO,MAAM,oBAAoB,CAAC;AACzC,OAAO,GAAG,MAAM,gBAAgB,CAAC;AACjC,OAAO,OAAO,MAAM,oBAAoB,CAAC;AACzC,OAAO,QAAQ,MAAM,qBAAqB,CAAC;AAC3C,OAAO,IAAI,MAAM,iBAAiB,CAAC;AACnC,OAAO,UAAU,MAAM,uBAAuB,CAAC;AAC/C,OAAO,IAAI,MAAM,iBAAiB,CAAC;AACnC,OAAO,MAAM,MAAM,mBAAmB,CAAC;AACvC,OAAO,SAAS,MAAM,sBAAsB,CAAC;AAC7C,OAAO,cAAc,MAAM,2BAA2B,CAAC;AACvD,OAAO,aAAa,MAAM,0BAA0B,CAAC;AACrD,OAAO,iBAAiB,MAAM,8BAA8B,CAAC;AAK7D,sFAAsF;AACtF,MAAM,CAAC,MAAM,QAAQ,GAAgB;IACnC,GAAG,MAAM;IACT,GAAG,OAAO;IACV,GAAG,OAAO;IACV,GAAG,QAAQ;IACX,GAAG,KAAK;IACR,GAAG,IAAI;IACP,GAAG,OAAO;IACV,GAAG,QAAQ;IACX,GAAG,QAAQ;IACX,GAAG,OAAO;IACV,GAAG,KAAK;IACR,GAAG,GAAG;IACN,GAAG,UAAU;IACb,GAAG,OAAO;IACV,GAAG,QAAQ;IACX,GAAG,IAAI;IACP,GAAG,IAAI;IACP,GAAG,MAAM;IACT,GAAG,SAAS;IACZ,GAAG,cAAc;IACjB,GAAG,aAAa;IAChB,GAAG,iBAAiB;CACrB,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,MAAkB;IAC9C,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,MAAM,MAAM,mBAAmB,CAAC;AACvC,OAAO,OAAO,MAAM,oBAAoB,CAAC;AACzC,OAAO,OAAO,MAAM,oBAAoB,CAAC;AACzC,OAAO,QAAQ,MAAM,qBAAqB,CAAC;AAC3C,OAAO,KAAK,MAAM,kBAAkB,CAAC;AACrC,OAAO,IAAI,MAAM,iBAAiB,CAAC;AACnC,OAAO,OAAO,MAAM,oBAAoB,CAAC;AACzC,OAAO,QAAQ,MAAM,qBAAqB,CAAC;AAC3C,OAAO,KAAK,MAAM,kBAAkB,CAAC;AACrC,OAAO,QAAQ,MAAM,qBAAqB,CAAC;AAC3C,OAAO,OAAO,MAAM,oBAAoB,CAAC;AACzC,OAAO,GAAG,MAAM,gBAAgB,CAAC;AACjC,OAAO,QAAQ,MAAM,qBAAqB,CAAC;AAC3C,OAAO,OAAO,MAAM,oBAAoB,CAAC;AACzC,OAAO,QAAQ,MAAM,qBAAqB,CAAC;AAC3C,OAAO,IAAI,MAAM,iBAAiB,CAAC;AACnC,OAAO,UAAU,MAAM,uBAAuB,CAAC;AAC/C,OAAO,IAAI,MAAM,iBAAiB,CAAC;AACnC,OAAO,MAAM,MAAM,mBAAmB,CAAC;AACvC,OAAO,SAAS,MAAM,sBAAsB,CAAC;AAC7C,OAAO,cAAc,MAAM,2BAA2B,CAAC;AACvD,OAAO,aAAa,MAAM,0BAA0B,CAAC;AACrD,OAAO,iBAAiB,MAAM,8BAA8B,CAAC;AAK7D,sFAAsF;AACtF,MAAM,CAAC,MAAM,QAAQ,GAAgB;IACnC,GAAG,MAAM;IACT,GAAG,OAAO;IACV,GAAG,OAAO;IACV,GAAG,QAAQ;IACX,GAAG,KAAK;IACR,GAAG,IAAI;IACP,GAAG,OAAO;IACV,GAAG,QAAQ;IACX,GAAG,QAAQ;IACX,GAAG,OAAO;IACV,GAAG,KAAK;IACR,GAAG,GAAG;IACN,GAAG,QAAQ;IACX,GAAG,UAAU;IACb,GAAG,OAAO;IACV,GAAG,QAAQ;IACX,GAAG,IAAI;IACP,GAAG,IAAI;IACP,GAAG,MAAM;IACT,GAAG,SAAS;IACZ,GAAG,cAAc;IACjB,GAAG,aAAa;IAChB,GAAG,iBAAiB;CACrB,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,MAAkB;IAC9C,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC;WAC5D,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC;WAC9C,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS,IAAI,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;AACzF,CAAC;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,iHAAiH;IACjH,gHAAgH;IAChH,2GAA2G;IAC3G,kHAAkH;IAClH,6EAA6E;IAC7E,mHAAmH;IACnH,qFAAqF;IACrF,4GAA4G;IAC5G,+GAA+G;IAC/G,8GAA8G;IAC9G,uGAAuG;CACxG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC"}
|
|
@@ -13,19 +13,20 @@
|
|
|
13
13
|
* See the License for the specific language governing permissions and
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
|
-
import {
|
|
17
|
-
|
|
18
|
-
//
|
|
19
|
-
//
|
|
20
|
-
|
|
16
|
+
import { assertReusedContextStorageStateSupported, assertStorageStateDoesNotResetUserProfile } from '../browserContextFactory.js';
|
|
17
|
+
import { validateBrowserConnectConnectionString } from './validation.js';
|
|
18
|
+
// Shared with the host's browser_connect validation (see validation.ts) so
|
|
19
|
+
// the two never drift: the host checks the combination before tearing down
|
|
20
|
+
// the working provider, and the factory keeps the same check as the last
|
|
21
|
+
// line of defense.
|
|
22
|
+
export const vscodeProfileConflictRemedy = 'Drop --storage-state and sign in in the profile, or use a fresh isolated browser outside the VS Code provider.';
|
|
21
23
|
export class VSCodeBrowserContextFactory {
|
|
22
24
|
_config;
|
|
23
25
|
_playwright;
|
|
24
26
|
_connectionString;
|
|
25
27
|
name = 'vscode';
|
|
26
28
|
description = 'Connect to a browser running in the Playwright VS Code extension';
|
|
27
|
-
//
|
|
28
|
-
// it applied via setStorageState(), like the other reused-context factories.
|
|
29
|
+
// Fresh contexts accept storage state; existing extension contexts reject it.
|
|
29
30
|
appliesStorageState = true;
|
|
30
31
|
// Each createContext() reuses the extension browser's existing context when
|
|
31
32
|
// one is present, so two sessions would end up in the same context (same
|
|
@@ -44,7 +45,9 @@ export class VSCodeBrowserContextFactory {
|
|
|
44
45
|
// already refuses to do. Checked before connecting, so the contradiction
|
|
45
46
|
// fails fast without ever reaching the browser.
|
|
46
47
|
assertStorageStateDoesNotResetUserProfile(this._config, vscodeProfileConflictRemedy);
|
|
47
|
-
let launchOptions = this._config.browser.launchOptions;
|
|
48
|
+
let launchOptions = { ...this._config.browser.launchOptions };
|
|
49
|
+
if (this._config.browser.chromiumSandboxDefaulted)
|
|
50
|
+
delete launchOptions.chromiumSandbox;
|
|
48
51
|
if (this._config.browser.userDataDir) {
|
|
49
52
|
launchOptions = {
|
|
50
53
|
...launchOptions,
|
|
@@ -52,6 +55,9 @@ export class VSCodeBrowserContextFactory {
|
|
|
52
55
|
userDataDir: this._config.browser.userDataDir,
|
|
53
56
|
};
|
|
54
57
|
}
|
|
58
|
+
const connectionError = validateBrowserConnectConnectionString(this._connectionString);
|
|
59
|
+
if (connectionError)
|
|
60
|
+
throw new Error(connectionError);
|
|
55
61
|
const connectionString = new URL(this._connectionString);
|
|
56
62
|
connectionString.searchParams.set('launch-options', JSON.stringify(launchOptions));
|
|
57
63
|
const browserType = this._playwright.chromium; // it could also be firefox or webkit, we just need some browser type to call `connect` on
|
|
@@ -60,10 +66,8 @@ export class VSCodeBrowserContextFactory {
|
|
|
60
66
|
try {
|
|
61
67
|
const existing = browser.contexts()[0];
|
|
62
68
|
if (existing) {
|
|
63
|
-
//
|
|
64
|
-
|
|
65
|
-
// scans would run anonymously depending on which branch was taken.
|
|
66
|
-
await applyStorageStateToReusedContext(this._config, existing);
|
|
69
|
+
// Importing into an existing context requires an unsafe rollback snapshot.
|
|
70
|
+
assertReusedContextStorageStateSupported(this._config);
|
|
67
71
|
context = existing;
|
|
68
72
|
}
|
|
69
73
|
else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browserContextFactory.js","sourceRoot":"","sources":["../../src/vscode/browserContextFactory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"browserContextFactory.js","sourceRoot":"","sources":["../../src/vscode/browserContextFactory.ts"],"names":[],"mappings":"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"}
|
package/lib/vscode/host.js
CHANGED
|
@@ -28,6 +28,7 @@ import { BrowserServerBackend } from '../browserServerBackend.js';
|
|
|
28
28
|
import { BrowserSessionRegistry } from '../browserSessions.js';
|
|
29
29
|
import { assertStorageStateDoesNotResetUserProfile, contextFactory } from '../browserContextFactory.js';
|
|
30
30
|
import { vscodeProfileConflictRemedy } from './browserContextFactory.js';
|
|
31
|
+
import { validateBrowserConnectConnectionString, validateBrowserConnectLib } from './validation.js';
|
|
31
32
|
const contextSwitchOptions = z.object({
|
|
32
33
|
connectionString: z.string().optional().describe('The connection string to use to connect to the browser'),
|
|
33
34
|
lib: z.string().optional().describe('The library to use for the connection'),
|
|
@@ -147,6 +148,24 @@ export class VSCodeProxyBackend {
|
|
|
147
148
|
content: [{ type: 'text', text: '### Result\nSuccessfully disconnected.\n' }],
|
|
148
149
|
};
|
|
149
150
|
}
|
|
151
|
+
// Strict allowlist validation before spawning: `lib` flows into a bare
|
|
152
|
+
// `import()` in the child and `connectionString` into `connect()`, so an
|
|
153
|
+
// unconstrained value gives any MCP caller server-side RCE/SSRF. Rejected
|
|
154
|
+
// here, before the working provider is torn down.
|
|
155
|
+
const libError = validateBrowserConnectLib(params.lib);
|
|
156
|
+
if (libError) {
|
|
157
|
+
return {
|
|
158
|
+
content: [{ type: 'text', text: `### Result\n${libError}\n` }],
|
|
159
|
+
isError: true,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
const connectionError = validateBrowserConnectConnectionString(params.connectionString);
|
|
163
|
+
if (connectionError) {
|
|
164
|
+
return {
|
|
165
|
+
content: [{ type: 'text', text: `### Result\n${connectionError}\n` }],
|
|
166
|
+
isError: true,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
150
169
|
// The child's factory would only surface this on the first browser
|
|
151
170
|
// operation — after the working provider has already been torn down,
|
|
152
171
|
// leaving the session attached to a provider that can never create a
|
|
@@ -173,6 +192,7 @@ export class VSCodeProxyBackend {
|
|
|
173
192
|
return new StdioClientTransport({
|
|
174
193
|
command: process.execPath,
|
|
175
194
|
cwd: process.cwd(),
|
|
195
|
+
env: { PLAYWRIGHT_MCP_VSCODE_ALLOW_REMOTE: process.env.PLAYWRIGHT_MCP_VSCODE_ALLOW_REMOTE ?? '' },
|
|
176
196
|
args: [
|
|
177
197
|
path.join(fileURLToPath(import.meta.url), '..', 'main.js'),
|
|
178
198
|
// The fallback output dir is memoized on the config OBJECT, and
|
|
@@ -180,7 +200,7 @@ export class VSCodeProxyBackend {
|
|
|
180
200
|
// materializing the resolved dir here, the spawned provider would
|
|
181
201
|
// open a second temp root and scatter one run's artifacts across
|
|
182
202
|
// the provider switch.
|
|
183
|
-
JSON.stringify({ ...this._config, outputDir: resolveOutputDir(this._config) }),
|
|
203
|
+
JSON.stringify({ ...this._config, server: { ...this._config.server, authToken: undefined }, outputDir: resolveOutputDir(this._config) }),
|
|
184
204
|
connectionString,
|
|
185
205
|
lib,
|
|
186
206
|
],
|
|
@@ -227,7 +247,10 @@ export class VSCodeProxyBackend {
|
|
|
227
247
|
inputSchema: z.toJSONSchema(contextSwitchOptions),
|
|
228
248
|
annotations: {
|
|
229
249
|
title: 'Connect to a browser running in VS Code.',
|
|
230
|
-
|
|
250
|
+
// Spawns a provider child process and tears down the working one —
|
|
251
|
+
// decidedly not read-only.
|
|
252
|
+
readOnlyHint: false,
|
|
253
|
+
destructiveHint: true,
|
|
231
254
|
openWorldHint: false,
|
|
232
255
|
},
|
|
233
256
|
};
|
package/lib/vscode/host.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/vscode/host.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,KAAK,SAAS,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,yCAAyC,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AACxG,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/vscode/host.ts"],"names":[],"mappings":"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"}
|
package/lib/vscode/main.js
CHANGED
|
@@ -17,7 +17,22 @@ import { StdioServerTransport } from '@modelcontextprotocol/server/stdio';
|
|
|
17
17
|
import * as mcpServer from '../mcp/server.js';
|
|
18
18
|
import { BrowserServerBackend } from '../browserServerBackend.js';
|
|
19
19
|
import { VSCodeBrowserContextFactory } from './browserContextFactory.js';
|
|
20
|
+
import { validateBrowserConnectConnectionString, validateBrowserConnectLib } from './validation.js';
|
|
20
21
|
async function main(config, connectionString, lib) {
|
|
22
|
+
// Defense-in-depth: the child must not trust parent argv blindly — the
|
|
23
|
+
// host already validated both values before spawning (see validation.ts).
|
|
24
|
+
const libError = validateBrowserConnectLib(lib);
|
|
25
|
+
if (libError) {
|
|
26
|
+
// eslint-disable-next-line no-console
|
|
27
|
+
console.error(`browser_connect: ${libError}`);
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
const connectionError = validateBrowserConnectConnectionString(connectionString);
|
|
31
|
+
if (connectionError) {
|
|
32
|
+
// eslint-disable-next-line no-console
|
|
33
|
+
console.error(`browser_connect: ${connectionError}`);
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
21
36
|
const playwright = await import(lib).then(mod => mod.default ?? mod);
|
|
22
37
|
const factory = new VSCodeBrowserContextFactory(config, playwright, connectionString);
|
|
23
38
|
await mcpServer.connect({
|
package/lib/vscode/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/vscode/main.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,KAAK,SAAS,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/vscode/main.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,KAAK,SAAS,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,sCAAsC,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAGpG,KAAK,UAAU,IAAI,CAAC,MAAkB,EAAE,gBAAwB,EAAE,GAAW;IAC3E,uEAAuE;IACvE,0EAA0E;IAC1E,MAAM,QAAQ,GAAG,yBAAyB,CAAC,GAAG,CAAC,CAAC;IAChD,IAAI,QAAQ,EAAE,CAAC;QACb,sCAAsC;QACtC,OAAO,CAAC,KAAK,CAAC,oBAAoB,QAAQ,EAAE,CAAC,CAAC;QAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,eAAe,GAAG,sCAAsC,CAAC,gBAAgB,CAAC,CAAC;IACjF,IAAI,eAAe,EAAE,CAAC;QACpB,sCAAsC;QACtC,OAAO,CAAC,KAAK,CAAC,oBAAoB,eAAe,EAAE,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC;IACrE,MAAM,OAAO,GAAG,IAAI,2BAA2B,CAAC,MAAM,EAAE,UAAU,EAAE,gBAAgB,CAAC,CAAC;IACtF,MAAM,SAAS,CAAC,OAAO,CACnB;QACE,IAAI,EAAE,gBAAgB;QACtB,YAAY,EAAE,mBAAmB;QACjC,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC;QACvD,OAAO,EAAE,QAAQ;KAClB,EACD,IAAI,oBAAoB,EAAE,EAC1B,KAAK,CACR,CAAC;AACJ,CAAC;AAED,MAAM,IAAI,CACN,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAC3B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAClB,CAAC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Microsoft Corporation.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
// Shared `browser_connect` validation for the VS Code bridge, used by the
|
|
17
|
+
// host (before spawning the child), the child entrypoint (before `import()`),
|
|
18
|
+
// and the factory (before `connect()`), so the three never drift.
|
|
19
|
+
const allowedBrowserConnectLibs = new Set(['playwright', 'playwright-core']);
|
|
20
|
+
function isRemoteBrowserConnectAllowed() {
|
|
21
|
+
const value = process.env.PLAYWRIGHT_MCP_VSCODE_ALLOW_REMOTE?.trim().toLowerCase();
|
|
22
|
+
return value === '1' || value === 'true' || value === 'yes';
|
|
23
|
+
}
|
|
24
|
+
function isLoopbackHostname(hostname) {
|
|
25
|
+
const normalized = hostname.trim().toLowerCase().replace(/^\[(.*)\]$/, '$1').replace(/\.$/, '');
|
|
26
|
+
if (normalized === 'localhost' || normalized === '127.0.0.1' || normalized === '::1')
|
|
27
|
+
return true;
|
|
28
|
+
// The URL parser canonicalizes an IPv4-mapped IPv6 loopback such as
|
|
29
|
+
// [::ffff:127.0.0.1] to the hex form ::ffff:7f00:1 (two 16-bit groups),
|
|
30
|
+
// so accept that spelling too instead of failing closed on a legitimate
|
|
31
|
+
// loopback.
|
|
32
|
+
const v4Mapped = /^::ffff:([0-9a-f]{1,4}):([0-9a-f]{1,4})$/.exec(normalized);
|
|
33
|
+
if (v4Mapped)
|
|
34
|
+
return ((Number.parseInt(v4Mapped[1], 16) << 16) | Number.parseInt(v4Mapped[2], 16)) === 0x7f000001;
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
export function validateBrowserConnectLib(lib) {
|
|
38
|
+
if (typeof lib !== 'string' || !lib)
|
|
39
|
+
return 'Invalid `lib`: expected one of "playwright", "playwright-core".';
|
|
40
|
+
if (lib.includes('\0'))
|
|
41
|
+
return 'Invalid `lib`: null bytes are not allowed.';
|
|
42
|
+
if (lib.includes('/') || lib.includes('\\'))
|
|
43
|
+
return 'Invalid `lib`: path separators are not allowed, expected one of "playwright", "playwright-core".';
|
|
44
|
+
// The colon check also rejects every URL scheme (`data:`, `file:`, `https:`,
|
|
45
|
+
// `node:`, ...) — none may reach the child's `import()`.
|
|
46
|
+
if (lib.includes(':'))
|
|
47
|
+
return 'Invalid `lib`: URL schemes are not allowed, expected one of "playwright", "playwright-core".';
|
|
48
|
+
if (lib.startsWith('.'))
|
|
49
|
+
return 'Invalid `lib`: relative paths are not allowed, expected one of "playwright", "playwright-core".';
|
|
50
|
+
if (!allowedBrowserConnectLibs.has(lib))
|
|
51
|
+
return 'Invalid `lib`: expected one of "playwright", "playwright-core".';
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
export function validateBrowserConnectConnectionString(connectionString) {
|
|
55
|
+
if (typeof connectionString !== 'string' || !connectionString)
|
|
56
|
+
return 'Invalid `connectionString`: expected a ws: or wss: URL.';
|
|
57
|
+
if (connectionString.includes('\0'))
|
|
58
|
+
return 'Invalid `connectionString`: null bytes are not allowed.';
|
|
59
|
+
let url;
|
|
60
|
+
try {
|
|
61
|
+
url = new URL(connectionString);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return 'Invalid `connectionString`: expected a ws: or wss: URL.';
|
|
65
|
+
}
|
|
66
|
+
if (url.protocol !== 'ws:' && url.protocol !== 'wss:')
|
|
67
|
+
return `Invalid \`connectionString\`: only ws: and wss: URLs are allowed (got "${url.protocol}").`;
|
|
68
|
+
if (url.username || url.password)
|
|
69
|
+
return 'Invalid `connectionString`: credentials (userinfo) are not allowed.';
|
|
70
|
+
if (!url.hostname)
|
|
71
|
+
return 'Invalid `connectionString`: missing hostname.';
|
|
72
|
+
if (!isRemoteBrowserConnectAllowed() && !isLoopbackHostname(url.hostname))
|
|
73
|
+
return 'Invalid `connectionString`: only loopback hosts (localhost, 127.0.0.1, ::1) are allowed. Set PLAYWRIGHT_MCP_VSCODE_ALLOW_REMOTE=1 to allow remote hosts.';
|
|
74
|
+
if (!isLoopbackHostname(url.hostname) && url.protocol !== 'wss:')
|
|
75
|
+
return 'Invalid `connectionString`: remote hosts require wss: to protect connection credentials.';
|
|
76
|
+
return undefined;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/vscode/validation.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mcp-accessibility-scanner",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.5.0",
|
|
4
4
|
"mcpName": "io.github.JustasMonkev/mcp-accessibility-scanner",
|
|
5
5
|
"description": "A Model Context Protocol (MCP) server for performing automated accessibility scans of web pages using Playwright and Axe-core",
|
|
6
6
|
"type": "module",
|
|
@@ -35,8 +35,9 @@
|
|
|
35
35
|
"npm-publish": "npm run clean && npm run build && npm publish",
|
|
36
36
|
"test": "vitest run",
|
|
37
37
|
"test:docker": "bash ./tests/docker-smoke.sh",
|
|
38
|
-
"test:mcp": "node .
|
|
39
|
-
"test:mcp:install": "node .
|
|
38
|
+
"test:mcp": "npm run build && node .codex/run-mcp-direct-harness.mjs",
|
|
39
|
+
"test:mcp:install": "npm run build && node .codex/run-mcp-direct-harness.mjs --include-install",
|
|
40
|
+
"test:mcp:luna": "node .codex/run-mcp-tool-loop.mjs",
|
|
40
41
|
"bench": "node bench/mcp-bench.mjs",
|
|
41
42
|
"bench:compare": "node bench/mcp-bench.mjs --compare",
|
|
42
43
|
"test:watch": "vitest",
|
|
@@ -51,8 +52,8 @@
|
|
|
51
52
|
"axe-core": "4.13.0",
|
|
52
53
|
"commander": "^15.0.0",
|
|
53
54
|
"debug": "^4.4.3",
|
|
54
|
-
"playwright": "1.63.0
|
|
55
|
-
"playwright-core": "1.63.0
|
|
55
|
+
"playwright": "1.63.0",
|
|
56
|
+
"playwright-core": "1.63.0",
|
|
56
57
|
"re2": "^1.26.1",
|
|
57
58
|
"ws": "^8.21.3",
|
|
58
59
|
"zod": "^4.4.3"
|
|
@@ -64,15 +65,15 @@
|
|
|
64
65
|
"@types/json-schema": "^7.0.15",
|
|
65
66
|
"@types/node": "^26.2.0",
|
|
66
67
|
"@types/ws": "^8.18.1",
|
|
67
|
-
"@vitest/coverage-v8": "^
|
|
68
|
-
"@vitest/ui": "^
|
|
68
|
+
"@vitest/coverage-v8": "^5.0.1",
|
|
69
|
+
"@vitest/ui": "^5.0.1",
|
|
69
70
|
"eslint": "^10.8.1",
|
|
70
71
|
"eslint-plugin-notice": "^1.0.0",
|
|
71
72
|
"happy-dom": "^20.11.2",
|
|
72
73
|
"knip": "^6.32.2",
|
|
73
74
|
"oxlint": "^1.78.0",
|
|
74
75
|
"typescript": "^7.0.2",
|
|
75
|
-
"vitest": "^
|
|
76
|
+
"vitest": "^5.0.1"
|
|
76
77
|
},
|
|
77
78
|
"keywords": [
|
|
78
79
|
"mcp",
|