@muxoai/platform 1.4.3 → 1.4.5

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.
@@ -0,0 +1,840 @@
1
+ import { ENTERPRISE_TOOLKITS_CATALOG, STRIPE_PROJECTS_DEPLOYABLE_CATALOG, isStripeProjectsExclusiveProvider, resolveStripeProjectsCanonicalToolSlug, } from "./composio-catalog.js";
2
+ import { MUXO_VERSION } from "./version.js";
3
+ const PROVIDER_SKILL_OVERRIDES = {
4
+ github: {
5
+ recommendedTools: [
6
+ "app.github.list_repos",
7
+ "app.github.create_issue",
8
+ "app.github.create_pull_request",
9
+ ],
10
+ workflowSteps: [
11
+ "Verify GitHub OAuth connection via `connection_status({ provider: \"github\" })`; if missing, call `start_connection({ provider: \"github\" })` and `wait_for_connection({ provider: \"github\" })`.",
12
+ "Inspect exact parameter schemas with `inspect_tool({ slug: \"app.github.create_issue\" })` or `search_tools({ query: \"github\" })`.",
13
+ "For mutating operations (creating issues, PRs, releases, or branch updates), call `plan_action` first and execute via `execute_write` with a stable `idempotency_key`.",
14
+ ],
15
+ pitfalls: [
16
+ "Always pass `owner` and `repo` as separate fields (never combined `owner/repo`) when calling `app.github.*` tools.",
17
+ "Check repository visibility and branch protection before attempting direct branch or pull request mutations.",
18
+ "Paginate repository and issue listings using `per_page` and `page` when auditing large organizations.",
19
+ ],
20
+ },
21
+ gmail: {
22
+ recommendedTools: [
23
+ "app.gmail.fetch_emails",
24
+ "app.gmail.send_email",
25
+ "app.gmail.create_email_draft",
26
+ ],
27
+ workflowSteps: [
28
+ "Check Gmail connection with `connection_status({ provider: \"gmail\" })`; if not active, run `start_connection({ provider: \"gmail\" })` and `wait_for_connection({ provider: \"gmail\" })`.",
29
+ "Use `execute_read` with `app.gmail.fetch_emails` and a scoped Gmail query (e.g., `is:inbox newer_than:7d`) before drafting or replying.",
30
+ "For outbound email (`app.gmail.send_email`), create a governed plan via `plan_action` so Cedar/OPA recipient domain guardrails and DLP checks run before `execute_write`.",
31
+ ],
32
+ pitfalls: [
33
+ "Prefer `app.gmail.create_email_draft` when human review is desired before external customer communication.",
34
+ "Always verify `recipient_email` against workspace parameter policy rules (`not_ends_with` / allowed domains) before sending.",
35
+ "Never resend a failed `app.gmail.send_email` call without the original `idempotency_key`.",
36
+ ],
37
+ },
38
+ slack: {
39
+ recommendedTools: [
40
+ "app.slack.list_channels",
41
+ "app.slack.send_message",
42
+ ],
43
+ workflowSteps: [
44
+ "Confirm Slack OAuth status via `connection_status({ provider: \"slack\" })`.",
45
+ "Resolve channel names to Slack channel IDs (`C0...`) using `execute_read({ tool_slug: \"app.slack.list_channels\", input: {} })`.",
46
+ "Plan and send formatted Slack messages using `plan_action` + `execute_write({ tool_slug: \"app.slack.send_message\", ... })`.",
47
+ ],
48
+ pitfalls: [
49
+ "Pass canonical Slack channel IDs (e.g. `C01234567`) rather than `#channel-name` strings whenever possible.",
50
+ "When replying in a thread, pass `thread_ts` explicitly to avoid noisy top-level channel broadcasts.",
51
+ ],
52
+ },
53
+ notion: {
54
+ recommendedTools: [
55
+ "app.notion.search",
56
+ "app.notion.create_page",
57
+ ],
58
+ workflowSteps: [
59
+ "Authenticate Notion via `start_connection({ provider: \"notion\" })` + `wait_for_connection({ provider: \"notion\" })`.",
60
+ "Search existing pages or databases first with `execute_read({ tool_slug: \"app.notion.search\", input: { query: \"...\" } })` to obtain parent UUIDs.",
61
+ "Create or update Notion pages via `plan_action` and `execute_write`.",
62
+ ],
63
+ pitfalls: [
64
+ "Notion page creation requires a valid parent `page_id` or `database_id` shared with the integration during OAuth authorization.",
65
+ "Strip hyphens or preserve canonical 36-char UUIDs consistently when referencing Notion parent objects.",
66
+ ],
67
+ },
68
+ linear: {
69
+ recommendedTools: [
70
+ "app.linear.list_issues",
71
+ "app.linear.create_issue",
72
+ ],
73
+ workflowSteps: [
74
+ "Verify Linear connection with `connection_status({ provider: \"linear\" })`.",
75
+ "List existing issues via `execute_read({ tool_slug: \"app.linear.list_issues\", input: {} })` to discover valid `team_id` and state identifiers.",
76
+ "Create or update Linear issues via `plan_action` and `execute_write`.",
77
+ ],
78
+ pitfalls: [
79
+ "Linear `create_issue` requires a valid UUID `team_id` (not the short team key like `ENG`); resolve it from `app.linear.list_issues` or workspace memory first.",
80
+ "Priority values in Linear are integers (`0` = No priority, `1` = Urgent, `2` = High, `3` = Medium, `4` = Low).",
81
+ ],
82
+ },
83
+ jira: {
84
+ recommendedTools: [
85
+ "app.jira.search_issues",
86
+ "app.jira.create_issue",
87
+ ],
88
+ workflowSteps: [
89
+ "Ensure Jira connection is active via `connection_status({ provider: \"jira\" })`.",
90
+ "Run JQL queries via `execute_read({ tool_slug: \"app.jira.search_issues\", input: { jql: \"project = ENG ORDER BY created DESC\" } })`.",
91
+ "Create or transition issues using `plan_action` + `execute_write`.",
92
+ ],
93
+ pitfalls: [
94
+ "`project_key` (e.g., `ENG`) and `issue_type` (e.g., `Task`, `Bug`) are case-sensitive in Jira Cloud.",
95
+ "Always bound JQL queries with a project filter or `max_results` to avoid large payload truncation.",
96
+ ],
97
+ },
98
+ hubspot: {
99
+ recommendedTools: [
100
+ "app.hubspot.search_contacts",
101
+ "app.hubspot.create_contact",
102
+ "app.hubspot.create_deal",
103
+ ],
104
+ workflowSteps: [
105
+ "Verify HubSpot OAuth status via `connection_status({ provider: \"hubspot\" })`.",
106
+ "Deduplicate contacts first using `execute_read({ tool_slug: \"app.hubspot.search_contacts\", input: { query: \"email@domain.com\" } })`.",
107
+ "Create or update CRM contacts and deals via `plan_action` and `execute_write`.",
108
+ ],
109
+ pitfalls: [
110
+ "Always search by email before calling `app.hubspot.create_contact` to prevent 409 Conflict errors on existing contacts.",
111
+ "Deal `amount` values should be passed as numeric strings without currency symbols.",
112
+ ],
113
+ },
114
+ salesforce: {
115
+ recommendedTools: [
116
+ "app.salesforce.query_soql",
117
+ "app.salesforce.create_lead",
118
+ "app.salesforce.update_opportunity",
119
+ ],
120
+ workflowSteps: [
121
+ "Confirm Salesforce OAuth connection via `connection_status({ provider: \"salesforce\" })`.",
122
+ "Run bounded SOQL queries with `execute_read` before mutating Leads, Contacts, or Opportunities.",
123
+ "Use `plan_action` + `execute_write` with an `idempotency_key` for all CRM record writes.",
124
+ ],
125
+ pitfalls: [
126
+ "Always include a `LIMIT` clause in SOQL queries (`SELECT Id, Name FROM Account LIMIT 50`).",
127
+ "Salesforce `Lead` creation requires `LastName` and `Company` as mandatory fields.",
128
+ ],
129
+ },
130
+ shopify: {
131
+ recommendedTools: [
132
+ "app.shopify.list_orders",
133
+ "app.shopify.get_order",
134
+ "app.shopify.create_Order_refund",
135
+ ],
136
+ workflowSteps: [
137
+ "Check Shopify connection via `connection_status({ provider: \"shopify\" })`.",
138
+ "Inspect order line items and fulfillment status via `execute_read` before planning any order update or refund.",
139
+ "Route refunds or financial adjustments through `plan_action` and `execute_financial`.",
140
+ ],
141
+ pitfalls: [
142
+ "Verify currency and remaining refundable amount on the order before planning a refund.",
143
+ "Financial mutations in Shopify trigger Muxo's `financial` risk ring and require explicit policy clearance or human approval.",
144
+ ],
145
+ },
146
+ metaads: {
147
+ recommendedTools: [
148
+ "app.metaads.get_insights",
149
+ "app.metaads.list_campaigns",
150
+ "app.metaads.update_campaign_budget",
151
+ ],
152
+ workflowSteps: [
153
+ "Verify Meta Ads OAuth connection with `connection_status({ provider: \"metaads\" })`.",
154
+ "Pull campaign ROAS, CPA, and spend metrics via `execute_read` before proposing budget or status changes.",
155
+ "Plan campaign budget updates via `plan_action` so spend caps and Cedar/OPA parameter policies are evaluated before `execute_write`.",
156
+ ],
157
+ pitfalls: [
158
+ "Meta Ads `ad_account_id` must include the `act_` prefix (e.g., `act_123456789`).",
159
+ "Meta Ads budgets (`daily_budget`, `lifetime_budget`) are specified in minor currency units (cents) on upstream endpoints.",
160
+ ],
161
+ },
162
+ googleads: {
163
+ recommendedTools: [
164
+ "app.googleads.list_campaigns",
165
+ "app.googleads.get_campaign_metrics",
166
+ "app.googleads.update_campaign_budget",
167
+ ],
168
+ workflowSteps: [
169
+ "Confirm Google Ads OAuth status via `connection_status({ provider: \"googleads\" })`.",
170
+ "Fetch campaign performance metrics via `execute_read` before adjusting budgets or bidding targets.",
171
+ "Execute budget changes through `plan_action` + `execute_write`.",
172
+ ],
173
+ pitfalls: [
174
+ "Format Google Ads `customer_id` as a 10-digit string without hyphens (`1234567890`).",
175
+ "Google Ads currency amounts in GAQL/mutations use micros (`1,000,000` micros = `$1.00`).",
176
+ ],
177
+ },
178
+ stripe: {
179
+ recommendedTools: [
180
+ "app.stripe.list_customers",
181
+ "app.stripe.create_invoice",
182
+ "app.stripe.create_payment_link",
183
+ ],
184
+ workflowSteps: [
185
+ "Verify Stripe connected app status via `connection_status({ provider: \"stripe\" })`.",
186
+ "Look up existing Stripe customers by email via `execute_read` before creating invoices or payment links.",
187
+ "Plan financial operations with `plan_action` and execute via `execute_financial`.",
188
+ ],
189
+ pitfalls: [
190
+ "Stripe amounts are always in integer minor units (e.g., `2500` for `$25.00 USD`).",
191
+ "Always supply a deterministic `idempotency_key` on `execute_financial` to guarantee zero duplicate charges.",
192
+ ],
193
+ },
194
+ google_analytics: {
195
+ recommendedTools: [
196
+ "app.google_analytics.run_report",
197
+ "app.google_analytics.get_metadata",
198
+ "app.google_analytics.list_accounts",
199
+ ],
200
+ workflowSteps: [
201
+ "Verify Google Analytics (GA4) OAuth connection via `connection_status({ provider: \"google_analytics\" })`.",
202
+ "Discover available properties and custom dimensions via `execute_read` (`app.google_analytics.list_accounts` / `app.google_analytics.get_metadata`).",
203
+ "Run bounded GA4 reports via `execute_read({ tool_slug: \"app.google_analytics.run_report\", input: { property: \"properties/123456\", dateRanges: [{ startDate: \"7daysAgo\", endDate: \"today\" }] } })`.",
204
+ ],
205
+ pitfalls: [
206
+ "GA4 `property` parameter must include the `properties/` prefix (e.g., `properties/123456789`).",
207
+ "Verify custom dimension/metric API names with `get_metadata` before including them in `run_report`.",
208
+ ],
209
+ },
210
+ discord: {
211
+ recommendedTools: [
212
+ "app.discord.list_channels",
213
+ "app.discord.send_message",
214
+ "app.discord.create_thread",
215
+ ],
216
+ workflowSteps: [
217
+ "Check Discord connection via `connection_status({ provider: \"discord\" })`.",
218
+ "Resolve guild and channel snowflake IDs with `execute_read` before posting messages.",
219
+ "Plan and execute channel messages or threads via `plan_action` + `execute_write`.",
220
+ ],
221
+ pitfalls: [
222
+ "Discord `channel_id` and `guild_id` must be 64-bit snowflake strings, not human channel names.",
223
+ "Keep message `content` under 2,000 characters or use `embeds` for longer structured reports.",
224
+ ],
225
+ },
226
+ airtable: {
227
+ recommendedTools: [
228
+ "app.airtable.list_records",
229
+ "app.airtable.create_records",
230
+ "app.airtable.update_record",
231
+ ],
232
+ workflowSteps: [
233
+ "Verify Airtable OAuth status via `connection_status({ provider: \"airtable\" })`.",
234
+ "Inspect existing base records and field names with `execute_read` (`app.airtable.list_records`).",
235
+ "Create or update records via `plan_action` + `execute_write` with exact case-sensitive field names.",
236
+ ],
237
+ pitfalls: [
238
+ "Airtable `baseId` starts with `app...`, `tableIdOrName` starts with `tbl...` (or exact table name), and `recordId` starts with `rec...`.",
239
+ "Batch record writes in Airtable accept at most 10 records per request.",
240
+ ],
241
+ },
242
+ figma: {
243
+ recommendedTools: [
244
+ "app.figma.get_file",
245
+ "app.figma.get_comments",
246
+ "app.figma.post_comment",
247
+ ],
248
+ workflowSteps: [
249
+ "Confirm Figma OAuth connection via `connection_status({ provider: \"figma\" })`.",
250
+ "Fetch file node trees or design tokens via `execute_read` (`app.figma.get_file`).",
251
+ "Post design review comments through `plan_action` + `execute_write`.",
252
+ ],
253
+ pitfalls: [
254
+ "Extract `file_key` from the Figma URL segment `/design/<file_key>/...` or `/file/<file_key>/...`.",
255
+ "Pass `depth: 2` when inspecting large Figma files to avoid oversized node payloads.",
256
+ ],
257
+ },
258
+ zendesk: {
259
+ recommendedTools: [
260
+ "app.zendesk.list_tickets",
261
+ "app.zendesk.get_ticket",
262
+ "app.zendesk.reply_ticket",
263
+ ],
264
+ workflowSteps: [
265
+ "Verify Zendesk connection via `connection_status({ provider: \"zendesk\" })`.",
266
+ "Read ticket history and requester details via `execute_read` (`app.zendesk.get_ticket`).",
267
+ "Plan public replies or internal notes with `plan_action` and execute via `execute_write`.",
268
+ ],
269
+ pitfalls: [
270
+ "Explicitly set `public: false` on `comment` when posting internal agent notes so drafts are not emailed to customers.",
271
+ "Always verify ticket `status` (`new`, `open`, `pending`, `solved`) before mutating.",
272
+ ],
273
+ },
274
+ asana: {
275
+ recommendedTools: [
276
+ "app.asana.list_tasks",
277
+ "app.asana.create_task",
278
+ "app.asana.update_task",
279
+ ],
280
+ workflowSteps: [
281
+ "Check Asana OAuth connection with `connection_status({ provider: \"asana\" })`.",
282
+ "Resolve `workspace` and `projects` GIDs via `execute_read` before creating tasks.",
283
+ "Use `plan_action` + `execute_write` with an `idempotency_key` for task creation and status updates.",
284
+ ],
285
+ pitfalls: [
286
+ "Asana `workspace`, `projects`, and `assignee` fields require string GIDs, not display names.",
287
+ "Date fields (`due_on`) must be formatted as `YYYY-MM-DD`.",
288
+ ],
289
+ },
290
+ posthog: {
291
+ recommendedTools: [
292
+ "app.posthog.list_projects",
293
+ "app.posthog.query_insights",
294
+ "app.posthog.list_feature_flags",
295
+ ],
296
+ workflowSteps: [
297
+ "Confirm PostHog connection via `connection_status({ provider: \"posthog\" })`.",
298
+ "Resolve `project_id` with `execute_read` (`app.posthog.list_projects`) before querying HogQL insights or feature flags.",
299
+ "Route any feature flag rollout changes through `plan_action` + `execute_write`.",
300
+ ],
301
+ pitfalls: [
302
+ "Always bound HogQL queries with a date range and `LIMIT` clause.",
303
+ "Feature flag percentage rollouts affect live production traffic and should require human approval.",
304
+ ],
305
+ },
306
+ sentry: {
307
+ recommendedTools: [
308
+ "app.sentry.list_issues",
309
+ "app.sentry.get_issue_events",
310
+ "app.sentry.update_issue",
311
+ ],
312
+ workflowSteps: [
313
+ "Verify Sentry OAuth connection via `connection_status({ provider: \"sentry\" })`.",
314
+ "Fetch unresolved issues and stacktraces via `execute_read` (`app.sentry.list_issues`).",
315
+ "Resolve or assign issues via `plan_action` + `execute_write`.",
316
+ ],
317
+ pitfalls: [
318
+ "Sentry `organization_slug` and `project_slug` are URL slugs, whereas `issue_id` is a numeric string.",
319
+ ],
320
+ },
321
+ };
322
+ const CURATED_WORKFLOW_SKILLS = [
323
+ {
324
+ slug: "changelog-generator",
325
+ name: "changelog-generator",
326
+ title: "Muxo Governed Changelog & Release Notes Generator",
327
+ description: "Generate customer-facing changelogs and release readiness briefs from GitHub commits/PRs, Linear/Jira issues, and publish to Notion or Slack under Muxo governance.",
328
+ category: "workflow",
329
+ lane: "hybrid",
330
+ providerSlug: "github",
331
+ providerName: "GitHub + Linear + Notion + Slack",
332
+ requiresMcp: ["muxo"],
333
+ mcpServerUrl: "https://api.muxo.ai/mcp",
334
+ recommendedTools: [
335
+ "app.github.list_repos",
336
+ "app.linear.list_issues",
337
+ "instant.composio.workbench",
338
+ "app.notion.create_page",
339
+ "app.slack.send_message",
340
+ ],
341
+ workflowSteps: [
342
+ "Check active connections for `github`, `linear`, `notion`, and `slack` via `connection_status`.",
343
+ "Fetch recent merged pull requests and closed issues using `execute_read` (`app.github.list_repos`, `app.linear.list_issues`).",
344
+ "Synthesize and categorize changes (Features, Fixes, Security, Breaking Changes) in `instant.composio.workbench`.",
345
+ "Create a governed plan (`plan_action`) and publish the release notes to Notion (`app.notion.create_page`) or Slack (`app.slack.send_message`) via `execute_write`.",
346
+ ],
347
+ pitfalls: [
348
+ "Filter out internal chore commits and redact internal ticket URLs or secret identifiers before publishing externally.",
349
+ "Always preview the formatted Markdown changelog via `plan_action` before posting to public or announcement channels.",
350
+ ],
351
+ sourceRepo: "ComposioHQ/awesome-claude-skills (transpiled for Muxo Governed MCP)",
352
+ },
353
+ {
354
+ slug: "lead-research-assistant",
355
+ name: "lead-research-assistant",
356
+ title: "Muxo Governed Lead Research & CRM Enrichment Assistant",
357
+ description: "Research target accounts and leads using zero-OAuth Muxo Instant Web Search & Scraper, enrich company intelligence, and sync qualified leads into HubSpot or Salesforce.",
358
+ category: "workflow",
359
+ lane: "hybrid",
360
+ providerSlug: "hubspot",
361
+ providerName: "Muxo Instant Web + HubSpot / Salesforce",
362
+ requiresMcp: ["muxo"],
363
+ mcpServerUrl: "https://api.muxo.ai/mcp",
364
+ recommendedTools: [
365
+ "instant.web.search",
366
+ "instant.web.scrape",
367
+ "instant.composio.workbench",
368
+ "app.hubspot.search_contacts",
369
+ "app.hubspot.create_contact",
370
+ ],
371
+ workflowSteps: [
372
+ "Use `execute_read` with `instant.web.search` and `instant.web.scrape` (zero OAuth required) to gather verified company, funding, and role signals.",
373
+ "Score and normalize the lead profile using `instant.composio.workbench`.",
374
+ "Check existing CRM records via `execute_read({ tool_slug: \"app.hubspot.search_contacts\", ... })` to avoid duplicate entries.",
375
+ "Plan and write the enriched contact or deal via `plan_action` + `execute_write`.",
376
+ ],
377
+ pitfalls: [
378
+ "Always deduplicate by email domain and contact email in HubSpot/Salesforce before creating a new contact.",
379
+ "Do not store unverified scraped PII without attributing the public source URL in the CRM note.",
380
+ ],
381
+ sourceRepo: "ComposioHQ/awesome-claude-skills (transpiled for Muxo Governed MCP)",
382
+ },
383
+ {
384
+ slug: "meeting-insights-analyzer",
385
+ name: "meeting-insights-analyzer",
386
+ title: "Muxo Governed Meeting Insights & Action Item Extractor",
387
+ description: "Analyze meeting transcripts and calendar threads, extract owner-assigned action items, file follow-up tasks in Linear/Jira, and post structured recaps to Slack or Notion.",
388
+ category: "workflow",
389
+ lane: "hybrid",
390
+ providerSlug: "slack",
391
+ providerName: "Google Calendar + Linear + Notion + Slack",
392
+ requiresMcp: ["muxo"],
393
+ mcpServerUrl: "https://api.muxo.ai/mcp",
394
+ recommendedTools: [
395
+ "app.googlecalendar.list_events",
396
+ "instant.composio.workbench",
397
+ "app.linear.create_issue",
398
+ "app.notion.create_page",
399
+ "app.slack.send_message",
400
+ ],
401
+ workflowSteps: [
402
+ "Retrieve meeting context and attendees via `execute_read` (`app.googlecalendar.list_events` or `app.notion.search`).",
403
+ "Extract structured decisions, risks, and owner-assigned action items in `instant.composio.workbench`.",
404
+ "Create follow-up tickets (`app.linear.create_issue`) and share the recap (`app.slack.send_message` / `app.notion.create_page`) via `plan_action` + `execute_write`.",
405
+ ],
406
+ pitfalls: [
407
+ "Resolve attendee names to canonical workspace user/team IDs before creating Linear or Jira issues.",
408
+ "Batch ticket creation carefully and include a deterministic `idempotency_key` per action item.",
409
+ ],
410
+ sourceRepo: "ComposioHQ/awesome-claude-skills (transpiled for Muxo Governed MCP)",
411
+ },
412
+ {
413
+ slug: "invoice-organizer",
414
+ name: "invoice-organizer",
415
+ title: "Muxo Governed Invoice & Financial Reconciliation Organizer",
416
+ description: "Extract invoice details from Gmail threads, reconcile against Stripe customers/invoices, and archive structured financial records with cryptographic Muxo receipts.",
417
+ category: "workflow",
418
+ lane: "hybrid",
419
+ providerSlug: "stripe",
420
+ providerName: "Gmail + Stripe + Notion",
421
+ requiresMcp: ["muxo"],
422
+ mcpServerUrl: "https://api.muxo.ai/mcp",
423
+ recommendedTools: [
424
+ "app.gmail.fetch_emails",
425
+ "app.stripe.list_customers",
426
+ "app.stripe.create_invoice",
427
+ "instant.composio.workbench",
428
+ ],
429
+ workflowSteps: [
430
+ "Search billing emails via `execute_read({ tool_slug: \"app.gmail.fetch_emails\", input: { query: \"invoice OR receipt newer_than:30d\" } })`.",
431
+ "Normalize vendor, amount, currency, and due date in `instant.composio.workbench`.",
432
+ "Reconcile against Stripe records (`app.stripe.list_customers`) and route any invoice creation through `plan_action` + `execute_financial`.",
433
+ "Verify the HMAC-SHA256 + Ed25519 execution receipt via `get_receipt`.",
434
+ ],
435
+ pitfalls: [
436
+ "Always verify currency minor units (cents) and tax line items before calling `execute_financial`.",
437
+ "Use `reconcile_run` (`get_run_context({ action: \"reconcile_run\" })`) after financial runs to confirm zero drift.",
438
+ ],
439
+ sourceRepo: "ComposioHQ/awesome-claude-skills (transpiled for Muxo Governed MCP)",
440
+ },
441
+ {
442
+ slug: "competitive-ads-extractor",
443
+ name: "competitive-ads-extractor",
444
+ title: "Muxo Governed Competitive Ads & Growth Intelligence Extractor",
445
+ description: "Extract competitor landing pages, ad positioning, and SEO signals using Muxo Instant Web Search & Scraper, compare against Meta Ads / Google Ads performance, and publish a growth brief.",
446
+ category: "workflow",
447
+ lane: "hybrid",
448
+ providerSlug: "metaads",
449
+ providerName: "Muxo Instant Web + Meta Ads + Google Ads",
450
+ requiresMcp: ["muxo"],
451
+ mcpServerUrl: "https://api.muxo.ai/mcp",
452
+ recommendedTools: [
453
+ "instant.web.search",
454
+ "instant.web.scrape",
455
+ "instant.seo.audit",
456
+ "app.metaads.get_insights",
457
+ "instant.composio.workbench",
458
+ ],
459
+ workflowSteps: [
460
+ "Run `execute_read` with `instant.web.search`, `instant.web.scrape`, and `instant.seo.audit` against competitor domains.",
461
+ "Synthesize messaging hooks, CTAs, and keyword gaps in `instant.composio.workbench`.",
462
+ "Optionally join with live `app.metaads.get_insights` or `app.googleads.get_campaign_metrics` and publish the growth brief to Notion or Slack.",
463
+ ],
464
+ pitfalls: [
465
+ "Respect public page rate limits and cap `maxChars` on `instant.web.scrape` to keep context windows lean.",
466
+ "Never auto-increase ad campaign budgets without an explicit `plan_action` approval preview.",
467
+ ],
468
+ sourceRepo: "ComposioHQ/awesome-claude-skills (transpiled for Muxo Governed MCP)",
469
+ },
470
+ {
471
+ slug: "security-audit",
472
+ name: "security-audit",
473
+ title: "Muxo Governed Cloud, Endpoint & Workspace Security Audit",
474
+ description: "Audit HTTP security headers, TLS/CORS posture, workspace Cedar/OPA policies, and active OAuth connections with signed Muxo receipts.",
475
+ category: "workflow",
476
+ lane: "hybrid",
477
+ providerSlug: "security",
478
+ providerName: "Muxo Security + Cedar/OPA Governance",
479
+ requiresMcp: ["muxo"],
480
+ mcpServerUrl: "https://api.muxo.ai/mcp",
481
+ recommendedTools: [
482
+ "instant.security.headers_audit",
483
+ "get_organization",
484
+ "get_run_context",
485
+ "instant.composio.workbench",
486
+ ],
487
+ workflowSteps: [
488
+ "Audit public web endpoints using `execute_read({ tool_slug: \"instant.security.headers_audit\", input: { url: \"https://...\" } })`.",
489
+ "Inspect workspace Cedar/OPA guardrails and compiled policies via `get_organization({ action: \"export_cedar_opa\" })`.",
490
+ "Review recent blocked or high-risk runs via `get_run_context({ action: \"otel_traces\" })` and generate a remediation report.",
491
+ ],
492
+ pitfalls: [
493
+ "Never log or output raw BYOK keys or vault credentials when summarizing security findings.",
494
+ "Use `get_organization({ action: \"simulate_policy\" })` to test stricter guardrails before applying policy updates.",
495
+ ],
496
+ sourceRepo: "ComposioHQ/awesome-claude-skills (transpiled for Muxo Governed MCP)",
497
+ },
498
+ ];
499
+ export function transpileAwesomeClaudeSkillToMuxo(rawMarkdown, baseUrl = "https://api.muxo.ai") {
500
+ const cleanBase = baseUrl.replace(/\/+$/, "");
501
+ let out = rawMarkdown;
502
+ // Rewrite frontmatter MCP server requirement from rube/composio to muxo
503
+ out = out.replace(/requires:\s*\n\s*mcp:\s*\n\s*-\s*(?:rube|composio)/gi, "requires:\n mcp:\n - muxo");
504
+ out = out.replace(/https?:\/\/rube\.app\/mcp\/?/gi, `${cleanBase}/mcp`);
505
+ out = out.replace(/https?:\/\/connect\.composio\.dev\/mcp\/?/gi, `${cleanBase}/mcp`);
506
+ // Rewrite Rube / Composio meta-tools to Muxo governed 18-tool contract
507
+ const replacements = [
508
+ [/\bRUBE_SEARCH_TOOLS\b/g, "search_tools"],
509
+ [/\bCOMPOSIO_SEARCH_TOOLS\b/g, "search_tools"],
510
+ [/\bRUBE_GET_TOOL_SCHEMAS\b/g, "inspect_tool"],
511
+ [/\bCOMPOSIO_GET_TOOL_SCHEMAS\b/g, "inspect_tool"],
512
+ [
513
+ /\bRUBE_MANAGE_CONNECTIONS\b/g,
514
+ "start_connection + wait_for_connection",
515
+ ],
516
+ [
517
+ /\bCOMPOSIO_MANAGE_CONNECTIONS\b/g,
518
+ "start_connection + wait_for_connection",
519
+ ],
520
+ [/\bRUBE_MULTI_EXECUTE_TOOL\b/g, "plan_action + execute_write (or execute_read)"],
521
+ [
522
+ /\bCOMPOSIO_MULTI_EXECUTE_TOOL\b/g,
523
+ "plan_action + execute_write (or execute_read)",
524
+ ],
525
+ [/\bRUBE_REMOTE_WORKBENCH\b/g, "instant.composio.workbench"],
526
+ [/\bCOMPOSIO_REMOTE_WORKBENCH\b/g, "instant.composio.workbench"],
527
+ [/\bRube MCP\b/gi, "Muxo Governed MCP"],
528
+ ];
529
+ for (const [pattern, replacement] of replacements) {
530
+ out = out.replace(pattern, replacement);
531
+ }
532
+ return out;
533
+ }
534
+ function buildCatalogSkills(baseUrl = "https://api.muxo.ai") {
535
+ const cleanBase = baseUrl.replace(/\/+$/, "");
536
+ const mcpServerUrl = `${cleanBase}/mcp`;
537
+ const skills = [];
538
+ const seenSlugs = new Set();
539
+ const addSkill = (skill) => {
540
+ if (seenSlugs.has(skill.slug))
541
+ return;
542
+ seenSlugs.add(skill.slug);
543
+ skills.push(skill);
544
+ };
545
+ // 1. Curated workflow skills first
546
+ for (const wf of CURATED_WORKFLOW_SKILLS) {
547
+ addSkill({
548
+ ...wf,
549
+ mcpServerUrl,
550
+ });
551
+ }
552
+ // 2. Stripe Projects Cloud Infrastructure skills (Zero-OAuth enforced)
553
+ for (const item of STRIPE_PROJECTS_DEPLOYABLE_CATALOG) {
554
+ const prov = item.providerSlug.toLowerCase();
555
+ const canonicalSlug = resolveStripeProjectsCanonicalToolSlug(prov) || item.slug;
556
+ const provisioningSlug = `${prov}-provisioning`;
557
+ const definition = {
558
+ slug: provisioningSlug,
559
+ name: provisioningSlug,
560
+ title: `${item.providerName} Zero-OAuth Cloud Provisioning (${canonicalSlug})`,
561
+ description: `Provision and manage ${item.providerName} (${item.name}) directly through Muxo Stripe Projects (${canonicalSlug}) with zero OAuth handoff and automatic AES-256-GCM vault credential storage.`,
562
+ category: "cloud_infrastructure",
563
+ lane: "stripe_projects",
564
+ providerSlug: prov,
565
+ providerName: item.providerName,
566
+ requiresMcp: ["muxo"],
567
+ mcpServerUrl,
568
+ recommendedTools: [
569
+ canonicalSlug,
570
+ "get_run_context",
571
+ "execute_provisioning",
572
+ ],
573
+ workflowSteps: [
574
+ `Do NOT call \`start_connection\` or \`wait_for_connection\` for ${item.providerName} — ${item.providerName} is a Stripe Projects cloud infrastructure provider with zero OAuth required.`,
575
+ `Inspect the provisioning schema via \`inspect_tool({ slug: "${canonicalSlug}" })\`.`,
576
+ `Create a governed provisioning plan via \`plan_action({ tool_slug: "${canonicalSlug}", input: { resource_name: "prod-${prov}", plan: "${item.defaultPlan}" } })\`.`,
577
+ `Execute via \`execute_provisioning({ tool_slug: "${canonicalSlug}", plan_id: "<plan_id>", idempotency_key: "prov-${prov}-01" })\` — credentials are automatically encrypted into the workspace AES-256-GCM vault.`,
578
+ ],
579
+ pitfalls: [
580
+ `CRITICAL: Never route ${item.providerName} infrastructure requests through \`app.${prov}.*\` or OAuth handoff; always use \`${canonicalSlug}\` on the \`stripe_projects\` lane.`,
581
+ "Retrieve connection strings or API keys safely via `get_run_context({ action: \"vault\" })` rather than hardcoding secrets in prompts.",
582
+ ],
583
+ stripeProjectsOverride: {
584
+ enforced: true,
585
+ canonicalToolSlug: canonicalSlug,
586
+ reason: `${item.providerName} is provisioned natively via Stripe Projects (${item.upstreamSlug}) with zero OAuth handoff.`,
587
+ },
588
+ sourceRepo: "ComposioHQ/awesome-claude-skills + Muxo Stripe Projects Catalog",
589
+ };
590
+ addSkill(definition);
591
+ // Also register `<provider>-automation` alias for cloud providers that appear in awesome-claude-skills (e.g. supabase-automation, vercel-automation, cloudflare-automation, render-automation)
592
+ const automationAliasSlug = `${prov}-automation`;
593
+ if (isStripeProjectsExclusiveProvider(prov) ||
594
+ ["supabase", "vercel", "cloudflare", "turso", "neon", "upstash", "render", "netlify", "herenow"].includes(prov)) {
595
+ addSkill({
596
+ ...definition,
597
+ slug: automationAliasSlug,
598
+ name: automationAliasSlug,
599
+ title: `${item.providerName} Automation & Zero-OAuth Provisioning`,
600
+ });
601
+ }
602
+ }
603
+ // 3. Enterprise Connected App Automation skills (`<provider>-automation`)
604
+ for (const tk of ENTERPRISE_TOOLKITS_CATALOG) {
605
+ const prov = tk.slug.toLowerCase();
606
+ if (isStripeProjectsExclusiveProvider(prov)) {
607
+ continue;
608
+ }
609
+ const slug = `${prov}-automation`;
610
+ if (seenSlugs.has(slug))
611
+ continue;
612
+ const override = PROVIDER_SKILL_OVERRIDES[prov];
613
+ const sampleTools = override?.recommendedTools ||
614
+ (tk.sampleActions.length > 0
615
+ ? tk.sampleActions.map((act) => act.muxoSlug || `app.${prov}.${act.upstreamSlug.toLowerCase().replace(new RegExp(`^${prov}_`), "")}`)
616
+ : [`app.${prov}.list`, `app.${prov}.get`, `app.${prov}.create`]);
617
+ const workflowSteps = override?.workflowSteps || [
618
+ `Check active OAuth status via \`connection_status({ provider: "${prov}" })\`; if not connected, call \`start_connection({ provider: "${prov}" })\` and \`wait_for_connection({ provider: "${prov}" })\`.`,
619
+ `Discover and inspect ${tk.name} tools with \`search_tools({ query: "${prov}" })\` and \`inspect_tool({ slug: "${sampleTools[0]}" })\`.`,
620
+ `Execute read-only queries directly with \`execute_read\`; for any write, admin, financial, or destructive action, call \`plan_action\` first and then \`execute_<risk>\` with an \`idempotency_key\`.`,
621
+ ];
622
+ const pitfalls = override?.pitfalls || [
623
+ `Always inspect the input schema via \`inspect_tool\` before calling \`${sampleTools[0]}\` to ensure required IDs and pagination cursors match.`,
624
+ `Never bypass \`plan_action\` on mutating ${tk.name} operations — Muxo evaluates Cedar/OPA guardrails and generates an \`ApprovalImpactPreview\` before execution.`,
625
+ `Pass a deterministic \`idempotency_key\` on every write call so network retries never duplicate ${tk.name} records.`,
626
+ ];
627
+ addSkill({
628
+ slug,
629
+ name: slug,
630
+ title: `${tk.name} Governed Automation Skill`,
631
+ description: `${tk.description} Governed by Muxo MCP (${mcpServerUrl}) with OAuth connection management, Cedar/OPA policy checks, and signed execution receipts.`,
632
+ category: "app_automation",
633
+ lane: "composio_sdk",
634
+ providerSlug: prov,
635
+ providerName: tk.name,
636
+ requiresMcp: ["muxo"],
637
+ mcpServerUrl,
638
+ recommendedTools: sampleTools,
639
+ workflowSteps,
640
+ pitfalls,
641
+ sourceRepo: "ComposioHQ/awesome-claude-skills (transpiled for Muxo Governed MCP)",
642
+ });
643
+ }
644
+ // 4. Ensure all curated PROVIDER_SKILL_OVERRIDES are registered even if not in ENTERPRISE_TOOLKITS_CATALOG
645
+ const DISPLAY_NAMES = {
646
+ metaads: "Meta Ads",
647
+ googleads: "Google Ads",
648
+ google_analytics: "Google Analytics (GA4)",
649
+ discord: "Discord",
650
+ airtable: "Airtable",
651
+ figma: "Figma",
652
+ zendesk: "Zendesk",
653
+ asana: "Asana",
654
+ posthog: "PostHog",
655
+ sentry: "Sentry",
656
+ };
657
+ for (const [prov, override] of Object.entries(PROVIDER_SKILL_OVERRIDES)) {
658
+ if (isStripeProjectsExclusiveProvider(prov))
659
+ continue;
660
+ const slug = `${prov}-automation`;
661
+ if (seenSlugs.has(slug))
662
+ continue;
663
+ const displayName = DISPLAY_NAMES[prov] || prov.charAt(0).toUpperCase() + prov.slice(1);
664
+ addSkill({
665
+ slug,
666
+ name: slug,
667
+ title: `${displayName} Governed Automation Skill`,
668
+ description: `Automate ${displayName} workflows through Muxo MCP (${mcpServerUrl}) with managed OAuth connections, Cedar/OPA parameter guardrails, and signed execution receipts.`,
669
+ category: "app_automation",
670
+ lane: "composio_sdk",
671
+ providerSlug: prov,
672
+ providerName: displayName,
673
+ requiresMcp: ["muxo"],
674
+ mcpServerUrl,
675
+ recommendedTools: override.recommendedTools,
676
+ workflowSteps: override.workflowSteps,
677
+ pitfalls: override.pitfalls,
678
+ sourceRepo: "ComposioHQ/awesome-claude-skills (transpiled for Muxo Governed MCP)",
679
+ });
680
+ }
681
+ return skills;
682
+ }
683
+ export function listMuxoSkills(filter, baseUrl = "https://api.muxo.ai") {
684
+ const all = buildCatalogSkills(baseUrl);
685
+ if (!filter)
686
+ return all;
687
+ const cat = filter.category?.trim().toLowerCase();
688
+ const prov = filter.provider?.trim().toLowerCase();
689
+ const q = filter.query?.trim().toLowerCase();
690
+ return all.filter((skill) => {
691
+ if (cat && skill.category.toLowerCase() !== cat)
692
+ return false;
693
+ if (prov && skill.providerSlug.toLowerCase() !== prov)
694
+ return false;
695
+ if (q) {
696
+ const hay = `${skill.slug} ${skill.title} ${skill.description} ${skill.providerName} ${skill.recommendedTools.join(" ")}`.toLowerCase();
697
+ if (!hay.includes(q))
698
+ return false;
699
+ }
700
+ return true;
701
+ });
702
+ }
703
+ export function getMuxoSkill(slug, baseUrl = "https://api.muxo.ai") {
704
+ const clean = String(slug || "")
705
+ .trim()
706
+ .toLowerCase()
707
+ .replace(/\.md$/i, "");
708
+ if (!clean)
709
+ return null;
710
+ const all = buildCatalogSkills(baseUrl);
711
+ return (all.find((s) => s.slug.toLowerCase() === clean) ||
712
+ all.find((s) => s.category !== "workflow" && s.providerSlug.toLowerCase() === clean) ||
713
+ all.find((s) => s.providerSlug.toLowerCase() === clean) ||
714
+ null);
715
+ }
716
+ export function renderMuxoSkillMarkdown(slug, baseUrl = "https://api.muxo.ai") {
717
+ const skill = getMuxoSkill(slug, baseUrl);
718
+ if (!skill)
719
+ return null;
720
+ const cleanBase = baseUrl.replace(/\/+$/, "");
721
+ const overrideBanner = skill.stripeProjectsOverride?.enforced
722
+ ? [
723
+ "",
724
+ "## Zero-OAuth Cloud Infrastructure Rule (Stripe Projects Override)",
725
+ `- **Mandatory Tool**: \`${skill.stripeProjectsOverride.canonicalToolSlug}\` (\`stripe_projects\` lane)`,
726
+ `- **Why**: ${skill.stripeProjectsOverride.reason}`,
727
+ "- **Rule**: Never call `start_connection` or `app.*` OAuth tools for this provider. Provisioning and SQL/deployment run directly via `plan_action` -> `execute_provisioning`.",
728
+ ].join("\n")
729
+ : "";
730
+ const rawMd = `---
731
+ name: ${skill.slug}
732
+ description: "${skill.description.replace(/"/g, '\\"')}"
733
+ requires:
734
+ mcp:
735
+ - muxo
736
+ ---
737
+
738
+ # ${skill.title}
739
+
740
+ ${skill.description}
741
+
742
+ ## Governed MCP Connection
743
+ - **MCP Server**: \`${cleanBase}/mcp\` (Streamable HTTP, \`Bearer mk_live_...\`)
744
+ - **Provider Lane**: \`${skill.lane}\` (\`${skill.providerName}\`)
745
+ - **Skill URI**: \`skill://muxo/${skill.slug}/SKILL.md\` / \`muxo://skills/${skill.slug}\`
746
+ ${overrideBanner}
747
+
748
+ ## Recommended Muxo Tool Slugs
749
+ ${skill.recommendedTools.map((t) => `- \`${t}\``).join("\n")}
750
+
751
+ ## Step-by-Step Governed Execution Plan
752
+ ${skill.workflowSteps.map((step, idx) => `${idx + 1}. ${step}`).join("\n")}
753
+
754
+ ## Known Pitfalls & Parameter Guardrails
755
+ ${skill.pitfalls.map((p) => `- ${p}`).join("\n")}
756
+
757
+ ## Multi-Tool Chaining & Workbench
758
+ - For multi-step data joins, filtering, or payload transformation across tools, invoke \`execute_read({ tool_slug: "instant.composio.workbench", input: { code: "...", thought: "..." } })\`.
759
+ - Every mutating execution returns a signed \`ExecutionReceipt\` with \`businessSummary\` and can be verified or reconciled via \`get_run_context({ action: "reconcile_run", run_id: "<run_id>" })\`.
760
+ `;
761
+ return transpileAwesomeClaudeSkillToMuxo(rawMd, cleanBase);
762
+ }
763
+ const FEATURED_MCP_SKILL_SLUGS = [
764
+ "github-automation",
765
+ "gmail-automation",
766
+ "slack-automation",
767
+ "notion-automation",
768
+ "linear-automation",
769
+ "hubspot-automation",
770
+ "salesforce-automation",
771
+ "shopify-automation",
772
+ "metaads-automation",
773
+ "stripe-automation",
774
+ "supabase-provisioning",
775
+ "vercel-provisioning",
776
+ "turso-provisioning",
777
+ "changelog-generator",
778
+ "lead-research-assistant",
779
+ "security-audit",
780
+ ];
781
+ export function getProviderSkillHint(toolOrProviderSlug, baseUrl = "https://api.muxo.ai") {
782
+ const raw = String(toolOrProviderSlug || "").trim().toLowerCase();
783
+ if (!raw)
784
+ return null;
785
+ const cleanBase = baseUrl.replace(/\/+$/, "");
786
+ let candidateProvider = raw;
787
+ if (raw.startsWith("app.") || raw.startsWith("resource.") || raw.startsWith("instant.")) {
788
+ const parts = raw.split(".");
789
+ if (parts.length >= 2) {
790
+ candidateProvider = parts[1];
791
+ }
792
+ }
793
+ const skill = getMuxoSkill(raw, cleanBase) ||
794
+ getMuxoSkill(`${candidateProvider}-provisioning`, cleanBase) ||
795
+ getMuxoSkill(`${candidateProvider}-automation`, cleanBase) ||
796
+ getMuxoSkill(candidateProvider, cleanBase);
797
+ if (!skill)
798
+ return null;
799
+ return {
800
+ slug: skill.slug,
801
+ title: skill.title,
802
+ category: skill.category,
803
+ lane: skill.lane,
804
+ mcpResourceUri: `muxo://skills/${skill.slug}`,
805
+ skillUrl: `${cleanBase}/skills/${skill.slug}/SKILL.md`,
806
+ recommendedTools: skill.recommendedTools,
807
+ pitfalls: skill.pitfalls,
808
+ ...(skill.stripeProjectsOverride
809
+ ? { stripeProjectsOverride: skill.stripeProjectsOverride }
810
+ : {}),
811
+ };
812
+ }
813
+ export function buildMuxoMcpSkillBundles(baseUrl = "https://api.muxo.ai", options) {
814
+ const skills = options?.includeAll
815
+ ? listMuxoSkills(undefined, baseUrl)
816
+ : FEATURED_MCP_SKILL_SLUGS.map((s) => getMuxoSkill(s, baseUrl)).filter((s) => Boolean(s));
817
+ return skills.map((skill) => {
818
+ const content = renderMuxoSkillMarkdown(skill.slug, baseUrl) || `# ${skill.title}\n`;
819
+ const uri = `skill://muxo/${skill.slug}/SKILL.md`;
820
+ return {
821
+ name: skill.slug,
822
+ description: skill.description,
823
+ version: MUXO_VERSION,
824
+ uri,
825
+ frontmatter: {
826
+ name: skill.slug,
827
+ description: skill.description,
828
+ },
829
+ content,
830
+ files: [
831
+ {
832
+ path: "SKILL.md",
833
+ uri,
834
+ mimeType: "text/markdown",
835
+ content,
836
+ },
837
+ ],
838
+ };
839
+ });
840
+ }