@prompteryx/mcp-server 1.0.1

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.
Files changed (66) hide show
  1. package/README.md +271 -0
  2. package/dist/auth/api-key-auth.d.ts +51 -0
  3. package/dist/auth/api-key-auth.d.ts.map +1 -0
  4. package/dist/auth/api-key-auth.js +50 -0
  5. package/dist/auth/api-key-auth.js.map +1 -0
  6. package/dist/auth/usage-enforcer.d.ts +40 -0
  7. package/dist/auth/usage-enforcer.d.ts.map +1 -0
  8. package/dist/auth/usage-enforcer.js +134 -0
  9. package/dist/auth/usage-enforcer.js.map +1 -0
  10. package/dist/execution/cloud-executor.d.ts +16 -0
  11. package/dist/execution/cloud-executor.d.ts.map +1 -0
  12. package/dist/execution/cloud-executor.js +225 -0
  13. package/dist/execution/cloud-executor.js.map +1 -0
  14. package/dist/execution/integration-executor.d.ts +18 -0
  15. package/dist/execution/integration-executor.d.ts.map +1 -0
  16. package/dist/execution/integration-executor.js +101 -0
  17. package/dist/execution/integration-executor.js.map +1 -0
  18. package/dist/index.d.ts +19 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +54 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/resources/workflow-resources.d.ts +16 -0
  23. package/dist/resources/workflow-resources.d.ts.map +1 -0
  24. package/dist/resources/workflow-resources.js +79 -0
  25. package/dist/resources/workflow-resources.js.map +1 -0
  26. package/dist/server.d.ts +28 -0
  27. package/dist/server.d.ts.map +1 -0
  28. package/dist/server.js +104 -0
  29. package/dist/server.js.map +1 -0
  30. package/dist/tools/ai-browser-tools.d.ts +21 -0
  31. package/dist/tools/ai-browser-tools.d.ts.map +1 -0
  32. package/dist/tools/ai-browser-tools.js +88 -0
  33. package/dist/tools/ai-browser-tools.js.map +1 -0
  34. package/dist/tools/browser-session-manager.d.ts +75 -0
  35. package/dist/tools/browser-session-manager.d.ts.map +1 -0
  36. package/dist/tools/browser-session-manager.js +206 -0
  37. package/dist/tools/browser-session-manager.js.map +1 -0
  38. package/dist/tools/browser-tools.d.ts +20 -0
  39. package/dist/tools/browser-tools.d.ts.map +1 -0
  40. package/dist/tools/browser-tools.js +270 -0
  41. package/dist/tools/browser-tools.js.map +1 -0
  42. package/dist/tools/data-tools.d.ts +9 -0
  43. package/dist/tools/data-tools.d.ts.map +1 -0
  44. package/dist/tools/data-tools.js +110 -0
  45. package/dist/tools/data-tools.js.map +1 -0
  46. package/dist/tools/integration-tools.d.ts +29 -0
  47. package/dist/tools/integration-tools.d.ts.map +1 -0
  48. package/dist/tools/integration-tools.js +214 -0
  49. package/dist/tools/integration-tools.js.map +1 -0
  50. package/dist/tools/workflow-builder-tools.d.ts +20 -0
  51. package/dist/tools/workflow-builder-tools.d.ts.map +1 -0
  52. package/dist/tools/workflow-builder-tools.js +95 -0
  53. package/dist/tools/workflow-builder-tools.js.map +1 -0
  54. package/dist/tools/workflow-tools.d.ts +16 -0
  55. package/dist/tools/workflow-tools.d.ts.map +1 -0
  56. package/dist/tools/workflow-tools.js +128 -0
  57. package/dist/tools/workflow-tools.js.map +1 -0
  58. package/dist/utils/node-config-loader.d.ts +54 -0
  59. package/dist/utils/node-config-loader.d.ts.map +1 -0
  60. package/dist/utils/node-config-loader.js +105 -0
  61. package/dist/utils/node-config-loader.js.map +1 -0
  62. package/dist/utils/output-formatter.d.ts +37 -0
  63. package/dist/utils/output-formatter.d.ts.map +1 -0
  64. package/dist/utils/output-formatter.js +62 -0
  65. package/dist/utils/output-formatter.js.map +1 -0
  66. package/package.json +51 -0
package/dist/server.js ADDED
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Prompteryx MCP Server
3
+ *
4
+ * Sets up the McpServer instance, authenticates the user,
5
+ * registers all tool categories, resources, and handles lifecycle.
6
+ */
7
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
8
+ import { authenticate, refreshAuthContext } from './auth/api-key-auth.js';
9
+ import { BrowserSessionManager } from './tools/browser-session-manager.js';
10
+ import { registerBrowserTools } from './tools/browser-tools.js';
11
+ import { registerWorkflowTools } from './tools/workflow-tools.js';
12
+ import { registerWorkflowBuilderTools } from './tools/workflow-builder-tools.js';
13
+ import { registerIntegrationTools } from './tools/integration-tools.js';
14
+ import { registerAiBrowserTools } from './tools/ai-browser-tools.js';
15
+ import { registerDataTools } from './tools/data-tools.js';
16
+ import { registerResources } from './resources/workflow-resources.js';
17
+ const AUTH_REFRESH_INTERVAL_MS = 60_000; // Refresh auth context every 60 seconds
18
+ export async function createPrompterxServer(config) {
19
+ const { apiKey, apiUrl, executionMode, sessionTimeout, } = config;
20
+ // Authenticate and get user context
21
+ let authContext;
22
+ try {
23
+ authContext = await authenticate(apiKey, apiUrl);
24
+ }
25
+ catch (err) {
26
+ process.stderr.write(`[Prompteryx MCP] Authentication failed: ${err.message}\n`);
27
+ throw err;
28
+ }
29
+ process.stderr.write(`[Prompteryx MCP] Authenticated as ${authContext.email} (${authContext.subscriptionTier} plan)\n`);
30
+ process.stderr.write(`[Prompteryx MCP] Execution mode: ${executionMode}\n`);
31
+ // Periodic auth refresh to keep usage stats current
32
+ const refreshInterval = setInterval(async () => {
33
+ try {
34
+ authContext = await refreshAuthContext(apiKey, apiUrl);
35
+ }
36
+ catch {
37
+ // Keep the old context if refresh fails
38
+ }
39
+ }, AUTH_REFRESH_INTERVAL_MS);
40
+ // Never keep the process alive just for the refresh timer (cleanup() clears it).
41
+ refreshInterval.unref?.();
42
+ const getAuth = () => authContext;
43
+ // Create MCP server
44
+ const server = new McpServer({
45
+ name: 'prompteryx',
46
+ version: '1.0.1',
47
+ }, {
48
+ capabilities: {
49
+ tools: {},
50
+ resources: {},
51
+ },
52
+ });
53
+ // Browser session manager (shared across browser tools and AI browser)
54
+ const sessionManager = new BrowserSessionManager(sessionTimeout ?? 300_000);
55
+ const cloudConfig = () => ({
56
+ apiKey,
57
+ apiUrl,
58
+ browserbaseProjectId: process.env.BROWSERBASE_PROJECT_ID ?? '',
59
+ browserbaseApiKey: process.env.BROWSERBASE_API_KEY ?? '',
60
+ browserbaseContextId: authContext.browserbaseContextId,
61
+ stealth: config.stealthMode,
62
+ videoRecording: config.videoRecording,
63
+ });
64
+ // Shared context objects for tool modules
65
+ const browserCtx = {
66
+ getAuth,
67
+ sessionManager,
68
+ apiKey,
69
+ apiUrl,
70
+ executionMode,
71
+ cloudConfig,
72
+ };
73
+ const workflowCtx = { getAuth, apiKey, apiUrl };
74
+ // Register all tool categories
75
+ registerBrowserTools(server, browserCtx);
76
+ registerWorkflowTools(server, workflowCtx);
77
+ registerWorkflowBuilderTools(server, workflowCtx);
78
+ registerAiBrowserTools(server, browserCtx);
79
+ registerDataTools(server);
80
+ registerResources(server, workflowCtx);
81
+ // Dynamic integration tools (async — registers based on user's credentials)
82
+ const integrationCount = await registerIntegrationTools(server, workflowCtx);
83
+ process.stderr.write(`[Prompteryx MCP] Registered ${integrationCount} integration tools\n`);
84
+ const credentialServices = authContext.credentials
85
+ .filter((c) => c.isValid)
86
+ .map((c) => c.connectorId);
87
+ if (credentialServices.length > 0) {
88
+ process.stderr.write(`[Prompteryx MCP] Connected services: ${credentialServices.join(', ')}\n`);
89
+ }
90
+ // Cleanup on exit
91
+ const cleanup = async () => {
92
+ clearInterval(refreshInterval);
93
+ const { minutesUsed } = await sessionManager.close();
94
+ if (minutesUsed > 0) {
95
+ process.stderr.write(`[Prompteryx MCP] Session closed. Cloud minutes used: ${minutesUsed}\n`);
96
+ }
97
+ };
98
+ if (config.registerSignalHandlers !== false) {
99
+ process.on('SIGINT', async () => { await cleanup(); process.exit(0); });
100
+ process.on('SIGTERM', async () => { await cleanup(); process.exit(0); });
101
+ }
102
+ return { server, cleanup };
103
+ }
104
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * AI Browser Agent Tool
3
+ *
4
+ * Provides the browser_ai_action tool that uses Google's Gemini
5
+ * Computer Use model to perform complex visual tasks on web pages.
6
+ * Consumes AI credits from the user's account.
7
+ */
8
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
9
+ import type { AuthContext } from '../auth/api-key-auth.js';
10
+ import { BrowserSessionManager, type CloudSessionConfig } from './browser-session-manager.js';
11
+ interface AiBrowserContext {
12
+ getAuth: () => AuthContext;
13
+ sessionManager: BrowserSessionManager;
14
+ apiKey: string;
15
+ apiUrl: string;
16
+ executionMode: 'cloud' | 'local';
17
+ cloudConfig: () => CloudSessionConfig;
18
+ }
19
+ export declare function registerAiBrowserTools(server: McpServer, ctx: AiBrowserContext): void;
20
+ export {};
21
+ //# sourceMappingURL=ai-browser-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-browser-tools.d.ts","sourceRoot":"","sources":["../../src/tools/ai-browser-tools.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,OAAO,EAAE,qBAAqB,EAAE,KAAK,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAG9F,UAAU,gBAAgB;IACxB,OAAO,EAAE,MAAM,WAAW,CAAC;IAC3B,cAAc,EAAE,qBAAqB,CAAC;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,OAAO,GAAG,OAAO,CAAC;IACjC,WAAW,EAAE,MAAM,kBAAkB,CAAC;CACvC;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,gBAAgB,QA4F9E"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * AI Browser Agent Tool
3
+ *
4
+ * Provides the browser_ai_action tool that uses Google's Gemini
5
+ * Computer Use model to perform complex visual tasks on web pages.
6
+ * Consumes AI credits from the user's account.
7
+ */
8
+ import { z } from 'zod';
9
+ import { enforceUsageLimits, recordUsage, formatUsageRemaining } from '../auth/usage-enforcer.js';
10
+ import { formatError } from '../utils/output-formatter.js';
11
+ export function registerAiBrowserTools(server, ctx) {
12
+ // browser_ai_action
13
+ server.tool('browser_ai_action', 'AI Browser Agent: Give a natural language instruction and the AI will see the screen and perform complex multi-step browser actions. Uses Gemini Computer Use model. Consumes AI credits.', {
14
+ instruction: z.string().describe('Natural language instruction (e.g. "Log into my dashboard and download the monthly report")'),
15
+ maxSteps: z.number().optional().describe('Maximum number of AI actions to perform (default: 10)'),
16
+ cloudProfileId: z.string().optional().describe('Reuse a saved cloud profile (its cookies/logins). Omit to use your default cloud profile; pass persistContext:false for a clean throwaway browser.'),
17
+ persistContext: z.boolean().optional().describe('Persist cookies/logins at session close. Defaults true; set false for an ephemeral run.'),
18
+ viewport: z.object({ width: z.number(), height: z.number() }).optional().describe('Viewport size (default 1440x900).'),
19
+ model: z.string().optional().describe('Vision model id (e.g. gemini-3-flash-preview).'),
20
+ aiVision: z.string().optional().describe('Screenshot resolution "WxH" (e.g. 320x200). Lower = fewer tokens = cheaper.'),
21
+ recordSession: z.boolean().optional().describe('Record the run to an MP4.'),
22
+ }, async ({ instruction, maxSteps, cloudProfileId, persistContext, viewport, model, aiVision, recordSession }) => {
23
+ // Check AI agent credits
24
+ const check = enforceUsageLimits(ctx.getAuth(), 'ai-agent', ctx.executionMode);
25
+ if (!check.allowed) {
26
+ return formatError(check.reason, undefined, { usageRemaining: formatUsageRemaining(ctx.getAuth()) });
27
+ }
28
+ try {
29
+ // Execute via the platform API which handles Gemini interaction. Forward
30
+ // the full option set the endpoint now supports (profile rule, viewport,
31
+ // model, AI-vision downscale, recording) — see app/api/v1/ai-browser/execute.
32
+ const res = await fetch(`${ctx.apiUrl}/api/v1/ai-browser/execute`, {
33
+ method: 'POST',
34
+ headers: {
35
+ 'X-API-Key': ctx.apiKey,
36
+ 'Content-Type': 'application/json',
37
+ },
38
+ body: JSON.stringify({
39
+ instruction,
40
+ maxSteps: maxSteps ?? 10,
41
+ sessionId: ctx.sessionManager.activeSession?.sessionId,
42
+ mode: ctx.executionMode,
43
+ ...(cloudProfileId ? { cloudProfileId } : {}),
44
+ ...(typeof persistContext === 'boolean' ? { persistContext } : {}),
45
+ ...(viewport ? { viewport } : {}),
46
+ ...(model ? { model } : {}),
47
+ ...(aiVision ? { aiVision } : {}),
48
+ ...(typeof recordSession === 'boolean' ? { recordSession } : {}),
49
+ }),
50
+ });
51
+ if (!res.ok) {
52
+ const errData = await res.json().catch(() => ({}));
53
+ return formatError(errData.error?.message ?? `AI Browser Agent failed (${res.status})`, 'Ensure you have AI credits available. Check usage at prompteryx.ai/settings.');
54
+ }
55
+ const data = await res.json();
56
+ // Record AI credit usage
57
+ if (data.creditsUsed) {
58
+ await recordUsage(ctx.apiKey, ctx.apiUrl, { aiCreditsUsed: data.creditsUsed });
59
+ }
60
+ const content = [];
61
+ // Action summary
62
+ content.push({
63
+ type: 'text',
64
+ text: JSON.stringify({
65
+ success: true,
66
+ instruction,
67
+ stepsPerformed: data.steps?.length ?? 0,
68
+ actions: data.steps?.map((s) => s.action) ?? [],
69
+ creditsUsed: data.creditsUsed ?? 0,
70
+ creditsRemaining: ctx.getAuth().aiCreditsIncluded - ctx.getAuth().aiCreditsUsedThisMonth - (data.creditsUsed ?? 0),
71
+ }, null, 2),
72
+ });
73
+ // Final screenshot if available
74
+ if (data.finalScreenshot) {
75
+ content.push({
76
+ type: 'image',
77
+ data: data.finalScreenshot,
78
+ mimeType: 'image/png',
79
+ });
80
+ }
81
+ return { content };
82
+ }
83
+ catch (err) {
84
+ return formatError(`AI Browser Agent error: ${err.message}`);
85
+ }
86
+ });
87
+ }
88
+ //# sourceMappingURL=ai-browser-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-browser-tools.js","sourceRoot":"","sources":["../../src/tools/ai-browser-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Browser Session Manager
3
+ *
4
+ * Manages the lifecycle of Playwright browser sessions.
5
+ * - Cloud mode: creates and reuses Browserbase sessions via CDP.
6
+ * - Local mode: connects to the Electron desktop app at localhost:61337.
7
+ *
8
+ * Sessions persist across tool calls within a single MCP conversation
9
+ * and are released on browser_close or process exit.
10
+ */
11
+ import type { Browser, Page, BrowserContext } from 'playwright-core';
12
+ export interface SessionInfo {
13
+ browser: Browser;
14
+ context: BrowserContext;
15
+ page: Page;
16
+ sessionId: string;
17
+ mode: 'cloud' | 'local';
18
+ createdAt: number;
19
+ lastUsedAt: number;
20
+ debugUrl?: string;
21
+ connectUrl?: string;
22
+ }
23
+ export interface CloudSessionConfig {
24
+ apiKey: string;
25
+ apiUrl: string;
26
+ browserbaseProjectId: string;
27
+ browserbaseApiKey: string;
28
+ browserbaseContextId?: string;
29
+ viewport?: {
30
+ width: number;
31
+ height: number;
32
+ };
33
+ stealth?: boolean;
34
+ videoRecording?: boolean;
35
+ }
36
+ export interface LocalSessionConfig {
37
+ electronUrl: string;
38
+ chromeProfile?: string;
39
+ }
40
+ export declare class BrowserSessionManager {
41
+ private session;
42
+ private timeoutTimer;
43
+ private timeoutMs;
44
+ constructor(timeoutMs?: number);
45
+ get activeSession(): SessionInfo | null;
46
+ get hasSession(): boolean;
47
+ /**
48
+ * Returns the current page, creating a cloud session if needed.
49
+ */
50
+ getOrCreateCloudPage(config: CloudSessionConfig): Promise<SessionInfo>;
51
+ /**
52
+ * Creates a Browserbase session via their REST API.
53
+ */
54
+ private createBrowserbaseSession;
55
+ /**
56
+ * Connects to a local Electron instance.
57
+ */
58
+ getOrCreateLocalPage(config: LocalSessionConfig): Promise<SessionInfo>;
59
+ /**
60
+ * Gets the active page. Throws if no session exists.
61
+ */
62
+ getPage(): Page;
63
+ /**
64
+ * Returns elapsed minutes since session creation.
65
+ */
66
+ getSessionMinutes(): number;
67
+ /**
68
+ * Closes the session and releases all resources.
69
+ */
70
+ close(): Promise<{
71
+ minutesUsed: number;
72
+ }>;
73
+ private resetTimeout;
74
+ }
75
+ //# sourceMappingURL=browser-session-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-session-manager.d.ts","sourceRoot":"","sources":["../../src/tools/browser-session-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAErE,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,cAAc,CAAC;IACxB,IAAI,EAAE,IAAI,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB,EAAE,MAAM,CAAC;IAC7B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAKD,qBAAa,qBAAqB;IAChC,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,YAAY,CAA8C;IAClE,OAAO,CAAC,SAAS,CAAS;gBAEd,SAAS,GAAE,MAA2B;IAIlD,IAAI,aAAa,IAAI,WAAW,GAAG,IAAI,CAEtC;IAED,IAAI,UAAU,IAAI,OAAO,CAExB;IAED;;OAEG;IACG,oBAAoB,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC;IAiD5E;;OAEG;YACW,wBAAwB;IAuCtC;;OAEG;IACG,oBAAoB,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC;IAwC5E;;OAEG;IACH,OAAO,IAAI,IAAI;IASf;;OAEG;IACH,iBAAiB,IAAI,MAAM;IAK3B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAuC/C,OAAO,CAAC,YAAY;CAMrB"}
@@ -0,0 +1,206 @@
1
+ /**
2
+ * Browser Session Manager
3
+ *
4
+ * Manages the lifecycle of Playwright browser sessions.
5
+ * - Cloud mode: creates and reuses Browserbase sessions via CDP.
6
+ * - Local mode: connects to the Electron desktop app at localhost:61337.
7
+ *
8
+ * Sessions persist across tool calls within a single MCP conversation
9
+ * and are released on browser_close or process exit.
10
+ */
11
+ const BROWSERBASE_API = 'https://api.browserbase.com/v1';
12
+ const SESSION_TIMEOUT_MS = 300_000; // 5 minutes default idle timeout
13
+ export class BrowserSessionManager {
14
+ session = null;
15
+ timeoutTimer = null;
16
+ timeoutMs;
17
+ constructor(timeoutMs = SESSION_TIMEOUT_MS) {
18
+ this.timeoutMs = timeoutMs;
19
+ }
20
+ get activeSession() {
21
+ return this.session;
22
+ }
23
+ get hasSession() {
24
+ return this.session !== null;
25
+ }
26
+ /**
27
+ * Returns the current page, creating a cloud session if needed.
28
+ */
29
+ async getOrCreateCloudPage(config) {
30
+ if (this.session && this.session.mode === 'cloud') {
31
+ this.session.lastUsedAt = Date.now();
32
+ this.resetTimeout();
33
+ return this.session;
34
+ }
35
+ // Clean up any existing session first
36
+ await this.close();
37
+ const { chromium } = await import('playwright-core');
38
+ // Create Browserbase session
39
+ const bbSession = await this.createBrowserbaseSession(config);
40
+ const browser = await chromium.connectOverCDP(bbSession.connectUrl);
41
+ const contexts = browser.contexts();
42
+ const context = contexts[0] || await browser.newContext();
43
+ const pages = context.pages();
44
+ const page = pages[0] || await context.newPage();
45
+ // Get debug URL for live viewing
46
+ let debugUrl;
47
+ try {
48
+ const debugRes = await fetch(`${BROWSERBASE_API}/sessions/${bbSession.id}/debug`, {
49
+ headers: { 'x-bb-api-key': config.browserbaseApiKey },
50
+ });
51
+ if (debugRes.ok) {
52
+ const debugData = await debugRes.json();
53
+ debugUrl = debugData.debuggerFullscreenUrl;
54
+ }
55
+ }
56
+ catch { /* non-critical */ }
57
+ this.session = {
58
+ browser,
59
+ context,
60
+ page,
61
+ sessionId: bbSession.id,
62
+ mode: 'cloud',
63
+ createdAt: Date.now(),
64
+ lastUsedAt: Date.now(),
65
+ debugUrl,
66
+ connectUrl: bbSession.connectUrl,
67
+ };
68
+ this.resetTimeout();
69
+ return this.session;
70
+ }
71
+ /**
72
+ * Creates a Browserbase session via their REST API.
73
+ */
74
+ async createBrowserbaseSession(config) {
75
+ const browserSettings = {};
76
+ if (config.browserbaseContextId) {
77
+ browserSettings.context = {
78
+ id: config.browserbaseContextId,
79
+ persist: true,
80
+ };
81
+ }
82
+ if (config.viewport) {
83
+ browserSettings.viewport = config.viewport;
84
+ }
85
+ const body = {
86
+ projectId: config.browserbaseProjectId,
87
+ };
88
+ if (Object.keys(browserSettings).length > 0) {
89
+ body.browserSettings = browserSettings;
90
+ }
91
+ const res = await fetch(`${BROWSERBASE_API}/sessions`, {
92
+ method: 'POST',
93
+ headers: {
94
+ 'Content-Type': 'application/json',
95
+ 'x-bb-api-key': config.browserbaseApiKey,
96
+ },
97
+ body: JSON.stringify(body),
98
+ });
99
+ if (!res.ok) {
100
+ const text = await res.text();
101
+ throw new Error(`Browserbase session creation failed (${res.status}): ${text}`);
102
+ }
103
+ const data = await res.json();
104
+ return { id: data.id, connectUrl: data.connectUrl };
105
+ }
106
+ /**
107
+ * Connects to a local Electron instance.
108
+ */
109
+ async getOrCreateLocalPage(config) {
110
+ if (this.session && this.session.mode === 'local') {
111
+ this.session.lastUsedAt = Date.now();
112
+ this.resetTimeout();
113
+ return this.session;
114
+ }
115
+ await this.close();
116
+ // Health check
117
+ const healthRes = await fetch(`${config.electronUrl}/status`).catch(() => null);
118
+ if (!healthRes || !healthRes.ok) {
119
+ throw new Error('Prompteryx Desktop App is not running. Start it or switch to cloud mode (remove PROMPTERYX_EXECUTION_MODE=local).');
120
+ }
121
+ const { chromium } = await import('playwright-core');
122
+ // The Electron app exposes a CDP endpoint
123
+ const browser = await chromium.connectOverCDP(`${config.electronUrl}`);
124
+ const contexts = browser.contexts();
125
+ const context = contexts[0] || await browser.newContext();
126
+ const pages = context.pages();
127
+ const page = pages[0] || await context.newPage();
128
+ this.session = {
129
+ browser,
130
+ context,
131
+ page,
132
+ sessionId: `local-${Date.now()}`,
133
+ mode: 'local',
134
+ createdAt: Date.now(),
135
+ lastUsedAt: Date.now(),
136
+ };
137
+ this.resetTimeout();
138
+ return this.session;
139
+ }
140
+ /**
141
+ * Gets the active page. Throws if no session exists.
142
+ */
143
+ getPage() {
144
+ if (!this.session) {
145
+ throw new Error('No active browser session. Call a browser tool first to create one.');
146
+ }
147
+ this.session.lastUsedAt = Date.now();
148
+ this.resetTimeout();
149
+ return this.session.page;
150
+ }
151
+ /**
152
+ * Returns elapsed minutes since session creation.
153
+ */
154
+ getSessionMinutes() {
155
+ if (!this.session)
156
+ return 0;
157
+ return (Date.now() - this.session.createdAt) / 60_000;
158
+ }
159
+ /**
160
+ * Closes the session and releases all resources.
161
+ */
162
+ async close() {
163
+ if (this.timeoutTimer) {
164
+ clearTimeout(this.timeoutTimer);
165
+ this.timeoutTimer = null;
166
+ }
167
+ if (!this.session)
168
+ return { minutesUsed: 0 };
169
+ const minutesUsed = this.getSessionMinutes();
170
+ const sessionId = this.session.sessionId;
171
+ const mode = this.session.mode;
172
+ try {
173
+ await this.session.page.close().catch(() => { });
174
+ await this.session.context.close().catch(() => { });
175
+ await this.session.browser.close().catch(() => { });
176
+ }
177
+ catch { /* best effort */ }
178
+ // Release Browserbase session
179
+ if (mode === 'cloud') {
180
+ try {
181
+ await fetch(`${BROWSERBASE_API}/sessions/${sessionId}`, {
182
+ method: 'POST',
183
+ headers: {
184
+ 'Content-Type': 'application/json',
185
+ 'x-bb-api-key': process.env.BROWSERBASE_API_KEY || '',
186
+ },
187
+ body: JSON.stringify({
188
+ status: 'REQUEST_RELEASE',
189
+ projectId: process.env.BROWSERBASE_PROJECT_ID || '',
190
+ }),
191
+ });
192
+ }
193
+ catch { /* best effort */ }
194
+ }
195
+ this.session = null;
196
+ return { minutesUsed: Math.ceil(minutesUsed) };
197
+ }
198
+ resetTimeout() {
199
+ if (this.timeoutTimer)
200
+ clearTimeout(this.timeoutTimer);
201
+ this.timeoutTimer = setTimeout(() => {
202
+ this.close().catch(() => { });
203
+ }, this.timeoutMs);
204
+ }
205
+ }
206
+ //# sourceMappingURL=browser-session-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-session-manager.js","sourceRoot":"","sources":["../../src/tools/browser-session-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Browser Automation Tools
3
+ *
4
+ * 20+ MCP tools that wrap Playwright browser actions.
5
+ * Each tool maps to node types in lib/node-executor.ts.
6
+ */
7
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
8
+ import type { AuthContext } from '../auth/api-key-auth.js';
9
+ import { BrowserSessionManager, type CloudSessionConfig } from './browser-session-manager.js';
10
+ interface BrowserToolsContext {
11
+ getAuth: () => AuthContext;
12
+ sessionManager: BrowserSessionManager;
13
+ apiKey: string;
14
+ apiUrl: string;
15
+ executionMode: 'cloud' | 'local';
16
+ cloudConfig: () => CloudSessionConfig;
17
+ }
18
+ export declare function registerBrowserTools(server: McpServer, ctx: BrowserToolsContext): void;
19
+ export {};
20
+ //# sourceMappingURL=browser-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-tools.d.ts","sourceRoot":"","sources":["../../src/tools/browser-tools.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,OAAO,EAAE,qBAAqB,EAAE,KAAK,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAI9F,UAAU,mBAAmB;IAC3B,OAAO,EAAE,MAAM,WAAW,CAAC;IAC3B,cAAc,EAAE,qBAAqB,CAAC;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,OAAO,GAAG,OAAO,CAAC;IACjC,WAAW,EAAE,MAAM,kBAAkB,CAAC;CACvC;AA4BD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,mBAAmB,QAwV/E"}