@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
@@ -0,0 +1,225 @@
1
+ /**
2
+ * Cloud Executor
3
+ *
4
+ * Executes browser node operations on a cloud Browserbase session
5
+ * by calling individual node actions against the active Playwright page.
6
+ * Mirrors the logic from lib/node-executor.ts executeNode().
7
+ */
8
+ import { formatSuccess, formatError, formatScreenshot, } from '../utils/output-formatter.js';
9
+ const DEFAULT_TIMEOUT = 30_000;
10
+ /**
11
+ * Core browser action executor.
12
+ * Takes a Playwright Page and a command with params,
13
+ * then executes the corresponding browser action.
14
+ */
15
+ export async function executeBrowserAction(page, action, params) {
16
+ const timeout = params.timeout ?? DEFAULT_TIMEOUT;
17
+ try {
18
+ switch (action) {
19
+ case 'navigate': {
20
+ const url = params.url;
21
+ if (!url)
22
+ return formatError('url is required');
23
+ const waitUntil = params.waitUntil ?? 'domcontentloaded';
24
+ await page.goto(url, { timeout, waitUntil });
25
+ const title = await page.title();
26
+ return formatSuccess({ url: page.url(), title });
27
+ }
28
+ case 'click': {
29
+ const selector = params.selector;
30
+ if (!selector)
31
+ return formatError('selector is required');
32
+ await page.click(selector, {
33
+ timeout,
34
+ button: params.button ?? 'left',
35
+ clickCount: params.clickCount ?? 1,
36
+ });
37
+ return formatSuccess({ clicked: selector });
38
+ }
39
+ case 'fill': {
40
+ const selector = params.selector;
41
+ const value = params.value ?? '';
42
+ if (!selector)
43
+ return formatError('selector is required');
44
+ await page.fill(selector, value, { timeout });
45
+ return formatSuccess({ filled: selector, value });
46
+ }
47
+ case 'type': {
48
+ const selector = params.selector;
49
+ const text = params.text ?? '';
50
+ if (!selector)
51
+ return formatError('selector is required');
52
+ await page.locator(selector).pressSequentially(text, {
53
+ delay: params.delay ?? 50,
54
+ timeout,
55
+ });
56
+ return formatSuccess({ typed: text, into: selector });
57
+ }
58
+ case 'press_key': {
59
+ const key = params.key;
60
+ if (!key)
61
+ return formatError('key is required (e.g. "Enter", "Tab", "Escape")');
62
+ if (params.selector) {
63
+ await page.locator(params.selector).press(key, { timeout });
64
+ }
65
+ else {
66
+ await page.keyboard.press(key);
67
+ }
68
+ return formatSuccess({ pressed: key });
69
+ }
70
+ case 'select': {
71
+ const selector = params.selector;
72
+ const value = params.value;
73
+ if (!selector)
74
+ return formatError('selector is required');
75
+ if (value === undefined)
76
+ return formatError('value is required');
77
+ const values = Array.isArray(value) ? value : [value];
78
+ await page.selectOption(selector, values, { timeout });
79
+ return formatSuccess({ selected: values, in: selector });
80
+ }
81
+ case 'check': {
82
+ const selector = params.selector;
83
+ if (!selector)
84
+ return formatError('selector is required');
85
+ if (params.uncheck) {
86
+ await page.uncheck(selector, { timeout });
87
+ }
88
+ else {
89
+ await page.check(selector, { timeout });
90
+ }
91
+ return formatSuccess({ [params.uncheck ? 'unchecked' : 'checked']: selector });
92
+ }
93
+ case 'hover': {
94
+ const selector = params.selector;
95
+ if (!selector)
96
+ return formatError('selector is required');
97
+ await page.hover(selector, { timeout });
98
+ return formatSuccess({ hovered: selector });
99
+ }
100
+ case 'scroll': {
101
+ if (params.selector) {
102
+ await page.locator(params.selector).scrollIntoViewIfNeeded({ timeout });
103
+ return formatSuccess({ scrolledTo: params.selector });
104
+ }
105
+ const x = params.deltaX ?? 0;
106
+ const y = params.deltaY ?? 300;
107
+ await page.mouse.wheel(x, y);
108
+ return formatSuccess({ scrolled: { deltaX: x, deltaY: y } });
109
+ }
110
+ case 'extract_text': {
111
+ const selector = params.selector;
112
+ if (!selector)
113
+ return formatError('selector is required');
114
+ const text = await page.locator(selector).first().innerText({ timeout });
115
+ return formatSuccess({ text, selector });
116
+ }
117
+ case 'extract_attribute': {
118
+ const selector = params.selector;
119
+ const attribute = params.attribute ?? 'href';
120
+ if (!selector)
121
+ return formatError('selector is required');
122
+ const value = await page.locator(selector).first().getAttribute(attribute, { timeout });
123
+ return formatSuccess({ attribute, value, selector });
124
+ }
125
+ case 'screenshot': {
126
+ const options = { type: 'png' };
127
+ if (params.fullPage)
128
+ options.fullPage = true;
129
+ if (params.selector) {
130
+ const buffer = await page.locator(params.selector).screenshot(options);
131
+ const base64 = buffer.toString('base64');
132
+ return formatScreenshot(base64, page.url(), await page.title());
133
+ }
134
+ const buffer = await page.screenshot(options);
135
+ const base64 = buffer.toString('base64');
136
+ return formatScreenshot(base64, page.url(), await page.title());
137
+ }
138
+ case 'evaluate': {
139
+ const script = params.script;
140
+ if (!script)
141
+ return formatError('script is required (JavaScript to run in page context)');
142
+ const result = await page.evaluate(script);
143
+ return formatSuccess({ result });
144
+ }
145
+ case 'wait': {
146
+ if (params.selector) {
147
+ const state = params.state ?? 'visible';
148
+ await page.locator(params.selector).waitFor({ state, timeout });
149
+ return formatSuccess({ waited: 'selector', selector: params.selector, state });
150
+ }
151
+ if (params.milliseconds) {
152
+ await page.waitForTimeout(params.milliseconds);
153
+ return formatSuccess({ waited: 'timeout', milliseconds: params.milliseconds });
154
+ }
155
+ if (params.navigation) {
156
+ await page.waitForLoadState(params.loadState ?? 'domcontentloaded', { timeout });
157
+ return formatSuccess({ waited: 'navigation' });
158
+ }
159
+ return formatError('Specify selector, milliseconds, or navigation: true');
160
+ }
161
+ case 'get_page_info': {
162
+ const url = page.url();
163
+ const title = await page.title();
164
+ return formatSuccess({ url, title });
165
+ }
166
+ case 'drag_drop': {
167
+ if (!params.source || !params.target) {
168
+ return formatError('source and target selectors are required');
169
+ }
170
+ await page.dragAndDrop(params.source, params.target, { timeout });
171
+ return formatSuccess({ dragged: params.source, to: params.target });
172
+ }
173
+ case 'set_files': {
174
+ const selector = params.selector;
175
+ if (!selector)
176
+ return formatError('selector is required');
177
+ if (!params.files)
178
+ return formatError('files array is required');
179
+ await page.setInputFiles(selector, params.files, { timeout });
180
+ return formatSuccess({ uploaded: params.files.length ?? 1, to: selector });
181
+ }
182
+ case 'get_cookies': {
183
+ const cookies = await page.context().cookies();
184
+ return formatSuccess({ cookies, count: cookies.length });
185
+ }
186
+ case 'set_cookies': {
187
+ if (!params.cookies || !Array.isArray(params.cookies)) {
188
+ return formatError('cookies array is required');
189
+ }
190
+ await page.context().addCookies(params.cookies);
191
+ return formatSuccess({ set: params.cookies.length });
192
+ }
193
+ case 'pdf': {
194
+ const buffer = await page.pdf({
195
+ format: params.format ?? 'A4',
196
+ printBackground: params.printBackground ?? true,
197
+ });
198
+ const base64 = buffer.toString('base64');
199
+ return {
200
+ content: [
201
+ { type: 'text', text: JSON.stringify({ success: true, format: params.format ?? 'A4', sizeBytes: buffer.length }) },
202
+ { type: 'text', text: `[PDF generated: ${buffer.length} bytes. Base64 data available.]` },
203
+ ],
204
+ };
205
+ }
206
+ default:
207
+ return formatError(`Unknown browser action: ${action}`, 'Available: navigate, click, fill, type, press_key, select, check, hover, scroll, extract_text, extract_attribute, screenshot, evaluate, wait, get_page_info, drag_drop, set_files, get_cookies, set_cookies, pdf');
208
+ }
209
+ }
210
+ catch (err) {
211
+ const msg = err.message ?? String(err);
212
+ // Provide helpful suggestions for common errors
213
+ if (msg.includes('Timeout') || msg.includes('timeout')) {
214
+ return formatError(msg, 'Element may not exist or page is still loading. Try browser_wait first, or use browser_screenshot to see the page.');
215
+ }
216
+ if (msg.includes('selector') || msg.includes('locator')) {
217
+ return formatError(msg, 'The selector may be wrong. Use browser_screenshot to see the page and find the correct selector.');
218
+ }
219
+ if (msg.includes('Target closed') || msg.includes('Target page')) {
220
+ return formatError(msg, 'The browser session was disconnected. It will auto-recover on the next tool call.');
221
+ }
222
+ return formatError(msg);
223
+ }
224
+ }
225
+ //# sourceMappingURL=cloud-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-executor.js","sourceRoot":"","sources":["../../src/execution/cloud-executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Integration Executor
3
+ *
4
+ * Calls Prompteryx's existing /api/execute-{service} routes
5
+ * to run integration node actions (Gmail, Sheets, Slack, etc.).
6
+ * This ensures all OAuth credential handling, rate limiting,
7
+ * and API logic stays centralized in the main app.
8
+ */
9
+ import { type McpToolResult } from '../utils/output-formatter.js';
10
+ export interface IntegrationCallOptions {
11
+ apiKey: string;
12
+ apiUrl: string;
13
+ nodeType: string;
14
+ params: Record<string, any>;
15
+ credentialId?: string;
16
+ }
17
+ export declare function executeIntegration(options: IntegrationCallOptions): Promise<McpToolResult>;
18
+ //# sourceMappingURL=integration-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration-executor.d.ts","sourceRoot":"","sources":["../../src/execution/integration-executor.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAA8B,KAAK,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAE9F,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AA6CD,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,aAAa,CAAC,CA+ChG"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Integration Executor
3
+ *
4
+ * Calls Prompteryx's existing /api/execute-{service} routes
5
+ * to run integration node actions (Gmail, Sheets, Slack, etc.).
6
+ * This ensures all OAuth credential handling, rate limiting,
7
+ * and API logic stays centralized in the main app.
8
+ */
9
+ import { formatSuccess, formatError } from '../utils/output-formatter.js';
10
+ /**
11
+ * Maps node types to their API route service names.
12
+ * e.g. "gmail-message-send" → "gmail"
13
+ * "google-sheets-row-append" → "google-sheets"
14
+ */
15
+ function getServiceName(nodeType) {
16
+ // Integration node types follow the pattern: service-resource-operation
17
+ // The service name is everything before the last two segments
18
+ const known = {
19
+ gmail: 'gmail',
20
+ slack: 'slack',
21
+ telegram: 'telegram',
22
+ whatsapp: 'whatsapp',
23
+ facebook: 'facebook',
24
+ instagram: 'instagram',
25
+ youtube: 'youtube',
26
+ wordpress: 'wordpress',
27
+ airtable: 'airtable',
28
+ notion: 'notion',
29
+ stripe: 'stripe',
30
+ openai: 'openai',
31
+ anthropic: 'anthropic',
32
+ gemini: 'gemini',
33
+ elevenlabs: 'elevenlabs',
34
+ };
35
+ const prefix = nodeType.split('-')[0];
36
+ if (known[prefix])
37
+ return known[prefix];
38
+ // Handle compound service names
39
+ if (nodeType.startsWith('google-sheets'))
40
+ return 'google-sheets';
41
+ if (nodeType.startsWith('google-calendar'))
42
+ return 'google-calendar';
43
+ if (nodeType.startsWith('google-docs'))
44
+ return 'google-docs';
45
+ if (nodeType.startsWith('google-drive'))
46
+ return 'google-drive';
47
+ if (nodeType.startsWith('microsoft-outlook'))
48
+ return 'microsoft-outlook';
49
+ if (nodeType.startsWith('microsoft-excel'))
50
+ return 'microsoft-excel';
51
+ if (nodeType.startsWith('microsoft-word'))
52
+ return 'microsoft-word';
53
+ if (nodeType.startsWith('microsoft-sharepoint'))
54
+ return 'microsoft-sharepoint';
55
+ if (nodeType.startsWith('microsoft-teams'))
56
+ return 'microsoft-teams';
57
+ return prefix;
58
+ }
59
+ export async function executeIntegration(options) {
60
+ const { apiKey, apiUrl, nodeType, params, credentialId } = options;
61
+ const service = getServiceName(nodeType);
62
+ try {
63
+ // Use the API-key-authed bridge (/api/v1/execute-integration), NOT the raw
64
+ // /api/execute-<service> route (which needs a Firebase token, so an API key
65
+ // 401s). The bridge re-invokes the service route over the internal channel.
66
+ // credentialId belongs INSIDE params (the service routes read params.credentialId).
67
+ const body = {
68
+ service,
69
+ nodeType,
70
+ params: credentialId ? { ...params, credentialId } : params,
71
+ };
72
+ const res = await fetch(`${apiUrl}/api/v1/execute-integration`, {
73
+ method: 'POST',
74
+ headers: {
75
+ 'X-API-Key': apiKey,
76
+ 'Content-Type': 'application/json',
77
+ },
78
+ body: JSON.stringify(body),
79
+ });
80
+ if (!res.ok) {
81
+ const text = await res.text();
82
+ let parsed;
83
+ try {
84
+ parsed = JSON.parse(text);
85
+ }
86
+ catch {
87
+ return formatError(`Integration call failed (${res.status}): ${text}`);
88
+ }
89
+ return formatError(parsed.error?.message ?? parsed.error ?? `Integration call failed (${res.status})`, parsed.error?.suggestion);
90
+ }
91
+ const data = await res.json();
92
+ if (data.success === false) {
93
+ return formatError(data.error?.message ?? 'Integration returned an error');
94
+ }
95
+ return formatSuccess(data.data ?? data);
96
+ }
97
+ catch (err) {
98
+ return formatError(`Integration execution failed: ${err.message}`);
99
+ }
100
+ }
101
+ //# sourceMappingURL=integration-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration-executor.js","sourceRoot":"","sources":["../../src/execution/integration-executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Prompteryx MCP Server — Entry Point
4
+ *
5
+ * Usage:
6
+ * npx @prompteryx/mcp-server (stdio transport)
7
+ * PROMPTERYX_API_KEY=px_key_... npx @prompteryx/mcp-server
8
+ *
9
+ * Environment variables:
10
+ * PROMPTERYX_API_KEY (required) Your Prompteryx API key
11
+ * PROMPTERYX_API_URL (optional) API base URL (default: https://www.prompteryx.ai)
12
+ * PROMPTERYX_EXECUTION_MODE (optional) "cloud" or "local" (default: cloud)
13
+ * PROMPTERYX_CHROME_PROFILE (optional) Chrome profile ID for local mode
14
+ * PROMPTERYX_SESSION_TIMEOUT (optional) Session idle timeout in ms (default: 300000)
15
+ * PROMPTERYX_STEALTH_MODE (optional) "true"/"false" (default: true)
16
+ * PROMPTERYX_VIDEO_RECORDING (optional) "true"/"false" (default: false)
17
+ */
18
+ export {};
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;GAeG"}
package/dist/index.js ADDED
@@ -0,0 +1,54 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Prompteryx MCP Server — Entry Point
4
+ *
5
+ * Usage:
6
+ * npx @prompteryx/mcp-server (stdio transport)
7
+ * PROMPTERYX_API_KEY=px_key_... npx @prompteryx/mcp-server
8
+ *
9
+ * Environment variables:
10
+ * PROMPTERYX_API_KEY (required) Your Prompteryx API key
11
+ * PROMPTERYX_API_URL (optional) API base URL (default: https://www.prompteryx.ai)
12
+ * PROMPTERYX_EXECUTION_MODE (optional) "cloud" or "local" (default: cloud)
13
+ * PROMPTERYX_CHROME_PROFILE (optional) Chrome profile ID for local mode
14
+ * PROMPTERYX_SESSION_TIMEOUT (optional) Session idle timeout in ms (default: 300000)
15
+ * PROMPTERYX_STEALTH_MODE (optional) "true"/"false" (default: true)
16
+ * PROMPTERYX_VIDEO_RECORDING (optional) "true"/"false" (default: false)
17
+ */
18
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
19
+ import { createPrompterxServer } from './server.js';
20
+ async function main() {
21
+ const apiKey = process.env.PROMPTERYX_API_KEY;
22
+ if (!apiKey) {
23
+ process.stderr.write('[Prompteryx MCP] Error: PROMPTERYX_API_KEY environment variable is required.\n' +
24
+ 'Get your API key at: https://www.prompteryx.ai → Settings → API Keys\n\n' +
25
+ 'Add to your MCP client config:\n' +
26
+ ' "env": { "PROMPTERYX_API_KEY": "px_key_YOUR_KEY_HERE" }\n');
27
+ process.exit(1);
28
+ }
29
+ const config = {
30
+ apiKey,
31
+ apiUrl: process.env.PROMPTERYX_API_URL ?? 'https://www.prompteryx.ai',
32
+ executionMode: process.env.PROMPTERYX_EXECUTION_MODE ?? 'cloud',
33
+ chromeProfile: process.env.PROMPTERYX_CHROME_PROFILE,
34
+ sessionTimeout: process.env.PROMPTERYX_SESSION_TIMEOUT
35
+ ? parseInt(process.env.PROMPTERYX_SESSION_TIMEOUT, 10)
36
+ : 300_000,
37
+ stealthMode: process.env.PROMPTERYX_STEALTH_MODE !== 'false',
38
+ videoRecording: process.env.PROMPTERYX_VIDEO_RECORDING === 'true',
39
+ };
40
+ process.stderr.write('[Prompteryx MCP] Starting server...\n');
41
+ try {
42
+ const { server } = await createPrompterxServer(config);
43
+ // Use stdio transport (standard for Claude Desktop, Cursor, VS Code)
44
+ const transport = new StdioServerTransport();
45
+ await server.connect(transport);
46
+ process.stderr.write('[Prompteryx MCP] Server connected via stdio transport. Ready for requests.\n');
47
+ }
48
+ catch (err) {
49
+ process.stderr.write(`[Prompteryx MCP] Fatal: ${err.message}\n`);
50
+ process.exit(1);
51
+ }
52
+ }
53
+ main();
54
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAqB,MAAM,aAAa,CAAC;AAEvE,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IAC9C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,gFAAgF;YAChF,0EAA0E;YAC1E,kCAAkC;YAClC,6DAA6D,CAC9D,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAiB;QAC3B,MAAM;QACN,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,2BAA2B;QACrE,aAAa,EAAG,OAAO,CAAC,GAAG,CAAC,yBAA+C,IAAI,OAAO;QACtF,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,yBAAyB;QACpD,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,0BAA0B;YACpD,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,EAAE,CAAC;YACtD,CAAC,CAAC,OAAO;QACX,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,OAAO;QAC5D,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,0BAA0B,KAAK,MAAM;KAClE,CAAC;IAEF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAE9D,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,qBAAqB,CAAC,MAAM,CAAC,CAAC;QAEvD,qEAAqE;QACrE,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAEhC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8EAA8E,CAAC,CAAC;IACvG,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * MCP Resources
3
+ *
4
+ * Exposes read-only data about the user's Prompteryx account
5
+ * as MCP resources. Clients can list and read these resources.
6
+ */
7
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
8
+ import type { AuthContext } from '../auth/api-key-auth.js';
9
+ interface ResourceContext {
10
+ getAuth: () => AuthContext;
11
+ apiKey: string;
12
+ apiUrl: string;
13
+ }
14
+ export declare function registerResources(server: McpServer, ctx: ResourceContext): void;
15
+ export {};
16
+ //# sourceMappingURL=workflow-resources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-resources.d.ts","sourceRoot":"","sources":["../../src/resources/workflow-resources.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAG3D,UAAU,eAAe;IACvB,OAAO,EAAE,MAAM,WAAW,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,QAwFxE"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * MCP Resources
3
+ *
4
+ * Exposes read-only data about the user's Prompteryx account
5
+ * as MCP resources. Clients can list and read these resources.
6
+ */
7
+ import { formatUsageRemaining } from '../auth/usage-enforcer.js';
8
+ export function registerResources(server, ctx) {
9
+ // Workflows list
10
+ server.resource('workflows', 'prompteryx://workflows', {
11
+ description: 'List of your saved Prompteryx workflows',
12
+ mimeType: 'application/json',
13
+ }, async () => {
14
+ const auth = ctx.getAuth();
15
+ return {
16
+ contents: [{
17
+ uri: 'prompteryx://workflows',
18
+ text: JSON.stringify({
19
+ workflows: auth.workflows.map((w) => ({
20
+ id: w.id,
21
+ name: w.name,
22
+ description: w.description,
23
+ nodeCount: w.nodeCount,
24
+ lastRun: w.lastRun,
25
+ })),
26
+ count: auth.workflows.length,
27
+ }, null, 2),
28
+ mimeType: 'application/json',
29
+ }],
30
+ };
31
+ });
32
+ // Connections / credentials
33
+ server.resource('connections', 'prompteryx://connections', {
34
+ description: 'Your connected services (OAuth credentials)',
35
+ mimeType: 'application/json',
36
+ }, async () => {
37
+ const auth = ctx.getAuth();
38
+ return {
39
+ contents: [{
40
+ uri: 'prompteryx://connections',
41
+ text: JSON.stringify({
42
+ connections: auth.credentials.map((c) => ({
43
+ id: c.id,
44
+ service: c.connectorId,
45
+ name: c.name,
46
+ isValid: c.isValid,
47
+ })),
48
+ count: auth.credentials.length,
49
+ }, null, 2),
50
+ mimeType: 'application/json',
51
+ }],
52
+ };
53
+ });
54
+ // Usage stats
55
+ server.resource('usage', 'prompteryx://usage', {
56
+ description: 'Your current usage and remaining limits',
57
+ mimeType: 'application/json',
58
+ }, async () => {
59
+ const auth = ctx.getAuth();
60
+ const remaining = formatUsageRemaining(auth);
61
+ return {
62
+ contents: [{
63
+ uri: 'prompteryx://usage',
64
+ text: JSON.stringify({
65
+ subscriptionTier: auth.subscriptionTier,
66
+ usage: auth.monthlyUsage,
67
+ limits: {
68
+ cloudBrowserMinutesAllowed: auth.cloudBrowserMinutesAllowed,
69
+ aiCreditsIncluded: auth.aiCreditsIncluded,
70
+ monthlyExecutionsAllowed: auth.monthlyExecutionsAllowed,
71
+ },
72
+ remaining,
73
+ }, null, 2),
74
+ mimeType: 'application/json',
75
+ }],
76
+ };
77
+ });
78
+ }
79
+ //# sourceMappingURL=workflow-resources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-resources.js","sourceRoot":"","sources":["../../src/resources/workflow-resources.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
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
+ export interface ServerConfig {
9
+ apiKey: string;
10
+ apiUrl: string;
11
+ executionMode: 'cloud' | 'local';
12
+ chromeProfile?: string;
13
+ sessionTimeout?: number;
14
+ stealthMode?: boolean;
15
+ videoRecording?: boolean;
16
+ /**
17
+ * Install SIGINT/SIGTERM handlers that close the browser session on exit.
18
+ * Default true (the stdio binary). The hosted HTTP route creates one server
19
+ * per MCP session inside a long-lived process and passes false, otherwise
20
+ * every session would add another pair of process listeners.
21
+ */
22
+ registerSignalHandlers?: boolean;
23
+ }
24
+ export declare function createPrompterxServer(config: ServerConfig): Promise<{
25
+ server: McpServer;
26
+ cleanup: () => Promise<void>;
27
+ }>;
28
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAWpE,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,OAAO,GAAG,OAAO,CAAC;IACjC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;;;OAKG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AAID,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,YAAY;;;GAuG/D"}