@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,214 @@
1
+ /**
2
+ * Integration Tools (Dynamic Registry)
3
+ *
4
+ * Auto-generates MCP tools from NODE_CONFIGS integration entries.
5
+ * When new integration nodes are added to the platform, they
6
+ * automatically appear as MCP tools—no MCP code changes needed.
7
+ *
8
+ * Only registers tools for services where the user has valid credentials.
9
+ */
10
+ import { enforceUsageLimits, recordUsage, formatUsageRemaining } from '../auth/usage-enforcer.js';
11
+ import { executeIntegration } from '../execution/integration-executor.js';
12
+ import { fetchIntegrationConfigs, buildToolSchema, nodeTypeToToolName, } from '../utils/node-config-loader.js';
13
+ import { formatError } from '../utils/output-formatter.js';
14
+ /**
15
+ * Known service→connectorId mappings.
16
+ * Used to filter tools based on the user's connected credentials.
17
+ */
18
+ const SERVICE_CONNECTOR_MAP = {
19
+ gmail: 'gmail',
20
+ 'google-sheets': 'google-sheets',
21
+ 'google-calendar': 'google-calendar',
22
+ 'google-docs': 'google-docs',
23
+ 'google-drive': 'google-drive',
24
+ slack: 'slack',
25
+ telegram: 'telegram',
26
+ whatsapp: 'whatsapp',
27
+ facebook: 'facebook',
28
+ instagram: 'instagram',
29
+ youtube: 'youtube',
30
+ wordpress: 'wordpress',
31
+ airtable: 'airtable',
32
+ notion: 'notion',
33
+ stripe: 'stripe',
34
+ 'microsoft-outlook': 'microsoft-outlook',
35
+ 'microsoft-excel': 'microsoft-excel',
36
+ 'microsoft-word': 'microsoft-word',
37
+ 'microsoft-sharepoint': 'microsoft-sharepoint',
38
+ 'microsoft-teams': 'microsoft-teams',
39
+ openai: 'openai',
40
+ anthropic: 'anthropic',
41
+ gemini: 'gemini',
42
+ elevenlabs: 'elevenlabs',
43
+ };
44
+ function getServiceFromNodeType(nodeType) {
45
+ for (const svc of Object.keys(SERVICE_CONNECTOR_MAP)) {
46
+ if (nodeType.startsWith(svc))
47
+ return svc;
48
+ }
49
+ return nodeType.split('-')[0];
50
+ }
51
+ function hasCredentialForService(credentials, service) {
52
+ const connectorId = SERVICE_CONNECTOR_MAP[service];
53
+ if (!connectorId)
54
+ return true; // Unknown services: don't filter out
55
+ return credentials.some((c) => c.connectorId === connectorId && c.isValid);
56
+ }
57
+ /**
58
+ * Registers integration tools dynamically.
59
+ *
60
+ * This is called once during server setup. It registers tools based on:
61
+ * 1. Available integration configs from the platform
62
+ * 2. User's connected OAuth credentials
63
+ *
64
+ * For the MCP protocol, tools are registered statically at connection
65
+ * init, so we scope to all service types the user has credentials for.
66
+ */
67
+ export async function registerIntegrationTools(server, ctx) {
68
+ const auth = ctx.getAuth();
69
+ const credentials = auth.credentials ?? [];
70
+ // Fetch the integration configs from the platform
71
+ let configs = await fetchIntegrationConfigs(ctx.apiKey, ctx.apiUrl);
72
+ // If the API doesn't return configs yet, use a hardcoded fallback set
73
+ if (configs.length === 0) {
74
+ configs = getBuiltinIntegrationConfigs();
75
+ }
76
+ // Filter: only register tools where the user has credentials
77
+ const eligibleConfigs = configs.filter((config) => {
78
+ const service = getServiceFromNodeType(config.type);
79
+ return hasCredentialForService(credentials, service);
80
+ });
81
+ let registered = 0;
82
+ for (const config of eligibleConfigs) {
83
+ const toolName = nodeTypeToToolName(config.type);
84
+ const description = config.description || `${config.label} integration`;
85
+ // Build Zod schema from the config's param definitions
86
+ let schema;
87
+ try {
88
+ schema = buildToolSchema(config);
89
+ }
90
+ catch {
91
+ // Skip configs that can't produce a valid schema
92
+ continue;
93
+ }
94
+ server.tool(toolName, description, schema.shape, async (params) => {
95
+ const check = enforceUsageLimits(ctx.getAuth(), 'integration');
96
+ if (!check.allowed) {
97
+ return formatError(check.reason, undefined, { usageRemaining: formatUsageRemaining(ctx.getAuth()) });
98
+ }
99
+ const result = await executeIntegration({
100
+ apiKey: ctx.apiKey,
101
+ apiUrl: ctx.apiUrl,
102
+ nodeType: config.type,
103
+ params,
104
+ credentialId: params.credentialId,
105
+ });
106
+ // Record execution
107
+ await recordUsage(ctx.apiKey, ctx.apiUrl, { executionCount: 1 });
108
+ return result;
109
+ });
110
+ registered++;
111
+ }
112
+ return registered;
113
+ }
114
+ /**
115
+ * Fallback: minimal set of integration configs if the API isn't reachable.
116
+ * These cover the most common operations users expect.
117
+ */
118
+ function getBuiltinIntegrationConfigs() {
119
+ return [
120
+ {
121
+ type: 'gmail-message-send',
122
+ label: 'Gmail: Send Email',
123
+ description: 'Send an email via Gmail. Supports HTML body, CC, BCC, and attachments.',
124
+ category: 'Integrations',
125
+ credentials: ['gmail'],
126
+ defaultParams: {},
127
+ paramSchema: {
128
+ to: { type: 'string', label: 'To', description: 'Recipient email address', required: true },
129
+ subject: { type: 'string', label: 'Subject', description: 'Email subject line', required: true },
130
+ body: { type: 'textarea', label: 'Body', description: 'Email body (plain text or HTML)' },
131
+ cc: { type: 'string', label: 'CC', description: 'CC recipients (comma-separated)' },
132
+ bcc: { type: 'string', label: 'BCC', description: 'BCC recipients (comma-separated)' },
133
+ },
134
+ },
135
+ {
136
+ type: 'gmail-message-list',
137
+ label: 'Gmail: List Emails',
138
+ description: 'Search and list emails from your Gmail inbox.',
139
+ category: 'Integrations',
140
+ credentials: ['gmail'],
141
+ defaultParams: {},
142
+ paramSchema: {
143
+ query: { type: 'string', label: 'Search Query', description: 'Gmail search query (e.g. "is:unread from:user@example.com")' },
144
+ maxResults: { type: 'number', label: 'Max Results', description: 'Maximum emails to return', default: 10 },
145
+ },
146
+ },
147
+ {
148
+ type: 'google-sheets-row-append',
149
+ label: 'Google Sheets: Append Row',
150
+ description: 'Append a row of data to a Google Sheets spreadsheet.',
151
+ category: 'Integrations',
152
+ credentials: ['google-sheets'],
153
+ defaultParams: {},
154
+ paramSchema: {
155
+ spreadsheetId: { type: 'string', label: 'Spreadsheet ID', description: 'Google Sheets spreadsheet ID', required: true },
156
+ sheetName: { type: 'string', label: 'Sheet Name', description: 'Tab/sheet name', default: 'Sheet1' },
157
+ values: { type: 'json', label: 'Row Values', description: 'Array of cell values to append', required: true },
158
+ },
159
+ },
160
+ {
161
+ type: 'google-sheets-data-read',
162
+ label: 'Google Sheets: Read Data',
163
+ description: 'Read data from a Google Sheets spreadsheet.',
164
+ category: 'Integrations',
165
+ credentials: ['google-sheets'],
166
+ defaultParams: {},
167
+ paramSchema: {
168
+ spreadsheetId: { type: 'string', label: 'Spreadsheet ID', description: 'Google Sheets spreadsheet ID', required: true },
169
+ range: { type: 'string', label: 'Range', description: 'Cell range (e.g. "A1:D10")', default: 'A:Z' },
170
+ },
171
+ },
172
+ {
173
+ type: 'slack-message-send',
174
+ label: 'Slack: Send Message',
175
+ description: 'Send a message to a Slack channel or user.',
176
+ category: 'Integrations',
177
+ credentials: ['slack'],
178
+ defaultParams: {},
179
+ paramSchema: {
180
+ channel: { type: 'string', label: 'Channel', description: 'Channel name or ID (e.g. "#general" or "C01234567")', required: true },
181
+ text: { type: 'textarea', label: 'Message', description: 'Message text (supports Slack markdown)', required: true },
182
+ },
183
+ },
184
+ {
185
+ type: 'google-calendar-event-create',
186
+ label: 'Google Calendar: Create Event',
187
+ description: 'Create a new event on Google Calendar.',
188
+ category: 'Integrations',
189
+ credentials: ['google-calendar'],
190
+ defaultParams: {},
191
+ paramSchema: {
192
+ summary: { type: 'string', label: 'Title', description: 'Event title', required: true },
193
+ start: { type: 'string', label: 'Start', description: 'Start time (ISO 8601)', required: true },
194
+ end: { type: 'string', label: 'End', description: 'End time (ISO 8601)', required: true },
195
+ description: { type: 'textarea', label: 'Description', description: 'Event description' },
196
+ location: { type: 'string', label: 'Location', description: 'Event location' },
197
+ },
198
+ },
199
+ {
200
+ type: 'notion-page-create',
201
+ label: 'Notion: Create Page',
202
+ description: 'Create a new page in a Notion database.',
203
+ category: 'Integrations',
204
+ credentials: ['notion'],
205
+ defaultParams: {},
206
+ paramSchema: {
207
+ databaseId: { type: 'string', label: 'Database ID', description: 'Notion database ID', required: true },
208
+ properties: { type: 'json', label: 'Properties', description: 'Page properties as JSON object', required: true },
209
+ content: { type: 'textarea', label: 'Content', description: 'Page body content (markdown)' },
210
+ },
211
+ },
212
+ ];
213
+ }
214
+ //# sourceMappingURL=integration-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration-tools.js","sourceRoot":"","sources":["../../src/tools/integration-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Workflow Builder Tools (Unique Feature)
3
+ *
4
+ * Allows building visual Prompteryx workflows from within an MCP client.
5
+ * No other MCP server offers this capability.
6
+ *
7
+ * Tools:
8
+ * - workflow_add_node: Add a node to an existing workflow
9
+ * - workflow_record_actions: Start/stop/save browser action recording
10
+ */
11
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
12
+ import type { AuthContext } from '../auth/api-key-auth.js';
13
+ interface WorkflowBuilderContext {
14
+ getAuth: () => AuthContext;
15
+ apiKey: string;
16
+ apiUrl: string;
17
+ }
18
+ export declare function registerWorkflowBuilderTools(server: McpServer, ctx: WorkflowBuilderContext): void;
19
+ export {};
20
+ //# sourceMappingURL=workflow-builder-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-builder-tools.d.ts","sourceRoot":"","sources":["../../src/tools/workflow-builder-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAI3D,UAAU,sBAAsB;IAC9B,OAAO,EAAE,MAAM,WAAW,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAoBD,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,sBAAsB,QAmF1F"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Workflow Builder Tools (Unique Feature)
3
+ *
4
+ * Allows building visual Prompteryx workflows from within an MCP client.
5
+ * No other MCP server offers this capability.
6
+ *
7
+ * Tools:
8
+ * - workflow_add_node: Add a node to an existing workflow
9
+ * - workflow_record_actions: Start/stop/save browser action recording
10
+ */
11
+ import { z } from 'zod';
12
+ import { getTierFeatures } from '../auth/usage-enforcer.js';
13
+ import { formatSuccess, formatError } from '../utils/output-formatter.js';
14
+ async function apiCall(ctx, method, path, body) {
15
+ const res = await fetch(`${ctx.apiUrl}${path}`, {
16
+ method,
17
+ headers: {
18
+ 'X-API-Key': ctx.apiKey,
19
+ 'Content-Type': 'application/json',
20
+ },
21
+ ...(body ? { body: JSON.stringify(body) } : {}),
22
+ });
23
+ const data = await res.json().catch(() => ({}));
24
+ return { ok: res.ok, status: res.status, data };
25
+ }
26
+ export function registerWorkflowBuilderTools(server, ctx) {
27
+ // workflow_add_node
28
+ server.tool('workflow_add_node', 'Add a node to an existing Prompteryx workflow. Specify the node type, parameters, and optionally which node to connect after.', {
29
+ workflowId: z.string().describe('The workflow ID to add the node to'),
30
+ nodeType: z.string().describe('Node type (e.g. "click", "fill", "gmail-message-send")'),
31
+ label: z.string().describe('Display label for this step'),
32
+ params: z.record(z.any()).describe('Node parameters'),
33
+ afterNodeId: z.string().optional().describe('Connect this node after the specified node ID'),
34
+ }, async (params) => {
35
+ const features = getTierFeatures(ctx.getAuth().subscriptionTier);
36
+ if (!features.workflowCreate) {
37
+ return formatError('Workflow editing requires Starter plan or higher.');
38
+ }
39
+ const { ok, data } = await apiCall(ctx, 'POST', `/api/v1/workflows/${params.workflowId}/nodes`, {
40
+ nodeType: params.nodeType,
41
+ label: params.label,
42
+ params: params.params,
43
+ afterNodeId: params.afterNodeId,
44
+ });
45
+ if (!ok)
46
+ return formatError(data.error?.message ?? 'Failed to add node');
47
+ return formatSuccess({
48
+ added: true,
49
+ nodeId: data.data?.nodeId ?? data.nodeId,
50
+ workflowId: params.workflowId,
51
+ editUrl: `${ctx.apiUrl}/studio?workflow=${params.workflowId}`,
52
+ });
53
+ });
54
+ // workflow_record_actions
55
+ server.tool('workflow_record_actions', 'Record browser actions during a session and save them as a reusable Prompteryx workflow. Actions: "start" begins recording, "stop" ends recording and shows a summary, "save" saves the recorded actions as a workflow.', {
56
+ action: z.enum(['start', 'stop', 'save']).describe('"start" to begin recording, "stop" to end and see summary, "save" to save as a workflow'),
57
+ workflowName: z.string().optional().describe('Name for the saved workflow (required for "save" action)'),
58
+ }, async (params) => {
59
+ const features = getTierFeatures(ctx.getAuth().subscriptionTier);
60
+ if (!features.recordToWorkflow) {
61
+ return formatError('Action recording requires Starter plan or higher.');
62
+ }
63
+ const { ok, data } = await apiCall(ctx, 'POST', '/api/v1/recordings', {
64
+ action: params.action,
65
+ workflowName: params.workflowName,
66
+ });
67
+ if (!ok)
68
+ return formatError(data.error?.message ?? `Recording ${params.action} failed`);
69
+ switch (params.action) {
70
+ case 'start':
71
+ return formatSuccess({
72
+ recording: true,
73
+ message: 'Recording started. Perform browser actions, then call workflow_record_actions with action "stop".',
74
+ });
75
+ case 'stop':
76
+ return formatSuccess({
77
+ recording: false,
78
+ actionsRecorded: data.data?.actionsCount ?? 0,
79
+ actions: data.data?.actions ?? [],
80
+ message: 'Recording stopped. Call workflow_record_actions with action "save" and a workflowName to save.',
81
+ });
82
+ case 'save':
83
+ return formatSuccess({
84
+ saved: true,
85
+ workflowId: data.data?.workflowId ?? data.workflowId,
86
+ name: params.workflowName,
87
+ message: 'Recorded actions saved as a workflow. Run it anytime with workflow_execute — no AI costs!',
88
+ editUrl: `${ctx.apiUrl}/studio?workflow=${data.data?.workflowId ?? data.workflowId}`,
89
+ });
90
+ default:
91
+ return formatError('Invalid action. Use "start", "stop", or "save".');
92
+ }
93
+ });
94
+ }
95
+ //# sourceMappingURL=workflow-builder-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-builder-tools.js","sourceRoot":"","sources":["../../src/tools/workflow-builder-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Workflow Tools
3
+ *
4
+ * CRUD and execution tools for Prompteryx visual workflows.
5
+ * Calls the platform's REST API for all operations.
6
+ */
7
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
8
+ import type { AuthContext } from '../auth/api-key-auth.js';
9
+ interface WorkflowToolsContext {
10
+ getAuth: () => AuthContext;
11
+ apiKey: string;
12
+ apiUrl: string;
13
+ }
14
+ export declare function registerWorkflowTools(server: McpServer, ctx: WorkflowToolsContext): void;
15
+ export {};
16
+ //# sourceMappingURL=workflow-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-tools.d.ts","sourceRoot":"","sources":["../../src/tools/workflow-tools.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAI3D,UAAU,oBAAoB;IAC5B,OAAO,EAAE,MAAM,WAAW,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAoBD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,oBAAoB,QAwIjF"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Workflow Tools
3
+ *
4
+ * CRUD and execution tools for Prompteryx visual workflows.
5
+ * Calls the platform's REST API for all operations.
6
+ */
7
+ import { z } from 'zod';
8
+ import { enforceUsageLimits, recordUsage, formatUsageRemaining } from '../auth/usage-enforcer.js';
9
+ import { formatSuccess, formatError } from '../utils/output-formatter.js';
10
+ async function apiCall(ctx, method, path, body) {
11
+ const res = await fetch(`${ctx.apiUrl}${path}`, {
12
+ method,
13
+ headers: {
14
+ 'X-API-Key': ctx.apiKey,
15
+ 'Content-Type': 'application/json',
16
+ },
17
+ ...(body ? { body: JSON.stringify(body) } : {}),
18
+ });
19
+ const data = await res.json().catch(() => ({}));
20
+ return { ok: res.ok, status: res.status, data };
21
+ }
22
+ export function registerWorkflowTools(server, ctx) {
23
+ // workflow_list
24
+ server.tool('workflow_list', 'List all your saved Prompteryx workflows.', {}, async () => {
25
+ const auth = ctx.getAuth();
26
+ const workflows = auth.workflows ?? [];
27
+ if (workflows.length === 0) {
28
+ return formatSuccess({ workflows: [], message: 'No workflows found. Create one with workflow_create.' });
29
+ }
30
+ return formatSuccess({
31
+ workflows: workflows.map((w) => ({
32
+ id: w.id,
33
+ name: w.name,
34
+ description: w.description,
35
+ nodeCount: w.nodeCount,
36
+ lastRun: w.lastRun,
37
+ })),
38
+ count: workflows.length,
39
+ });
40
+ });
41
+ // workflow_get
42
+ server.tool('workflow_get', 'Get details of a specific workflow including its nodes and configuration.', { workflowId: z.string().describe('The workflow ID') }, async ({ workflowId }) => {
43
+ const { ok, data } = await apiCall(ctx, 'GET', `/api/v1/workflows/${workflowId}`);
44
+ if (!ok)
45
+ return formatError(data.error?.message ?? 'Failed to fetch workflow');
46
+ return formatSuccess(data.data ?? data);
47
+ });
48
+ // workflow_execute
49
+ server.tool('workflow_execute', 'Execute a saved Prompteryx workflow by ID. Returns execution results when complete.', {
50
+ workflowId: z.string().describe('The workflow ID to execute'),
51
+ variables: z.record(z.any()).optional().describe('Variables to pass to the workflow'),
52
+ runMode: z.enum(['visible', 'headless']).optional().describe('Browser visibility mode'),
53
+ timeout: z.number().optional().describe('Execution timeout in ms (default: 300000)'),
54
+ }, async (params) => {
55
+ const check = enforceUsageLimits(ctx.getAuth(), 'workflow');
56
+ if (!check.allowed) {
57
+ return formatError(check.reason, undefined, { usageRemaining: formatUsageRemaining(ctx.getAuth()) });
58
+ }
59
+ const { ok, data } = await apiCall(ctx, 'POST', `/api/v1/workflows/${params.workflowId}/execute`, {
60
+ variables: params.variables,
61
+ options: {
62
+ runMode: params.runMode ?? 'headless',
63
+ timeout: params.timeout ?? 300000,
64
+ },
65
+ });
66
+ if (!ok)
67
+ return formatError(data.error?.message ?? 'Workflow execution failed');
68
+ // Record execution
69
+ await recordUsage(ctx.apiKey, ctx.apiUrl, { executionCount: 1 });
70
+ return formatSuccess({
71
+ executionId: data.data?.executionId ?? data.executionId,
72
+ status: data.data?.status ?? 'completed',
73
+ results: data.data?.results ?? data.results,
74
+ message: 'Workflow executed successfully',
75
+ });
76
+ });
77
+ // workflow_create
78
+ server.tool('workflow_create', 'Create a new Prompteryx workflow. You can either provide explicit nodes or describe what you want and AI will design it.', {
79
+ name: z.string().describe('Name for the workflow'),
80
+ description: z.string().optional().describe('Description of what the workflow does'),
81
+ nodes: z.array(z.object({
82
+ type: z.string().describe('Node type (e.g. "open-page", "click", "gmail-message-send")'),
83
+ label: z.string().describe('Display label for this step'),
84
+ params: z.record(z.any()).describe('Node parameters'),
85
+ })).optional().describe('Explicit node definitions'),
86
+ buildFromDescription: z.string().optional().describe('Natural language description — AI will design the workflow'),
87
+ }, async (params) => {
88
+ const features = ctx.getAuth().subscriptionTier;
89
+ if (features === 'free') {
90
+ return formatError('Workflow creation requires a Starter plan or higher. Upgrade at prompteryx.ai/pricing.');
91
+ }
92
+ if (params.buildFromDescription) {
93
+ const { ok, data } = await apiCall(ctx, 'POST', '/api/ai-workflow', {
94
+ description: params.buildFromDescription,
95
+ workflowName: params.name,
96
+ });
97
+ if (!ok)
98
+ return formatError(data.error?.message ?? 'AI workflow builder failed');
99
+ return formatSuccess({
100
+ workflowId: data.data?.workflowId ?? data.workflowId,
101
+ name: params.name,
102
+ message: 'Workflow created by AI. View and edit it in the Prompteryx Visual Studio.',
103
+ editUrl: `${ctx.apiUrl}/studio?workflow=${data.data?.workflowId ?? data.workflowId}`,
104
+ });
105
+ }
106
+ const { ok, data } = await apiCall(ctx, 'POST', '/api/v1/workflows', {
107
+ name: params.name,
108
+ description: params.description,
109
+ nodes: params.nodes,
110
+ });
111
+ if (!ok)
112
+ return formatError(data.error?.message ?? 'Workflow creation failed');
113
+ return formatSuccess({
114
+ workflowId: data.data?.workflowId ?? data.workflowId,
115
+ name: params.name,
116
+ message: 'Workflow created. You can execute it with workflow_execute or edit it in the Visual Studio.',
117
+ editUrl: `${ctx.apiUrl}/studio?workflow=${data.data?.workflowId ?? data.workflowId}`,
118
+ });
119
+ });
120
+ // workflow_delete
121
+ server.tool('workflow_delete', 'Delete a workflow from your account.', { workflowId: z.string().describe('The workflow ID to delete') }, async ({ workflowId }) => {
122
+ const { ok, data } = await apiCall(ctx, 'DELETE', `/api/v1/workflows/${workflowId}`);
123
+ if (!ok)
124
+ return formatError(data.error?.message ?? 'Failed to delete workflow');
125
+ return formatSuccess({ deleted: true, workflowId });
126
+ });
127
+ }
128
+ //# sourceMappingURL=workflow-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-tools.js","sourceRoot":"","sources":["../../src/tools/workflow-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Node Config → Zod Schema Converter
3
+ *
4
+ * Converts Prompteryx ParamDefinition objects from NODE_CONFIGS into
5
+ * Zod schemas suitable for MCP tool registration.
6
+ * Fetches configs from the platform API so the MCP server
7
+ * stays in sync without bundling the full config.
8
+ */
9
+ import { z } from 'zod';
10
+ export interface ParamDef {
11
+ type: string;
12
+ label?: string;
13
+ displayName?: string;
14
+ description?: string;
15
+ required?: boolean;
16
+ default?: any;
17
+ options?: Array<{
18
+ label?: string;
19
+ name?: string;
20
+ value: any;
21
+ }>;
22
+ min?: number;
23
+ max?: number;
24
+ }
25
+ export interface IntegrationNodeConfig {
26
+ type: string;
27
+ label: string;
28
+ description: string;
29
+ category: string;
30
+ credentials?: string[];
31
+ paramSchema: Record<string, ParamDef>;
32
+ defaultParams: Record<string, any>;
33
+ }
34
+ /**
35
+ * Fetches integration node configs from the platform API.
36
+ * Falls back to empty array if unavailable.
37
+ */
38
+ export declare function fetchIntegrationConfigs(apiKey: string, apiUrl: string): Promise<IntegrationNodeConfig[]>;
39
+ /**
40
+ * Converts a ParamDefinition from NODE_CONFIGS into a Zod schema.
41
+ * Handles string, number, boolean, select, textarea, json, etc.
42
+ */
43
+ export declare function paramDefToZod(name: string, def: ParamDef): z.ZodTypeAny;
44
+ /**
45
+ * Builds a Zod object schema from an integration node's paramSchema.
46
+ * Filters out display-only params (notice, heading) and internal params.
47
+ */
48
+ export declare function buildToolSchema(config: IntegrationNodeConfig): z.ZodObject<any>;
49
+ /**
50
+ * Generates a clean MCP tool name from a node type.
51
+ * e.g. "gmail-message-send" → "gmail_message_send"
52
+ */
53
+ export declare function nodeTypeToToolName(type: string): string;
54
+ //# sourceMappingURL=node-config-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-config-loader.d.ts","sourceRoot":"","sources":["../../src/utils/node-config-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,GAAG,CAAA;KAAE,CAAC,CAAC;IAC/D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACtC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACpC;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAgBlC;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,GAAG,CAAC,CAAC,UAAU,CAwCvE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,qBAAqB,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAgB/E;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD"}