0nmcp 2.9.0 → 2.9.2
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/catalog.js +1037 -0
- package/crm/social.js +9 -2
- package/lib/capabilities.js +700 -0
- package/lib/sequences.js +353 -0
- package/lib/stats.json +1 -1
- package/package.json +23 -100
- package/tools.js +4 -0
- package/workflow.js +16 -5
|
@@ -0,0 +1,700 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 0nMCP — Universal Capability Routing System
|
|
3
|
+
* Patent Pending: Universal Capability Routing & Field Resolution
|
|
4
|
+
*
|
|
5
|
+
* Instead of: "send email via SendGrid"
|
|
6
|
+
* You write: {{email.send}} → resolves to user's configured email provider
|
|
7
|
+
*
|
|
8
|
+
* The .0n file defines WHAT to do.
|
|
9
|
+
* The user's account defines HOW.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
export const CAPABILITIES = {
|
|
13
|
+
|
|
14
|
+
// ══════════════════════════════════════════════════
|
|
15
|
+
// EMAIL
|
|
16
|
+
// ══════════════════════════════════════════════════
|
|
17
|
+
'email.send': {
|
|
18
|
+
name: 'Send Email',
|
|
19
|
+
variable: '{{email.send}}',
|
|
20
|
+
description: 'Send a transactional or marketing email',
|
|
21
|
+
providers: ['crm', 'sendgrid', 'gmail', 'resend', 'postmark', 'mailgun', 'brevo', 'mailchimp'],
|
|
22
|
+
defaultProvider: 'crm',
|
|
23
|
+
inputSchema: { to: 'string', subject: 'string', body: 'string', from: 'string?', replyTo: 'string?' },
|
|
24
|
+
providerMap: {
|
|
25
|
+
crm: { tool: 'crm_send_email', mapFields: { contactId: '{{resolve.contactId}}', subject: '{{subject}}', body: '{{body}}' } },
|
|
26
|
+
sendgrid: { tool: 'sendgrid_send_email', mapFields: { to: '{{to}}', subject: '{{subject}}', body: '{{body}}' } },
|
|
27
|
+
gmail: { tool: 'gmail_send_email', mapFields: { to: '{{to}}', subject: '{{subject}}', body: '{{body}}' } },
|
|
28
|
+
resend: { tool: 'resend_send_email', mapFields: { to: '{{to}}', subject: '{{subject}}', html: '{{body}}' } },
|
|
29
|
+
postmark: { tool: 'postmark_send_email', mapFields: { To: '{{to}}', Subject: '{{subject}}', HtmlBody: '{{body}}' } },
|
|
30
|
+
mailgun: { tool: 'mailgun_send_message', mapFields: { to: '{{to}}', subject: '{{subject}}', html: '{{body}}' } },
|
|
31
|
+
brevo: { tool: 'brevo_send_transactional', mapFields: { to: [{ email: '{{to}}' }], subject: '{{subject}}', htmlContent: '{{body}}' } },
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
|
|
35
|
+
'email.list_templates': {
|
|
36
|
+
name: 'List Email Templates',
|
|
37
|
+
variable: '{{email.list_templates}}',
|
|
38
|
+
description: 'List available email templates',
|
|
39
|
+
providers: ['crm', 'sendgrid', 'mailchimp', 'postmark'],
|
|
40
|
+
defaultProvider: 'crm',
|
|
41
|
+
},
|
|
42
|
+
|
|
43
|
+
'email.add_contact': {
|
|
44
|
+
name: 'Add to Email List',
|
|
45
|
+
variable: '{{email.add_contact}}',
|
|
46
|
+
description: 'Add a contact to an email list or audience',
|
|
47
|
+
providers: ['sendgrid', 'mailchimp', 'convertkit', 'activecampaign', 'brevo'],
|
|
48
|
+
defaultProvider: 'mailchimp',
|
|
49
|
+
inputSchema: { email: 'string', firstName: 'string?', lastName: 'string?', listId: 'string?' },
|
|
50
|
+
},
|
|
51
|
+
|
|
52
|
+
// ══════════════════════════════════════════════════
|
|
53
|
+
// SMS / MESSAGING
|
|
54
|
+
// ══════════════════════════════════════════════════
|
|
55
|
+
'sms.send': {
|
|
56
|
+
name: 'Send SMS',
|
|
57
|
+
variable: '{{sms.send}}',
|
|
58
|
+
description: 'Send a text message',
|
|
59
|
+
providers: ['crm', 'twilio', 'whatsapp'],
|
|
60
|
+
defaultProvider: 'crm',
|
|
61
|
+
inputSchema: { to: 'string', message: 'string' },
|
|
62
|
+
providerMap: {
|
|
63
|
+
crm: { tool: 'crm_send_sms', mapFields: { contactId: '{{resolve.contactId}}', message: '{{message}}' } },
|
|
64
|
+
twilio: { tool: 'twilio_send_sms', mapFields: { to: '{{to}}', body: '{{message}}' } },
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
|
|
68
|
+
'message.send': {
|
|
69
|
+
name: 'Send Message',
|
|
70
|
+
variable: '{{message.send}}',
|
|
71
|
+
description: 'Send a message to a channel or chat',
|
|
72
|
+
providers: ['slack', 'discord', 'telegram', 'whatsapp'],
|
|
73
|
+
defaultProvider: 'slack',
|
|
74
|
+
inputSchema: { channel: 'string', text: 'string' },
|
|
75
|
+
providerMap: {
|
|
76
|
+
slack: { tool: 'slack_send_message', mapFields: { channel: '{{channel}}', text: '{{text}}' } },
|
|
77
|
+
discord: { tool: 'discord_send_message', mapFields: { channelId: '{{channel}}', content: '{{text}}' } },
|
|
78
|
+
telegram: { tool: 'telegram_send_message', mapFields: { chat_id: '{{channel}}', text: '{{text}}' } },
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
|
|
82
|
+
// ══════════════════════════════════════════════════
|
|
83
|
+
// CONTACTS / CRM
|
|
84
|
+
// ══════════════════════════════════════════════════
|
|
85
|
+
'contact.create': {
|
|
86
|
+
name: 'Create Contact',
|
|
87
|
+
variable: '{{contact.create}}',
|
|
88
|
+
description: 'Create a new contact/lead in the CRM',
|
|
89
|
+
providers: ['crm', 'hubspot', 'pipedrive', 'activecampaign', 'intercom'],
|
|
90
|
+
defaultProvider: 'crm',
|
|
91
|
+
inputSchema: { email: 'string', firstName: 'string?', lastName: 'string?', phone: 'string?', company: 'string?', tags: 'array?' },
|
|
92
|
+
},
|
|
93
|
+
|
|
94
|
+
'contact.search': {
|
|
95
|
+
name: 'Search Contacts',
|
|
96
|
+
variable: '{{contact.search}}',
|
|
97
|
+
description: 'Search for contacts by name, email, or phone',
|
|
98
|
+
providers: ['crm', 'hubspot', 'pipedrive', 'activecampaign'],
|
|
99
|
+
defaultProvider: 'crm',
|
|
100
|
+
inputSchema: { query: 'string' },
|
|
101
|
+
},
|
|
102
|
+
|
|
103
|
+
'contact.tag': {
|
|
104
|
+
name: 'Tag Contact',
|
|
105
|
+
variable: '{{contact.tag}}',
|
|
106
|
+
description: 'Add tags to a contact for segmentation',
|
|
107
|
+
providers: ['crm', 'activecampaign', 'convertkit', 'hubspot'],
|
|
108
|
+
defaultProvider: 'crm',
|
|
109
|
+
inputSchema: { contactId: 'string', tags: 'array' },
|
|
110
|
+
},
|
|
111
|
+
|
|
112
|
+
// ══════════════════════════════════════════════════
|
|
113
|
+
// CALENDAR / BOOKING
|
|
114
|
+
// ══════════════════════════════════════════════════
|
|
115
|
+
'calendar.book': {
|
|
116
|
+
name: 'Book Appointment',
|
|
117
|
+
variable: '{{calendar.book}}',
|
|
118
|
+
description: 'Book a calendar appointment or meeting',
|
|
119
|
+
providers: ['crm', 'google_calendar', 'calendly', 'zoom'],
|
|
120
|
+
defaultProvider: 'crm',
|
|
121
|
+
inputSchema: { contactId: 'string?', startTime: 'string', endTime: 'string?', title: 'string', attendees: 'array?' },
|
|
122
|
+
},
|
|
123
|
+
|
|
124
|
+
'calendar.list': {
|
|
125
|
+
name: 'List Events',
|
|
126
|
+
variable: '{{calendar.list}}',
|
|
127
|
+
description: 'List upcoming calendar events',
|
|
128
|
+
providers: ['crm', 'google_calendar', 'calendly'],
|
|
129
|
+
defaultProvider: 'crm',
|
|
130
|
+
inputSchema: { maxResults: 'number?' },
|
|
131
|
+
},
|
|
132
|
+
|
|
133
|
+
'meeting.create': {
|
|
134
|
+
name: 'Create Video Meeting',
|
|
135
|
+
variable: '{{meeting.create}}',
|
|
136
|
+
description: 'Create a video meeting room',
|
|
137
|
+
providers: ['zoom', 'google_calendar'],
|
|
138
|
+
defaultProvider: 'zoom',
|
|
139
|
+
inputSchema: { topic: 'string', startTime: 'string', duration: 'number?' },
|
|
140
|
+
},
|
|
141
|
+
|
|
142
|
+
// ══════════════════════════════════════════════════
|
|
143
|
+
// PAYMENTS / INVOICING
|
|
144
|
+
// ══════════════════════════════════════════════════
|
|
145
|
+
'payment.create_customer': {
|
|
146
|
+
name: 'Create Payment Customer',
|
|
147
|
+
variable: '{{payment.create_customer}}',
|
|
148
|
+
description: 'Create a customer in the payment system',
|
|
149
|
+
providers: ['stripe', 'square', 'quickbooks', 'xero'],
|
|
150
|
+
defaultProvider: 'stripe',
|
|
151
|
+
inputSchema: { email: 'string', name: 'string?' },
|
|
152
|
+
},
|
|
153
|
+
|
|
154
|
+
'payment.create_invoice': {
|
|
155
|
+
name: 'Create Invoice',
|
|
156
|
+
variable: '{{payment.create_invoice}}',
|
|
157
|
+
description: 'Create and send an invoice',
|
|
158
|
+
providers: ['stripe', 'square', 'quickbooks', 'xero', 'wave'],
|
|
159
|
+
defaultProvider: 'stripe',
|
|
160
|
+
inputSchema: { customer: 'string', amount: 'number', description: 'string?' },
|
|
161
|
+
},
|
|
162
|
+
|
|
163
|
+
'payment.create_checkout': {
|
|
164
|
+
name: 'Create Checkout',
|
|
165
|
+
variable: '{{payment.create_checkout}}',
|
|
166
|
+
description: 'Create a payment checkout session',
|
|
167
|
+
providers: ['stripe', 'square'],
|
|
168
|
+
defaultProvider: 'stripe',
|
|
169
|
+
inputSchema: { priceId: 'string', successUrl: 'string?', cancelUrl: 'string?' },
|
|
170
|
+
},
|
|
171
|
+
|
|
172
|
+
'payment.list_transactions': {
|
|
173
|
+
name: 'List Transactions',
|
|
174
|
+
variable: '{{payment.list_transactions}}',
|
|
175
|
+
description: 'List recent payment transactions',
|
|
176
|
+
providers: ['stripe', 'square', 'quickbooks'],
|
|
177
|
+
defaultProvider: 'stripe',
|
|
178
|
+
inputSchema: { limit: 'number?' },
|
|
179
|
+
},
|
|
180
|
+
|
|
181
|
+
// ══════════════════════════════════════════════════
|
|
182
|
+
// SOCIAL MEDIA
|
|
183
|
+
// ══════════════════════════════════════════════════
|
|
184
|
+
'social.post': {
|
|
185
|
+
name: 'Create Social Post',
|
|
186
|
+
variable: '{{social.post}}',
|
|
187
|
+
description: 'Post to social media',
|
|
188
|
+
providers: ['crm', 'linkedin', 'twitter', 'instagram', 'facebook_ads', 'pinterest', 'tiktok', 'reddit'],
|
|
189
|
+
defaultProvider: 'crm',
|
|
190
|
+
inputSchema: { text: 'string', platform: 'string?', imageUrl: 'string?' },
|
|
191
|
+
},
|
|
192
|
+
|
|
193
|
+
'social.get_analytics': {
|
|
194
|
+
name: 'Get Social Analytics',
|
|
195
|
+
variable: '{{social.get_analytics}}',
|
|
196
|
+
description: 'Get social media performance metrics',
|
|
197
|
+
providers: ['crm', 'linkedin', 'twitter', 'instagram', 'youtube', 'pinterest'],
|
|
198
|
+
defaultProvider: 'crm',
|
|
199
|
+
inputSchema: { platform: 'string?', dateRange: 'string?' },
|
|
200
|
+
},
|
|
201
|
+
|
|
202
|
+
// ══════════════════════════════════════════════════
|
|
203
|
+
// ADVERTISING
|
|
204
|
+
// ══════════════════════════════════════════════════
|
|
205
|
+
'ads.create_campaign': {
|
|
206
|
+
name: 'Create Ad Campaign',
|
|
207
|
+
variable: '{{ads.create_campaign}}',
|
|
208
|
+
description: 'Create an advertising campaign',
|
|
209
|
+
providers: ['google_ads', 'facebook_ads', 'linkedin_ads', 'tiktok_ads', 'twitter', 'x_ads', 'pinterest'],
|
|
210
|
+
defaultProvider: 'facebook_ads',
|
|
211
|
+
inputSchema: { name: 'string', budget: 'number', objective: 'string?' },
|
|
212
|
+
},
|
|
213
|
+
|
|
214
|
+
'ads.get_performance': {
|
|
215
|
+
name: 'Get Ad Performance',
|
|
216
|
+
variable: '{{ads.get_performance}}',
|
|
217
|
+
description: 'Get advertising campaign metrics',
|
|
218
|
+
providers: ['google_ads', 'facebook_ads', 'linkedin_ads', 'tiktok_ads'],
|
|
219
|
+
defaultProvider: 'facebook_ads',
|
|
220
|
+
inputSchema: { campaignId: 'string?', dateRange: 'string?' },
|
|
221
|
+
},
|
|
222
|
+
|
|
223
|
+
// ══════════════════════════════════════════════════
|
|
224
|
+
// PROJECT MANAGEMENT
|
|
225
|
+
// ══════════════════════════════════════════════════
|
|
226
|
+
'project.create_task': {
|
|
227
|
+
name: 'Create Task',
|
|
228
|
+
variable: '{{project.create_task}}',
|
|
229
|
+
description: 'Create a task or issue',
|
|
230
|
+
providers: ['crm', 'asana', 'trello', 'monday', 'linear', 'jira', 'notion'],
|
|
231
|
+
defaultProvider: 'crm',
|
|
232
|
+
inputSchema: { title: 'string', description: 'string?', assignee: 'string?', dueDate: 'string?', priority: 'string?' },
|
|
233
|
+
},
|
|
234
|
+
|
|
235
|
+
'project.list_tasks': {
|
|
236
|
+
name: 'List Tasks',
|
|
237
|
+
variable: '{{project.list_tasks}}',
|
|
238
|
+
description: 'List tasks from a project',
|
|
239
|
+
providers: ['crm', 'asana', 'trello', 'monday', 'linear', 'jira'],
|
|
240
|
+
defaultProvider: 'crm',
|
|
241
|
+
inputSchema: { projectId: 'string?', status: 'string?' },
|
|
242
|
+
},
|
|
243
|
+
|
|
244
|
+
'project.create_issue': {
|
|
245
|
+
name: 'Create Issue',
|
|
246
|
+
variable: '{{project.create_issue}}',
|
|
247
|
+
description: 'Create a bug report or feature request',
|
|
248
|
+
providers: ['github', 'jira', 'linear'],
|
|
249
|
+
defaultProvider: 'github',
|
|
250
|
+
inputSchema: { title: 'string', body: 'string?', labels: 'array?', assignee: 'string?' },
|
|
251
|
+
},
|
|
252
|
+
|
|
253
|
+
// ══════════════════════════════════════════════════
|
|
254
|
+
// STORAGE / FILES
|
|
255
|
+
// ══════════════════════════════════════════════════
|
|
256
|
+
'storage.upload': {
|
|
257
|
+
name: 'Upload File',
|
|
258
|
+
variable: '{{storage.upload}}',
|
|
259
|
+
description: 'Upload a file to cloud storage',
|
|
260
|
+
providers: ['google_drive', 'dropbox', 'supabase', 'aws'],
|
|
261
|
+
defaultProvider: 'google_drive',
|
|
262
|
+
inputSchema: { fileName: 'string', content: 'string', folder: 'string?' },
|
|
263
|
+
},
|
|
264
|
+
|
|
265
|
+
'storage.list': {
|
|
266
|
+
name: 'List Files',
|
|
267
|
+
variable: '{{storage.list}}',
|
|
268
|
+
description: 'List files in cloud storage',
|
|
269
|
+
providers: ['google_drive', 'dropbox', 'supabase', 'aws'],
|
|
270
|
+
defaultProvider: 'google_drive',
|
|
271
|
+
inputSchema: { folder: 'string?', limit: 'number?' },
|
|
272
|
+
},
|
|
273
|
+
|
|
274
|
+
// ══════════════════════════════════════════════════
|
|
275
|
+
// DATABASE
|
|
276
|
+
// ══════════════════════════════════════════════════
|
|
277
|
+
'db.query': {
|
|
278
|
+
name: 'Query Database',
|
|
279
|
+
variable: '{{db.query}}',
|
|
280
|
+
description: 'Query data from a database',
|
|
281
|
+
providers: ['supabase', 'mongodb', 'airtable', 'google_sheets', 'neon', 'planetscale', 'turso', 'cockroachdb'],
|
|
282
|
+
defaultProvider: 'supabase',
|
|
283
|
+
inputSchema: { table: 'string', filter: 'object?', select: 'string?', limit: 'number?' },
|
|
284
|
+
},
|
|
285
|
+
|
|
286
|
+
'db.insert': {
|
|
287
|
+
name: 'Insert Record',
|
|
288
|
+
variable: '{{db.insert}}',
|
|
289
|
+
description: 'Insert a record into a database',
|
|
290
|
+
providers: ['supabase', 'mongodb', 'airtable', 'google_sheets', 'notion'],
|
|
291
|
+
defaultProvider: 'supabase',
|
|
292
|
+
inputSchema: { table: 'string', data: 'object' },
|
|
293
|
+
},
|
|
294
|
+
|
|
295
|
+
'db.update': {
|
|
296
|
+
name: 'Update Record',
|
|
297
|
+
variable: '{{db.update}}',
|
|
298
|
+
description: 'Update records in a database',
|
|
299
|
+
providers: ['supabase', 'mongodb', 'airtable', 'notion'],
|
|
300
|
+
defaultProvider: 'supabase',
|
|
301
|
+
inputSchema: { table: 'string', data: 'object', match: 'object' },
|
|
302
|
+
},
|
|
303
|
+
|
|
304
|
+
// ══════════════════════════════════════════════════
|
|
305
|
+
// SPREADSHEETS
|
|
306
|
+
// ══════════════════════════════════════════════════
|
|
307
|
+
'spreadsheet.read': {
|
|
308
|
+
name: 'Read Spreadsheet',
|
|
309
|
+
variable: '{{spreadsheet.read}}',
|
|
310
|
+
description: 'Read data from a spreadsheet',
|
|
311
|
+
providers: ['google_sheets', 'airtable', 'notion'],
|
|
312
|
+
defaultProvider: 'google_sheets',
|
|
313
|
+
inputSchema: { spreadsheetId: 'string', range: 'string' },
|
|
314
|
+
},
|
|
315
|
+
|
|
316
|
+
'spreadsheet.write': {
|
|
317
|
+
name: 'Write to Spreadsheet',
|
|
318
|
+
variable: '{{spreadsheet.write}}',
|
|
319
|
+
description: 'Write data to a spreadsheet',
|
|
320
|
+
providers: ['google_sheets', 'airtable', 'notion'],
|
|
321
|
+
defaultProvider: 'google_sheets',
|
|
322
|
+
inputSchema: { spreadsheetId: 'string', range: 'string', values: 'array' },
|
|
323
|
+
},
|
|
324
|
+
|
|
325
|
+
// ══════════════════════════════════════════════════
|
|
326
|
+
// SUPPORT / TICKETING
|
|
327
|
+
// ══════════════════════════════════════════════════
|
|
328
|
+
'support.create_ticket': {
|
|
329
|
+
name: 'Create Support Ticket',
|
|
330
|
+
variable: '{{support.create_ticket}}',
|
|
331
|
+
description: 'Create a support ticket or help desk issue',
|
|
332
|
+
providers: ['zendesk', 'freshdesk', 'intercom', 'jira', 'crm'],
|
|
333
|
+
defaultProvider: 'crm',
|
|
334
|
+
inputSchema: { subject: 'string', description: 'string', priority: 'string?', contactEmail: 'string?' },
|
|
335
|
+
},
|
|
336
|
+
|
|
337
|
+
'support.list_tickets': {
|
|
338
|
+
name: 'List Support Tickets',
|
|
339
|
+
variable: '{{support.list_tickets}}',
|
|
340
|
+
description: 'List open support tickets',
|
|
341
|
+
providers: ['zendesk', 'freshdesk', 'intercom', 'jira'],
|
|
342
|
+
defaultProvider: 'zendesk',
|
|
343
|
+
inputSchema: { status: 'string?', limit: 'number?' },
|
|
344
|
+
},
|
|
345
|
+
|
|
346
|
+
// ══════════════════════════════════════════════════
|
|
347
|
+
// E-COMMERCE
|
|
348
|
+
// ══════════════════════════════════════════════════
|
|
349
|
+
'shop.list_products': {
|
|
350
|
+
name: 'List Products',
|
|
351
|
+
variable: '{{shop.list_products}}',
|
|
352
|
+
description: 'List products from an e-commerce store',
|
|
353
|
+
providers: ['shopify', 'woocommerce', 'bigcommerce', 'square'],
|
|
354
|
+
defaultProvider: 'shopify',
|
|
355
|
+
inputSchema: { limit: 'number?' },
|
|
356
|
+
},
|
|
357
|
+
|
|
358
|
+
'shop.create_product': {
|
|
359
|
+
name: 'Create Product',
|
|
360
|
+
variable: '{{shop.create_product}}',
|
|
361
|
+
description: 'Create a product in an e-commerce store',
|
|
362
|
+
providers: ['shopify', 'woocommerce', 'bigcommerce', 'stripe'],
|
|
363
|
+
defaultProvider: 'shopify',
|
|
364
|
+
inputSchema: { title: 'string', price: 'number', description: 'string?' },
|
|
365
|
+
},
|
|
366
|
+
|
|
367
|
+
'shop.list_orders': {
|
|
368
|
+
name: 'List Orders',
|
|
369
|
+
variable: '{{shop.list_orders}}',
|
|
370
|
+
description: 'List recent orders',
|
|
371
|
+
providers: ['shopify', 'woocommerce', 'bigcommerce', 'square'],
|
|
372
|
+
defaultProvider: 'shopify',
|
|
373
|
+
inputSchema: { limit: 'number?', status: 'string?' },
|
|
374
|
+
},
|
|
375
|
+
|
|
376
|
+
// ══════════════════════════════════════════════════
|
|
377
|
+
// DESIGN
|
|
378
|
+
// ══════════════════════════════════════════════════
|
|
379
|
+
'design.get_file': {
|
|
380
|
+
name: 'Get Design File',
|
|
381
|
+
variable: '{{design.get_file}}',
|
|
382
|
+
description: 'Read a design file',
|
|
383
|
+
providers: ['figma'],
|
|
384
|
+
defaultProvider: 'figma',
|
|
385
|
+
inputSchema: { fileKey: 'string' },
|
|
386
|
+
},
|
|
387
|
+
|
|
388
|
+
'design.export': {
|
|
389
|
+
name: 'Export Design',
|
|
390
|
+
variable: '{{design.export}}',
|
|
391
|
+
description: 'Export design frames as images',
|
|
392
|
+
providers: ['figma'],
|
|
393
|
+
defaultProvider: 'figma',
|
|
394
|
+
inputSchema: { fileKey: 'string', nodeIds: 'string', format: 'string?' },
|
|
395
|
+
},
|
|
396
|
+
|
|
397
|
+
// ══════════════════════════════════════════════════
|
|
398
|
+
// AI / GENERATION
|
|
399
|
+
// ══════════════════════════════════════════════════
|
|
400
|
+
'ai.generate_text': {
|
|
401
|
+
name: 'Generate Text',
|
|
402
|
+
variable: '{{ai.generate_text}}',
|
|
403
|
+
description: 'Generate text using AI',
|
|
404
|
+
providers: ['groq', 'openai', 'anthropic', 'mistral', 'cohere', 'ollama', 'replicate', 'deepseek'],
|
|
405
|
+
defaultProvider: 'groq',
|
|
406
|
+
inputSchema: { prompt: 'string', model: 'string?', maxTokens: 'number?' },
|
|
407
|
+
},
|
|
408
|
+
|
|
409
|
+
'ai.generate_image': {
|
|
410
|
+
name: 'Generate Image',
|
|
411
|
+
variable: '{{ai.generate_image}}',
|
|
412
|
+
description: 'Generate an image using AI',
|
|
413
|
+
providers: ['openai', 'stability', 'replicate'],
|
|
414
|
+
defaultProvider: 'openai',
|
|
415
|
+
inputSchema: { prompt: 'string', size: 'string?' },
|
|
416
|
+
},
|
|
417
|
+
|
|
418
|
+
'ai.generate_audio': {
|
|
419
|
+
name: 'Generate Audio',
|
|
420
|
+
variable: '{{ai.generate_audio}}',
|
|
421
|
+
description: 'Generate speech from text',
|
|
422
|
+
providers: ['elevenlabs', 'openai'],
|
|
423
|
+
defaultProvider: 'elevenlabs',
|
|
424
|
+
inputSchema: { text: 'string', voiceId: 'string?' },
|
|
425
|
+
},
|
|
426
|
+
|
|
427
|
+
'ai.transcribe': {
|
|
428
|
+
name: 'Transcribe Audio',
|
|
429
|
+
variable: '{{ai.transcribe}}',
|
|
430
|
+
description: 'Convert speech to text',
|
|
431
|
+
providers: ['deepgram', 'groq', 'openai'],
|
|
432
|
+
defaultProvider: 'deepgram',
|
|
433
|
+
inputSchema: { audioUrl: 'string', language: 'string?' },
|
|
434
|
+
},
|
|
435
|
+
|
|
436
|
+
'ai.embed': {
|
|
437
|
+
name: 'Create Embedding',
|
|
438
|
+
variable: '{{ai.embed}}',
|
|
439
|
+
description: 'Create vector embeddings from text',
|
|
440
|
+
providers: ['openai', 'cohere', 'ollama'],
|
|
441
|
+
defaultProvider: 'openai',
|
|
442
|
+
inputSchema: { text: 'string', model: 'string?' },
|
|
443
|
+
},
|
|
444
|
+
|
|
445
|
+
// ══════════════════════════════════════════════════
|
|
446
|
+
// DOCUMENTS / SIGNING
|
|
447
|
+
// ══════════════════════════════════════════════════
|
|
448
|
+
'document.sign': {
|
|
449
|
+
name: 'Send for Signature',
|
|
450
|
+
variable: '{{document.sign}}',
|
|
451
|
+
description: 'Send a document for e-signature',
|
|
452
|
+
providers: ['docusign'],
|
|
453
|
+
defaultProvider: 'docusign',
|
|
454
|
+
inputSchema: { subject: 'string', recipients: 'array', documentUrl: 'string?' },
|
|
455
|
+
},
|
|
456
|
+
|
|
457
|
+
// ══════════════════════════════════════════════════
|
|
458
|
+
// WEBSITE / CMS
|
|
459
|
+
// ══════════════════════════════════════════════════
|
|
460
|
+
'cms.create_post': {
|
|
461
|
+
name: 'Create Blog Post',
|
|
462
|
+
variable: '{{cms.create_post}}',
|
|
463
|
+
description: 'Create a blog post or page',
|
|
464
|
+
providers: ['crm', 'wordpress', 'webflow', 'notion'],
|
|
465
|
+
defaultProvider: 'crm',
|
|
466
|
+
inputSchema: { title: 'string', content: 'string', status: 'string?' },
|
|
467
|
+
},
|
|
468
|
+
|
|
469
|
+
'cms.publish': {
|
|
470
|
+
name: 'Publish Site',
|
|
471
|
+
variable: '{{cms.publish}}',
|
|
472
|
+
description: 'Publish or deploy a website',
|
|
473
|
+
providers: ['webflow', 'netlify'],
|
|
474
|
+
defaultProvider: 'webflow',
|
|
475
|
+
inputSchema: { siteId: 'string' },
|
|
476
|
+
},
|
|
477
|
+
|
|
478
|
+
// ══════════════════════════════════════════════════
|
|
479
|
+
// DOMAINS / DNS
|
|
480
|
+
// ══════════════════════════════════════════════════
|
|
481
|
+
'domain.search': {
|
|
482
|
+
name: 'Search Domains',
|
|
483
|
+
variable: '{{domain.search}}',
|
|
484
|
+
description: 'Search for available domain names',
|
|
485
|
+
providers: ['godaddy', 'cloudflare'],
|
|
486
|
+
defaultProvider: 'godaddy',
|
|
487
|
+
inputSchema: { query: 'string' },
|
|
488
|
+
},
|
|
489
|
+
|
|
490
|
+
'domain.manage_dns': {
|
|
491
|
+
name: 'Manage DNS',
|
|
492
|
+
variable: '{{domain.manage_dns}}',
|
|
493
|
+
description: 'Create or update DNS records',
|
|
494
|
+
providers: ['cloudflare', 'godaddy'],
|
|
495
|
+
defaultProvider: 'cloudflare',
|
|
496
|
+
inputSchema: { domain: 'string', type: 'string', name: 'string', content: 'string' },
|
|
497
|
+
},
|
|
498
|
+
|
|
499
|
+
// ══════════════════════════════════════════════════
|
|
500
|
+
// COLD EMAIL / OUTREACH
|
|
501
|
+
// ══════════════════════════════════════════════════
|
|
502
|
+
'outreach.add_lead': {
|
|
503
|
+
name: 'Add Outreach Lead',
|
|
504
|
+
variable: '{{outreach.add_lead}}',
|
|
505
|
+
description: 'Add a lead to a cold email campaign',
|
|
506
|
+
providers: ['smartlead', 'lemlist'],
|
|
507
|
+
defaultProvider: 'smartlead',
|
|
508
|
+
inputSchema: { email: 'string', firstName: 'string?', campaignId: 'string' },
|
|
509
|
+
},
|
|
510
|
+
|
|
511
|
+
// ══════════════════════════════════════════════════
|
|
512
|
+
// FORMS / DATA COLLECTION
|
|
513
|
+
// ══════════════════════════════════════════════════
|
|
514
|
+
'form.get_responses': {
|
|
515
|
+
name: 'Get Form Responses',
|
|
516
|
+
variable: '{{form.get_responses}}',
|
|
517
|
+
description: 'Get responses from a form',
|
|
518
|
+
providers: ['typeform', 'crm', 'google_sheets'],
|
|
519
|
+
defaultProvider: 'typeform',
|
|
520
|
+
inputSchema: { formId: 'string' },
|
|
521
|
+
},
|
|
522
|
+
|
|
523
|
+
// ══════════════════════════════════════════════════
|
|
524
|
+
// EDUCATION / COURSES
|
|
525
|
+
// ══════════════════════════════════════════════════
|
|
526
|
+
'course.create': {
|
|
527
|
+
name: 'Create Course',
|
|
528
|
+
variable: '{{course.create}}',
|
|
529
|
+
description: 'Create a course with modules and lessons',
|
|
530
|
+
providers: ['crm'],
|
|
531
|
+
defaultProvider: 'crm',
|
|
532
|
+
inputSchema: { title: 'string', description: 'string?', modules: 'array' },
|
|
533
|
+
},
|
|
534
|
+
|
|
535
|
+
// ══════════════════════════════════════════════════
|
|
536
|
+
// SXO / SEO
|
|
537
|
+
// ══════════════════════════════════════════════════
|
|
538
|
+
'sxo.scan': {
|
|
539
|
+
name: 'SXO Domain Scan',
|
|
540
|
+
variable: '{{sxo.scan}}',
|
|
541
|
+
description: 'Scan a domain for SXO/SEO/AI readiness score',
|
|
542
|
+
providers: ['sxo'],
|
|
543
|
+
defaultProvider: 'sxo',
|
|
544
|
+
inputSchema: { url: 'string' },
|
|
545
|
+
},
|
|
546
|
+
|
|
547
|
+
// ══════════════════════════════════════════════════
|
|
548
|
+
// PIPELINE / SALES
|
|
549
|
+
// ══════════════════════════════════════════════════
|
|
550
|
+
'pipeline.create_deal': {
|
|
551
|
+
name: 'Create Deal',
|
|
552
|
+
variable: '{{pipeline.create_deal}}',
|
|
553
|
+
description: 'Create a deal/opportunity in the sales pipeline',
|
|
554
|
+
providers: ['crm', 'hubspot', 'pipedrive'],
|
|
555
|
+
defaultProvider: 'crm',
|
|
556
|
+
inputSchema: { name: 'string', value: 'number?', stage: 'string?', contactId: 'string?' },
|
|
557
|
+
},
|
|
558
|
+
|
|
559
|
+
'pipeline.move_stage': {
|
|
560
|
+
name: 'Move Deal Stage',
|
|
561
|
+
variable: '{{pipeline.move_stage}}',
|
|
562
|
+
description: 'Move a deal to a different pipeline stage',
|
|
563
|
+
providers: ['crm', 'hubspot', 'pipedrive'],
|
|
564
|
+
defaultProvider: 'crm',
|
|
565
|
+
inputSchema: { dealId: 'string', stageId: 'string' },
|
|
566
|
+
},
|
|
567
|
+
|
|
568
|
+
// ══════════════════════════════════════════════════
|
|
569
|
+
// VOICE / PHONE
|
|
570
|
+
// ══════════════════════════════════════════════════
|
|
571
|
+
'voice.call': {
|
|
572
|
+
name: 'Make Phone Call',
|
|
573
|
+
variable: '{{voice.call}}',
|
|
574
|
+
description: 'Initiate a phone call',
|
|
575
|
+
providers: ['twilio', 'crm'],
|
|
576
|
+
defaultProvider: 'twilio',
|
|
577
|
+
inputSchema: { to: 'string', from: 'string?', message: 'string?' },
|
|
578
|
+
},
|
|
579
|
+
|
|
580
|
+
'voice.tts': {
|
|
581
|
+
name: 'Text to Speech',
|
|
582
|
+
variable: '{{voice.tts}}',
|
|
583
|
+
description: 'Convert text to natural speech audio',
|
|
584
|
+
providers: ['elevenlabs', 'openai'],
|
|
585
|
+
defaultProvider: 'elevenlabs',
|
|
586
|
+
inputSchema: { text: 'string', voiceId: 'string?' },
|
|
587
|
+
},
|
|
588
|
+
|
|
589
|
+
'voice.transcribe': {
|
|
590
|
+
name: 'Transcribe Audio',
|
|
591
|
+
variable: '{{voice.transcribe}}',
|
|
592
|
+
description: 'Convert audio/speech to text',
|
|
593
|
+
providers: ['deepgram', 'groq', 'openai'],
|
|
594
|
+
defaultProvider: 'deepgram',
|
|
595
|
+
inputSchema: { audioUrl: 'string' },
|
|
596
|
+
},
|
|
597
|
+
|
|
598
|
+
// ══════════════════════════════════════════════════
|
|
599
|
+
// ACCOUNTING
|
|
600
|
+
// ══════════════════════════════════════════════════
|
|
601
|
+
'accounting.create_invoice': {
|
|
602
|
+
name: 'Create Accounting Invoice',
|
|
603
|
+
variable: '{{accounting.create_invoice}}',
|
|
604
|
+
description: 'Create an invoice in the accounting system',
|
|
605
|
+
providers: ['quickbooks', 'xero', 'wave'],
|
|
606
|
+
defaultProvider: 'quickbooks',
|
|
607
|
+
inputSchema: { customer: 'string', lineItems: 'array', dueDate: 'string?' },
|
|
608
|
+
},
|
|
609
|
+
|
|
610
|
+
'accounting.list_invoices': {
|
|
611
|
+
name: 'List Accounting Invoices',
|
|
612
|
+
variable: '{{accounting.list_invoices}}',
|
|
613
|
+
description: 'List invoices from accounting',
|
|
614
|
+
providers: ['quickbooks', 'xero'],
|
|
615
|
+
defaultProvider: 'quickbooks',
|
|
616
|
+
inputSchema: { limit: 'number?', status: 'string?' },
|
|
617
|
+
},
|
|
618
|
+
|
|
619
|
+
// ══════════════════════════════════════════════════
|
|
620
|
+
// AUTOMATION / WORKFLOWS
|
|
621
|
+
// ══════════════════════════════════════════════════
|
|
622
|
+
'automation.trigger': {
|
|
623
|
+
name: 'Trigger Automation',
|
|
624
|
+
variable: '{{automation.trigger}}',
|
|
625
|
+
description: 'Trigger an automation workflow',
|
|
626
|
+
providers: ['crm', 'zapier', 'make', 'n8n', 'pabbly'],
|
|
627
|
+
defaultProvider: 'crm',
|
|
628
|
+
inputSchema: { workflowId: 'string?', data: 'object?' },
|
|
629
|
+
},
|
|
630
|
+
|
|
631
|
+
// ══════════════════════════════════════════════════
|
|
632
|
+
// DEPLOYMENT / HOSTING
|
|
633
|
+
// ══════════════════════════════════════════════════
|
|
634
|
+
'deploy.site': {
|
|
635
|
+
name: 'Deploy Website',
|
|
636
|
+
variable: '{{deploy.site}}',
|
|
637
|
+
description: 'Deploy or publish a website',
|
|
638
|
+
providers: ['netlify', 'cloudflare', 'render', 'railway'],
|
|
639
|
+
defaultProvider: 'netlify',
|
|
640
|
+
inputSchema: { siteId: 'string' },
|
|
641
|
+
},
|
|
642
|
+
|
|
643
|
+
// ══════════════════════════════════════════════════
|
|
644
|
+
// VIDEO
|
|
645
|
+
// ══════════════════════════════════════════════════
|
|
646
|
+
'video.get': {
|
|
647
|
+
name: 'Get Video',
|
|
648
|
+
variable: '{{video.get}}',
|
|
649
|
+
description: 'Get video details or recording',
|
|
650
|
+
providers: ['youtube', 'loom', 'twitch'],
|
|
651
|
+
defaultProvider: 'youtube',
|
|
652
|
+
inputSchema: { videoId: 'string' },
|
|
653
|
+
},
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
/**
|
|
657
|
+
* Resolve a capability to the user's configured provider
|
|
658
|
+
*/
|
|
659
|
+
export function resolveCapability(capabilityId, userConfig = {}) {
|
|
660
|
+
const cap = CAPABILITIES[capabilityId]
|
|
661
|
+
if (!cap) return null
|
|
662
|
+
|
|
663
|
+
// Check user's preferred provider for this capability
|
|
664
|
+
const preferredProvider = userConfig[capabilityId] || userConfig[capabilityId.split('.')[0]] || cap.defaultProvider
|
|
665
|
+
|
|
666
|
+
// Verify the provider is in the allowed list
|
|
667
|
+
if (cap.providers.includes(preferredProvider)) {
|
|
668
|
+
return { capability: cap, provider: preferredProvider, tool: cap.providerMap?.[preferredProvider]?.tool }
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
// Fallback to default
|
|
672
|
+
return { capability: cap, provider: cap.defaultProvider, tool: cap.providerMap?.[cap.defaultProvider]?.tool }
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
/**
|
|
676
|
+
* List all capabilities
|
|
677
|
+
*/
|
|
678
|
+
export function listCapabilities() {
|
|
679
|
+
return Object.entries(CAPABILITIES).map(([id, cap]) => ({
|
|
680
|
+
id,
|
|
681
|
+
variable: cap.variable,
|
|
682
|
+
name: cap.name,
|
|
683
|
+
description: cap.description,
|
|
684
|
+
providers: cap.providers,
|
|
685
|
+
defaultProvider: cap.defaultProvider,
|
|
686
|
+
}))
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
/**
|
|
690
|
+
* Get capabilities by category
|
|
691
|
+
*/
|
|
692
|
+
export function getCapabilitiesByCategory() {
|
|
693
|
+
const categories = {}
|
|
694
|
+
for (const [id, cap] of Object.entries(CAPABILITIES)) {
|
|
695
|
+
const category = id.split('.')[0]
|
|
696
|
+
if (!categories[category]) categories[category] = []
|
|
697
|
+
categories[category].push({ id, ...cap })
|
|
698
|
+
}
|
|
699
|
+
return categories
|
|
700
|
+
}
|