@page2ai/mcp 0.7.0 → 0.8.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/CHANGELOG.md +9 -0
- package/dist/bridge/protocol.d.ts +1 -0
- package/dist/bridge/protocol.d.ts.map +1 -1
- package/dist/bridge/protocol.js +1 -0
- package/dist/bridge/protocol.js.map +1 -1
- package/dist/index.js +45 -13
- package/dist/index.js.map +1 -1
- package/manifest.json +1 -1
- package/package.json +1 -1
- package/server.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,15 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and
|
|
|
5
5
|
project uses [Semantic Versioning](https://semver.org/spec/v2.0.0.html); while the
|
|
6
6
|
major version is `0`, a minor bump may carry breaking changes.
|
|
7
7
|
|
|
8
|
+
## 0.8.0 - 2026-11-02
|
|
9
|
+
|
|
10
|
+
Multiple MCP clients (Claude Desktop, Cursor, `claude -p`) can now share the user's browser through Agent Bridge simultaneously.
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
|
|
14
|
+
- **Auto-port selection.** When `PAGE2AI_BRIDGE_PORT` is not set, the bridge tries ports 3025 through 3032 in order instead of only 3025. The first free port wins. A second Page2AI server started while the first is running picks the next port; the extension (1.7.0 or later) scans the range and connects to all of them. Explicit `PAGE2AI_BRIDGE_PORT` still uses only that port (backward compat).
|
|
15
|
+
- The Claude Code plugin runs `page2ai-mcp@0.8.0`.
|
|
16
|
+
|
|
8
17
|
## 0.7.0 - 2026-11-02
|
|
9
18
|
|
|
10
19
|
Results an agent can act on without a person watching (BL-59 b, c, f; T200 measurements). The hosted endpoint's contract is unchanged.
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export declare const BRIDGE_PROTOCOL = "page2ai-bridge/2";
|
|
2
2
|
export declare const DEFAULT_BRIDGE_PORT = 3025;
|
|
3
|
+
export declare const BRIDGE_PORT_RANGE = 8;
|
|
3
4
|
/** A bridge failure with the protocol's code (TIMEOUT, PERMISSION_REQUIRED, ...).
|
|
4
5
|
* Callers decide by `code`; the message is for people and may change. */
|
|
5
6
|
export declare class BridgeError extends Error {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/bridge/protocol.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,eAAe,qBAAqB,CAAC;AAClD,eAAO,MAAM,mBAAmB,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/bridge/protocol.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,eAAe,qBAAqB,CAAC;AAClD,eAAO,MAAM,mBAAmB,OAAO,CAAC;AACxC,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAEnC;0EAC0E;AAC1E,qBAAa,WAAY,SAAQ,KAAK;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK1C;AAID,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,8EAA8E;IAC9E,KAAK,EAAE,MAAM,CAAC;IACd,4BAA4B;IAC5B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,QAAQ,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,OAAO,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IAGX,IAAI,EAAE,iBAAiB,GAAG,mBAAmB,GAAG,SAAS,GAAG,gBAAgB,GAAG,qBAAqB,CAAC;IACrG,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,gBAAgB,GAAG,YAAY,GAAG,WAAW,GAAG,WAAW,GAAG,oBAAoB,GAAG,mBAAmB,CAAC;AAIrH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,WAAW,CAAC;IAClB,QAAQ,EAAE,OAAO,eAAe,CAAC;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,4BAA4B;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,OAAO,eAAe,CAAC;IACjC,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;4DAC4D;AAC5D,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,SAAS,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE;QACP,aAAa,EAAE,OAAO,CAAC;QACvB,kBAAkB,EAAE,OAAO,CAAC;QAC5B,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,aAAa,GAAG,gBAAgB,GAAG,cAAc,GAAG,kBAAkB,GAAG,qBAAqB,GAAG,WAAW,CAAC;AAIzH,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,OAAO,CAAC;IACvB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CACnB"}
|
package/dist/bridge/protocol.js
CHANGED
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
// The port is inside both proofs, so a relay through another port fails.
|
|
13
13
|
export const BRIDGE_PROTOCOL = 'page2ai-bridge/2';
|
|
14
14
|
export const DEFAULT_BRIDGE_PORT = 3025;
|
|
15
|
+
export const BRIDGE_PORT_RANGE = 8;
|
|
15
16
|
/** A bridge failure with the protocol's code (TIMEOUT, PERMISSION_REQUIRED, ...).
|
|
16
17
|
* Callers decide by `code`; the message is for people and may change. */
|
|
17
18
|
export class BridgeError extends Error {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/bridge/protocol.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,wDAAwD;AACxD,EAAE;AACF,mFAAmF;AACnF,oFAAoF;AACpF,0CAA0C;AAC1C,yGAAyG;AACzG,iGAAiG;AACjG,uBAAuB;AACvB,gFAAgF;AAChF,kFAAkF;AAClF,yEAAyE;AAEzE,MAAM,CAAC,MAAM,eAAe,GAAG,kBAAkB,CAAC;AAClD,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/bridge/protocol.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,wDAAwD;AACxD,EAAE;AACF,mFAAmF;AACnF,oFAAoF;AACpF,0CAA0C;AAC1C,yGAAyG;AACzG,iGAAiG;AACjG,uBAAuB;AACvB,gFAAgF;AAChF,kFAAkF;AAClF,yEAAyE;AAEzE,MAAM,CAAC,MAAM,eAAe,GAAG,kBAAkB,CAAC;AAClD,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC;AACxC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAEnC;0EAC0E;AAC1E,MAAM,OAAO,WAAY,SAAQ,KAAK;IAC3B,IAAI,CAAS;IAEtB,YAAY,IAAY,EAAE,OAAe;QACvC,KAAK,CAAC,GAAG,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF"}
|
package/dist/index.js
CHANGED
|
@@ -17,7 +17,7 @@ import { serveStdio } from '@modelcontextprotocol/server/stdio';
|
|
|
17
17
|
import { Server } from '@modelcontextprotocol/server';
|
|
18
18
|
import { LOCAL_SERVE, handlePageToMarkdown, pageToMarkdownDefinition, setBridge } from './tools/page-to-markdown.js';
|
|
19
19
|
import { BridgeServer } from './bridge/server.js';
|
|
20
|
-
import { DEFAULT_BRIDGE_PORT } from './bridge/protocol.js';
|
|
20
|
+
import { DEFAULT_BRIDGE_PORT, BRIDGE_PORT_RANGE } from './bridge/protocol.js';
|
|
21
21
|
import { BRIDGE_KEY_ENV, parseBridgeKeys } from './bridge/keys.js';
|
|
22
22
|
const SERVER_NAME = 'page2ai-mcp';
|
|
23
23
|
// Read the version from package.json instead of restating it here.
|
|
@@ -104,7 +104,7 @@ const handle = serveStdio(buildServer, {
|
|
|
104
104
|
const isServerless = !!(process.env.VERCEL || process.env.AWS_LAMBDA_FUNCTION_NAME);
|
|
105
105
|
let bridge = null;
|
|
106
106
|
if (!isServerless) {
|
|
107
|
-
const
|
|
107
|
+
const explicitPort = parseInt(process.env.PAGE2AI_BRIDGE_PORT ?? '', 10);
|
|
108
108
|
// An unpacked or self-built Chrome extension has its own ID: list its exact
|
|
109
109
|
// origin(s), comma-separated, e.g. PAGE2AI_BRIDGE_ORIGINS=chrome-extension://<id>.
|
|
110
110
|
const extraOrigins = (process.env.PAGE2AI_BRIDGE_ORIGINS ?? '')
|
|
@@ -113,17 +113,49 @@ if (!isServerless) {
|
|
|
113
113
|
const { keys, problems } = parseBridgeKeys(process.env[BRIDGE_KEY_ENV]);
|
|
114
114
|
for (const problem of problems)
|
|
115
115
|
log(`${BRIDGE_KEY_ENV}: ${problem}; ignored`);
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
bridge
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
116
|
+
const makeBridge = (port) => new BridgeServer({ port, serverVersion: SERVER_VERSION, log, extraOrigins, keys });
|
|
117
|
+
if (explicitPort) {
|
|
118
|
+
// User pinned a specific port — use it or fail.
|
|
119
|
+
bridge = makeBridge(explicitPort);
|
|
120
|
+
setBridge(bridge);
|
|
121
|
+
bridge.start().then(() => log(`bridge ready on ws://127.0.0.1:${explicitPort}`), (err) => {
|
|
122
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
123
|
+
log(`bridge failed to start: ${msg} (the server continues without it)`);
|
|
124
|
+
bridge = null;
|
|
125
|
+
setBridge(null, err?.code === 'EADDRINUSE'
|
|
126
|
+
? `port ${explicitPort} is held by another program`
|
|
127
|
+
: `it failed to start (${msg})`);
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
// Try ports in order: the first free port wins. Multiple MCP clients
|
|
132
|
+
// (Claude Desktop, Cursor, claude -p) each get their own port; the
|
|
133
|
+
// extension scans the range and connects to all of them.
|
|
134
|
+
(async () => {
|
|
135
|
+
const lastPort = DEFAULT_BRIDGE_PORT + BRIDGE_PORT_RANGE - 1;
|
|
136
|
+
for (let port = DEFAULT_BRIDGE_PORT; port <= lastPort; port++) {
|
|
137
|
+
const candidate = makeBridge(port);
|
|
138
|
+
try {
|
|
139
|
+
await candidate.start();
|
|
140
|
+
bridge = candidate;
|
|
141
|
+
setBridge(bridge);
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
catch (err) {
|
|
145
|
+
if (err.code === 'EADDRINUSE') {
|
|
146
|
+
log(`bridge: port ${port} in use, trying next`);
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
150
|
+
log(`bridge failed to start: ${msg} (the server continues without it)`);
|
|
151
|
+
setBridge(null, `it failed to start (${msg})`);
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
log(`bridge: all ports ${DEFAULT_BRIDGE_PORT}-${lastPort} in use (the server continues without it)`);
|
|
156
|
+
setBridge(null, `all bridge ports (${DEFAULT_BRIDGE_PORT}-${lastPort}) are held by other programs`);
|
|
157
|
+
})();
|
|
158
|
+
}
|
|
127
159
|
}
|
|
128
160
|
log(`server ${SERVER_VERSION} ready on stdio (tools: page_to_markdown)`);
|
|
129
161
|
let shuttingDown = false;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,yCAAyC;AACzC,+EAA+E;AAC/E,4EAA4E;AAC5E,2EAA2E;AAC3E,EAAE;AACF,8EAA8E;AAC9E,6EAA6E;AAC7E,gFAAgF;AAChF,+EAA+E;AAC/E,8EAA8E;AAC9E,2EAA2E;AAC3E,qEAAqE;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACrH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/manifest.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"manifest_version": "0.3",
|
|
3
3
|
"name": "page2ai-mcp",
|
|
4
4
|
"display_name": "Page2AI — Web to Markdown",
|
|
5
|
-
"version": "0.
|
|
5
|
+
"version": "0.8.0",
|
|
6
6
|
"description": "Convert any web page to clean Markdown for LLM context",
|
|
7
7
|
"long_description": "Page2AI MCP converts a web page URL to Markdown for AI context windows. It keeps the page's main content (its <main> or dominant <article>), preserves code blocks with language hints, converts tables and lists, and drops navigation, headers, footers and sidebars. The only network requests go to the URL you pass it and the addresses it redirects to, asked for as a browser opens a page, so docs platforms return the page itself rather than a Markdown copy of it: pure Node + linkedom, no external services, no telemetry.\n\nAgent Bridge (Page2AI browser extension 1.6.0 or later: the Chrome Web Store serves it since 2026-10-26, while Firefox Add-ons still serves 1.5.1, which has no Agent Bridge switch): when the extension is connected, the tool routes through the user's real browser — cookies, JavaScript rendering, extension-quality extraction — so pages behind a sign-in and JS-rendered content are within reach. Without the bridge, a page behind a sign-in or rendered only by JavaScript is out of the tool's reach; pass its HTML directly via the `html` parameter.\n\nA long page comes back in parts of up to 30,000 characters (about 8,000 tokens), the first one listing the page's sections, so an agent reads only what it needs; a page the server cannot read comes back with the next step to take.\n\nCompanion to the Page2AI browser extension (https://github.com/igorsaevets/page2ai-extension), which converts the live page in your own browser, including pages behind a sign-in. Built on the open-source @page2ai/core library.",
|
|
8
8
|
"author": {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@page2ai/mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"mcpName": "io.github.igorsaevets/page2ai-mcp",
|
|
5
5
|
"description": "MCP server that converts any web page URL to clean Markdown for LLM context. Processing is local and SSRF-guarded; no external APIs, no telemetry.",
|
|
6
6
|
"type": "module",
|
package/server.json
CHANGED
|
@@ -8,12 +8,12 @@
|
|
|
8
8
|
"source": "github"
|
|
9
9
|
},
|
|
10
10
|
"websiteUrl": "https://igorsaevets.github.io/page2ai-docs/mcp/",
|
|
11
|
-
"version": "0.
|
|
11
|
+
"version": "0.8.0",
|
|
12
12
|
"packages": [
|
|
13
13
|
{
|
|
14
14
|
"registryType": "npm",
|
|
15
15
|
"identifier": "@page2ai/mcp",
|
|
16
|
-
"version": "0.
|
|
16
|
+
"version": "0.8.0",
|
|
17
17
|
"transport": {
|
|
18
18
|
"type": "stdio"
|
|
19
19
|
},
|