@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.
- package/CHANGELOG.md +133 -0
- package/README.md +79 -114
- package/dist/catalog-service.d.ts +6 -0
- package/dist/catalog-service.js +69 -4
- package/dist/execute.d.ts +2 -0
- package/dist/execute.js +43 -17
- package/dist/meta-tools.js +9 -9
- package/dist/providers/mixpanel.js +4 -1
- package/dist/providers/revenuecat.d.ts +77 -0
- package/dist/providers/revenuecat.js +314 -0
- package/dist/providers/stripe.d.ts +23 -22
- package/dist/providers/stripe.js +63 -32
- package/dist/routes/ui.js +1 -1
- package/dist/skills.d.ts +1 -1
- package/dist/skills.js +53 -16
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/documentation/architecture.md +1 -1
- package/documentation/code-mode.md +23 -15
- package/documentation/connector-guides.md +7 -10
- package/documentation/connectors.md +1 -0
- package/documentation/meta-tools.md +27 -2
- package/documentation/notion.md +17 -0
- package/documentation/operations.md +11 -10
- package/documentation/provider-audit.md +45 -7
- package/documentation/provider-conventions.md +24 -15
- package/documentation/revenuecat.md +279 -0
- package/documentation/stripe.md +53 -67
- package/documentation/upgrading.md +32 -4
- package/ethos.md +4 -4
- package/package.json +6 -2
- package/templates/node/README.md +7 -0
- package/templates/node/package.json +5 -2
package/documentation/stripe.md
CHANGED
|
@@ -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
|
|
5
|
-
|
|
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("
|
|
13
|
-
|
|
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
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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
|
-
##
|
|
30
|
+
## OAuth mode belongs to the selected account
|
|
33
31
|
|
|
34
|
-
`mode`
|
|
35
|
-
|
|
36
|
-
|
|
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
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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
|
-
|
|
41
|
+
OAuth metadata therefore stays neutral:
|
|
44
42
|
|
|
45
|
-
- the default
|
|
46
|
-
- the
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
-
|
|
50
|
-
|
|
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
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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
|
-
|
|
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("
|
|
69
|
-
|
|
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
|
-
|
|
90
|
-
|
|
91
|
-
|
|
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.
|
|
135
|
-
|
|
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
|
|
193
|
-
|
|
194
|
-
|
|
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
|
|
214
|
-
|
|
215
|
-
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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": ">=
|
|
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"
|
package/templates/node/README.md
CHANGED
|
@@ -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": ">=
|
|
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.
|
|
18
|
+
"@zackbart/connecta": "0.18.1",
|
|
16
19
|
"quickjs-emscripten": "0.32.0"
|
|
17
20
|
},
|
|
18
21
|
"devDependencies": {
|