mcp-accessibility-scanner 2.0.7 → 2.0.9
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 +81 -1
- package/lib/browserServerBackend.js +3 -3
- package/lib/browserServerBackend.js.map +1 -1
- package/lib/mcp/http.js +129 -34
- package/lib/mcp/http.js.map +1 -1
- package/lib/mcp/mdb.js +9 -8
- package/lib/mcp/mdb.js.map +1 -1
- package/lib/mcp/proxyBackend.js +39 -5
- package/lib/mcp/proxyBackend.js.map +1 -1
- package/lib/mcp/server.js +10 -6
- package/lib/mcp/server.js.map +1 -1
- package/lib/mcp/toolListChanged.js +53 -0
- package/lib/mcp/toolListChanged.js.map +1 -0
- package/lib/program.js +145 -54
- package/lib/program.js.map +1 -1
- package/lib/response.js +58 -2
- package/lib/response.js.map +1 -1
- package/lib/tools/auditKeyboard.js +58 -5
- package/lib/tools/auditKeyboard.js.map +1 -1
- package/lib/tools/auditSite.js +56 -0
- package/lib/tools/auditSite.js.map +1 -1
- package/lib/tools/scanPageMatrix.js +34 -0
- package/lib/tools/scanPageMatrix.js.map +1 -1
- package/lib/vscode/host.js +25 -10
- package/lib/vscode/host.js.map +1 -1
- package/package.json +4 -2
package/README.md
CHANGED
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
|
|
4
4
|
[](https://mseep.ai/app/justasmonkev-mcp-accessibility-scanner)
|
|
5
5
|
|
|
6
|
-
A Model Context Protocol (MCP) server that provides automated web accessibility scanning using Playwright and Axe-core. This server enables LLMs to perform WCAG compliance checks, capture annotated screenshots, and generate detailed accessibility reports.
|
|
7
6
|
A powerful Model Context Protocol (MCP) server that provides automated web accessibility scanning and browser automation using Playwright and Axe-core. This server enables LLMs to perform WCAG compliance checks, interact with web pages, manage persistent browser sessions, and generate detailed accessibility reports with visual annotations.
|
|
8
7
|
|
|
9
8
|
## Features
|
|
@@ -36,6 +35,48 @@ Using npm:
|
|
|
36
35
|
npm install -g mcp-accessibility-scanner
|
|
37
36
|
```
|
|
38
37
|
|
|
38
|
+
### Installation with Docker
|
|
39
|
+
|
|
40
|
+
A pre-built image is available on Docker Hub. The image includes Chromium and is pre-configured for containerized use — no extra flags needed.
|
|
41
|
+
|
|
42
|
+
**Pull from Docker Hub:**
|
|
43
|
+
```bash
|
|
44
|
+
docker pull justasmonkev/mcp-accessibility-scanner
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
#### Claude Code
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
claude mcp add mcp-accessibility-scanner -s user -- docker run -i --rm justasmonkev/mcp-accessibility-scanner
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
To persist screenshots and reports on your host, add a volume mount:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
claude mcp add mcp-accessibility-scanner -s user \
|
|
57
|
+
-- docker run -i --rm -v /tmp/mcp-output:/app/output justasmonkev/mcp-accessibility-scanner
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Without the `-v` mount, output files only exist inside the container and are lost when it exits.
|
|
61
|
+
|
|
62
|
+
#### Docker Compose
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
docker compose up -d
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
#### Build from source
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
docker build -t mcp-accessibility-scanner .
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
#### Docker smoke test
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
npm run test:docker
|
|
78
|
+
```
|
|
79
|
+
|
|
39
80
|
### Installation in VS Code
|
|
40
81
|
|
|
41
82
|
Install the Accessibility Scanner in VS Code using the VS Code CLI:
|
|
@@ -50,6 +91,45 @@ For VS Code Insiders:
|
|
|
50
91
|
code-insiders --add-mcp '{"name":"accessibility-scanner","command":"npx","args":["mcp-accessibility-scanner"]}'
|
|
51
92
|
```
|
|
52
93
|
|
|
94
|
+
## CLI Modes
|
|
95
|
+
|
|
96
|
+
The scanner can run in two modes depending on how you use it.
|
|
97
|
+
|
|
98
|
+
### MCP server (default, no subcommand)
|
|
99
|
+
|
|
100
|
+
When launched without a subcommand, the process starts an MCP server that communicates over stdio. This is the mode used by MCP clients such as Claude Desktop, VS Code, and Claude Code -- you should never need to run it by hand.
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
npx mcp-accessibility-scanner # starts the MCP server (stdio)
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
All of the MCP client configuration examples in this README already use this default mode.
|
|
107
|
+
|
|
108
|
+
### Interactive REPL (`interactive` subcommand)
|
|
109
|
+
|
|
110
|
+
For manual terminal use, the `interactive` subcommand starts a readline REPL where you can call any tool directly:
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
$ npx mcp-accessibility-scanner interactive
|
|
114
|
+
Interactive mode. Type "<tool-name> <json>" to call a tool. Ctrl+D to exit.
|
|
115
|
+
> browser_navigate {"url": "https://example.com"}
|
|
116
|
+
> scan_page {"violationsTag": ["wcag21aa"]}
|
|
117
|
+
> audit_keyboard {"maxTabs": 30}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Each line is `<tool-name> <json-arguments>`. Omit the JSON to pass `{}`.
|
|
121
|
+
Global browser connection flags still apply here, for example `npx mcp-accessibility-scanner --extension interactive`.
|
|
122
|
+
|
|
123
|
+
### Discovering available tools (`list-tools` subcommand)
|
|
124
|
+
|
|
125
|
+
To print every tool name and its description:
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
npx mcp-accessibility-scanner list-tools
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
> **Note:** Tool names like `browser_navigate` and `scan_page` are MCP tool identifiers (and REPL commands in interactive mode). They are not shell subcommands -- you cannot run `npx mcp-accessibility-scanner browser_navigate`.
|
|
132
|
+
|
|
53
133
|
## Configuration
|
|
54
134
|
|
|
55
135
|
Here's the Claude Desktop configuration:
|
|
@@ -31,7 +31,7 @@ export class BrowserServerBackend {
|
|
|
31
31
|
this._browserContextFactory = factory;
|
|
32
32
|
this._tools = filteredTools(config);
|
|
33
33
|
}
|
|
34
|
-
async initialize(
|
|
34
|
+
async initialize(_context, clientVersion, roots) {
|
|
35
35
|
let rootPath;
|
|
36
36
|
if (roots.length > 0) {
|
|
37
37
|
const firstRootUri = roots[0]?.uri;
|
|
@@ -50,13 +50,13 @@ export class BrowserServerBackend {
|
|
|
50
50
|
async listTools() {
|
|
51
51
|
return this._tools.map(tool => toMcpTool(tool.schema));
|
|
52
52
|
}
|
|
53
|
-
async callTool(name, rawArguments) {
|
|
53
|
+
async callTool(name, rawArguments, requestContext) {
|
|
54
54
|
const tool = this._tools.find(tool => tool.schema.name === name);
|
|
55
55
|
if (!tool)
|
|
56
56
|
throw new Error(`Tool "${name}" not found`);
|
|
57
57
|
const parsedArguments = tool.schema.inputSchema.parse(rawArguments || {});
|
|
58
58
|
const context = this._context;
|
|
59
|
-
const response = new Response(context, name, parsedArguments);
|
|
59
|
+
const response = new Response(context, name, parsedArguments, requestContext);
|
|
60
60
|
context.setRunningTool(name);
|
|
61
61
|
try {
|
|
62
62
|
await tool.handle(context, parsedArguments, response);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browserServerBackend.js","sourceRoot":"","sources":["../src/browserServerBackend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAO1C,MAAM,OAAO,oBAAoB;IACvB,MAAM,CAAS;IACf,QAAQ,CAAsB;IAC9B,WAAW,CAAyB;IACpC,OAAO,CAAa;IACpB,sBAAsB,CAAwB;IAEtD,YAAY,MAAkB,EAAE,OAA8B;QAC5D,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,sBAAsB,GAAG,OAAO,CAAC;QACtC,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"browserServerBackend.js","sourceRoot":"","sources":["../src/browserServerBackend.ts"],"names":[],"mappings":"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"}
|
package/lib/mcp/http.js
CHANGED
|
@@ -17,10 +17,10 @@ import assert from 'assert';
|
|
|
17
17
|
import http from 'http';
|
|
18
18
|
import crypto from 'crypto';
|
|
19
19
|
import debug from 'debug';
|
|
20
|
-
import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';
|
|
21
20
|
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
22
21
|
import * as mcpServer from './server.js';
|
|
23
22
|
const testDebug = debug('pw:mcp:test');
|
|
23
|
+
const allowedLoopbackHostnamePattern = /^127(?:\.\d{1,3}){3}$/;
|
|
24
24
|
export async function startHttpServer(config, abortSignal) {
|
|
25
25
|
const { host, port } = config;
|
|
26
26
|
const httpServer = http.createServer();
|
|
@@ -49,45 +49,30 @@ export function httpAddressToString(address) {
|
|
|
49
49
|
return `http://${resolvedHost}:${resolvedPort}`;
|
|
50
50
|
}
|
|
51
51
|
export async function installHttpTransport(httpServer, serverBackendFactory) {
|
|
52
|
-
const sseSessions = new Map();
|
|
53
52
|
const streamableSessions = new Map();
|
|
54
53
|
httpServer.on('request', async (req, res) => {
|
|
55
|
-
const
|
|
56
|
-
if (
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
async function handleSSE(serverBackendFactory, req, res, url, sessions) {
|
|
63
|
-
if (req.method === 'POST') {
|
|
64
|
-
const sessionId = url.searchParams.get('sessionId');
|
|
65
|
-
if (!sessionId) {
|
|
66
|
-
res.statusCode = 400;
|
|
67
|
-
return res.end('Missing sessionId');
|
|
54
|
+
const validationError = validateRequestHeaders(httpServer, req);
|
|
55
|
+
if (validationError) {
|
|
56
|
+
res.statusCode = validationError.statusCode;
|
|
57
|
+
res.end(validationError.message);
|
|
58
|
+
return;
|
|
68
59
|
}
|
|
69
|
-
const
|
|
70
|
-
if (
|
|
71
|
-
res.statusCode =
|
|
72
|
-
|
|
60
|
+
const routingError = validateRequestRouting(req, !!req.headers['mcp-session-id']);
|
|
61
|
+
if (routingError) {
|
|
62
|
+
res.statusCode = routingError.statusCode;
|
|
63
|
+
res.end(routingError.message);
|
|
64
|
+
return;
|
|
73
65
|
}
|
|
74
|
-
|
|
75
|
-
}
|
|
76
|
-
else if (req.method === 'GET') {
|
|
77
|
-
const transport = new SSEServerTransport('/sse', res);
|
|
78
|
-
sessions.set(transport.sessionId, transport);
|
|
79
|
-
testDebug(`create SSE session: ${transport.sessionId}`);
|
|
80
|
-
await mcpServer.connect(serverBackendFactory, transport, false);
|
|
81
|
-
res.on('close', () => {
|
|
82
|
-
testDebug(`delete SSE session: ${transport.sessionId}`);
|
|
83
|
-
sessions.delete(transport.sessionId);
|
|
84
|
-
});
|
|
85
|
-
return;
|
|
86
|
-
}
|
|
87
|
-
res.statusCode = 405;
|
|
88
|
-
res.end('Method not allowed');
|
|
66
|
+
await handleStreamable(serverBackendFactory, req, res, streamableSessions);
|
|
67
|
+
});
|
|
89
68
|
}
|
|
90
69
|
async function handleStreamable(serverBackendFactory, req, res, sessions) {
|
|
70
|
+
const routingError = validateRequestRouting(req, !!req.headers['mcp-session-id']);
|
|
71
|
+
if (routingError) {
|
|
72
|
+
res.statusCode = routingError.statusCode;
|
|
73
|
+
res.end(routingError.message);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
91
76
|
const sessionId = req.headers['mcp-session-id'];
|
|
92
77
|
if (sessionId) {
|
|
93
78
|
const transport = sessions.get(sessionId);
|
|
@@ -133,4 +118,114 @@ function decorateServer(server) {
|
|
|
133
118
|
return close.call(server, callback);
|
|
134
119
|
};
|
|
135
120
|
}
|
|
121
|
+
function validateRequestHeaders(httpServer, req) {
|
|
122
|
+
const allowedHosts = allowedHostnamesForServer(httpServer);
|
|
123
|
+
const hostHeader = req.headers.host;
|
|
124
|
+
const host = typeof hostHeader === 'string' ? parseAuthority(hostHeader) : undefined;
|
|
125
|
+
if (!host) {
|
|
126
|
+
testDebug('reject request with invalid host header: %o', hostHeader);
|
|
127
|
+
return { statusCode: 400, message: 'Invalid Host header' };
|
|
128
|
+
}
|
|
129
|
+
if (!allowedHosts.has(host.hostname)) {
|
|
130
|
+
testDebug('reject request for disallowed host %s; allowed hosts: %o', host.hostname, [...allowedHosts]);
|
|
131
|
+
return { statusCode: 403, message: 'Forbidden Host header' };
|
|
132
|
+
}
|
|
133
|
+
const originHeader = req.headers.origin;
|
|
134
|
+
if (!originHeader)
|
|
135
|
+
return;
|
|
136
|
+
const origin = parseOriginAuthority(originHeader);
|
|
137
|
+
if (!origin) {
|
|
138
|
+
testDebug('reject request with invalid origin header: %o', originHeader);
|
|
139
|
+
return { statusCode: 400, message: 'Invalid Origin header' };
|
|
140
|
+
}
|
|
141
|
+
if (!allowedHosts.has(origin.hostname)) {
|
|
142
|
+
testDebug('reject request for disallowed origin %s; allowed hosts: %o', origin.hostname, [...allowedHosts]);
|
|
143
|
+
return { statusCode: 403, message: 'Forbidden Origin header' };
|
|
144
|
+
}
|
|
145
|
+
if (origin.scheme !== host.scheme) {
|
|
146
|
+
testDebug('reject request with mismatched origin scheme %s for host scheme %s', origin.scheme, host.scheme);
|
|
147
|
+
return { statusCode: 403, message: 'Forbidden Origin header' };
|
|
148
|
+
}
|
|
149
|
+
if (origin.authority !== host.authority) {
|
|
150
|
+
testDebug('reject request with mismatched origin authority %s for host authority %s', origin.authority, host.authority);
|
|
151
|
+
return { statusCode: 403, message: 'Forbidden Origin header' };
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
function allowedHostnamesForServer(httpServer) {
|
|
155
|
+
const allowed = new Set(['localhost', '::1', '127.0.0.1']);
|
|
156
|
+
const address = httpServer.address();
|
|
157
|
+
if (!address || typeof address === 'string')
|
|
158
|
+
return allowed;
|
|
159
|
+
const boundAddress = normalizeHostname(address.address);
|
|
160
|
+
if (boundAddress && !isWildcardAddress(boundAddress))
|
|
161
|
+
allowed.add(boundAddress);
|
|
162
|
+
return allowed;
|
|
163
|
+
}
|
|
164
|
+
function isWildcardAddress(hostname) {
|
|
165
|
+
return hostname === '0.0.0.0' || hostname === '::';
|
|
166
|
+
}
|
|
167
|
+
function validateRequestRouting(req, hasSessionId) {
|
|
168
|
+
const requestPath = parseRequestPath(req.url);
|
|
169
|
+
if (!requestPath)
|
|
170
|
+
return { statusCode: 400, message: 'Invalid request' };
|
|
171
|
+
if (requestPath !== '/mcp')
|
|
172
|
+
return { statusCode: 404, message: 'Not found' };
|
|
173
|
+
if (req.method === 'POST' || hasSessionId)
|
|
174
|
+
return;
|
|
175
|
+
return { statusCode: 400, message: 'Invalid request' };
|
|
176
|
+
}
|
|
177
|
+
function parseAuthority(authority) {
|
|
178
|
+
try {
|
|
179
|
+
const url = new URL(`http://${authority}`);
|
|
180
|
+
const hostname = normalizeHostname(url.hostname);
|
|
181
|
+
return {
|
|
182
|
+
hostname,
|
|
183
|
+
authority: formatAuthority(hostname, url.port),
|
|
184
|
+
scheme: 'http',
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
function parseOriginAuthority(origin) {
|
|
192
|
+
try {
|
|
193
|
+
const url = new URL(origin);
|
|
194
|
+
if (url.protocol !== 'http:' && url.protocol !== 'https:')
|
|
195
|
+
return;
|
|
196
|
+
const hostname = normalizeHostname(url.hostname);
|
|
197
|
+
return {
|
|
198
|
+
hostname,
|
|
199
|
+
authority: formatAuthority(hostname, url.port),
|
|
200
|
+
scheme: url.protocol === 'https:' ? 'https' : 'http',
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
function parseRequestPath(requestUrl) {
|
|
208
|
+
if (!requestUrl)
|
|
209
|
+
return;
|
|
210
|
+
try {
|
|
211
|
+
return new URL(requestUrl, 'http://127.0.0.1').pathname;
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
function formatAuthority(hostname, port) {
|
|
218
|
+
const normalizedHost = hostname.includes(':') ? `[${hostname}]` : hostname;
|
|
219
|
+
return port ? `${normalizedHost}:${port}` : normalizedHost;
|
|
220
|
+
}
|
|
221
|
+
function normalizeHostname(hostname) {
|
|
222
|
+
const lowerCase = hostname.trim().toLowerCase().replace(/^\[(.*)\]$/, '$1');
|
|
223
|
+
if (lowerCase.startsWith('::ffff:'))
|
|
224
|
+
return lowerCase.slice('::ffff:'.length);
|
|
225
|
+
if (allowedLoopbackHostnamePattern.test(lowerCase))
|
|
226
|
+
return '127.0.0.1';
|
|
227
|
+
if (lowerCase.endsWith('.localhost'))
|
|
228
|
+
return 'localhost';
|
|
229
|
+
return lowerCase;
|
|
230
|
+
}
|
|
136
231
|
//# sourceMappingURL=http.js.map
|
package/lib/mcp/http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/mcp/http.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/mcp/http.ts"],"names":[],"mappings":"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"}
|
package/lib/mcp/mdb.js
CHANGED
|
@@ -34,7 +34,7 @@ export class MDBBackend {
|
|
|
34
34
|
constructor(topLevelBackend) {
|
|
35
35
|
this._topLevelBackend = topLevelBackend;
|
|
36
36
|
}
|
|
37
|
-
async initialize(
|
|
37
|
+
async initialize(_context) {
|
|
38
38
|
if (this._initialized)
|
|
39
39
|
return;
|
|
40
40
|
this._initialized = true;
|
|
@@ -45,7 +45,7 @@ export class MDBBackend {
|
|
|
45
45
|
const response = await this._client().listTools();
|
|
46
46
|
return response.tools;
|
|
47
47
|
}
|
|
48
|
-
async callTool(name, args) {
|
|
48
|
+
async callTool(name, args, requestContext) {
|
|
49
49
|
if (name === pushToolsSchema.name)
|
|
50
50
|
return await this._pushTools(pushToolsSchema.inputSchema.parse(args || {}));
|
|
51
51
|
const interruptPromise = new ManualPromise();
|
|
@@ -65,6 +65,7 @@ export class MDBBackend {
|
|
|
65
65
|
this._client().callTool({
|
|
66
66
|
name,
|
|
67
67
|
arguments: args,
|
|
68
|
+
_meta: requestContext?._meta,
|
|
68
69
|
}).then(result => {
|
|
69
70
|
resultPromise.resolve(result);
|
|
70
71
|
}).catch(e => {
|
|
@@ -179,17 +180,17 @@ class OnceTimeServerBackendWrapper {
|
|
|
179
180
|
this._backend = backend;
|
|
180
181
|
this._backend.requestSelfDestruct = () => this._selfDestructPromise.resolve();
|
|
181
182
|
}
|
|
182
|
-
async initialize(
|
|
183
|
-
await this._backend.initialize?.(
|
|
183
|
+
async initialize(context, clientVersion, roots) {
|
|
184
|
+
await this._backend.initialize?.(context, clientVersion, roots);
|
|
184
185
|
}
|
|
185
186
|
async listTools() {
|
|
186
187
|
return this._backend.listTools();
|
|
187
188
|
}
|
|
188
|
-
async callTool(name, args) {
|
|
189
|
-
return this._backend.callTool(name, args);
|
|
189
|
+
async callTool(name, args, requestContext) {
|
|
190
|
+
return this._backend.callTool(name, args, requestContext);
|
|
190
191
|
}
|
|
191
|
-
serverClosed(
|
|
192
|
-
this._backend.serverClosed?.(
|
|
192
|
+
serverClosed() {
|
|
193
|
+
this._backend.serverClosed?.();
|
|
193
194
|
this._selfDestructPromise.resolve();
|
|
194
195
|
}
|
|
195
196
|
async waitForClosed() {
|
package/lib/mcp/mdb.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mdb.js","sourceRoot":"","sources":["../../src/mcp/mdb.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,SAAS,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,OAAO,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAInD,MAAM,QAAQ,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC;AACrC,MAAM,WAAW,GAAG,KAAK,CAAC,eAAe,CAAC,CAAC;AAE3C,MAAM,OAAO,UAAU;IACb,MAAM,GAAkH,EAAE,CAAC;IAC3H,iBAAiB,CAAsD;IACvE,gBAAgB,CAA0B;IAC1C,YAAY,GAAG,KAAK,CAAC;IAE7B,YAAY,eAAwC;QAClD,IAAI,CAAC,gBAAgB,GAAG,eAAe,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"mdb.js","sourceRoot":"","sources":["../../src/mcp/mdb.ts"],"names":[],"mappings":"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"}
|
package/lib/mcp/proxyBackend.js
CHANGED
|
@@ -17,19 +17,22 @@ import debug from 'debug';
|
|
|
17
17
|
import { z } from 'zod';
|
|
18
18
|
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
19
19
|
import { ListRootsRequestSchema, PingRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
20
|
+
import { notifyToolListChanged } from './toolListChanged.js';
|
|
20
21
|
const errorsDebug = debug('pw:mcp:errors');
|
|
21
22
|
export class ProxyBackend {
|
|
22
23
|
_mcpProviders;
|
|
23
24
|
_currentClient;
|
|
24
25
|
_contextSwitchTool;
|
|
25
26
|
_roots = [];
|
|
27
|
+
_backendContext;
|
|
26
28
|
constructor(mcpProviders) {
|
|
27
29
|
this._mcpProviders = mcpProviders;
|
|
28
30
|
this._contextSwitchTool = this._defineContextSwitchTool();
|
|
29
31
|
}
|
|
30
|
-
async initialize(
|
|
32
|
+
async initialize(context, clientVersion, roots) {
|
|
33
|
+
this._backendContext = context;
|
|
31
34
|
this._roots = roots;
|
|
32
|
-
await this._setCurrentClient(this._mcpProviders[0]);
|
|
35
|
+
await this._setCurrentClient(this._mcpProviders[0], false);
|
|
33
36
|
}
|
|
34
37
|
async listTools() {
|
|
35
38
|
const response = await this._currentClient.listTools();
|
|
@@ -40,12 +43,18 @@ export class ProxyBackend {
|
|
|
40
43
|
this._contextSwitchTool,
|
|
41
44
|
];
|
|
42
45
|
}
|
|
43
|
-
async callTool(name, args) {
|
|
46
|
+
async callTool(name, args, requestContext) {
|
|
44
47
|
if (name === this._contextSwitchTool.name)
|
|
45
48
|
return this._callContextSwitchTool(args);
|
|
49
|
+
const progressToken = requestContext?._meta?.progressToken;
|
|
46
50
|
return await this._currentClient.callTool({
|
|
47
51
|
name,
|
|
48
52
|
arguments: args,
|
|
53
|
+
_meta: requestContext?._meta,
|
|
54
|
+
}, undefined, progressToken === undefined ? undefined : {
|
|
55
|
+
onprogress: params => {
|
|
56
|
+
void this._forwardProgressNotification(requestContext, progressToken, params);
|
|
57
|
+
},
|
|
49
58
|
});
|
|
50
59
|
}
|
|
51
60
|
serverClosed() {
|
|
@@ -56,7 +65,7 @@ export class ProxyBackend {
|
|
|
56
65
|
const factory = this._mcpProviders.find(factory => factory.name === params.name);
|
|
57
66
|
if (!factory)
|
|
58
67
|
throw new Error('Unknown connection method: ' + params.name);
|
|
59
|
-
await this._setCurrentClient(factory);
|
|
68
|
+
await this._setCurrentClient(factory, true);
|
|
60
69
|
return {
|
|
61
70
|
content: [{ type: 'text', text: '### Result\nSuccessfully changed connection method.\n' }],
|
|
62
71
|
};
|
|
@@ -68,6 +77,20 @@ export class ProxyBackend {
|
|
|
68
77
|
};
|
|
69
78
|
}
|
|
70
79
|
}
|
|
80
|
+
async _forwardProgressNotification(requestContext, progressToken, params) {
|
|
81
|
+
try {
|
|
82
|
+
await requestContext?.sendNotification({
|
|
83
|
+
method: 'notifications/progress',
|
|
84
|
+
params: {
|
|
85
|
+
progressToken,
|
|
86
|
+
...params,
|
|
87
|
+
},
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
errorsDebug('Failed to forward downstream progress notification: %o', error);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
71
94
|
_defineContextSwitchTool() {
|
|
72
95
|
return {
|
|
73
96
|
name: 'browser_connect',
|
|
@@ -85,7 +108,8 @@ export class ProxyBackend {
|
|
|
85
108
|
},
|
|
86
109
|
};
|
|
87
110
|
}
|
|
88
|
-
async _setCurrentClient(factory) {
|
|
111
|
+
async _setCurrentClient(factory, notifyOnChange) {
|
|
112
|
+
const previousTools = notifyOnChange ? await this._getExposedTools(this._currentClient).catch(() => undefined) : undefined;
|
|
89
113
|
await this._currentClient?.close();
|
|
90
114
|
this._currentClient = undefined;
|
|
91
115
|
const client = new Client({ name: 'Playwright MCP Proxy', version: '0.0.0' });
|
|
@@ -99,6 +123,16 @@ export class ProxyBackend {
|
|
|
99
123
|
const transport = await factory.connect();
|
|
100
124
|
await client.connect(transport);
|
|
101
125
|
this._currentClient = client;
|
|
126
|
+
await notifyToolListChanged(this._backendContext, previousTools, await this._getExposedTools(client));
|
|
127
|
+
}
|
|
128
|
+
async _getExposedTools(client) {
|
|
129
|
+
if (!client)
|
|
130
|
+
return [];
|
|
131
|
+
const { tools } = await client.listTools();
|
|
132
|
+
const toolDescriptors = [...tools];
|
|
133
|
+
if (this._mcpProviders.length > 1)
|
|
134
|
+
toolDescriptors.push(this._contextSwitchTool);
|
|
135
|
+
return toolDescriptors;
|
|
102
136
|
}
|
|
103
137
|
}
|
|
104
138
|
//# sourceMappingURL=proxyBackend.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxyBackend.js","sourceRoot":"","sources":["../../src/mcp/proxyBackend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"proxyBackend.js","sourceRoot":"","sources":["../../src/mcp/proxyBackend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAC/F,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAY7D,MAAM,WAAW,GAAG,KAAK,CAAC,eAAe,CAAC,CAAC;AAE3C,MAAM,OAAO,YAAY;IACf,aAAa,CAAgB;IAC7B,cAAc,CAAqB;IACnC,kBAAkB,CAAO;IACzB,MAAM,GAAW,EAAE,CAAC;IACpB,eAAe,CAAmC;IAE1D,YAAY,YAA2B;QACrC,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;QAClC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAA6B,EAAE,aAA4B,EAAE,KAAa;QACzF,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC;QAC/B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,SAAS;QACb,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAe,CAAC,SAAS,EAAE,CAAC;QACxD,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC;YACjC,OAAO,QAAQ,CAAC,KAAK,CAAC;QACxB,OAAO;YACL,GAAG,QAAQ,CAAC,KAAK;YACjB,IAAI,CAAC,kBAAkB;SACxB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAY,EAAE,IAA4C,EAAE,cAAuC;QAChH,IAAI,IAAI,KAAK,IAAI,CAAC,kBAAkB,CAAC,IAAI;YACvC,OAAO,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,aAAa,GAAG,cAAc,EAAE,KAAK,EAAE,aAAa,CAAC;QAC3D,OAAO,MAAM,IAAI,CAAC,cAAe,CAAC,QAAQ,CAAC;YACzC,IAAI;YACJ,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,cAAc,EAAE,KAAK;SAC7B,EAAE,SAAS,EAAE,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;YACtD,UAAU,EAAE,MAAM,CAAC,EAAE;gBACnB,KAAK,IAAI,CAAC,4BAA4B,CAAC,cAAc,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;YAChF,CAAC;SACF,CAAmB,CAAC;IACvB,CAAC;IAED,YAAY;QACV,KAAK,IAAI,CAAC,cAAc,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACvD,CAAC;IAEO,KAAK,CAAC,sBAAsB,CAAC,MAAW;QAC9C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC;YACjF,IAAI,CAAC,OAAO;gBACV,MAAM,IAAI,KAAK,CAAC,6BAA6B,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;YAE/D,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC5C,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,uDAAuD,EAAE,CAAC;aAC3F,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,sBAAsB,KAAK,IAAI,EAAE,CAAC;gBAClE,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,4BAA4B,CACxC,cAAkD,EAClD,aAA8B,EAC9B,MAA8D;QAE9D,IAAI,CAAC;YACH,MAAM,cAAc,EAAE,gBAAgB,CAAC;gBACrC,MAAM,EAAE,wBAAwB;gBAChC,MAAM,EAAE;oBACN,aAAa;oBACb,GAAG,MAAM;iBACV;aACF,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,CAAC,wDAAwD,EAAE,KAAK,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IAEO,wBAAwB;QAC9B,OAAO;YACL,IAAI,EAAE,iBAAiB;YACvB,WAAW,EAAE;gBACX,0DAA0D;gBAC1D,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,OAAO,CAAC,IAAI,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC;aACpF,CAAC,IAAI,CAAC,IAAI,CAAC;YACZ,WAAW,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC;gBACnC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAA0B,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,6CAA6C,CAAC;aACnL,CAAC,CAAwB;YAC1B,WAAW,EAAE;gBACX,KAAK,EAAE,8BAA8B;gBACrC,YAAY,EAAE,IAAI;gBAClB,aAAa,EAAE,KAAK;aACrB;SACF,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAAC,OAAoB,EAAE,cAAuB;QAC3E,MAAM,aAAa,GAAG,cAAc,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3H,MAAM,IAAI,CAAC,cAAc,EAAE,KAAK,EAAE,CAAC;QACnC,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;QAEhC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAC9E,MAAM,CAAC,oBAAoB,CAAC;YAC1B,KAAK,EAAE;gBACL,WAAW,EAAE,IAAI;aAClB;SACF,CAAC,CAAC;QACH,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACjF,MAAM,CAAC,iBAAiB,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAExD,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QAC1C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAChC,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC;QAC7B,MAAM,qBAAqB,CAAC,IAAI,CAAC,eAAe,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC;IACxG,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,MAA0B;QACvD,IAAI,CAAC,MAAM;YACT,OAAO,EAAE,CAAC;QAEZ,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;QAC3C,MAAM,eAAe,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;QACnC,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;YAC/B,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAChD,OAAO,eAAe,CAAC;IACzB,CAAC;CACF"}
|
package/lib/mcp/server.js
CHANGED
|
@@ -34,7 +34,9 @@ export function createServer(name, version, backend, runHeartbeat) {
|
|
|
34
34
|
const initializedPromise = new Promise(resolve => initializedPromiseResolve = resolve);
|
|
35
35
|
const server = new Server({ name, version }, {
|
|
36
36
|
capabilities: {
|
|
37
|
-
tools: {
|
|
37
|
+
tools: {
|
|
38
|
+
listChanged: true,
|
|
39
|
+
},
|
|
38
40
|
}
|
|
39
41
|
});
|
|
40
42
|
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
@@ -44,7 +46,7 @@ export function createServer(name, version, backend, runHeartbeat) {
|
|
|
44
46
|
return { tools };
|
|
45
47
|
});
|
|
46
48
|
let heartbeatRunning = false;
|
|
47
|
-
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
49
|
+
server.setRequestHandler(CallToolRequestSchema, async (request, extra) => {
|
|
48
50
|
serverDebug('callTool', request);
|
|
49
51
|
await initializedPromise;
|
|
50
52
|
if (runHeartbeat && !heartbeatRunning) {
|
|
@@ -52,7 +54,7 @@ export function createServer(name, version, backend, runHeartbeat) {
|
|
|
52
54
|
startHeartbeat(server);
|
|
53
55
|
}
|
|
54
56
|
try {
|
|
55
|
-
return await backend.callTool(request.params.name, request.params.arguments || {});
|
|
57
|
+
return await backend.callTool(request.params.name, request.params.arguments || {}, extra);
|
|
56
58
|
}
|
|
57
59
|
catch (error) {
|
|
58
60
|
return {
|
|
@@ -70,14 +72,17 @@ export function createServer(name, version, backend, runHeartbeat) {
|
|
|
70
72
|
clientRoots = roots;
|
|
71
73
|
}
|
|
72
74
|
const clientVersion = server.getClientVersion() ?? { name: 'unknown', version: 'unknown' };
|
|
73
|
-
|
|
75
|
+
const context = {
|
|
76
|
+
notifyToolListChanged: () => server.sendToolListChanged(),
|
|
77
|
+
};
|
|
78
|
+
await backend.initialize?.(context, clientVersion, clientRoots);
|
|
74
79
|
initializedPromiseResolve();
|
|
75
80
|
}
|
|
76
81
|
catch (e) {
|
|
77
82
|
errorsDebug(e);
|
|
78
83
|
}
|
|
79
84
|
});
|
|
80
|
-
addServerListener(server, 'close', () => backend.serverClosed?.(
|
|
85
|
+
addServerListener(server, 'close', () => backend.serverClosed?.());
|
|
81
86
|
return server;
|
|
82
87
|
}
|
|
83
88
|
const startHeartbeat = (server) => {
|
|
@@ -116,7 +121,6 @@ export async function start(serverBackendFactory, options) {
|
|
|
116
121
|
`Listening on ${url}`,
|
|
117
122
|
'Put this in your client config:',
|
|
118
123
|
JSON.stringify(mcpConfig, undefined, 2),
|
|
119
|
-
'For legacy SSE transport support, you can use the /sse endpoint instead.',
|
|
120
124
|
].join('\n');
|
|
121
125
|
// eslint-disable-next-line no-console
|
|
122
126
|
console.error(message);
|