cbrowser 18.3.6 → 18.3.7

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/dist/cli.js CHANGED
File without changes
@@ -0,0 +1,40 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CBrowser - Cognitive Browser Automation
4
+ *
5
+ * Copyright (c) 2026 WF Media (Alexandria Eden)
6
+ * Email: alexandria.shai.eden@gmail.com
7
+ *
8
+ * This source code is licensed under the Business Source License 1.1
9
+ * found in the LICENSE file in the root directory of this source tree.
10
+ *
11
+ * Non-production use is permitted. Production use requires a commercial license.
12
+ * See LICENSE for full terms.
13
+ */
14
+ /**
15
+ * CBrowser MCP Server with Native SDK OAuth Authentication
16
+ *
17
+ * Uses the official MCP SDK auth router (Express-based) with ProxyOAuthServerProvider
18
+ * for RFC-compliant OAuth 2.1 integration with Auth0 or other providers.
19
+ *
20
+ * Run with: cbrowser mcp-native-auth
21
+ * Or: npx cbrowser mcp-native-auth
22
+ *
23
+ * Environment variables:
24
+ * PORT - Port to listen on (default: 3000)
25
+ * HOST - Host to bind to (default: 0.0.0.0)
26
+ * MCP_SERVER_URL - Public URL of this server (required for OAuth metadata)
27
+ *
28
+ * Auth0 OAuth Environment Variables:
29
+ * AUTH0_DOMAIN - Your Auth0 tenant domain (e.g., 'your-tenant.auth0.com')
30
+ * AUTH0_AUDIENCE - API audience/identifier (e.g., 'https://your-server.com')
31
+ * AUTH0_CLIENT_ID - Optional: Client ID for static registration
32
+ */
33
+ import express from "express";
34
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
35
+ import { ProxyOAuthServerProvider } from "@modelcontextprotocol/sdk/server/auth/providers/proxyProvider.js";
36
+ declare function createMcpServer(): McpServer;
37
+ declare function createProxyOAuthProvider(): ProxyOAuthServerProvider | null;
38
+ declare function createApp(): express.Application;
39
+ export { createApp, createMcpServer, createProxyOAuthProvider };
40
+ //# sourceMappingURL=mcp-server-native-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server-native-auth.d.ts","sourceRoot":"","sources":["../src/mcp-server-native-auth.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;GAWG;AAEH;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,OAA4C,MAAM,SAAS,CAAC;AAGnE,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,OAAO,EAAE,wBAAwB,EAAqB,MAAM,kEAAkE,CAAC;AAmJ/H,iBAAS,eAAe,IAAI,SAAS,CAoFpC;AAMD,iBAAS,wBAAwB,IAAI,wBAAwB,GAAG,IAAI,CAiCnE;AAMD,iBAAS,SAAS,IAAI,OAAO,CAAC,WAAW,CA2FxC;AA+DD,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,wBAAwB,EAAE,CAAC"}
@@ -0,0 +1,383 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CBrowser - Cognitive Browser Automation
4
+ *
5
+ * Copyright (c) 2026 WF Media (Alexandria Eden)
6
+ * Email: alexandria.shai.eden@gmail.com
7
+ *
8
+ * This source code is licensed under the Business Source License 1.1
9
+ * found in the LICENSE file in the root directory of this source tree.
10
+ *
11
+ * Non-production use is permitted. Production use requires a commercial license.
12
+ * See LICENSE for full terms.
13
+ */
14
+ /**
15
+ * CBrowser MCP Server with Native SDK OAuth Authentication
16
+ *
17
+ * Uses the official MCP SDK auth router (Express-based) with ProxyOAuthServerProvider
18
+ * for RFC-compliant OAuth 2.1 integration with Auth0 or other providers.
19
+ *
20
+ * Run with: cbrowser mcp-native-auth
21
+ * Or: npx cbrowser mcp-native-auth
22
+ *
23
+ * Environment variables:
24
+ * PORT - Port to listen on (default: 3000)
25
+ * HOST - Host to bind to (default: 0.0.0.0)
26
+ * MCP_SERVER_URL - Public URL of this server (required for OAuth metadata)
27
+ *
28
+ * Auth0 OAuth Environment Variables:
29
+ * AUTH0_DOMAIN - Your Auth0 tenant domain (e.g., 'your-tenant.auth0.com')
30
+ * AUTH0_AUDIENCE - API audience/identifier (e.g., 'https://your-server.com')
31
+ * AUTH0_CLIENT_ID - Optional: Client ID for static registration
32
+ */
33
+ import express from "express";
34
+ import { createServer } from "node:http";
35
+ import { createRemoteJWKSet, jwtVerify } from "jose";
36
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
37
+ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
38
+ import { mcpAuthRouter } from "@modelcontextprotocol/sdk/server/auth/router.js";
39
+ import { ProxyOAuthServerProvider } from "@modelcontextprotocol/sdk/server/auth/providers/proxyProvider.js";
40
+ import { z } from "zod";
41
+ import { CBrowser } from "./browser.js";
42
+ import { ensureDirectories, getStatusInfo, getSessionId } from "./config.js";
43
+ // Version from package.json
44
+ const VERSION = "16.14.5";
45
+ // =========================================================================
46
+ // Configuration
47
+ // =========================================================================
48
+ const PORT = parseInt(process.env.PORT || "3000", 10);
49
+ const HOST = process.env.HOST || "0.0.0.0";
50
+ const SERVER_URL = process.env.MCP_SERVER_URL || `http://localhost:${PORT}`;
51
+ // Token cache to avoid hitting Auth0 rate limits
52
+ const tokenCache = new Map();
53
+ const TOKEN_CACHE_TTL = 30 * 60 * 1000; // 30 minutes
54
+ let auth0Config = null;
55
+ function getAuth0Config() {
56
+ const domain = process.env.AUTH0_DOMAIN;
57
+ const audience = process.env.AUTH0_AUDIENCE;
58
+ if (!domain || !audience) {
59
+ return null;
60
+ }
61
+ if (!auth0Config || auth0Config.domain !== domain) {
62
+ auth0Config = {
63
+ domain,
64
+ audience,
65
+ clientId: process.env.AUTH0_CLIENT_ID,
66
+ jwks: createRemoteJWKSet(new URL(`https://${domain}/.well-known/jwks.json`)),
67
+ };
68
+ }
69
+ return auth0Config;
70
+ }
71
+ /**
72
+ * Validate Auth0 token - supports both JWT and opaque tokens with caching
73
+ */
74
+ async function validateAuth0Token(token) {
75
+ const config = getAuth0Config();
76
+ if (!config) {
77
+ return null;
78
+ }
79
+ // Check cache first (use first 32 chars of token as key for security)
80
+ const cacheKey = token.substring(0, 32);
81
+ const cached = tokenCache.get(cacheKey);
82
+ if (cached && cached.expires > Date.now()) {
83
+ return {
84
+ token,
85
+ clientId: cached.payload.azp || "unknown",
86
+ scopes: cached.payload.scope?.split(" ") || [],
87
+ expiresAt: cached.payload.exp ? cached.payload.exp * 1000 : undefined,
88
+ };
89
+ }
90
+ const tokenParts = token.split(".");
91
+ // If it's a proper JWT (3 parts), validate locally
92
+ if (tokenParts.length === 3) {
93
+ try {
94
+ const { payload } = await jwtVerify(token, config.jwks, {
95
+ issuer: `https://${config.domain}/`,
96
+ audience: config.audience,
97
+ });
98
+ console.log("[Auth] JWT validated successfully for subject:", payload.sub);
99
+ // Cache the result
100
+ tokenCache.set(cacheKey, { payload, expires: Date.now() + TOKEN_CACHE_TTL });
101
+ return {
102
+ token,
103
+ clientId: payload.azp || "unknown",
104
+ scopes: payload.scope?.split(" ") || [],
105
+ expiresAt: payload.exp ? payload.exp * 1000 : undefined,
106
+ };
107
+ }
108
+ catch (error) {
109
+ console.error("[Auth] JWT validation failed:", error instanceof Error ? error.message : error);
110
+ return null;
111
+ }
112
+ }
113
+ // For opaque/JWE tokens, validate via Auth0's userinfo endpoint
114
+ console.log("[Auth] Opaque token detected, validating via Auth0 userinfo...");
115
+ try {
116
+ const response = await fetch(`https://${config.domain}/userinfo`, {
117
+ headers: {
118
+ Authorization: `Bearer ${token}`,
119
+ },
120
+ });
121
+ if (response.ok) {
122
+ const userinfo = await response.json();
123
+ console.log("[Auth] Token validated via userinfo for:", userinfo.sub || userinfo.email);
124
+ // Cache the result
125
+ tokenCache.set(cacheKey, { payload: userinfo, expires: Date.now() + TOKEN_CACHE_TTL });
126
+ return {
127
+ token,
128
+ clientId: userinfo.sub || "unknown",
129
+ scopes: [],
130
+ };
131
+ }
132
+ else {
133
+ console.error("[Auth] Userinfo validation failed:", response.status, await response.text());
134
+ return null;
135
+ }
136
+ }
137
+ catch (error) {
138
+ console.error("[Auth] Userinfo request failed:", error instanceof Error ? error.message : error);
139
+ return null;
140
+ }
141
+ }
142
+ // =========================================================================
143
+ // Browser Instance Management
144
+ // =========================================================================
145
+ let browserInstance = null;
146
+ async function getBrowser() {
147
+ if (!browserInstance) {
148
+ browserInstance = new CBrowser({ headless: true });
149
+ await browserInstance.launch();
150
+ }
151
+ return browserInstance;
152
+ }
153
+ // =========================================================================
154
+ // Create MCP Server with Tools
155
+ // =========================================================================
156
+ function createMcpServer() {
157
+ const server = new McpServer({
158
+ name: "cbrowser",
159
+ version: VERSION,
160
+ });
161
+ // Register basic tools
162
+ server.tool("status", "Get CBrowser environment status", {}, async () => {
163
+ const info = await getStatusInfo(VERSION);
164
+ return {
165
+ content: [{ type: "text", text: JSON.stringify(info, null, 2) }],
166
+ };
167
+ });
168
+ server.tool("navigate", "Navigate to a URL", {
169
+ url: z.string().describe("URL to navigate to"),
170
+ }, async ({ url }) => {
171
+ const browser = await getBrowser();
172
+ await browser.navigate(url);
173
+ return {
174
+ content: [{ type: "text", text: `Navigated to ${url}` }],
175
+ };
176
+ });
177
+ server.tool("screenshot", "Take a screenshot of the current page", {
178
+ name: z.string().optional().describe("Screenshot filename"),
179
+ }, async ({ name }) => {
180
+ const browser = await getBrowser();
181
+ const paths = ensureDirectories();
182
+ const filename = name || `screenshot_${Date.now()}.png`;
183
+ const filepath = `${paths.screenshotsDir}/${filename}`;
184
+ await browser.screenshot(filepath);
185
+ return {
186
+ content: [{ type: "text", text: `Screenshot saved to ${filepath} (session: ${paths.sessionId})` }],
187
+ };
188
+ });
189
+ server.tool("click", "Click an element on the page", {
190
+ selector: z.string().describe("CSS selector or natural language description"),
191
+ }, async ({ selector }) => {
192
+ const browser = await getBrowser();
193
+ await browser.click(selector);
194
+ return {
195
+ content: [{ type: "text", text: `Clicked: ${selector}` }],
196
+ };
197
+ });
198
+ server.tool("fill", "Fill a form field", {
199
+ selector: z.string().describe("CSS selector or natural language description"),
200
+ value: z.string().describe("Value to fill"),
201
+ }, async ({ selector, value }) => {
202
+ const browser = await getBrowser();
203
+ await browser.fill(selector, value);
204
+ return {
205
+ content: [{ type: "text", text: `Filled ${selector} with value` }],
206
+ };
207
+ });
208
+ return server;
209
+ }
210
+ // =========================================================================
211
+ // Proxy OAuth Provider Setup
212
+ // =========================================================================
213
+ function createProxyOAuthProvider() {
214
+ const config = getAuth0Config();
215
+ if (!config) {
216
+ console.log("[Auth] No Auth0 configuration found, auth disabled");
217
+ return null;
218
+ }
219
+ const options = {
220
+ endpoints: {
221
+ authorizationUrl: `https://${config.domain}/authorize`,
222
+ tokenUrl: `https://${config.domain}/oauth/token`,
223
+ revocationUrl: `https://${config.domain}/oauth/revoke`,
224
+ registrationUrl: `https://${config.domain}/oidc/register`,
225
+ },
226
+ verifyAccessToken: async (token) => {
227
+ const result = await validateAuth0Token(token);
228
+ if (!result) {
229
+ throw new Error("Invalid access token");
230
+ }
231
+ return result;
232
+ },
233
+ getClient: async (clientId) => {
234
+ // For dynamic registration, we trust Auth0 to manage clients
235
+ // Return basic info for any client ID that Auth0 issued
236
+ return {
237
+ client_id: clientId,
238
+ client_name: "CBrowser Client",
239
+ redirect_uris: [],
240
+ };
241
+ },
242
+ };
243
+ return new ProxyOAuthServerProvider(options);
244
+ }
245
+ // =========================================================================
246
+ // Express App Setup
247
+ // =========================================================================
248
+ function createApp() {
249
+ const app = express();
250
+ // Trust proxy for accurate IP behind reverse proxy
251
+ app.set("trust proxy", true);
252
+ // CORS middleware
253
+ app.use((req, res, next) => {
254
+ res.setHeader("Access-Control-Allow-Origin", "*");
255
+ res.setHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, OPTIONS");
256
+ res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, MCP-Session-ID, X-API-Key");
257
+ res.setHeader("Access-Control-Expose-Headers", "MCP-Session-ID");
258
+ if (req.method === "OPTIONS") {
259
+ res.status(200).end();
260
+ return;
261
+ }
262
+ next();
263
+ });
264
+ // Health check (always available)
265
+ app.get("/health", (_req, res) => {
266
+ res.json({
267
+ status: "ok",
268
+ version: VERSION,
269
+ session: getSessionId(),
270
+ timestamp: new Date().toISOString(),
271
+ });
272
+ });
273
+ // Server info (always available)
274
+ app.get("/info", (_req, res) => {
275
+ res.json({
276
+ name: "CBrowser MCP Server (Native Auth)",
277
+ version: VERSION,
278
+ description: "Cognitive Browser automation with native MCP SDK OAuth",
279
+ session: getSessionId(),
280
+ authEnabled: !!getAuth0Config(),
281
+ });
282
+ });
283
+ // Setup OAuth with native MCP SDK auth router
284
+ const provider = createProxyOAuthProvider();
285
+ if (provider) {
286
+ const serverUrl = new URL(SERVER_URL);
287
+ const config = getAuth0Config();
288
+ // Full OAuth server mode - proxies to Auth0
289
+ const authOptions = {
290
+ provider,
291
+ issuerUrl: new URL(`https://${config.domain}`),
292
+ baseUrl: serverUrl,
293
+ serviceDocumentationUrl: new URL("https://github.com/alexandriashai/cbrowser#readme"),
294
+ scopesSupported: ["openid", "profile", "cbrowser:read", "cbrowser:write"],
295
+ resourceName: "CBrowser MCP Server",
296
+ resourceServerUrl: serverUrl,
297
+ };
298
+ app.use(mcpAuthRouter(authOptions));
299
+ console.log("[Auth] Native MCP SDK OAuth router installed");
300
+ console.log(`[Auth] Authorization endpoint: ${serverUrl.href}authorize`);
301
+ console.log(`[Auth] Token endpoint: ${serverUrl.href}token`);
302
+ }
303
+ else {
304
+ // No auth - expose protected resource metadata pointing to nothing
305
+ console.log("[Auth] No authentication configured - server is open");
306
+ }
307
+ // MCP endpoint
308
+ app.all("/mcp", express.raw({ type: "*/*" }), async (req, res) => {
309
+ try {
310
+ const transport = new StreamableHTTPServerTransport({
311
+ sessionIdGenerator: () => getSessionId(),
312
+ });
313
+ const server = createMcpServer();
314
+ await server.connect(transport);
315
+ // Handle the request
316
+ await transport.handleRequest(req, res, req.body);
317
+ }
318
+ catch (error) {
319
+ console.error("[MCP] Error handling request:", error);
320
+ res.status(500).json({ error: "Internal server error" });
321
+ }
322
+ });
323
+ // Root redirects to info
324
+ app.get("/", (_req, res) => {
325
+ res.redirect("/info");
326
+ });
327
+ return app;
328
+ }
329
+ // =========================================================================
330
+ // Main Entry Point
331
+ // =========================================================================
332
+ async function main() {
333
+ console.log(`
334
+ ╔══════════════════════════════════════════════════════════════╗
335
+ ║ CBrowser MCP Server (Native Auth) ║
336
+ ║ v${VERSION} ║
337
+ ╚══════════════════════════════════════════════════════════════╝
338
+ `);
339
+ // Ensure directories exist
340
+ const paths = ensureDirectories();
341
+ console.log(`[Config] Data directory: ${paths.dataDir}`);
342
+ console.log(`[Config] Session ID: ${paths.sessionId}`);
343
+ console.log(`[Config] Screenshots: ${paths.screenshotsDir}`);
344
+ // Create and start Express app
345
+ const app = createApp();
346
+ const server = createServer(app);
347
+ server.listen(PORT, HOST, () => {
348
+ console.log(`
349
+ ╔══════════════════════════════════════════════════════════════╗
350
+ ║ MCP Server running at: http://${HOST}:${PORT}
351
+ ║ Health check: http://${HOST}:${PORT}/health
352
+ ║ MCP endpoint: http://${HOST}:${PORT}/mcp
353
+ ║ Auth mode: ${getAuth0Config() ? "OAuth 2.1 (Auth0)" : "OPEN (no auth)"}
354
+ ╚══════════════════════════════════════════════════════════════╝
355
+ `);
356
+ });
357
+ // Graceful shutdown
358
+ process.on("SIGINT", async () => {
359
+ console.log("\n[Server] Shutting down...");
360
+ if (browserInstance) {
361
+ await browserInstance.close();
362
+ }
363
+ server.close();
364
+ process.exit(0);
365
+ });
366
+ process.on("SIGTERM", async () => {
367
+ console.log("\n[Server] Terminating...");
368
+ if (browserInstance) {
369
+ await browserInstance.close();
370
+ }
371
+ server.close();
372
+ process.exit(0);
373
+ });
374
+ }
375
+ // Run if executed directly
376
+ if (import.meta.url === `file://${process.argv[1]}`) {
377
+ main().catch((error) => {
378
+ console.error("[Fatal]", error);
379
+ process.exit(1);
380
+ });
381
+ }
382
+ export { createApp, createMcpServer, createProxyOAuthProvider };
383
+ //# sourceMappingURL=mcp-server-native-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server-native-auth.js","sourceRoot":"","sources":["../src/mcp-server-native-auth.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cbrowser",
3
- "version": "18.3.6",
3
+ "version": "18.3.7",
4
4
  "type": "module",
5
5
  "description": "Cognitive browser automation that thinks like your users—and helps AI agents navigate too. Simulate real user cognition with abandonment detection, constitutional safety, chaos engineering, and UX friction discovery. Sites that pass CBrowser's cognitive tests are easier for both humans and AI agents to navigate.",
6
6
  "main": "dist/index.js",