@muxoai/sdk 1.4.4 → 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.
@@ -6,7 +6,7 @@
6
6
  "plugins": [
7
7
  {
8
8
  "name": "muxo",
9
- "version": "1.4.4",
9
+ "version": "1.4.5",
10
10
  "description": "Governed execution across 1,000+ Connected Apps, Instant Tools (search, scrape, crawl, SEO audit), Cloud Infrastructure provisioning, Workspace Memory recall, and cryptographic execution receipts.",
11
11
  "source": {
12
12
  "source": "local",
@@ -8,7 +8,7 @@
8
8
  },
9
9
  "metadata": {
10
10
  "description": "Official Muxo plugin marketplace for governed execution across Connected Apps, Instant Tools, Cloud Infrastructure, and Workspace Memory.",
11
- "version": "1.4.4"
11
+ "version": "1.4.5"
12
12
  },
13
13
  "plugins": [
14
14
  {
@@ -19,7 +19,7 @@
19
19
  },
20
20
  "strict": false,
21
21
  "description": "Governed execution across 1,000+ Connected Apps, Instant Tools (search, scrape, crawl, SEO audit), Cloud Infrastructure provisioning, Workspace Memory recall, and verifiable audit records.",
22
- "version": "1.4.4",
22
+ "version": "1.4.5",
23
23
  "category": "Productivity",
24
24
  "skills": [
25
25
  "./plugins/muxo/skills/muxo",
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  > **Let your AI agents take action across business apps, with approvals, spending controls, and proof of what happened.**
4
4
 
5
- Muxo (`v1.4.4`) is the governed action, workflow automation, cloud provisioning, and business-receipt platform for AI agents and B2B SaaS teams. Before any external write or provisioning action runs, Muxo shows **what changes**, **who is affected**, **the estimated USD cost (`$X.XX` alongside credits or `$0.00` BYOK)**, and **which guardrail triggered approval**. After execution, Muxo issues both a **business-facing receipt** (*what changed, who authorized it, what succeeded, what remains unresolved, and exact USD/credit cost*) and a **cryptographic Ed25519 + SHA-256 audit receipt**.
5
+ Muxo (`v1.4.5`) is the governed action, workflow automation, cloud provisioning, and business-receipt platform for AI agents and B2B SaaS teams. Before any external write or provisioning action runs, Muxo shows **what changes**, **who is affected**, **the estimated USD cost (`$X.XX` alongside credits or `$0.00` BYOK)**, and **which guardrail triggered approval**. After execution, Muxo issues both a **business-facing receipt** (*what changed, who authorized it, what succeeded, what remains unresolved, and exact USD/credit cost*) and a **cryptographic Ed25519 + SHA-256 audit receipt**.
6
6
 
7
7
  Customers and their agents interact exclusively with **Muxo** — either via tested workflow packs, structured tool slugs, or free-form **Natural Language** (`muxo do`, `POST /api/v1/do`, `client.do()`, and MCP `plan_action`).
8
8
 
@@ -121,6 +121,16 @@ Muxo ships a portable OpenAI Plugin (`plugins/muxo/plugin.json` & `plugins/muxo/
121
121
 
122
122
  ## Architecture & Source Layout
123
123
 
124
+ ### Domain skills and workspace gateways
125
+
126
+ Tool inspection and action planning include a `domainSkill` hint when a matching playbook exists. Read its provider pitfalls and required execution lane before planning:
127
+
128
+ - List skills: `GET /api/v1/skills` or MCP `get_run_context({ action: "skills", provider: "github", category: "app_automation" })`.
129
+ - Read a skill: MCP `get_run_context({ action: "get_skill", slug: "github-automation" })`, `muxo://skills/github-automation`, or `GET /skills/github-automation/SKILL.md`.
130
+ - Reconcile an existing run without replaying it: `get_run_context({ action: "reconcile_run", run_id: "<original-run-id>" })`. Reconciliation reports available run and receipt evidence; it does not guarantee an external effect.
131
+
132
+ For Composio BYOK, `POST /api/v1/byok` accepts an optional `mcpGatewayUrl` alongside the privately supplied key. Only HTTPS `connect.composio.dev` and `mcp.composio.dev` URLs without embedded credentials, query parameters, or fragments are accepted. Key rotation preserves the workspace gateway; deleting the Composio key removes it. Configure it in the console's BYOK form or through the API. Skills and gateways never grant OAuth consent, approval, or execution authority.
133
+
124
134
  | File / Directory | Responsibility |
125
135
  | --- | --- |
126
136
  | `ARCHITECTURE.md` | Internal engineering blueprint, Keep/Adopt/Drop ecosystem matrix, and Stripe Projects analysis |
package/dist/cli.js CHANGED
File without changes
@@ -250,6 +250,7 @@ export interface ComposioMcpGatewayResult {
250
250
  data: Record<string, unknown> | null;
251
251
  error?: string;
252
252
  }
253
+ export declare function normalizeComposioByokGatewayUrl(value: string): string;
253
254
  export declare function canUseComposioMcpGatewayForExecution(opts: {
254
255
  apiKey?: string | null;
255
256
  gatewayUrl?: string | null;
@@ -1892,6 +1892,18 @@ export function renderDefaultHostedSiteHtml(params) {
1892
1892
  </body>
1893
1893
  </html>`;
1894
1894
  }
1895
+ export function normalizeComposioByokGatewayUrl(value) {
1896
+ try {
1897
+ const url = new URL(value.trim());
1898
+ if (url.protocol === "https:" &&
1899
+ ["connect.composio.dev", "mcp.composio.dev"].includes(url.hostname) &&
1900
+ !url.port && !url.username && !url.password && !url.search && !url.hash) {
1901
+ return url.href;
1902
+ }
1903
+ }
1904
+ catch { }
1905
+ throw new Error("MCP gateway must be an HTTPS Composio URL without credentials, query parameters, or fragments.");
1906
+ }
1895
1907
  export function canUseComposioMcpGatewayForExecution(opts) {
1896
1908
  const key = String(opts.apiKey || "").trim();
1897
1909
  if (!key)
package/dist/engine.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import type { MuxoConfig } from "./config.js";
2
+ import { type MuxoDomainSkillHint } from "./skills-catalog.js";
2
3
  import { exportTemporalEventHistory, type DurableWorkflow } from "./durable-workflow.js";
3
4
  import { type CommercialPlaybookDefinition, type CommercialRoiReport, type CompiledPolicyAsCodeBundle, type HarnessConfigurationBundle, type OtelTraceExportBundle, type PolicyAsCodeEvaluationResult, type RunReconciliationReport } from "./oss-suite.js";
4
5
  import { type NaturalLanguageResolution } from "./nl.js";
@@ -126,6 +127,7 @@ export declare class MuxoEngine {
126
127
  instructions: string;
127
128
  };
128
129
  humanHandoff?: HumanHandoff;
130
+ domainSkill?: MuxoDomainSkillHint;
129
131
  llmGuidance: LlmGuidance;
130
132
  nextStep: string;
131
133
  }>;
package/dist/engine.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import crypto from "node:crypto";
2
2
  import { isStripeProjectsExclusiveProvider, normalizeStripeProjectsProviderSlug, wrapMuxoConnectUrl, } from "./composio-catalog.js";
3
+ import { getProviderSkillHint } from "./skills-catalog.js";
3
4
  import { APPROVED_PLAN_STATUSES, approvalRequiredError, buildApprovalHumanHandoff, buildApprovalUrl, buildOAuthHumanHandoff, clampWaitSeconds, looksLikeToolSlug, unknownToolError, } from "./mcp-schema.js";
4
5
  import { completeCloudProvisioningWorkflow, createCloudProvisioningWorkflow, exportTemporalEventHistory, normalizeWorkflowTarget, rollbackDurableWorkflow as runSagaRollbackOnWorkflow, signalDurableWorkflow as sendSignalToWorkflow, workflowNotFoundError, } from "./durable-workflow.js";
5
6
  import { buildMemoryKnowledgeGraph } from "./memory-graph.js";
@@ -174,21 +175,30 @@ export class MuxoEngine {
174
175
  // 4. inspect_tool
175
176
  async inspectTool(slug) {
176
177
  const normalized = slug.trim();
178
+ const withSkillHint = (tool) => {
179
+ const hint = getProviderSkillHint(tool.providerSlug || tool.slug, this.config.baseUrl);
180
+ return hint
181
+ ? {
182
+ ...tool,
183
+ domainSkill: hint,
184
+ }
185
+ : tool;
186
+ };
177
187
  const billing = this.stripeBilling
178
188
  .listTools()
179
189
  .find((t) => t.slug.toLowerCase() === normalized.toLowerCase() ||
180
190
  t.upstreamSlug.toLowerCase() === normalized.toLowerCase());
181
191
  if (billing)
182
- return billing;
192
+ return withSkillHint(billing);
183
193
  const instant = this.composioInstant.inspectTool(normalized);
184
194
  if (instant)
185
- return instant;
195
+ return withSkillHint(instant);
186
196
  const proj = this.stripeProjects.inspectTool(normalized);
187
197
  if (proj)
188
- return proj;
198
+ return withSkillHint(proj);
189
199
  const sdk = await this.composioSdk.inspectTool(normalized);
190
200
  if (sdk)
191
- return sdk;
201
+ return withSkillHint(sdk);
192
202
  throw unknownToolError(normalized);
193
203
  }
194
204
  // 5. connection_status
@@ -692,6 +702,8 @@ export class MuxoEngine {
692
702
  ? this.buildApprovalHandoff(plan)
693
703
  : undefined;
694
704
  const llmGuidance = this.buildPlanLlmGuidance(plan, authHandoff);
705
+ const domainSkill = getProviderSkillHint(tool.providerSlug || tool.slug, this.config.baseUrl) ||
706
+ undefined;
695
707
  return {
696
708
  plan,
697
709
  tool,
@@ -699,6 +711,7 @@ export class MuxoEngine {
699
711
  memoryContext,
700
712
  ...(authHandoff ? { authHandoff } : {}),
701
713
  ...(humanHandoff ? { humanHandoff } : {}),
714
+ ...(domainSkill ? { domainSkill } : {}),
702
715
  llmGuidance,
703
716
  nextStep,
704
717
  };
@@ -1347,6 +1360,9 @@ export class MuxoEngine {
1347
1360
  input: plan.input,
1348
1361
  connectedAccountId: activeConnId,
1349
1362
  composioApiKey: composioByok,
1363
+ mcpGatewayUrl: composioByok
1364
+ ? this.store.getByokMcpGatewayUrl(ctx.workspace.id)
1365
+ : null,
1350
1366
  });
1351
1367
  }
1352
1368
  else if (plan.lane === "stripe_projects") {
@@ -1103,6 +1103,9 @@ export const MUXO_MCP_TOOLS = [
1103
1103
  "workflow_history",
1104
1104
  "configure_harness",
1105
1105
  "harness_presets",
1106
+ "reconcile_run",
1107
+ "skills",
1108
+ "get_skill",
1106
1109
  "kill_switch",
1107
1110
  "governance_status",
1108
1111
  "scan_context",
@@ -1110,7 +1113,7 @@ export const MUXO_MCP_TOOLS = [
1110
1113
  "switch_workspace",
1111
1114
  "onboard_team",
1112
1115
  ],
1113
- description: "Control-plane operation (or omit action and pass any plain-English prompt): 'inspect' (default), 'remember' (save fact/preference), 'recall' (list memories), 'forget' (delete matching memories), 'memory_graph' (Graphiti bi-temporal entity/relationship lineage with optional as_of time-travel & focal_entity 2-hop BFS), 'set_guardrail' (apply plain-English or structured parameter_rules guardrail), 'reset_guardrails' (restore default safe guardrails), 'check_policy' (dry-run evaluate tool_slug + input against policy and parameter guardrails before planning), 'cedar_policy' (compile/evaluate AWS Cedar & OPA Rego policy-as-code), 'otel_traces' (export W3C OpenTelemetry GenAI/MCP spans & Langfuse batch), 'roi_analytics' (FinOps & BYOK unit-economics ROI report), 'playbooks' / 'create_playbook' / 'run_playbook' (list, author custom, or execute multi-step Temporal Saga playbooks), 'rollback_workflow' / 'signal_workflow' / 'workflow_history' (Temporal workflow lifecycle; accepts workflow_id='latest'), 'configure_harness' / 'harness_presets' (apply turnkey harness presets like startup-builder, strict-production, read-only-auditor, finops-byok-zero-cost and generate ready-to-paste harness config blocks), 'kill_switch' (pause/resume agent execution), 'governance_status' (Microsoft 9-module status + LLM policy brief), 'scan_context' (OWASP ASI-06 check), 'list_workspaces', 'switch_workspace', or 'onboard_team'",
1116
+ description: "Control-plane operation (or omit action and pass any plain-English prompt): 'inspect' (default), 'remember' (save fact/preference), 'recall' (list memories), 'forget' (delete matching memories), 'memory_graph' (Graphiti bi-temporal entity/relationship lineage with optional as_of time-travel & focal_entity 2-hop BFS), 'set_guardrail' (apply plain-English or structured parameter_rules guardrail), 'reset_guardrails' (restore default safe guardrails), 'check_policy' (dry-run evaluate tool_slug + input against policy and parameter guardrails before planning), 'cedar_policy' (compile/evaluate AWS Cedar & OPA Rego policy-as-code), 'otel_traces' (export W3C OpenTelemetry GenAI/MCP spans & Langfuse batch), 'roi_analytics' (FinOps & BYOK unit-economics ROI report), 'playbooks' / 'create_playbook' / 'run_playbook' (list, author custom, or execute multi-step Temporal Saga playbooks), 'rollback_workflow' / 'signal_workflow' / 'workflow_history' (Temporal workflow lifecycle; accepts workflow_id='latest'), 'configure_harness' / 'harness_presets' (apply turnkey harness presets like startup-builder, strict-production, read-only-auditor, finops-byok-zero-cost and generate ready-to-paste harness config blocks), 'reconcile_run' (verify run state, receipt signature, and upstream side-effect alignment), 'skills' / 'get_skill' (list or fetch governed domain & workflow SKILL.md playbooks), 'kill_switch' (pause/resume agent execution), 'governance_status' (Microsoft 9-module status + LLM policy brief), 'scan_context' (OWASP ASI-06 check), 'list_workspaces', 'switch_workspace', or 'onboard_team'",
1114
1117
  },
1115
1118
  prompt: {
1116
1119
  type: "string",
@@ -1221,7 +1224,16 @@ export const MUXO_MCP_TOOLS = [
1221
1224
  },
1222
1225
  slug: {
1223
1226
  type: "string",
1224
- description: "Optional playbook slug or natural-language name when action='run_playbook' (e.g. 'fullstack-cloud-bootstrap', 'competitor-seo-growth-brief', 'incident-containment-audit', 'customer-release-readiness')",
1227
+ description: "Playbook slug when action='run_playbook', or domain/workflow skill slug when action='get_skill' (e.g. 'github-automation', 'supabase-provisioning')",
1228
+ },
1229
+ provider: {
1230
+ type: "string",
1231
+ description: "Provider slug to filter action='skills' or select a provider's skill with action='get_skill'",
1232
+ },
1233
+ category: {
1234
+ type: "string",
1235
+ enum: ["governance", "app_automation", "cloud_infrastructure", "workflow"],
1236
+ description: "Category filter when action='skills'",
1225
1237
  },
1226
1238
  workflow_id: {
1227
1239
  type: "string",
package/dist/mcp.js CHANGED
@@ -340,6 +340,42 @@ export async function dispatchMcpToolCall(engine, ctx, toolName, args = {}) {
340
340
  prompt: prompt || null,
341
341
  });
342
342
  }
343
+ if (action === "reconcile_run") {
344
+ const runId = String(args.run_id || args.runId || args.slug || query || prompt || "latest").trim();
345
+ return engine.reconcileRun(ctx, runId);
346
+ }
347
+ if (action === "skills") {
348
+ const skills = listMuxoSkills({
349
+ category: args.category ? String(args.category) : undefined,
350
+ provider: args.provider ? String(args.provider) : undefined,
351
+ query: query || prompt || undefined,
352
+ }, engine.config.baseUrl);
353
+ return {
354
+ ok: true,
355
+ action: "skills",
356
+ count: skills.length,
357
+ skills,
358
+ };
359
+ }
360
+ if (action === "get_skill" || action === "skill") {
361
+ const skillSlug = String(args.slug ||
362
+ args.skill_slug ||
363
+ args.skillSlug ||
364
+ args.provider ||
365
+ query ||
366
+ prompt ||
367
+ "github-automation").trim();
368
+ const skill = getMuxoSkill(skillSlug, engine.config.baseUrl);
369
+ if (!skill) {
370
+ throw new Error(`Skill '${skillSlug}' not found in Muxo catalog.`);
371
+ }
372
+ return {
373
+ ok: true,
374
+ action: "get_skill",
375
+ skill,
376
+ markdown: renderMuxoSkillMarkdown(skill.slug, engine.config.baseUrl),
377
+ };
378
+ }
343
379
  if (action === "governance_status") {
344
380
  return engine.getGovernanceOverview(ctx);
345
381
  }
package/dist/oss-suite.js CHANGED
@@ -451,7 +451,7 @@ export function buildOtelTraceExport(params) {
451
451
  { key: "service.name", value: { stringValue: "muxo-agent-runtime" } },
452
452
  {
453
453
  key: "service.version",
454
- value: { stringValue: params.version || "1.4.4" },
454
+ value: { stringValue: params.version || "1.4.5" },
455
455
  },
456
456
  {
457
457
  key: "muxo.workspace.id",
@@ -467,7 +467,7 @@ export function buildOtelTraceExport(params) {
467
467
  {
468
468
  scope: {
469
469
  name: "@muxoai/otel-genai-mcp-tracer",
470
- version: params.version || "1.4.4",
470
+ version: params.version || "1.4.5",
471
471
  },
472
472
  spans,
473
473
  },
package/dist/server.js CHANGED
@@ -120,6 +120,7 @@ Set or inspect them via MCP \`get_run_context({ action: "set_guardrail", prompt:
120
120
  - \`muxo://governance/policy\` — Active guardrails, kill-switch status, trust score, and \`llmPolicyBrief\`
121
121
  - \`muxo://context\` — Live workspace context, active guardrails, provisioned resources, and \`llmSystemPrompt\`
122
122
  - \`muxo://memory/graph\` — Active Supermemory defaults and bi-temporal knowledge graph facts
123
+ - \`muxo://skills\` & \`muxo://skills/{skillSlug}\` — Governed domain & workflow skills catalog (140+ app, cloud provisioning, and multi-app workflow \`SKILL.md\` playbooks)
123
124
  - **MCP Prompts (\`prompts/list\` & \`prompts/get\`)**:
124
125
  - \`context\` — Inject workspace memory, active defaults, and guardrail summary
125
126
  - \`policy_guardrails\` — Inject the active \`llmSystemDirective\`, risk-lane matrix, and optional dry-run policy simulation for \`tool_slug\`
@@ -719,7 +720,10 @@ export function createMuxoServer(customConfig) {
719
720
  },
720
721
  "/api/v1/byok/{provider}": { delete: { summary: "Delete a BYOK provider key from the vault" } },
721
722
  "/api/v1/tools": { get: { summary: "Search unified catalogue across instant.*, app.*, and resource.*" } },
722
- "/api/v1/tools/{slug}": { get: { summary: "Inspect tool schema, risk level, credit cost, and LLM context URL" } },
723
+ "/api/v1/tools/{slug}": { get: { summary: "Inspect tool schema, risk level, credit cost, domainSkill pitfalls, and LLM context URL" } },
724
+ "/api/v1/skills": { get: { summary: "List governed domain, cloud provisioning, and multi-app workflow skills" } },
725
+ "/api/v1/skills/{slug}": { get: { summary: "Inspect governed domain or workflow skill definition and SKILL.md markdown" } },
726
+ "/skills/{slug}/SKILL.md": { get: { summary: "Download governed SKILL.md markdown bundle for any app, cloud provider, or workflow" } },
723
727
  "/api/v1/connections": {
724
728
  get: { summary: "List connected OAuth accounts and cloud providers" },
725
729
  post: { summary: "Start managed OAuth connection handoff" },
@@ -854,7 +858,7 @@ Users purchase Muxo Credits (\`POST /api/v1/billing/topup\` or \`muxo billing to
854
858
  }
855
859
  if (pathname === "/llms.txt" && req.method === "GET") {
856
860
  res.writeHead(200, { "Content-Type": "text/plain; charset=utf-8" });
857
- res.end(`# Muxo\n> Unified agent execution across Connected Apps, Instant Tools, Cloud Infrastructure, Workspace Memory, and Safety Guardrails.\n\n- Skill Document: ${config.baseUrl}/skill.md\n- Auth Guide: ${config.baseUrl}/auth.md\n- OpenAPI 3.1 Spec: ${config.baseUrl}/api/openapi.json\n- MCP Endpoint: ${config.baseUrl}/mcp\n- OAuth Callback Handoff: ${config.baseUrl}/oauth/callback\n- Plugin Marketplace (Codex/OpenAI): ${config.baseUrl}/.agents/plugins/marketplace.json\n- Plugin Marketplace (Claude/Droid): ${config.baseUrl}/.claude-plugin/marketplace.json\n- Console (app.muxo.ai): ${config.baseUrl}/\n- Landing & Provider Canvas (muxo.ai): ${config.baseUrl}/landing\n- Documentation (docs.muxo.ai): ${config.docsUrl}\n\n## Agent-Native Policy, Context & Governance Interface\n- MCP Control Plane (\`get_run_context\`): \`action: "recall" | "remember" | "forget" | "set_guardrail" | "reset_guardrails" | "check_policy" | "governance_status" | "kill_switch" | "scan_context"\`\n- Strict /v1 Organization Brief: \`get_organization({ company_context: { required: false } })\` returns accepted workspace policy facts + learned defaults in \`company_context.packet\`\n- Dry-Run Policy Simulator: \`POST ${config.baseUrl}/api/v1/guardrails/check\` (\`{ "tool_slug": "...", "input": { ... } }\`) or MCP \`get_run_context({ action: "check_policy", tool_slug, input })\`\n- Guardrails & Policy Brief: \`GET/POST ${config.baseUrl}/api/v1/guardrails\`, \`POST ${config.baseUrl}/api/v1/guardrails/reset\`, \`GET ${config.baseUrl}/api/v1/governance\` (includes \`llmPolicyBrief\`)\n- MCP Resources: \`muxo://policy/brief\`, \`muxo://governance/policy\`, \`muxo://context\`, \`muxo://memory/graph\`\n- MCP Prompts: \`context\`, \`policy_guardrails\`, \`governed_execution\`, \`security_audit\`\n`);
861
+ res.end(`# Muxo\n> Unified agent execution across Connected Apps, Instant Tools, Cloud Infrastructure, Workspace Memory, and Safety Guardrails.\n\n- Skill Document: ${config.baseUrl}/skill.md\n- Domain & Workflow Skills Catalog: ${config.baseUrl}/api/v1/skills (or ${config.baseUrl}/skills/<slug>/SKILL.md)\n- Auth Guide: ${config.baseUrl}/auth.md\n- OpenAPI 3.1 Spec: ${config.baseUrl}/api/openapi.json\n- MCP Endpoint: ${config.baseUrl}/mcp\n- OAuth Callback Handoff: ${config.baseUrl}/oauth/callback\n- Plugin Marketplace (Codex/OpenAI): ${config.baseUrl}/.agents/plugins/marketplace.json\n- Plugin Marketplace (Claude/Droid): ${config.baseUrl}/.claude-plugin/marketplace.json\n- Console (app.muxo.ai): ${config.baseUrl}/\n- Landing & Provider Canvas (muxo.ai): ${config.baseUrl}/landing\n- Documentation (docs.muxo.ai): ${config.docsUrl}\n\n## Agent-Native Policy, Context & Governance Interface\n- MCP Control Plane (\`get_run_context\`): \`action: "recall" | "remember" | "forget" | "set_guardrail" | "reset_guardrails" | "check_policy" | "governance_status" | "kill_switch" | "scan_context" | "skills" | "get_skill" | "reconcile_run"\`\n- Strict /v1 Organization Brief: \`get_organization({ company_context: { required: false } })\` returns accepted workspace policy facts + learned defaults in \`company_context.packet\`\n- Dry-Run Policy Simulator: \`POST ${config.baseUrl}/api/v1/guardrails/check\` (\`{ "tool_slug": "...", "input": { ... } }\`) or MCP \`get_run_context({ action: "check_policy", tool_slug, input })\`\n- Guardrails & Policy Brief: \`GET/POST ${config.baseUrl}/api/v1/guardrails\`, \`POST ${config.baseUrl}/api/v1/guardrails/reset\`, \`GET ${config.baseUrl}/api/v1/governance\` (includes \`llmPolicyBrief\`)\n- MCP Resources: \`muxo://policy/brief\`, \`muxo://governance/policy\`, \`muxo://context\`, \`muxo://memory/graph\`, \`muxo://skills\`, \`muxo://skills/{skillSlug}\`\n- MCP Prompts: \`context\`, \`policy_guardrails\`, \`governed_execution\`, \`security_audit\`\n`);
858
862
  return;
859
863
  }
860
864
  // Serve Installable Muxo Plugin Manifests & Metadata (Portable OpenAI Agent Plugins + Codex + Claude + Cursor)
@@ -3086,8 +3090,11 @@ Users purchase Muxo Credits (\`POST /api/v1/billing/topup\` or \`muxo billing to
3086
3090
  }
3087
3091
  if (pathname === "/api/v1/byok" && req.method === "POST") {
3088
3092
  const body = JSON.parse((await readBody(req)) || "{}");
3089
- const provider = String(body.provider || "").trim();
3090
- const secretKey = String(body.secretKey || body.apiKey || body.key || "").trim();
3093
+ const provider = String(body.providerSlug || body.provider_slug || body.provider || "").trim();
3094
+ const secretKey = String(body.secretKey || body.secret_key || body.apiKey || body.api_key || body.key || "").trim();
3095
+ const mcpGatewayUrl = body.mcpGatewayUrl || body.mcp_gateway_url
3096
+ ? String(body.mcpGatewayUrl || body.mcp_gateway_url).trim()
3097
+ : null;
3091
3098
  if (!provider || !secretKey) {
3092
3099
  sendJson(res, 400, {
3093
3100
  ok: false,
@@ -3095,7 +3102,9 @@ Users purchase Muxo Credits (\`POST /api/v1/billing/topup\` or \`muxo billing to
3095
3102
  });
3096
3103
  return;
3097
3104
  }
3098
- const record = store.setByokKey(ctx.workspace.id, provider, secretKey);
3105
+ const record = store.setByokKey(ctx.workspace.id, provider, secretKey, {
3106
+ mcpGatewayUrl,
3107
+ });
3099
3108
  sendJson(res, 201, {
3100
3109
  ok: true,
3101
3110
  key: record,
@@ -641,6 +641,43 @@ function buildCatalogSkills(baseUrl = "https://api.muxo.ai") {
641
641
  sourceRepo: "ComposioHQ/awesome-claude-skills (transpiled for Muxo Governed MCP)",
642
642
  });
643
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
+ }
644
681
  return skills;
645
682
  }
646
683
  export function listMuxoSkills(filter, baseUrl = "https://api.muxo.ai") {
@@ -671,8 +708,10 @@ export function getMuxoSkill(slug, baseUrl = "https://api.muxo.ai") {
671
708
  if (!clean)
672
709
  return null;
673
710
  const all = buildCatalogSkills(baseUrl);
674
- return (all.find((s) => s.slug.toLowerCase() === clean ||
675
- s.providerSlug.toLowerCase() === clean) || null);
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);
676
715
  }
677
716
  export function renderMuxoSkillMarkdown(slug, baseUrl = "https://api.muxo.ai") {
678
717
  const skill = getMuxoSkill(slug, baseUrl);
package/dist/store.d.ts CHANGED
@@ -178,7 +178,10 @@ export declare class MuxoStore {
178
178
  category: "llm" | "supplier";
179
179
  envVarName: string;
180
180
  };
181
- setByokKey(workspaceId: string, providerInput: string, secretKey: string): ByokKeyRecord;
181
+ setByokKey(workspaceId: string, providerInput: string, secretKey: string, options?: {
182
+ mcpGatewayUrl?: string | null;
183
+ }): ByokKeyRecord;
184
+ getByokMcpGatewayUrl(workspaceId: string): string | null;
182
185
  getByokKey(workspaceId: string, providerInput: string): string | null;
183
186
  deleteByokKey(workspaceId: string, providerInput: string): boolean;
184
187
  listByokKeys(workspaceId: string): ByokKeyRecord[];
package/dist/store.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import { DatabaseSync } from "node:sqlite";
2
2
  import crypto from "node:crypto";
3
+ import { normalizeComposioByokGatewayUrl } from "./composio-catalog.js";
3
4
  export const BYOK_PROVIDER_CATALOG = {
4
5
  openai: { category: "llm", envVarName: "OPENAI_API_KEY", label: "OpenAI (GPT-4o / o3-mini)" },
5
6
  anthropic: { category: "llm", envVarName: "ANTHROPIC_API_KEY", label: "Anthropic (Claude 3.7 Sonnet)" },
@@ -1204,7 +1205,7 @@ export class MuxoStore {
1204
1205
  envVarName,
1205
1206
  };
1206
1207
  }
1207
- setByokKey(workspaceId, providerInput, secretKey) {
1208
+ setByokKey(workspaceId, providerInput, secretKey, options) {
1208
1209
  const trimmed = secretKey.trim();
1209
1210
  if (!trimmed) {
1210
1211
  throw new Error("BYOK secretKey must not be empty");
@@ -1214,7 +1215,17 @@ export class MuxoStore {
1214
1215
  const keyPreview = trimmed.length <= 8
1215
1216
  ? `${trimmed.slice(0, 2)}***`
1216
1217
  : `${trimmed.slice(0, 6)}...${trimmed.slice(-4)}`;
1217
- const encryptedHex = this.encryptSecrets(workspaceId, { [envVarName]: trimmed });
1218
+ if (options?.mcpGatewayUrl && provider !== "composio") {
1219
+ throw new Error("MCP gateway URLs are only supported for Composio BYOK.");
1220
+ }
1221
+ const cleanGatewayUrl = options?.mcpGatewayUrl
1222
+ ? normalizeComposioByokGatewayUrl(options.mcpGatewayUrl)
1223
+ : provider === "composio" ? this.getByokMcpGatewayUrl(workspaceId) || "" : "";
1224
+ const secretPayload = {
1225
+ [envVarName]: trimmed,
1226
+ ...(cleanGatewayUrl ? { COMPOSIO_MCP_GATEWAY_URL: cleanGatewayUrl } : {}),
1227
+ };
1228
+ const encryptedHex = this.encryptSecrets(workspaceId, secretPayload);
1218
1229
  this.db
1219
1230
  .prepare(`INSERT INTO byok_keys (
1220
1231
  workspace_id, provider, category, env_var_name, key_preview, encrypted_secret_hex, updated_at
@@ -1233,9 +1244,19 @@ export class MuxoStore {
1233
1244
  envVarName,
1234
1245
  keyPreview,
1235
1246
  configured: true,
1247
+ ...(cleanGatewayUrl ? { mcpGatewayUrl: cleanGatewayUrl } : {}),
1236
1248
  updatedAt: now,
1237
1249
  };
1238
1250
  }
1251
+ getByokMcpGatewayUrl(workspaceId) {
1252
+ const row = this.db
1253
+ .prepare("SELECT encrypted_secret_hex FROM byok_keys WHERE workspace_id = ? AND provider = 'composio'")
1254
+ .get(workspaceId);
1255
+ if (!row)
1256
+ return null;
1257
+ const dec = this.decryptSecrets(workspaceId, row.encrypted_secret_hex);
1258
+ return dec.COMPOSIO_MCP_GATEWAY_URL || null;
1259
+ }
1239
1260
  getByokKey(workspaceId, providerInput) {
1240
1261
  const { provider, envVarName } = this.normalizeByokProvider(providerInput);
1241
1262
  const row = this.db
@@ -1255,11 +1276,23 @@ export class MuxoStore {
1255
1276
  }
1256
1277
  listByokKeys(workspaceId) {
1257
1278
  const rows = this.db
1258
- .prepare("SELECT provider, category, env_var_name, key_preview, updated_at FROM byok_keys WHERE workspace_id = ? ORDER BY updated_at DESC")
1279
+ .prepare("SELECT provider, category, env_var_name, key_preview, encrypted_secret_hex, updated_at FROM byok_keys WHERE workspace_id = ? ORDER BY updated_at DESC")
1259
1280
  .all(workspaceId);
1260
1281
  const configuredMap = new Map();
1261
1282
  for (const r of rows) {
1262
1283
  const p = String(r.provider);
1284
+ let mcpGatewayUrl;
1285
+ if (p === "composio" && r.encrypted_secret_hex) {
1286
+ try {
1287
+ const dec = this.decryptSecrets(workspaceId, String(r.encrypted_secret_hex));
1288
+ if (dec.COMPOSIO_MCP_GATEWAY_URL) {
1289
+ mcpGatewayUrl = dec.COMPOSIO_MCP_GATEWAY_URL;
1290
+ }
1291
+ }
1292
+ catch {
1293
+ // ignore
1294
+ }
1295
+ }
1263
1296
  configuredMap.set(p, {
1264
1297
  provider: p,
1265
1298
  providerSlug: p,
@@ -1267,6 +1300,7 @@ export class MuxoStore {
1267
1300
  envVarName: String(r.env_var_name),
1268
1301
  keyPreview: String(r.key_preview),
1269
1302
  configured: true,
1303
+ ...(mcpGatewayUrl ? { mcpGatewayUrl } : {}),
1270
1304
  updatedAt: String(r.updated_at),
1271
1305
  });
1272
1306
  }
package/dist/types.d.ts CHANGED
@@ -184,6 +184,7 @@ export interface MuxoTool {
184
184
  llmContextUrl?: string;
185
185
  providerUrl?: string;
186
186
  metadata?: Record<string, unknown>;
187
+ domainSkill?: Record<string, unknown>;
187
188
  }
188
189
  export type ToolDescriptor = MuxoTool;
189
190
  export interface ConnectionRecord {
@@ -2003,9 +2003,12 @@ async function loadByokKeys() {
2003
2003
  async function saveByokKeyFromUi() {
2004
2004
  var provider = byId('byok-provider-select').value;
2005
2005
  var secretKey = byId('byok-key-input').value.trim();
2006
+ var gwInput = byId('byok-gateway-input');
2007
+ var mcpGatewayUrl = provider === 'composio' && gwInput && gwInput.value ? gwInput.value.trim() : undefined;
2006
2008
  if (!secretKey) { showToast('Paste a key first'); byId('byok-key-input').focus(); return; }
2007
- await post('/api/v1/byok', { provider: provider, secretKey: secretKey, apiKey: secretKey });
2009
+ await post('/api/v1/byok', { provider: provider, secretKey: secretKey, apiKey: secretKey, mcpGatewayUrl: mcpGatewayUrl });
2008
2010
  byId('byok-key-input').value = '';
2011
+ if (gwInput) gwInput.value = '';
2009
2012
  showToast('Saved your ' + provider + ' key. It is encrypted in your vault.');
2010
2013
  await loadByokKeys();
2011
2014
  }
@@ -2365,6 +2368,13 @@ function init() {
2365
2368
  onSubmit('policy-form', savePolicy);
2366
2369
  onSubmit('scan-form', scanContextFromUi);
2367
2370
  onSubmit('byok-form', saveByokKeyFromUi);
2371
+ var byokSelect = byId('byok-provider-select');
2372
+ if (byokSelect) {
2373
+ byokSelect.addEventListener('change', function () {
2374
+ var gwField = byId('byok-gateway-field');
2375
+ if (gwField) gwField.hidden = byokSelect.value !== 'composio';
2376
+ });
2377
+ }
2368
2378
  onSubmit('join-workspace-form', joinWorkspaceFromForm);
2369
2379
  onSubmit('create-workspace-form', createWorkspaceFromForm);
2370
2380
  onSubmit('team-onboard-form', onboardTeamFromForm);
@@ -2761,6 +2771,7 @@ export function renderConsoleHtml() {
2761
2771
  </select>
2762
2772
  </label>
2763
2773
  <label class="field"><span>Key</span><input id="byok-key-input" type="password" placeholder="Paste the key" autocomplete="off" /></label>
2774
+ <label class="field" id="byok-gateway-field" hidden><span>MCP Gateway URL (optional)</span><input id="byok-gateway-input" type="url" placeholder="https://connect.composio.dev/mcp" autocomplete="off" /></label>
2764
2775
  <button class="btn btn-primary" type="submit" style="min-height:40px">Save key</button>
2765
2776
  </form>
2766
2777
  <div class="table-wrap">
package/dist/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const MUXO_VERSION = "1.4.4";
1
+ export declare const MUXO_VERSION = "1.4.5";
package/dist/version.js CHANGED
@@ -1 +1 @@
1
- export const MUXO_VERSION = "1.4.4";
1
+ export const MUXO_VERSION = "1.4.5";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@muxoai/sdk",
3
- "version": "1.4.4",
4
- "description": "Muxo — Unified Execution, Provisioning & Governance Platform over Composio, Stripe Projects, Microsoft Agent Governance & Supermemory",
3
+ "version": "1.4.5",
4
+ "description": "Muxo \u2014 Unified Execution, Provisioning & Governance Platform over Composio, Stripe Projects, Microsoft Agent Governance & Supermemory",
5
5
  "private": false,
6
6
  "license": "MIT",
7
7
  "homepage": "https://muxo.ai",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "muxo",
3
- "version": "1.4.4",
3
+ "version": "1.4.5",
4
4
  "description": "Governed agent execution across 1,000+ Connected Apps (managed OAuth handoff), Instant Tools (search, scrape, crawl, SEO audit), live Cloud Infrastructure provisioning, Workspace Memory recall, and verifiable audit records.",
5
5
  "author": {
6
6
  "name": "Muxo AI LLC",
@@ -8,7 +8,7 @@
8
8
  "url": "https://muxo.ai"
9
9
  },
10
10
  "homepage": "https://muxo.ai",
11
- "repository": "https://github.com/muxo-ai/muxo",
11
+ "repository": "https://github.com/Muxoai/muxo3",
12
12
  "license": "MIT",
13
13
  "skills": "./skills/",
14
14
  "hooks": "./hooks/hooks.json",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "muxo",
3
- "version": "1.4.4",
3
+ "version": "1.4.5",
4
4
  "description": "Your agent decides what to do — Muxo governs, provisions, remembers, and executes it. Unified access to 1,000+ Connected Apps (managed OAuth handoff), Instant Tools (search, scrape, crawl, SEO audit), live Cloud Infrastructure provisioning (Postgres, Redis, SQLite, Storage), Workspace Memory recall, and verifiable audit records.",
5
5
  "author": {
6
6
  "name": "Muxo AI LLC",
@@ -8,7 +8,7 @@
8
8
  "url": "https://muxo.ai"
9
9
  },
10
10
  "homepage": "https://muxo.ai",
11
- "repository": "https://github.com/muxo-ai/muxo",
11
+ "repository": "https://github.com/Muxoai/muxo3",
12
12
  "license": "MIT",
13
13
  "keywords": [
14
14
  "muxo",
@@ -33,7 +33,7 @@
33
33
  "com.openai": {
34
34
  "onboardingSkill": "./skills/setup/SKILL.md",
35
35
  "publication": {
36
- "release_notes": "Muxo v1.4.4: Unified governed execution across 1,000+ Connected Apps, Instant web/SEO tools, 94 Stripe Projects Cloud Infrastructure services, MCP 2026-07-28 compliance, and Workspace Memory."
36
+ "release_notes": "Muxo v1.4.5: Unified governed execution across 1,000+ Connected Apps, Instant web/SEO tools, 94 Stripe Projects Cloud Infrastructure services, MCP 2026-07-28 compliance, and Workspace Memory."
37
37
  }
38
38
  }
39
39
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "muxo",
3
3
  "description": "Your agent decides what to do — Muxo governs, provisions, remembers, and executes it. Connect and operate 1,000+ external apps via managed OAuth, zero-auth Instant Tools (web search, scrape, crawl, SEO audit, remote workbench), live Cloud Infrastructure provisioning (Stripe Projects), and Workspace Memory from Cursor.",
4
- "version": "1.4.4",
4
+ "version": "1.4.5",
5
5
  "mcpServers": "../mcp.json",
6
6
  "skills": "../skills/",
7
7
  "author": {
@@ -10,7 +10,7 @@
10
10
  "url": "https://muxo.ai"
11
11
  },
12
12
  "homepage": "https://muxo.ai",
13
- "repository": "https://github.com/muxo-ai/muxo",
13
+ "repository": "https://github.com/Muxoai/muxo3",
14
14
  "license": "MIT",
15
15
  "keywords": [
16
16
  "muxo",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
3
3
  "name": "muxo",
4
- "version": "1.4.4",
4
+ "version": "1.4.5",
5
5
  "description": "Your agent decides what to do — Muxo governs, provisions, remembers, and executes it. Unified access to 1,000+ Connected Apps (managed OAuth handoff), Instant Tools (search, scrape, crawl, SEO audit), live Cloud Infrastructure provisioning (Postgres, Redis, SQLite, Storage), Workspace Memory recall, and verifiable audit records.",
6
6
  "author": {
7
7
  "name": "Muxo AI LLC",
@@ -9,7 +9,7 @@
9
9
  "url": "https://muxo.ai"
10
10
  },
11
11
  "homepage": "https://muxo.ai",
12
- "repository": "https://github.com/muxo-ai/muxo",
12
+ "repository": "https://github.com/Muxoai/muxo3",
13
13
  "license": "MIT",
14
14
  "keywords": [
15
15
  "muxo",
@@ -109,7 +109,7 @@
109
109
  "commerce_description": "This plugin does not sell retail products or process consumer checkout inside ChatGPT."
110
110
  },
111
111
  "publication": {
112
- "release_notes": "Muxo v1.4.4: Unified governed execution across 1,000+ Connected Apps, Instant web/SEO tools, 94 Stripe Projects Cloud Infrastructure services, MCP 2026-07-28 compliance, and Workspace Memory."
112
+ "release_notes": "Muxo v1.4.5: Unified governed execution across 1,000+ Connected Apps, Instant web/SEO tools, 94 Stripe Projects Cloud Infrastructure services, MCP 2026-07-28 compliance, and Workspace Memory."
113
113
  }
114
114
  }
115
115
  }