@playwright/mcp 0.0.14 → 0.0.16

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,124 @@
1
+ "use strict";
2
+ /**
3
+ * Copyright (c) Microsoft Corporation.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ var __importDefault = (this && this.__importDefault) || function (mod) {
18
+ return (mod && mod.__esModule) ? mod : { "default": mod };
19
+ };
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.startStdioTransport = startStdioTransport;
22
+ exports.startHttpTransport = startHttpTransport;
23
+ const node_http_1 = __importDefault(require("node:http"));
24
+ const node_assert_1 = __importDefault(require("node:assert"));
25
+ const node_crypto_1 = __importDefault(require("node:crypto"));
26
+ const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
27
+ const sse_js_1 = require("@modelcontextprotocol/sdk/server/sse.js");
28
+ const streamableHttp_js_1 = require("@modelcontextprotocol/sdk/server/streamableHttp.js");
29
+ async function startStdioTransport(serverList) {
30
+ const server = await serverList.create();
31
+ await server.connect(new stdio_js_1.StdioServerTransport());
32
+ }
33
+ async function handleSSE(req, res, url, serverList, sessions) {
34
+ if (req.method === 'POST') {
35
+ const sessionId = url.searchParams.get('sessionId');
36
+ if (!sessionId) {
37
+ res.statusCode = 400;
38
+ return res.end('Missing sessionId');
39
+ }
40
+ const transport = sessions.get(sessionId);
41
+ if (!transport) {
42
+ res.statusCode = 404;
43
+ return res.end('Session not found');
44
+ }
45
+ return await transport.handlePostMessage(req, res);
46
+ }
47
+ else if (req.method === 'GET') {
48
+ const transport = new sse_js_1.SSEServerTransport('/sse', res);
49
+ sessions.set(transport.sessionId, transport);
50
+ const server = await serverList.create();
51
+ res.on('close', () => {
52
+ sessions.delete(transport.sessionId);
53
+ serverList.close(server).catch(e => console.error(e));
54
+ });
55
+ return await server.connect(transport);
56
+ }
57
+ res.statusCode = 405;
58
+ res.end('Method not allowed');
59
+ }
60
+ async function handleStreamable(req, res, serverList, sessions) {
61
+ const sessionId = req.headers['mcp-session-id'];
62
+ if (sessionId) {
63
+ const transport = sessions.get(sessionId);
64
+ if (!transport) {
65
+ res.statusCode = 404;
66
+ res.end('Session not found');
67
+ return;
68
+ }
69
+ return await transport.handleRequest(req, res);
70
+ }
71
+ if (req.method === 'POST') {
72
+ const transport = new streamableHttp_js_1.StreamableHTTPServerTransport({
73
+ sessionIdGenerator: () => node_crypto_1.default.randomUUID(),
74
+ onsessioninitialized: sessionId => {
75
+ sessions.set(sessionId, transport);
76
+ }
77
+ });
78
+ transport.onclose = () => {
79
+ if (transport.sessionId)
80
+ sessions.delete(transport.sessionId);
81
+ };
82
+ const server = await serverList.create();
83
+ await server.connect(transport);
84
+ return await transport.handleRequest(req, res);
85
+ }
86
+ res.statusCode = 400;
87
+ res.end('Invalid request');
88
+ }
89
+ function startHttpTransport(port, hostname, serverList) {
90
+ const sseSessions = new Map();
91
+ const streamableSessions = new Map();
92
+ const httpServer = node_http_1.default.createServer(async (req, res) => {
93
+ const url = new URL(`http://localhost${req.url}`);
94
+ if (url.pathname.startsWith('/mcp'))
95
+ await handleStreamable(req, res, serverList, streamableSessions);
96
+ else
97
+ await handleSSE(req, res, url, serverList, sseSessions);
98
+ });
99
+ httpServer.listen(port, hostname, () => {
100
+ const address = httpServer.address();
101
+ (0, node_assert_1.default)(address, 'Could not bind server socket');
102
+ let url;
103
+ if (typeof address === 'string') {
104
+ url = address;
105
+ }
106
+ else {
107
+ const resolvedPort = address.port;
108
+ let resolvedHost = address.family === 'IPv4' ? address.address : `[${address.address}]`;
109
+ if (resolvedHost === '0.0.0.0' || resolvedHost === '[::]')
110
+ resolvedHost = 'localhost';
111
+ url = `http://${resolvedHost}:${resolvedPort}`;
112
+ }
113
+ console.log(`Listening on ${url}`);
114
+ console.log('Put this in your client config:');
115
+ console.log(JSON.stringify({
116
+ 'mcpServers': {
117
+ 'playwright': {
118
+ 'url': `${url}/sse`
119
+ }
120
+ }
121
+ }, undefined, 2));
122
+ console.log('If your client supports streamable HTTP, you can use the /mcp endpoint instead.');
123
+ });
124
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@playwright/mcp",
3
- "version": "0.0.14",
3
+ "version": "0.0.16",
4
4
  "description": "Playwright Tools for MCP",
5
5
  "repository": {
6
6
  "type": "git",
@@ -16,7 +16,7 @@
16
16
  "license": "Apache-2.0",
17
17
  "scripts": {
18
18
  "build": "tsc",
19
- "lint": "eslint .",
19
+ "lint": "npm run update-readme && eslint .",
20
20
  "update-readme": "node utils/update-readme.js",
21
21
  "watch": "tsc --watch",
22
22
  "test": "playwright test",
@@ -34,16 +34,16 @@
34
34
  }
35
35
  },
36
36
  "dependencies": {
37
- "@modelcontextprotocol/sdk": "^1.6.1",
37
+ "@modelcontextprotocol/sdk": "^1.10.1",
38
38
  "commander": "^13.1.0",
39
- "playwright": "^1.52.0-alpha-1743163434000",
39
+ "playwright": "1.53.0-alpha-2025-04-25",
40
40
  "yaml": "^2.7.1",
41
41
  "zod-to-json-schema": "^3.24.4"
42
42
  },
43
43
  "devDependencies": {
44
44
  "@eslint/eslintrc": "^3.2.0",
45
45
  "@eslint/js": "^9.19.0",
46
- "@playwright/test": "^1.52.0-alpha-1743163434000",
46
+ "@playwright/test": "1.53.0-alpha-2025-04-25",
47
47
  "@stylistic/eslint-plugin": "^3.0.1",
48
48
  "@types/node": "^22.13.10",
49
49
  "@typescript-eslint/eslint-plugin": "^8.26.1",