@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.
- package/CHANGELOG.md +66 -0
- package/README.md +21 -16
- package/bin/connecta.mjs +1 -0
- package/bin/version.mjs +1 -1
- package/dist/auth-elicitation.js +1 -1
- package/dist/call-recovery.js +25 -0
- package/dist/catalog-service.js +7 -2
- package/dist/config-schema.d.ts +14 -7
- package/dist/config-schema.js +29 -10
- package/dist/config-value-sources.js +6 -3
- package/dist/config.d.ts +26 -8
- package/dist/config.js +38 -16
- package/dist/connector-access.d.ts +2 -1
- package/dist/connectors/guarded-fetch.d.ts +18 -1
- package/dist/connectors/guarded-fetch.js +21 -2
- package/dist/describe-config.d.ts +6 -3
- package/dist/describe-config.js +3 -2
- package/dist/errors.d.ts +3 -1
- package/dist/errors.js +1 -0
- package/dist/execute.js +16 -14
- package/dist/index.js +4 -3
- package/dist/invocation.js +39 -4
- package/dist/meta-tools.js +17 -19
- package/dist/operator-record.d.ts +2 -2
- package/dist/operator-record.js +2 -0
- package/dist/operator-ui/contract.d.ts +5 -4
- package/dist/operator-ui/generated.js +2 -2
- package/dist/operator-ui/model.d.ts +1 -1
- package/dist/operator-ui/view.d.ts +9 -0
- package/dist/operator-ui/view.js +12 -0
- package/dist/program-writes.js +4 -49
- package/dist/provider.d.ts +6 -5
- package/dist/provider.js +3 -4
- package/dist/providers/_shared/google/workspace.js +1 -1
- package/dist/providers/_shared/rest/dispatch.js +41 -0
- package/dist/providers/_shared/rest/operation-index.d.ts +133 -0
- package/dist/providers/_shared/rest/operation-index.js +527 -0
- package/dist/providers/_shared/rest/tools.d.ts +141 -0
- package/dist/providers/_shared/rest/tools.js +569 -0
- package/dist/providers/_shared/rest/value-safety.d.ts +151 -0
- package/dist/providers/_shared/rest/value-safety.js +580 -0
- package/dist/providers/breeze/skill.generated.js +2 -2
- package/dist/providers/cloudflare/graphql.js +385 -0
- package/dist/providers/cloudflare/index.d.ts +47 -51
- package/dist/providers/cloudflare/index.js +188 -1997
- package/dist/providers/cloudflare/openapi.generated.js +3347 -0
- package/dist/providers/cloudflare/rest.d.ts +37 -0
- package/dist/providers/cloudflare/rest.js +1056 -0
- package/dist/providers/cloudflare/skill.generated.js +7 -4
- package/dist/providers/cloudflare/value-safety.js +1247 -0
- package/dist/providers/docs/index.d.ts +1 -1
- package/dist/providers/docs/index.js +2 -2
- package/dist/providers/drive/index.d.ts +1 -1
- package/dist/providers/drive/index.js +1 -1
- package/dist/providers/forms/index.d.ts +1 -1
- package/dist/providers/forms/index.js +2 -2
- package/dist/providers/github/skill.generated.js +2 -2
- package/dist/providers/gmail/index.d.ts +1 -1
- package/dist/providers/gmail/index.js +274 -23
- package/dist/providers/gmail/skill.generated.js +2 -2
- package/dist/providers/linear/index.js +1 -1
- package/dist/providers/mixpanel/index.d.ts +27 -12
- package/dist/providers/mixpanel/index.js +58 -6
- package/dist/providers/mixpanel/operations.js +20 -0
- package/dist/providers/mixpanel/rest.js +603 -0
- package/dist/providers/mixpanel/skill.generated.js +3 -2
- package/dist/providers/mixpanel/value-safety.js +16 -0
- package/dist/providers/notion/index.d.ts +35 -31
- package/dist/providers/notion/index.js +76 -1499
- package/dist/providers/notion/openapi.generated.js +75 -0
- package/dist/providers/notion/rest.d.ts +24 -0
- package/dist/providers/notion/rest.js +1186 -0
- package/dist/providers/notion/skill.generated.js +5 -4
- package/dist/providers/notion/value-safety.js +31 -0
- package/dist/providers/planning-center/index.d.ts +27 -0
- package/dist/providers/planning-center/index.js +286 -24
- package/dist/providers/planning-center/skill.generated.js +24 -4
- package/dist/providers/sheets/index.d.ts +1 -1
- package/dist/providers/sheets/index.js +3 -3
- package/dist/providers/slides/index.d.ts +1 -1
- package/dist/providers/slides/index.js +3 -3
- package/dist/providers/stripe/index.d.ts +26 -20
- package/dist/providers/stripe/index.js +103 -130
- package/dist/providers/stripe/openapi.generated.js +649 -0
- package/dist/providers/stripe/rest.d.ts +14 -0
- package/dist/providers/stripe/rest.js +395 -0
- package/dist/providers/stripe/skill.generated.js +7 -5
- package/dist/providers/stripe/value-safety.js +705 -0
- package/dist/providers/vercel/index.d.ts +31 -22
- package/dist/providers/vercel/index.js +96 -853
- package/dist/providers/vercel/openapi.generated.js +456 -0
- package/dist/providers/vercel/rest.d.ts +20 -0
- package/dist/providers/vercel/rest.js +1002 -0
- package/dist/providers/vercel/skill.generated.js +4 -5
- package/dist/providers/vercel/value-safety.js +328 -0
- package/dist/providers/wispr-flow/index.d.ts +14 -0
- package/dist/providers/wispr-flow/index.js +117 -0
- package/dist/providers/wispr-flow/skill.generated.js +8 -0
- package/dist/routes/mcp.js +30 -10
- package/dist/routes/operator.js +14 -7
- package/dist/routes/ui-config.js +2 -2
- package/dist/server.js +3 -0
- package/dist/skills.js +5 -4
- package/dist/tool-safety.js +13 -5
- package/dist/types.d.ts +1 -1
- package/dist/ui.d.ts +1 -1
- package/dist/ui.js +1 -1
- package/dist/usage-guide.js +3 -3
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/write-outcome.js +47 -0
- package/documentation/README.md +1 -0
- package/documentation/architecture.md +155 -28
- package/documentation/auth.md +86 -27
- package/documentation/code-mode.md +81 -72
- package/documentation/deploying.md +10 -5
- package/documentation/integrating.md +72 -9
- package/documentation/meta-tools.md +52 -38
- package/documentation/operating.md +11 -8
- package/documentation/operator-tests.md +2 -3
- package/documentation/operator-ui.md +9 -3
- package/documentation/provider-auth-migration.md +308 -0
- package/documentation/provider-migration-0.29.md +18 -6
- package/examples/worker/AGENTS.md +5 -0
- package/examples/worker/README.md +2 -2
- package/examples/worker/src/connecta.config.ts +5 -0
- package/package.json +7 -2
- package/templates/node/AGENTS.md +6 -4
- package/templates/node/README.md +6 -4
- package/templates/node/package.json +1 -1
- package/templates/node/src/connecta.config.ts +5 -0
- package/dist/providers/vercel/mcp-ownership.js +0 -212
- 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
|
-
|
|
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.
|
|
33
|
-
*
|
|
34
|
-
*
|
|
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
|
-
/**
|
|
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 =
|
|
362
|
-
|
|
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: "
|
|
379
|
+
kind: "dual",
|
|
367
380
|
readme: "Mixpanel",
|
|
368
|
-
bundle: {
|
|
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:
|
|
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
|
+
};
|