@zackbart/connecta 0.17.0 → 0.18.1

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.
@@ -1,27 +1,25 @@
1
1
  # Stripe prebuilt connection
2
2
 
3
3
  Import `stripe()` independently from `@zackbart/connecta/providers/stripe`. It
4
- wraps [Stripe's hosted MCP server](https://docs.stripe.com/mcp) with a required
5
- production/sandbox mode, OAuth by default, a mode-scaled admission policy, a
4
+ wraps [Stripe's hosted MCP server](https://docs.stripe.com/mcp) with OAuth by
5
+ default, account-scoped mode guidance, a conservative admission policy, a
6
6
  task-oriented usage guide, and a vetted safety classification. It adds no
7
7
  provider dependency and is not reachable from Connecta's root entry.
8
8
 
9
9
  ```ts
10
10
  import { stripe } from "@zackbart/connecta/providers/stripe";
11
11
 
12
- const billing = stripe("stripe_live", {
13
- mode: "production",
14
- title: "Stripe (production)",
15
- purpose: "Revenue, disputes, and refunds for the real business",
12
+ const billing = stripe("stripe", {
13
+ purpose: "Revenue, disputes, and refunds across our Stripe organization",
16
14
  instructions: "Never refund above $500 without a human in the loop.",
17
15
  });
18
16
  ```
19
17
 
20
18
  The `id` owns the ordinary connector namespaces. Choose a connector boundary
21
- for its credential or OAuth session, mode, and business purpose — not
22
- automatically for each Stripe account. One OAuth session may cover more than
23
- one account in the same Stripe organization. Use separate connectors when the
24
- credential, production/sandbox mode, or business purpose differs.
19
+ for its credential or OAuth session and business purpose — not automatically
20
+ for each Stripe account. One OAuth session may cover live and sandbox accounts
21
+ in the same Stripe organization. Use separate connectors when the credential
22
+ or business purpose differs.
25
23
 
26
24
  `purpose` is required because it tells an agent where the deployment intends
27
25
  to route a question. The connector id, title, and purpose are configuration,
@@ -29,49 +27,37 @@ not proof of which account the authenticated Stripe session will use. Account
29
27
  `instructions` are appended to the maintained guide and cannot change the
30
28
  connector's safety classification.
31
29
 
32
- ## Mode is required, and it is the whole point
30
+ ## OAuth mode belongs to the selected account
33
31
 
34
- `mode` accepts `"production"` or `"sandbox"` and has **no default**. There is no
35
- safe guess between an account that moves real money and one that does not, so
36
- the deployment has to say which it configured.
32
+ Do not pass `mode` for OAuth. Stripe's `list_available_accounts_or_orgs` returns
33
+ each available account with its `stripe_context` and `livemode`. The same OAuth
34
+ session can return both `livemode: true` and `livemode: false` results.
37
35
 
38
- Stripe publishes exactly one endpoint `https://mcp.stripe.com/` and the
39
- environment is selected by the credential, not the URL. Connecta therefore
40
- cannot *route* by mode; what it can do is make the mode impossible for an agent
41
- to miss, and refuse a deployment whose declaration and credential disagree.
36
+ The served guide tells agents to call that tool before each account-scoped
37
+ operation. They select the intended result and carry its exact `stripe_context`
38
+ and `livemode` unchanged. Connector id, title, purpose, and OAuth identity are
39
+ routing hints. They never prove the account or mode. Ambiguity stops the call.
42
40
 
43
- `mode` shows up in four places an agent actually reads:
41
+ OAuth metadata therefore stays neutral:
44
42
 
45
- - the default `title` (`Stripe (production)` / `Stripe (sandbox)`);
46
- - the `description`, which is what `search_tools` ranks and returns — production
47
- reads `Stripe payments (production live money and real customers) — …`,
48
- sandbox reads `Stripe payments (sandbox — test data, no real money) — …`;
49
- - the first two lines of the usage guide, which state the mode and then say
50
- either "every write moves real money a refund cannot be undone" or "never
51
- answer a question about live revenue, payouts, or a named customer from this
52
- connector";
53
- - the admission policy, below.
43
+ - the default title is `Stripe`;
44
+ - the description says `live and sandbox accounts`;
45
+ - the guide warns that live writes move real money and sandbox writes change
46
+ test data;
47
+ - admission uses the stricter sandbox ceiling, because Connecta cannot select
48
+ a different connector policy after the account-scoped call begins.
54
49
 
55
- And one place a deployment author reads: if `auth` is a `headers` credential
56
- carrying a recognizable Stripe key prefix (`sk_`, `rk_`, or `pk_` with `_live_`
57
- or `_test_`), construction throws when the key's mode contradicts the declared
58
- one. That check reads nothing it cannot classify — an OAuth connector, or a
59
- credential shape this release does not recognize, is left alone rather than
60
- guessed at — and the error names only the two modes, never the key.
50
+ `mode` remains required for `headers` auth. A restricted key has one fixed live
51
+ or sandbox scope. Its title, description, guide, and admission policy keep the
52
+ fixed-mode behavior. Construction still throws when a recognizable key prefix
53
+ contradicts its declared mode.
61
54
 
62
- Deploy production and sandbox side by side. Two instances are isolated exactly
63
- like two hand-written connectors with different ids: separate addresses,
64
- catalogs, credentials, storage, admission counters, and health.
55
+ For OAuth, deploy one connector for the session:
65
56
 
66
57
  ```ts
67
58
  connectors: [
68
- stripe("stripe_live", {
69
- mode: "production",
70
- purpose: "Revenue, disputes, and refunds for the real business",
71
- }),
72
- stripe("stripe_sandbox", {
73
- mode: "sandbox",
74
- purpose: "Rehearsing billing changes before they touch production",
59
+ stripe("stripe", {
60
+ purpose: "Live and sandbox billing for our Stripe organization",
75
61
  }),
76
62
  ]
77
63
  ```
@@ -86,12 +72,9 @@ says one OAuth session can be tied to more than one account in the same Stripe
86
72
  organization. It does not say every session has multiple accounts.
87
73
 
88
74
  That scope changes what an agent must prove before an account-scoped call. It
89
- must resolve the intended organization account, inspect the selected tool's
90
- live input schema, and carry only the exact account or context field that
91
- schema exposes. If more than one account fits, or the live schema exposes no
92
- clear selection mechanism, the agent stops and asks. It never guesses from the
93
- connector id, title, or purpose, and it never invents an MCP argument or
94
- request header.
75
+ calls `list_available_accounts_or_orgs`, resolves the intended result, and
76
+ carries its exact `stripe_context` and `livemode`. If more than one account
77
+ fits, the agent stops and asks.
95
78
 
96
79
  Stripe also accepts a
97
80
  [restricted API key](https://docs.stripe.com/keys#create-restricted-api-key) as
@@ -131,10 +114,8 @@ stripe("merchant_42", {
131
114
  });
132
115
  ```
133
116
 
134
- Administrators must enable MCP access in the Stripe Dashboard. Stripe scopes
135
- OAuth session management and MCP access **separately for sandbox and live
136
- mode**. A connector that boots but cannot list tools is usually a dashboard
137
- toggle, not a bad key.
117
+ Administrators must enable MCP access in the Stripe Dashboard. A connector that
118
+ boots but cannot list tools is usually a dashboard toggle, not a bad key.
138
119
 
139
120
  ## The eleven tools, and what they are classified as
140
121
 
@@ -189,14 +170,23 @@ prefixes (`cus_`, `sub_`, `ch_`, `pi_`, `in_`, `acct_`), a plausible-looking one
189
170
  belongs to a different object or to nobody, and the id a write takes comes from
190
171
  `stripe_api_search` or a list read rather than from a guess.
191
172
 
192
- Account selection comes before that object-id rule. The served guide warns
193
- that the connector metadata states routing intent rather than authenticated
194
- identity. It tells the agent to use only selectors in the live tool schema and
195
- to stop when the account or selection mechanism is ambiguous. It also keeps
173
+ Account selection comes before that object-id rule. The served guide names
174
+ `list_available_accounts_or_orgs`, `stripe_context`, and `livemode`, and tells
175
+ the agent to stop when the account, mode, or selector is ambiguous. It keeps
196
176
  organization-account selection separate from the restricted-key-only Connect
197
177
  path, so an agent cannot repair uncertainty by fabricating `Stripe-Account` as
198
178
  a tool argument.
199
179
 
180
+ The guide also carries the reduction advice the generic schemas cannot (P7):
181
+ a list or search read that returns full objects belongs inside `execute_code`,
182
+ projected to the fields the question needs before `return`, because an
183
+ unprojected list truncates and a projected one keeps customer PII out of the
184
+ transcript. It names Stripe search's per-resource field set — charges search
185
+ has no `payment_intent` field, so the path is the PaymentIntent's
186
+ `latest_charge` — and the account → search → details → read sequence as one
187
+ program rather than four turns, and it names `outcome`, `failure_code`, and
188
+ `failure_message` on the charge as the answer to "why did this payment fail".
189
+
200
190
  Stripe publishes no stability or deprecation policy for this tool set and
201
191
  invites tool requests by email, so treat the list as unversioned. `get_balance_summary`
202
192
  is Treasury, which Stripe labels public preview and gates behind an access
@@ -210,9 +200,10 @@ Stripe documents no rate limit specific to the MCP server. The connection
210
200
  therefore transcribes the account limit that MCP traffic spends
211
201
  ([rate limits](https://docs.stripe.com/rate-limits)): **100 requests per second
212
202
  in live mode, 25 in a sandbox**, and any single endpoint is capped at 25 per
213
- second regardless of mode, so paging one list is the real constraint. The
214
- `maxConcurrency` beside it 8 for
215
- production, 4 for sandbox is Connecta's own conservative choice: Stripe
203
+ second regardless of mode. OAuth uses 25 calls per second and concurrency 4,
204
+ the safe bound for a session that can reach either mode. Fixed live credentials
205
+ use 100 calls per second and concurrency 8. Fixed sandbox credentials use 25
206
+ and concurrency 4. Stripe
216
207
  documents that per-account and per-endpoint concurrency limits exist, and
217
208
  surface as `429` with a `Stripe-Rate-Limited-Reason` of `global-concurrency` or
218
209
  `endpoint-concurrency`, but publishes no number.
@@ -226,14 +217,9 @@ admission and still needs restrained use.
226
217
 
227
218
  ## What is not verified
228
219
 
229
- Stripe's MCP documentation is silent on two things this connection had to reason
220
+ Stripe's MCP documentation is silent on one thing this connection had to reason
230
221
  about rather than read:
231
222
 
232
- - **How an OAuth session resolves to live versus sandbox at call time.** Stripe
233
- says sessions are "scoped to … the current environment (live mode or a
234
- sandbox)" and that dashboard access is managed separately per environment, but
235
- never states the mechanism. The key-prefix check covers `headers` auth only;
236
- for OAuth, `mode` is a declaration Connecta surfaces and cannot verify.
237
223
  - **Whether pagination cursors and `Idempotency-Key` are passable through
238
224
  `stripe_api_read` / `stripe_api_write`.** The conventions in the usage guide
239
225
  are Stripe's documented API conventions; how they thread through the generic
@@ -57,7 +57,7 @@ exist so far:
57
57
  | --- | --- | --- |
58
58
  | **pre-template** | before 0.10.2 | no `connecta init` existed; hand-written, or copied from the retired `examples/node` |
59
59
  | **A** | 0.10.2 – 0.15.1 | `.env.example`, `.gitignore`, `AGENTS.md`, `CLAUDE.md`, `README.md`, `package.json`, `src/index.ts`, `tsconfig.json` |
60
- | **B** | 0.16.0 – 0.17.0 | adds `.dockerignore`, `Dockerfile`, `docker-compose.yml`, and `src/file-activity.ts`; `src/index.ts` grows the four commented operator blocks; `.env.example` ships `CONNECTA_TOKEN=` empty |
60
+ | **B** | 0.16.0 – 0.18.1 | adds `.dockerignore`, `Dockerfile`, `docker-compose.yml`, and `src/file-activity.ts`; `src/index.ts` grows the four commented operator blocks; `.env.example` ships `CONNECTA_TOKEN=` empty |
61
61
 
62
62
  Generation A is a decade in template years and identifying it precisely does
63
63
  not matter, because you are about to reconstruct it exactly rather than guess
@@ -106,7 +106,7 @@ know what to preserve, once to know what to re-verify at the end.
106
106
  ### Bump the pin and install
107
107
 
108
108
  ```sh
109
- npm pkg set dependencies.@zackbart/connecta=0.17.0
109
+ npm pkg set dependencies.@zackbart/connecta=0.18.1
110
110
  npm install
111
111
  ```
112
112
 
@@ -130,7 +130,7 @@ Generate the *current* template beside the base you already made, into the same
130
130
  `$SCRATCH`:
131
131
 
132
132
  ```sh
133
- (cd "$SCRATCH" && npx @zackbart/connecta@0.17.0 init current)
133
+ (cd "$SCRATCH" && npx @zackbart/connecta@0.18.1 init current)
134
134
  ```
135
135
 
136
136
  You now have a three-way merge with a real base: `$SCRATCH/base` is what this
@@ -186,7 +186,7 @@ A deployment older than 0.10.2 has no base to diff against. Do not try to
186
186
  manufacture one. Instead:
187
187
 
188
188
  1. `SCRATCH=$(mktemp -d)`, then
189
- `(cd "$SCRATCH" && npx @zackbart/connecta@0.17.0 init current)` — there is no
189
+ `(cd "$SCRATCH" && npx @zackbart/connecta@0.18.1 init current)` — there is no
190
190
  `base` leg here, only the current template to read from.
191
191
  2. Copy `$SCRATCH/current` into the deployment file by file, **skipping
192
192
  `src/index.ts`**.
@@ -207,6 +207,34 @@ first, so cross them bottom-up: start at the oldest one still above this
207
207
  deployment's pin and work back up the page, because each boundary assumes the
208
208
  older ones are already done.
209
209
 
210
+ ### 0.18.0 → 0.18.1
211
+
212
+ Nothing throws, no option moves, and every deployment crosses this on the
213
+ version bump alone. The release adds one provider subpath,
214
+ `@zackbart/connecta/providers/revenuecat`, and rewrites guide text inside the
215
+ `mixpanel()` and `stripe()` connections; a deployment that constructs neither
216
+ sees no change, and one that does gets better first-line advice for the same
217
+ constructor calls. Clients that cache connector guides should refresh them
218
+ after upgrading.
219
+
220
+ ### 0.17.0 → 0.18.0
221
+
222
+ One floor moves and one always-loaded surface shrinks; neither changes a
223
+ deployment's configuration.
224
+
225
+ **Node 22 is the minimum supported release.** The published engine range and
226
+ the Node template both declare `>=22.0.0`, matching the template's
227
+ `node:22-slim` image. A Docker deployment already runs Node 22; a bare-metal
228
+ deployment on Node 20 must upgrade its runtime before taking this version.
229
+ Worker deployments are unaffected (#422).
230
+
231
+ **Model-facing guidance is split by load cost.** MCP instructions and tool
232
+ definitions now carry route selection, the fail-closed boundary, and minimum
233
+ guest syntax. Detailed selection, repair, runtime, and example guidance moved
234
+ to the existing `skills({ name: "usage" })` response. Clients that never fetch
235
+ the skill keep the same routes and need no deployment change; clients that
236
+ cache tool definitions should refresh them after upgrading (#418).
237
+
210
238
  ### 0.16.1 → 0.17.0
211
239
 
212
240
  Two construction rules need a deployment check.
package/ethos.md CHANGED
@@ -71,6 +71,7 @@ proposing one without a new argument is not.
71
71
  | Runtime connector registration | refused | config-as-code is the security model |
72
72
  | Prebuilt connections as the preferred authoring path | accepted | an a-la-carte provider constructor, imported and constructed in the deployment file, encodes maintained defaults for providers connecta actually uses — preferred *when maintained*, with no promise of one per provider; it returns exactly one ordinary `Connector` with no extra privileges — never a bundle, a group, a preset, or a registry — its tools are hand-written or proxied from a downstream MCP catalog, never generated from a schema document; its vetted annotations classify what the downstream leaves unannotated and otherwise preserve explicit annotations, with one fail-closed exception: a release-reviewed destructive classification outranks a contradictory downstream `readOnlyHint: true`, because Connecta has independently established that the tool mutates existing state; `remoteMcp()` and `api()` stay first-class ([#297](https://github.com/zackbart/connecta/issues/297), [#315](https://github.com/zackbart/connecta/issues/315)) |
73
73
  | Guarded raw REST escape hatches in a prebuilt connection | accepted | a large, fast-moving provider cannot be honestly represented by a small frozen list: a GET-only tool may expose provider-relative reads, while JSON mutations and explicit-content uploads stay separate and always cross the destructive boundary; the connector owns authentication, rate limits, error mapping, URL confinement, and safe method classification, while the provider token remains the capability boundary — this is not schema ingestion, runtime connector registration, or permission widening |
74
+ | Expanded Notion page create/update options | refused | the maintained writes own explicit parents, authored content, property replacement, and reversible trash; workspace-private creation, placement, richer media, coordination locks, asynchronous templates, and irreversible child erasure are different ownership, ordering, file, coordination, or deletion workflows, not missing fields — keep the approval names honest and use a custom `api()` connector when a deployment needs one ([#408](https://github.com/zackbart/connecta/issues/408), [#409](https://github.com/zackbart/connecta/issues/409)) |
74
75
  | Hosted-provider drift detection during catalog refreshes | accepted | a vetted classification is a claim about somebody else's catalog, and an allowlist nobody can tell is stale is an allowlist that is wrong — so each maintained hosted-MCP proxy ships the tool names, classifications, and (once a release records them) schemas it reviewed, and compares them against the live listing *inside* a catalog refresh the deployment already asked for; the boundary is the piggyback itself, which is what keeps this from being proactive credential liveness wearing a new hat ([#179](https://github.com/zackbart/connecta/issues/179)): no scheduled job, no background request, no credential probe, and not one byte of network traffic that would not have happened anyway; what it produces is four counts — unclassified additions, names no longer served, explicit annotation conflicts, schema changes — on connector status, `connecta doctor`, and one payload-free activity event with nowhere to put a tool name or a schema; the two read surfaces answer for the runtime that served the refresh, because the observation is isolate-local and only the activity event is durable, and unknown tools already fail closed, so drift costs approval round trips and stale guidance rather than capability ([#343](https://github.com/zackbart/connecta/issues/343)) |
75
76
  | Provider registry / integration marketplace | refused | prebuilt connections are imports, not listings; discovery happens in documentation, never at runtime ([#297](https://github.com/zackbart/connecta/issues/297)) |
76
77
  | Protocol sessions & server push | refused | stateless per request |
@@ -85,6 +86,7 @@ proposing one without a new argument is not.
85
86
  | Structured result surface | accepted | canonical `structuredContent` plus complete compact `content`; summary-only text is gated on host-forwarding evidence ([#191](https://github.com/zackbart/connecta/issues/191)) |
86
87
  | Code mode (`execute_code`) | accepted | the primary read, discovery, and composition surface: smaller serialized definitions, far smaller results once composition and projection happen before the model sees them, and a cold-start model that read the interface without help ([exploration](./documentation/code-first-exploration.md), [#224](https://github.com/zackbart/connecta/issues/224)) |
87
88
  | Code-first as the default; the eval gate retired | accepted | owner decision, 2026-07-30: one operator, no deploy-time flip; [`eval/code-first-gate`](https://github.com/zackbart/connecta/blob/main/eval/code-first-gate/README.md) survives as measurement, but nothing waits on its verdict ([#222](https://github.com/zackbart/connecta/issues/222), [#224](https://github.com/zackbart/connecta/issues/224)) |
89
+ | Always-loaded routing, on-demand execution detail | accepted | every conversation pays for MCP instructions and seven serialized definitions, so they carry only route selection, the fail-closed boundary, and the minimum guest syntax; selection detail, examples, runtime differences, and repair live in the existing byte-identical `usage` skill, fetched at most once per task — no new skill surface or deployment option ([#418](https://github.com/zackbart/connecta/issues/418)) |
88
90
  | Surface consolidation to seven tools | accepted | `list_connectors`, `describe_tools`, and `batch_call` fold into the program surface, deleting the routing choice between direct calls, batches, discovery, and execution; `call_tool` stays because a simple call is not cheaper through code ([#224](https://github.com/zackbart/connecta/issues/224)) |
89
91
  | Classic (executor-free) surface | removed | supersedes its provisional retention under [#224](https://github.com/zackbart/connecta/issues/224) — an executor is mandatory, and a deployment without one refuses to boot rather than serving a fallback shape ([#273](https://github.com/zackbart/connecta/issues/273)) |
90
92
  | Connector shortcut namespaces in programs | accepted | sugar over canonical addressing, kept but frozen — every expansion invents a collision class `<connectorId>.<toolName>` already solved ([#223](https://github.com/zackbart/connecta/issues/223)) |
@@ -100,6 +102,7 @@ proposing one without a new argument is not.
100
102
  | Inbound-demand catalog stale-while-revalidate | accepted | an agent-facing catalog read may return a complete, fingerprint-verified entry inside its configured stale window and move the refresh that same read demanded onto the runtime's existing deferred-work channel; this originates no timer, schedule, warmup, or credential probe, and operator status remains blocking — one refresh per connector is shared across agent and operator requests, a deferred owner uses a fresh bounded signal and connector scope and closes that scope, and invalidation is rechecked before stale publication, so no request-bound capability survives and no partial or pre-invalidation catalog gains authority ([#396](https://github.com/zackbart/connecta/issues/396)) |
101
103
  | Rich program output (`connecta.emit`) | accepted | one host-collected emission channel: programs emit strictly validated text/image/audio blocks, delivered after the result envelope on success only; budgets fail loudly at the emit call ([design record](./documentation/rich-output-design.md), [#267](https://github.com/zackbart/connecta/issues/267)) |
102
104
  | Result-channel widening of the `Executor` contract | refused | `ExecuteResult` stays `{ result, error?, logs? }` — structural compatibility with `@cloudflare/codemode` is the parity guarantee; emission rides the provider bridge instead ([#267](https://github.com/zackbart/connecta/issues/267)) |
105
+ | Erasable TypeScript in `execute_code` | refused | a location-preserving prototype accepted annotations, return types, assertions, aliases, interfaces, and erased generics at ~8.3 µs median transform cost, but `ts-blank-space` drags a 23.68 MB installed TypeScript dependency into the fetch-native core and no runnable agent arm established a first-run or repair benefit; the plain-JavaScript contract stands until new measured model evidence earns that package and parity cost ([evidence](https://github.com/zackbart/connecta/blob/main/eval/current-version/results/issue-419-evidence.md), [#419](https://github.com/zackbart/connecta/issues/419)) |
103
106
  | Guest-emitted `resource` / `resource_link` blocks | refused | a program can never mint a URI a client may dereference, and the carve-out this row waited on does not need one: `connecta.ui` takes HTML content, and the only `ui://` URI is connecta's build-time shell ([design record](./documentation/mcp-ui-design.md), [#266](https://github.com/zackbart/connecta/issues/266), [#267](https://github.com/zackbart/connecta/issues/267)) |
104
107
  | Provenance tracking for emitted content | refused | everything a program emits is program output; handles or attribution labels are capability-shaped machinery that changes no client's trust posture ([#267](https://github.com/zackbart/connecta/issues/267)) |
105
108
  | Program-generated UI (`connecta.ui` + the Apps shell) | accepted | one MCP Apps view per successful run: the program supplies HTML only, delivered in result `_meta`, which hosts keep out of model context, and rendered by connecta's static shell inside the host's sandboxed frame ([design record](./documentation/mcp-ui-design.md), [#266](https://github.com/zackbart/connecta/issues/266)) |
@@ -143,7 +146,4 @@ Breaking one is not a bug fix — it is a design change wearing a disguise.
143
146
  the wrong shape is worse than one that refuses to boot.
144
147
 
145
148
  ---
146
-
147
- Connecta began as a radical simplification of
148
- [executor](https://github.com/UsefulSoftwareCo/executor). The table above is
149
- the record of that simplification holding.
149
+ Connecta began as a radical simplification of [executor](https://github.com/UsefulSoftwareCo/executor); the table above is the record of that simplification holding.
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@zackbart/connecta",
3
- "version": "0.17.0",
3
+ "version": "0.18.1",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "description": "One MCP to rule them all — a single MCP endpoint aggregating many downstream connectors behind a code-first surface of seven meta-tools.",
7
7
  "license": "MIT",
8
8
  "engines": {
9
- "node": ">=20.9.0"
9
+ "node": ">=22.0.0"
10
10
  },
11
11
  "publishConfig": {
12
12
  "access": "public"
@@ -79,6 +79,10 @@
79
79
  "types": "./dist/providers/notion.d.ts",
80
80
  "import": "./dist/providers/notion.js"
81
81
  },
82
+ "./providers/revenuecat": {
83
+ "types": "./dist/providers/revenuecat.d.ts",
84
+ "import": "./dist/providers/revenuecat.js"
85
+ },
82
86
  "./providers/stripe": {
83
87
  "types": "./dist/providers/stripe.d.ts",
84
88
  "import": "./dist/providers/stripe.js"
@@ -8,6 +8,13 @@ npm install
8
8
  CONNECTA_TOKEN=dev-token npm start
9
9
  ```
10
10
 
11
+ The manifest approves only `esbuild@0.28.2` to run its install script. `tsx`
12
+ uses esbuild to run this TypeScript source, so that script is part of the
13
+ prescribed runtime path. npm 11 therefore installs without an unreviewed-script
14
+ warning, and npm 12 does not block the script. A later esbuild version needs a
15
+ new explicit review and approval; do not replace the pinned entry with a broad
16
+ package-name approval.
17
+
11
18
  Then point an MCP client at `http://localhost:8787/mcp` with
12
19
  `Authorization: Bearer dev-token`.
13
20
 
@@ -4,7 +4,10 @@
4
4
  "version": "0.0.0",
5
5
  "type": "module",
6
6
  "engines": {
7
- "node": ">=20.9.0"
7
+ "node": ">=22.0.0"
8
+ },
9
+ "allowScripts": {
10
+ "esbuild@0.28.2": true
8
11
  },
9
12
  "scripts": {
10
13
  "doctor": "connecta doctor",
@@ -12,7 +15,7 @@
12
15
  "typecheck": "tsc --noEmit"
13
16
  },
14
17
  "dependencies": {
15
- "@zackbart/connecta": "0.17.0",
18
+ "@zackbart/connecta": "0.18.1",
16
19
  "quickjs-emscripten": "0.32.0"
17
20
  },
18
21
  "devDependencies": {