@zackbart/connecta 0.30.0 → 0.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/README.md +21 -16
  3. package/bin/connecta.mjs +1 -0
  4. package/bin/version.mjs +1 -1
  5. package/dist/auth-elicitation.js +1 -1
  6. package/dist/call-recovery.js +25 -0
  7. package/dist/catalog-service.js +7 -2
  8. package/dist/config-schema.d.ts +14 -7
  9. package/dist/config-schema.js +29 -10
  10. package/dist/config-value-sources.js +6 -3
  11. package/dist/config.d.ts +26 -8
  12. package/dist/config.js +38 -16
  13. package/dist/connector-access.d.ts +2 -1
  14. package/dist/connectors/guarded-fetch.d.ts +18 -1
  15. package/dist/connectors/guarded-fetch.js +21 -2
  16. package/dist/describe-config.d.ts +6 -3
  17. package/dist/describe-config.js +3 -2
  18. package/dist/errors.d.ts +3 -1
  19. package/dist/errors.js +1 -0
  20. package/dist/execute.js +16 -14
  21. package/dist/index.js +4 -3
  22. package/dist/invocation.js +39 -4
  23. package/dist/meta-tools.js +17 -19
  24. package/dist/operator-record.d.ts +2 -2
  25. package/dist/operator-record.js +2 -0
  26. package/dist/operator-ui/contract.d.ts +5 -4
  27. package/dist/operator-ui/generated.js +2 -2
  28. package/dist/operator-ui/model.d.ts +1 -1
  29. package/dist/operator-ui/view.d.ts +9 -0
  30. package/dist/operator-ui/view.js +12 -0
  31. package/dist/program-writes.js +4 -49
  32. package/dist/provider.d.ts +6 -5
  33. package/dist/provider.js +3 -4
  34. package/dist/providers/_shared/google/workspace.js +1 -1
  35. package/dist/providers/_shared/rest/dispatch.js +41 -0
  36. package/dist/providers/_shared/rest/operation-index.d.ts +133 -0
  37. package/dist/providers/_shared/rest/operation-index.js +527 -0
  38. package/dist/providers/_shared/rest/tools.d.ts +141 -0
  39. package/dist/providers/_shared/rest/tools.js +569 -0
  40. package/dist/providers/_shared/rest/value-safety.d.ts +151 -0
  41. package/dist/providers/_shared/rest/value-safety.js +580 -0
  42. package/dist/providers/breeze/skill.generated.js +2 -2
  43. package/dist/providers/cloudflare/graphql.js +385 -0
  44. package/dist/providers/cloudflare/index.d.ts +47 -51
  45. package/dist/providers/cloudflare/index.js +188 -1997
  46. package/dist/providers/cloudflare/openapi.generated.js +3347 -0
  47. package/dist/providers/cloudflare/rest.d.ts +37 -0
  48. package/dist/providers/cloudflare/rest.js +1056 -0
  49. package/dist/providers/cloudflare/skill.generated.js +7 -4
  50. package/dist/providers/cloudflare/value-safety.js +1247 -0
  51. package/dist/providers/docs/index.d.ts +1 -1
  52. package/dist/providers/docs/index.js +2 -2
  53. package/dist/providers/drive/index.d.ts +1 -1
  54. package/dist/providers/drive/index.js +1 -1
  55. package/dist/providers/forms/index.d.ts +1 -1
  56. package/dist/providers/forms/index.js +2 -2
  57. package/dist/providers/github/skill.generated.js +2 -2
  58. package/dist/providers/gmail/index.d.ts +1 -1
  59. package/dist/providers/gmail/index.js +274 -23
  60. package/dist/providers/gmail/skill.generated.js +2 -2
  61. package/dist/providers/linear/index.js +1 -1
  62. package/dist/providers/mixpanel/index.d.ts +27 -12
  63. package/dist/providers/mixpanel/index.js +58 -6
  64. package/dist/providers/mixpanel/operations.js +20 -0
  65. package/dist/providers/mixpanel/rest.js +603 -0
  66. package/dist/providers/mixpanel/skill.generated.js +3 -2
  67. package/dist/providers/mixpanel/value-safety.js +16 -0
  68. package/dist/providers/notion/index.d.ts +35 -31
  69. package/dist/providers/notion/index.js +76 -1499
  70. package/dist/providers/notion/openapi.generated.js +75 -0
  71. package/dist/providers/notion/rest.d.ts +24 -0
  72. package/dist/providers/notion/rest.js +1186 -0
  73. package/dist/providers/notion/skill.generated.js +5 -4
  74. package/dist/providers/notion/value-safety.js +31 -0
  75. package/dist/providers/planning-center/index.d.ts +27 -0
  76. package/dist/providers/planning-center/index.js +286 -24
  77. package/dist/providers/planning-center/skill.generated.js +24 -4
  78. package/dist/providers/sheets/index.d.ts +1 -1
  79. package/dist/providers/sheets/index.js +3 -3
  80. package/dist/providers/slides/index.d.ts +1 -1
  81. package/dist/providers/slides/index.js +3 -3
  82. package/dist/providers/stripe/index.d.ts +26 -20
  83. package/dist/providers/stripe/index.js +103 -130
  84. package/dist/providers/stripe/openapi.generated.js +649 -0
  85. package/dist/providers/stripe/rest.d.ts +14 -0
  86. package/dist/providers/stripe/rest.js +395 -0
  87. package/dist/providers/stripe/skill.generated.js +7 -5
  88. package/dist/providers/stripe/value-safety.js +705 -0
  89. package/dist/providers/vercel/index.d.ts +31 -22
  90. package/dist/providers/vercel/index.js +96 -853
  91. package/dist/providers/vercel/openapi.generated.js +456 -0
  92. package/dist/providers/vercel/rest.d.ts +20 -0
  93. package/dist/providers/vercel/rest.js +1002 -0
  94. package/dist/providers/vercel/skill.generated.js +4 -5
  95. package/dist/providers/vercel/value-safety.js +328 -0
  96. package/dist/providers/wispr-flow/index.d.ts +14 -0
  97. package/dist/providers/wispr-flow/index.js +117 -0
  98. package/dist/providers/wispr-flow/skill.generated.js +8 -0
  99. package/dist/routes/mcp.js +30 -10
  100. package/dist/routes/operator.js +14 -7
  101. package/dist/routes/ui-config.js +2 -2
  102. package/dist/server.js +3 -0
  103. package/dist/skills.js +5 -4
  104. package/dist/tool-safety.js +13 -5
  105. package/dist/types.d.ts +1 -1
  106. package/dist/ui.d.ts +1 -1
  107. package/dist/ui.js +1 -1
  108. package/dist/usage-guide.js +3 -3
  109. package/dist/version.d.ts +1 -1
  110. package/dist/version.js +1 -1
  111. package/dist/write-outcome.js +47 -0
  112. package/documentation/README.md +1 -0
  113. package/documentation/architecture.md +155 -28
  114. package/documentation/auth.md +86 -27
  115. package/documentation/code-mode.md +81 -72
  116. package/documentation/deploying.md +10 -5
  117. package/documentation/integrating.md +72 -9
  118. package/documentation/meta-tools.md +52 -38
  119. package/documentation/operating.md +11 -8
  120. package/documentation/operator-tests.md +2 -3
  121. package/documentation/operator-ui.md +9 -3
  122. package/documentation/provider-auth-migration.md +308 -0
  123. package/documentation/provider-migration-0.29.md +18 -6
  124. package/examples/worker/AGENTS.md +5 -0
  125. package/examples/worker/README.md +2 -2
  126. package/examples/worker/src/connecta.config.ts +5 -0
  127. package/package.json +7 -2
  128. package/templates/node/AGENTS.md +6 -4
  129. package/templates/node/README.md +6 -4
  130. package/templates/node/package.json +1 -1
  131. package/templates/node/src/connecta.config.ts +5 -0
  132. package/dist/providers/vercel/mcp-ownership.js +0 -212
  133. package/dist/tool-safety.d.ts +0 -9
@@ -2,7 +2,7 @@ import { type RemoteMcpAuth } from "../../connectors/remote-mcp.js";
2
2
  import type { ConnectorCallAdmissionPolicy } from "../../types.js";
3
3
  export type MixpanelRegion = "us" | "eu" | "in";
4
4
  export declare const MIXPANEL_MCP_ENDPOINTS: Readonly<Record<MixpanelRegion, string>>;
5
- export interface MixpanelOptions {
5
+ interface MixpanelCommonOptions {
6
6
  /**
7
7
  * Human-readable display name; defaults to "Mixpanel (<region>)". The region
8
8
  * rides the title because a project lives in exactly one residency and
@@ -18,25 +18,40 @@ export interface MixpanelOptions {
18
18
  * region answers empty rather than wrong, which reads as an empty project.
19
19
  */
20
20
  region?: MixpanelRegion;
21
- /**
22
- * OAuth by default; static headers support Mixpanel service accounts, and
23
- * `{ type: "credential" }` takes the same service account as an
24
- * operator-managed `username:secret` that Connecta frames for the endpoint.
25
- */
26
- auth?: RemoteMcpAuth;
27
21
  /** Account-specific conventions appended to the maintained provider guide. */
28
22
  instructions?: string;
29
23
  /** Connector-specific inline result limit; omit to inherit the deployment. */
30
24
  maxResultBytes?: number;
31
25
  /**
32
- * Optional per-runtime policy. There is no default: Mixpanel meters its MCP
33
- * server per user per hour, and a per-runtime counter over-counts one runtime
34
- * serving many users and under-counts many runtimes sharing one credential.
35
- * Only an operator who knows the account can pick a number worth enforcing.
26
+ * Optional per-runtime policy. API mode defaults to 60 calls/hour and five
27
+ * concurrent calls across all tools and projects. MCP mode has no default:
28
+ * its per-user hourly quota cannot be modeled by one per-runtime counter.
36
29
  */
37
30
  callAdmission?: ConnectorCallAdmissionPolicy;
38
31
  }
39
- /** A maintained Mixpanel hosted-MCP connection. */
32
+ /** The default hosted MCP connection. Existing auth configurations still work. */
33
+ export interface MixpanelMcpOptions extends MixpanelCommonOptions {
34
+ via?: "mcp";
35
+ /**
36
+ * OAuth by default; static headers support Mixpanel service accounts, and
37
+ * `{ type: "credential" }` takes the same service account as an
38
+ * operator-managed `username:secret` that Connecta frames for the endpoint.
39
+ */
40
+ auth?: RemoteMcpAuth;
41
+ defaultProjectId?: never;
42
+ }
43
+ /** REST APIs using an operator-managed username:secret service account. */
44
+ export interface MixpanelApiOptions extends MixpanelCommonOptions {
45
+ via: "api";
46
+ auth: {
47
+ type: "credential";
48
+ };
49
+ /** Fills an omitted project_id. Explicit ids still reach other granted projects. */
50
+ defaultProjectId?: number;
51
+ }
52
+ export type MixpanelOptions = MixpanelMcpOptions | MixpanelApiOptions;
53
+ /** Mixpanel hosted MCP by default, or service-account REST with via: "api". */
40
54
  export declare const mixpanel: import("../../provider.js").ProviderFactory<MixpanelOptions>;
41
55
  /** @deprecated Read `mixpanel.definition.classify` instead. Kept for existing imports. */
42
56
  export declare const MIXPANEL_VETTED_CATALOG: import("../../catalog-drift.js").VettedCatalog;
57
+ export {};
@@ -1,9 +1,11 @@
1
1
  import { skill } from "./skill.generated.js";
2
2
  import { remoteMcp, withCredentialDefaults } from "../../connectors/remote-mcp.js";
3
3
  import { reviewedCatalog } from "../../catalog-drift.js";
4
- import { keys, optionsOf } from "../../config-schema.js";
4
+ import { keys, optionsOf, variants } from "../../config-schema.js";
5
5
  import { PROVIDER_COMMON, REMOTE_MCP_AUTH } from "../../connectors/option-shapes.js";
6
6
  import { defineProvider } from "../../provider.js";
7
+ import { apiConnector } from "../../connectors/api-connector.js";
8
+ import { mixpanelRest, MIXPANEL_API_ADMISSION } from "./rest.js";
7
9
  export const MIXPANEL_MCP_ENDPOINTS = {
8
10
  us: "https://mcp.mixpanel.com/mcp",
9
11
  eu: "https://mcp-eu.mixpanel.com/mcp",
@@ -358,18 +360,39 @@ ${regionNote}
358
360
  Account purpose: ${purpose}${skill.fragments.guide_1}${accountInstructions ? `\n## ${skill.instructionsHeading}\n\n${accountInstructions}\n` : ""}`;
359
361
  }
360
362
  /** The closed options mixpanel() accepts; see `assertKnownOptions`. */
361
- const MIXPANEL_OPTIONS = optionsOf()({ ...PROVIDER_COMMON, ...keys("region"), auth: REMOTE_MCP_AUTH });
362
- /** A maintained Mixpanel hosted-MCP connection. */
363
+ const MIXPANEL_OPTIONS = variants("via", {
364
+ mcp: optionsOf()({
365
+ ...PROVIDER_COMMON,
366
+ ...keys("region", "via"),
367
+ auth: REMOTE_MCP_AUTH,
368
+ }).shape,
369
+ api: optionsOf()({
370
+ ...PROVIDER_COMMON,
371
+ ...keys("region", "via", "defaultProjectId"),
372
+ auth: variants("type", { credential: optionsOf()(keys("type")).shape }),
373
+ }).shape,
374
+ }, "mcp");
375
+ /** Mixpanel hosted MCP by default, or service-account REST with via: "api". */
363
376
  export const mixpanel = defineProvider({
364
377
  name: "mixpanel",
365
378
  title: "Mixpanel",
366
- kind: "mcp",
379
+ kind: "dual",
367
380
  readme: "Mixpanel",
368
- bundle: { "baselineGzip": 131378, "maxGzip": 191378 },
381
+ bundle: {
382
+ baselineGzip: 205500,
383
+ maxGzip: 265500,
384
+ note: "./providers/mixpanel (#823) adds the REST connector, guarded transport, shared operation index and value-safety engine alongside the unchanged hosted MCP client. The nine-operation reviewed subset was shrunk to depth 3 without descriptions before remeasuring: operations.ts is 1355 B gzip. The provider remeasures at about 205500 B gzip, compared with the 131378 B MCP-only baseline; the cap follows baseline + 60000 B. No new runtime dependencies.",
385
+ },
369
386
  skill,
370
387
  options: MIXPANEL_OPTIONS,
371
388
  classify: MIXPANEL_CLASSIFICATION,
372
- create: mixpanelConnector,
389
+ create: (id, options, provider) => {
390
+ const region = options.region ?? "us";
391
+ if (!Object.hasOwn(MIXPANEL_MCP_ENDPOINTS, region)) {
392
+ throw new Error('region must be "us", "eu", or "in".');
393
+ }
394
+ return options.via === "api" ? mixpanelApi(id, options, provider) : mixpanelConnector(id, options, provider);
395
+ },
373
396
  });
374
397
  function mixpanelConnector(id, options, provider) {
375
398
  const purpose = options.purpose.trim();
@@ -412,5 +435,34 @@ function mixpanelConnector(id, options, provider) {
412
435
  });
413
436
  return connector;
414
437
  }
438
+ function mixpanelApi(id, options, provider) {
439
+ if (options.auth?.type !== "credential")
440
+ throw new Error('via: "api" requires auth: { type: "credential" }.');
441
+ if (options.defaultProjectId !== undefined &&
442
+ (!Number.isSafeInteger(options.defaultProjectId) || options.defaultProjectId < 1)) {
443
+ throw new Error("defaultProjectId must be a positive safe integer.");
444
+ }
445
+ const region = options.region ?? "us";
446
+ const rest = mixpanelRest(region, options.defaultProjectId);
447
+ const instructions = options.instructions?.trim();
448
+ return apiConnector(id, {
449
+ ...provider.connectorOptions,
450
+ title: options.title ?? `Mixpanel API (${region})`,
451
+ description: `Mixpanel service-account REST APIs (${region} residency): ${options.purpose}`,
452
+ credential: {
453
+ label: "Mixpanel service account",
454
+ description: "username:secret from Mixpanel organization settings. Import requires Owner or Admin on the target project.",
455
+ placeholder: "username:secret",
456
+ },
457
+ testCredential: rest.testCredential,
458
+ callAdmission: options.callAdmission ?? MIXPANEL_API_ADMISSION,
459
+ usageGuide: {
460
+ content: `# Mixpanel API usage\n\nService-account REST, ${region} residency. Account purpose: ${options.purpose}\n\nDefault project: ${options.defaultProjectId ?? "none; supply project_id"}.${skill.fragments.api}${instructions ? `\n## ${skill.instructionsHeading}\n\n${instructions}\n` : ""}`,
461
+ summary: `${REGION_COPY[region]} residency, service-account REST. Raw export, user activity, profiles, reports and event import.`,
462
+ required: true,
463
+ },
464
+ tools: rest.tools,
465
+ });
466
+ }
415
467
  /** @deprecated Read `mixpanel.definition.classify` instead. Kept for existing imports. */
416
468
  export const MIXPANEL_VETTED_CATALOG = reviewedCatalog(mixpanel.definition.classify, 'defineProvider("mixpanel")');
@@ -0,0 +1,20 @@
1
+ export const openapi = {
2
+ source: "https://docs.mixpanel.com/openapi/query.openapi.yaml",
3
+ revision: "reviewed-2026-10-14",
4
+ digest: "sha256:d9bbbbfa67f0a31f900b325932462b9cd541d287e55357d28e201df69a35e677",
5
+ version: "1.0.0",
6
+ servers: ["query", "export", "app", "ingestion"],
7
+ tags: ["Export", "Account", "Engage", "Funnels", "Insights", "Retention", "Activity Feed", "Events"],
8
+ ops: [
9
+ ["GET", "/api/2.0/export", "raw-event-export", "Download Data", 0, 1],
10
+ ["GET", "/api/app/me", "service-account-me", "Service-account identity and reachable projects", 1, 2],
11
+ ["POST", "/api/query/engage", "engage-query", "Query Profiles", 2],
12
+ ["GET", "/api/query/funnels", "funnels-query", "Query Saved Report", 3],
13
+ ["GET", "/api/query/funnels/list", "funnels-list-saved", "List Saved Funnels", 3],
14
+ ["GET", "/api/query/insights", "insights-query", "Query Saved Report", 4],
15
+ ["GET", "/api/query/retention", "retention-query", "Query Retention Report", 5],
16
+ ["GET", "/api/query/stream/query", "activity-stream-query", "Profile Event Activity", 6],
17
+ ["POST", "/import", "import-events", "Import Events", 7, 3],
18
+ ],
19
+ details: '{"d":[],"o":[[[["project_id","query",0,{"t":"integer"}],["from_date","query",1,{"t":"string"}],["to_date","query",1,{"t":"string"}],["limit","query",0,{"t":"integer"}],["event","query",0,{"t":"string"}],["where","query",0,{"t":"string"}],["time_in_ms","query",0,{"t":"boolean"}]],0],0,[[["project_id","query",1,{"t":"integer"}],["workspace_id","query",0,{"t":"integer"}]],["application/x-www-form-urlencoded",{"p":{"distinct_id":{"t":"string"},"distinct_ids":{"t":"string"},"data_group_id":{"t":"string"},"where":{"t":"string"},"output_properties":{"t":"array","i":{"t":"string"}},"session_id":{"t":"string"},"page":{"t":"integer"},"behaviors":{"t":"integer"},"as_of_timestamp":{"t":"integer"},"filter_by_cohort":{"t":"string"},"include_all_users":{"t":"boolean"}}}]],[[["project_id","query",1,{"t":"integer"}],["workspace_id","query",0,{"t":"integer"}],["funnel_id","query",1,{"t":"integer"}],["from_date","query",1,{"t":"string"}],["to_date","query",1,{"t":"string"}],["length","query",0,{"t":"integer"}],["length_unit","query",0,{"t":"string","e":["day","hour","minute","second"]}],["interval","query",0,{"t":"integer"}],["unit","query",0,{"t":"string","e":["day","week","month"]}],["on","query",0,{"t":"string"}],["where","query",0,{"t":"string"}],["limit","query",0,{"t":"integer"}]],0],[[["project_id","query",1,{"t":"integer"}],["workspace_id","query",0,{"t":"integer"}]],0],[[["project_id","query",1,{"t":"integer"}],["workspace_id","query",0,{"t":"integer"}],["bookmark_id","query",1,{"t":"integer"}]],0],[[["project_id","query",1,{"t":"integer"}],["workspace_id","query",0,{"t":"integer"}],["from_date","query",1,{"t":"string"}],["to_date","query",1,{"t":"string"}],["retention_type","query",0,{"t":"string","e":["birth","compounded"]}],["born_event","query",0,{"t":"string"}],["event","query",0,{"t":"string"}],["born_where","query",0,{"t":"string"}],["where","query",0,{"t":"string"}],["interval","query",0,{"t":"integer"}],["interval_count","query",0,{"t":"integer"}],["unit","query",0,{"t":"string","e":["day","week","month"]}],["unbounded_retention","query",0,{"t":"boolean"}],["on","query",0,{"t":"string"}],["limit","query",0,{"t":"integer"}]],0],[[["project_id","query",1,{"t":"integer"}],["workspace_id","query",0,{"t":"integer"}],["distinct_ids","query",1,{"t":"string"}],["from_date","query",1,{"t":"string"}],["to_date","query",1,{"t":"string"}]],0],[[["strict","query",1,{"t":"string","e":["0","1"]}],["project_id","query",1,{"t":"string"}]],["application/json",{"t":"array","i":{"t":"object","p":{"event":{"t":"string"},"properties":{"t":"object","p":{"time":{"t":"integer"},"distinct_id":{"t":"string"},"$insert_id":{"t":"string"}},"r":["time","$insert_id","distinct_id"],"m":{}}},"r":["event","properties"]}},1]]]}',
20
+ };