@zackbart/connecta 0.34.0 → 0.34.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.
Files changed (78) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/README.md +3 -2
  3. package/bin/version.mjs +1 -1
  4. package/dist/catalog-drift.d.ts +30 -26
  5. package/dist/catalog-drift.js +169 -84
  6. package/dist/catalog-service.js +1 -1
  7. package/dist/connectors/api-connector.d.ts +3 -0
  8. package/dist/connectors/api-connector.js +5 -1
  9. package/dist/connectors/option-shapes.js +1 -1
  10. package/dist/connectors/remote-mcp.d.ts +2 -0
  11. package/dist/connectors/remote-mcp.js +5 -1
  12. package/dist/describe-config.d.ts +2 -0
  13. package/dist/describe-config.js +1 -0
  14. package/dist/invocation.js +3 -2
  15. package/dist/meta-tools.js +3 -2
  16. package/dist/operator-ui/config-summary.js +3 -0
  17. package/dist/operator-ui/connection-map.js +2 -1
  18. package/dist/operator-ui/endpoints.js +1 -1
  19. package/dist/operator-ui/generated.js +3 -3
  20. package/dist/operator-ui/health.js +52 -0
  21. package/dist/operator-ui/overview.js +6 -17
  22. package/dist/operator-ui/view.d.ts +3 -4
  23. package/dist/operator-ui/view.js +29 -11
  24. package/dist/provider.d.ts +6 -1
  25. package/dist/provider.js +18 -1
  26. package/dist/providers/_shared/google/workspace.d.ts +3 -0
  27. package/dist/providers/_shared/google/workspace.js +1 -1
  28. package/dist/providers/basecamp/index.d.ts +2 -0
  29. package/dist/providers/breeze/index.d.ts +2 -0
  30. package/dist/providers/ccb/index.d.ts +2 -0
  31. package/dist/providers/ccb/index.js +1 -1
  32. package/dist/providers/cloudflare/index.d.ts +2 -0
  33. package/dist/providers/cloudflare/index.js +5 -1
  34. package/dist/providers/cloudflare/openapi.generated.js +3296 -3206
  35. package/dist/providers/cloudflare/rest.js +19 -0
  36. package/dist/providers/cloudflare/skill.generated.js +2 -2
  37. package/dist/providers/cloudflare/value-safety.js +51 -18
  38. package/dist/providers/intercom/index.d.ts +24 -0
  39. package/dist/providers/intercom/index.js +121 -0
  40. package/dist/providers/intercom/skill.generated.js +8 -0
  41. package/dist/providers/linear/index.js +204 -19
  42. package/dist/providers/linear/skill.generated.js +2 -2
  43. package/dist/providers/mixpanel/index.d.ts +2 -0
  44. package/dist/providers/mixpanel/index.js +21 -17
  45. package/dist/providers/mixpanel/skill.generated.js +1 -1
  46. package/dist/providers/notion/index.d.ts +2 -0
  47. package/dist/providers/notion/index.js +1 -1
  48. package/dist/providers/overflow/index.d.ts +2 -0
  49. package/dist/providers/planning-center/index.d.ts +2 -0
  50. package/dist/providers/revenuecat/index.d.ts +5 -3
  51. package/dist/providers/revenuecat/index.js +147 -7
  52. package/dist/providers/revenuecat/skill.generated.js +3 -3
  53. package/dist/providers/stripe/index.d.ts +2 -0
  54. package/dist/providers/stripe/index.js +50 -30
  55. package/dist/providers/stripe/skill.generated.js +2 -1
  56. package/dist/providers/tithely/index.d.ts +2 -0
  57. package/dist/providers/vercel/index.d.ts +2 -0
  58. package/dist/providers/vercel/index.js +1 -1
  59. package/dist/providers/vercel/openapi.generated.js +391 -374
  60. package/dist/providers/vercel/skill.generated.js +1 -1
  61. package/dist/providers/vercel/value-safety.js +14 -4
  62. package/dist/registry.d.ts +10 -14
  63. package/dist/registry.js +62 -62
  64. package/dist/routes/ui-data.js +8 -2
  65. package/dist/skills.js +8 -2
  66. package/dist/types.d.ts +18 -4
  67. package/dist/version.d.ts +1 -1
  68. package/dist/version.js +1 -1
  69. package/documentation/architecture.md +48 -5
  70. package/documentation/code-mode.md +7 -5
  71. package/documentation/integrating.md +55 -1
  72. package/documentation/meta-tools.md +2 -2
  73. package/documentation/operating.md +1 -1
  74. package/documentation/operator-tests.md +8 -2
  75. package/documentation/operator-ui.md +58 -11
  76. package/documentation/provider-auth-migration.md +22 -0
  77. package/package.json +5 -1
  78. package/templates/node/package.json +1 -1
@@ -283,7 +283,7 @@ signature is byte-identical to the one `search_tools` returns.
283
283
  integration is ambiguous. `safety: "readOnly"` selects stored read verdicts;
284
284
  `"approvalRequired"` selects stored write verdicts; omitted or `"all"` selects
285
285
  both. Search and describe rows carry `classification`. These filters grant no
286
- authority and change no call admission decision. On a read-only endpoint,
286
+ authority and change no call admission decision. On a read-only endpoint or connector,
287
287
  search and describe omit write tools (`W12`): a write is absent from every
288
288
  filter, and describing one is `unknown_tool`. `connecta.skill` guides are not
289
289
  filtered and may name such a write; calling it is still refused.
@@ -569,7 +569,7 @@ direct calls; and `input_required_invalid`, `input_required_limit`,
569
569
  | ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- |
570
570
  | `unknown_address` | no visible connector owns the tool address or grants the resource reader | false |
571
571
  | `unknown_tool` | the connector has no such tool | false |
572
- | `read_only_endpoint` | a program on a read-only endpoint attempted a write (`E4`) | false |
572
+ | `read_only_endpoint` | a program on a read-only endpoint or connector attempted a write (`E4`) | false |
573
573
  | `auth_required` | the credential is missing, expired, or rejected | false |
574
574
  | `invalid_args` | arguments or discovery bounds were rejected | false |
575
575
  | `not_found` | the downstream answered and the resource is not there — the one code that says skip this id rather than stop, raised only where the provider tells absence from a permission gap | false |
@@ -594,7 +594,7 @@ direct calls; and `input_required_invalid`, `input_required_limit`,
594
594
  sentence. A program cannot recover credentials — only an operator can — so stop
595
595
  and let the failure reach the model.
596
596
 
597
- **E4.** A tool classified as a write never runs on a read-only endpoint
597
+ **E4.** A tool classified as a write never runs on a read-only endpoint or connector
598
598
  (`W12`). A program's call is refused with `read_only_endpoint` before
599
599
  validation and before anything is sent. The refusal carries no `nextAction` and
600
600
  echoes no arguments: no route on that endpoint writes, so the program reports
@@ -702,7 +702,7 @@ errors retain their contributing connectors as well.
702
702
  Search counts, ranking, and term analysis retain every searched connector,
703
703
  including matches outside the returned page or beyond the requested offset.
704
704
  Each page rechecks current auth,
705
- grants, pool membership, and the endpoint's `readOnly`. Reading a stash inside a program carries
705
+ grants, pool membership, and endpoint OR connector `readOnly`. Reading a stash inside a program carries
706
706
  its dependencies forward to any new return stash. The page cap is the smallest
707
707
  of the deployment cap and contributing connectors' effective `maxResultBytes`.
708
708
  Read-only endpoints cannot page write results. A UUID is a handle, never a grant.
@@ -1026,7 +1026,9 @@ sent and records nothing: it was never an attempt (`W9`).
1026
1026
  Whether an endpoint writes belongs to deployment code. Every deployment sets
1027
1027
  `readOnly` for `/mcp` explicitly; construction fails without it. Each named pool inherits
1028
1028
  the deployment's `readOnly` unless it sets its own, in either direction. The
1029
- client owns approval; Connecta answers one question per endpoint: can it write.
1029
+ client owns approval. Every connector also accepts optional `readOnly?: boolean`
1030
+ (default `false`), enforced on every endpoint. Effective read-only is endpoint OR
1031
+ connector; setting connector `false` cannot reopen a read-only endpoint.
1030
1032
 
1031
1033
  ```ts
1032
1034
  createConnecta({
@@ -3,6 +3,21 @@
3
3
  Use this guide to change connectors in deployment configuration.
4
4
  [All agent routes](./README.md) are in the index.
5
5
 
6
+ ## Make one connection read-only
7
+
8
+ Every connector accepts optional `readOnly?: boolean`, defaulting to `false`:
9
+ `remoteMcp("notes", { url: "https://notes.example.com/mcp", auth: { type: "headers", headers: {} }, readOnly: true })`,
10
+ `api("tickets", { readOnly: true, tools: [] })`, and maintained providers such as
11
+ `stripe("billing", { purpose: "Revenue reports", auth: { type: "oauth" }, readOnly: true })`.
12
+ A custom `Connector` sets `readOnly: true` on its connector object.
13
+
14
+ Only tools classified read appear in search and describe, and every write or
15
+ unclassified tool call is refused before dispatch on every endpoint, including
16
+ maintainers' plain `/mcp`, programs, `call_tool`, and `call_destructive_tool`.
17
+ Effective read-only is endpoint `readOnly` OR connector `readOnly`; connector
18
+ `false` never widens an endpoint. Existing pool/deployment inheritance is unchanged.
19
+ Guides may still name unavailable tools. The operator UI shows a Read-only badge.
20
+
6
21
  ## Add or remove a connector
7
22
 
8
23
  Connectors are code-owned. Edit the deployment's `src/connecta.config.ts`;
@@ -92,7 +107,7 @@ const tracker = linear("tracker", {
92
107
  ```
93
108
 
94
109
  Linear defaults to OAuth; its read-only endpoint requests only the downstream
95
- read scope. That is separate from a Connecta `readOnly` endpoint. Read the installed `dist/providers/linear/index.d.ts` for API-key framing,
110
+ read scope. That is separate from Connecta endpoint or connector `readOnly`. Read the installed `dist/providers/linear/index.d.ts` for API-key framing,
96
111
  workspace instructions, and admission choices.
97
112
 
98
113
  The [human README](../README.md#what-you-can-connect) lists available
@@ -107,6 +122,34 @@ pool's `owner` instead ([auth guide](auth.md#pool-owners-for-google-workspace)).
107
122
  A request must not choose its own account. Gmail never sends mail, and Drive never permanently
108
123
  deletes files.
109
124
 
125
+ Intercom uses `intercom()` from `@zackbart/connecta/providers/intercom`:
126
+
127
+ ```ts
128
+ import { intercom } from "@zackbart/connecta/providers/intercom";
129
+
130
+ const support = intercom("support", {
131
+ purpose: "Customer support triage",
132
+ region: "eu",
133
+ });
134
+ // Add support to the deployment's connectors array.
135
+ ```
136
+
137
+ Set `region` explicitly to `"us"` or `"eu"` to match the workspace; AU is
138
+ unsupported. OAuth defaults to personal ownership because it acts as the
139
+ authorizing teammate. Non-loopback OAuth callbacks require an Intercom Customer
140
+ Support allowlist entry for the deployment's redirect URI before authorization
141
+ can complete. Alternatively, set `auth: { type: "credential" }` and connect an
142
+ API token through the [shared credential procedure](./auth.md#connect-a-shared-credential);
143
+ token auth defaults to shared ownership. Fin Operator tools require OAuth,
144
+ workspace availability and teammate permission. Their expected absence adds no
145
+ missing-tool drift; missing core tools still do. Schema coverage reports all
146
+ present reviewed tools as unpinned. Article operations, internal
147
+ notes and Operator actions can write; a note can reopen a snoozed conversation.
148
+ Use a read-only endpoint when writes are unwanted. Catalog review is based on
149
+ [Intercom's docs](https://developers.intercom.com/docs/guides/mcp), with unpinned
150
+ schemas; inspect live tools and the runtime guide before acting on sensitive
151
+ customer data.
152
+
110
153
  Wispr Flow uses OAuth only through `wisprFlow()` from
111
154
  `@zackbart/connecta/providers/wispr-flow`. It reaches the authorized account's
112
155
  Notetaker content, with personal and work accounts holding separate data.
@@ -116,6 +159,8 @@ reviewed classification includes task writes listed in Claude's directory even
116
159
  though Wispr's public help describes read-only access; discover the account's
117
160
  actual tools before assuming those writes exist.
118
161
 
162
+ For minimal Stripe OAuth/API-key examples with and without connector `readOnly`, see [Stripe setup](./provider-auth-migration.md#stripe). With an API key, prefer a restricted `rk_` key with only read permissions for read-only access; Stripe enforces it too.
163
+
119
164
  Stripe requires `auth`: `{ type: "oauth" }` reaches Stripe's hosted MCP
120
165
  server, and `{ type: "apiKey" }` with `mode` reaches Connecta's REST connector
121
166
  with an operator-managed key. Notion requires `auth` the same way:
@@ -221,6 +266,15 @@ for precedence, schema digests, and `unlisted: "hide"`. Review the behavior
221
266
  before declaring a read, and do not use classification to bypass provider target
222
267
  scopes or caller grants.
223
268
 
269
+ A reviewed name is required by default for drift comparison. Mark a tool
270
+ `optional: true` only when the downstream can omit it because of plan,
271
+ feature, or permission gating. For example, a remote `crm` connector can use
272
+ `classify: { tools: { list_accounts: "read", list_customers: { verdict: "read",
273
+ optional: true } } }`. Absence of `list_customers` then adds no unserved count;
274
+ when present, its verdict, annotations, and any pinned schema are still checked.
275
+ A missing schema pin means that tool's schema has not been verified against a
276
+ review. Zero schema changes alone does not establish a matching schema.
277
+
224
278
  ## A hand-written HTTP capability
225
279
 
226
280
  Define only the operations the deployment needs. Every `api()` tool needs a
@@ -35,7 +35,7 @@ is annotated `readOnlyHint: true, destructiveHint: false` on a read-only
35
35
  endpoint, and `readOnlyHint: false, destructiveHint: true` on a writable one.
36
36
  Approval belongs to the client. A read-only endpoint keeps all six tools, omits
37
37
  write tools from `search_tools` results and describe, and refuses every write
38
- call; `readOnly` never changes connector visibility or read grants. Guides
38
+ call. Connector `readOnly` applies the same restriction on every endpoint; effective read-only is endpoint OR connector. Neither setting changes connector visibility or read grants. Guides
39
39
  (`queryAnalysis.guideSummary`, `skills`, `connecta.skill`, skill
40
40
  `resources/read`) are documentation and may name tools the endpoint refuses. The four tools with structured-only success results
41
41
  advertise `outputSchema`. The two direct-call tools omit it because their default
@@ -533,7 +533,7 @@ cap and a 32 KiB program bridge ceiling, with UTF-8 alignment and forward progre
533
533
  returning pages unchanged can hit the program result cap. The admitted subject
534
534
  and principal, endpoint/pool, request origin, connector, and tool bindings must
535
535
  match. The host rechecks current access and whether the endpoint is read-only
536
- before returning each page; a read-only endpoint cannot read a write stash.
536
+ before returning each page; a read-only endpoint or connector cannot read a write stash.
537
537
  Caller arguments select no partition. A read-only endpoint never runs a write,
538
538
  so every write result it could page came from a writable endpoint.
539
539
 
@@ -24,7 +24,7 @@ descriptions. On a writable endpoint, programs and `call_destructive_tool` may
24
24
  write within the caller's grants, and `execute_code` is annotated as a write;
25
25
  the client controls approval. On a read-only endpoint, search and describe omit
26
26
  write tools and every write call is refused with `read_only_endpoint`, even one
27
- a connector guide names; tell the user rather than looking for another route. Never change pool, identity, or `readOnly` to work
27
+ a connector guide names; tell the user rather than looking for another route. A connector marked Read-only serves only read-classified tools even on a writable endpoint; writes and unclassified tools are omitted from search/describe and refused on every call path. Endpoint and connector restrictions compose by OR. Never change pool, identity, or `readOnly` to work
28
28
  around a refusal.
29
29
  [Routing between the call surfaces](./meta-tools.md#routing-between-the-call-surfaces)
30
30
  owns the full decision rules.
@@ -61,7 +61,7 @@ pool member, who gets the member page, with no tabs, on every path.
61
61
  | Activity | No calls | Activity | Member page, no activity request |
62
62
  | Settings | Snapshot without connectors or pools | Config | Member page, no configuration facts |
63
63
 
64
- Populated Overview has a failing connector, drift, auth and credential problems
64
+ Populated Overview has a failing connector, auth and credential problems
65
65
  and a tokenless agent in its attention list. Populated Endpoints shows who can use each endpoint; populated Tokens has one
66
66
  agent per slot state, with pools and last seen.
67
67
 
@@ -102,7 +102,13 @@ empty catalog counts zero.
102
102
  `test/browser/operator-overview.spec.ts` covers the Overview on the frozen v2
103
103
  fixtures: the status pill, stat labels and numbers, map columns, dashed read-only grants and dotted
104
104
  tokenless access; attention rows with their fix links, a copied fix prompt equal
105
- to the catalogue's text and a failing connector sorted first; the hover
105
+ to the catalogue's text, config order through a staggered full refresh, prototype-named
106
+ connector IDs during loading and failure, and stable single-card height when
107
+ its catalog empties. A single long-id, long-title card at 320, 390, 1024 and
108
+ 1440px covers all eight status labels, both auth scopes, with and without the
109
+ Read-only badge, tools and an action. Text rows stay single-line, full text
110
+ remains accessible, links stay focusable, and the detail header and Overview
111
+ attention rows retain their height; the hover
106
112
  sentence replacing the legend, and dimming; keyboard focus in column order with each node's sentence
107
113
  as its accessible name, Enter opening an endpoint's row and a connector; the
108
114
  narrow list, whose caller chips link where their map nodes do; an empty deployment; and a member at `/` getting the member page
@@ -68,15 +68,16 @@ parameters such as signed handoffs. A pool member sees the
68
68
  marks; a tokenless agent's mark is hollow). A dot legend counts each segment
69
69
  kind; the first two tiles link to their pages. At 760px and below the tiles
70
70
  sit two up, with People · Agents as one row across both.
71
- - **Needs attention.** One row per connector whose health is not ok, failing
72
- first, then one per agent in a pool whose token is missing or revoked. A
71
+ - **Needs attention.** One row per connector whose health is not ok, in
72
+ configuration order, then one per agent in a pool whose token is missing or revoked. A
73
73
  row names the problem ("crm needs authorization"), the endpoints it
74
74
  affects ("Affects /mcp and /mcp/team") or the agent URL it can't connect at,
75
- and links to the existing fix: Connect, Replace key, Inspect or Review on
75
+ and links to the existing fix: Connect, Replace key or Inspect on
76
76
  the connector's Connection tab, or Issue token on Tokens. A row with a
77
- problem code or drift also has Copy fix prompt. A problem keeps its row and
77
+ problem code also has Copy fix prompt. A problem keeps its row and
78
78
  prompt when the connector's detail read failed, prefixed "Details didn't
79
- load". With no rows it reads "All clear".
79
+ load". Surviving connector rows retain their order as individual reads settle,
80
+ even when their severity changes. With no rows it reads "All clear".
80
81
  - **Who reaches what.** The [connection map](#connection-map).
81
82
 
82
83
  ### Connection map
@@ -134,15 +135,37 @@ cells for the root), guarded grants' live verdicts, and read-only mode.
134
135
  ### Connectors
135
136
 
136
137
  One card per connector: title and id, one status pill, a Shared or Per person
137
- badge, its tool count over a read and write bar, and when it was last called.
138
+ badge, a Read-only badge when connector `readOnly` is enabled, its tool count over a read and write bar, and when it was last called.
138
139
  All, Needs attention and Healthy filter the cards, with counts, beside a
139
140
  search field. A connector that is not fine adds one action (Connect, Replace
140
- key, Inspect, or Review for drift) that opens its Connection tab.
141
+ key or Inspect) that opens its Connection tab.
141
142
 
142
143
  Every view shares one verdict per connector: the server's problem code first
143
144
  (a failed catalog reads "Catalog failed", never "Connected"), then a failed
144
- detail read ("Couldn't load", with no fix prompt), then a non-ok status, then
145
- catalog drift.
145
+ detail read ("Couldn't load", with no fix prompt), then a non-ok status.
146
+ Catalog drift is informational: it stays in the connector's Connection panel
147
+ with its fix prompt and in Activity, and never affects health or attention.
148
+
149
+ Health does not bounce while details load. A connector whose detail read is
150
+ in flight (its `/ui/data` row is `loading`, during sign-in, Retry or a
151
+ connector's Refresh) keeps the verdict the page last showed for it on every
152
+ view (cards, filter counts, the Overview headline, bar, attention list and map,
153
+ Endpoints and the connector page) until that read settles, never "Loading
154
+ details" or an in-between verdict. A connector with no earlier verdict shows
155
+ its contract status. Each connector changes only when its own read settles,
156
+ so one slow read never holds back the others and no row moves for an
157
+ in-between verdict. A new signed-in identity starts fresh. Cards reserve the action footer
158
+ even when no action is needed and the tool bar row even when the catalog is
159
+ empty. Each card header keeps its title, status and id/scope badges on single
160
+ lines; long text truncates with ellipsis and retains its full value on hover
161
+ and for screen readers. The connector detail header and Overview attention
162
+ text follow the same rule, and truncated links remain keyboard focusable.
163
+ Wider status labels never change the card height.
164
+
165
+ The top bar uses an icon-only Search button (⌘K or Ctrl+K opens the palette).
166
+ Deployment names stay on one line with ellipsis and their full name on hover;
167
+ a name matching the product label is omitted. Tabs scroll horizontally when
168
+ needed, moving to a second row on narrow screens.
146
169
 
147
170
  A List / Matrix toggle (`?view=matrix`) switches to a table of connectors by
148
171
  endpoint, `/mcp` first. A row header is the connector's monogram and name, plus
@@ -181,6 +204,30 @@ tabs:
181
204
  - **Activity.** The [Activity](#activity) page for that connector, without
182
205
  connector chips or monograms.
183
206
 
207
+ #### Read catalog drift
208
+
209
+ The connector's drift panel reports the last catalog comparison in this
210
+ runtime and identity partition. It never lists tool names or schemas. A
211
+ personal OAuth refresh belongs to that user; another user or endpoint subject
212
+ does not inherit it. A runtime restart or bounded observation eviction resets
213
+ the report until another listing is served.
214
+
215
+ “No catalog refresh yet” means this partition has no observation. “No reviewed
216
+ baseline” means a listing was observed without a reviewed classification.
217
+ “Matches the reviewed manifest” requires a baseline, successful verification,
218
+ no differences, and schema pins for every live reviewed tool. “Schemas not
219
+ pinned” and “Partial schema coverage” describe missing review evidence; they
220
+ are not clean schema comparisons. “Schema verification unavailable” replaces
221
+ an earlier successful report if hashing fails. Known differences remain visible
222
+ alongside coverage or verification limits. Each operator refresh returns the
223
+ comparison from the catalog it just loaded, including hashing failures and
224
+ schema changes, without another downstream status probe.
225
+
226
+ The unserved count excludes reviewed names explicitly marked optional for
227
+ plan, feature, or permission gating. Present optional tools still participate
228
+ in annotation and schema comparisons. Dropped tool names are counted even
229
+ without a baseline, and do not establish one.
230
+
184
231
  ### Settings
185
232
 
186
233
  The configuration snapshot as tiles, tagged "Defined in code", with no
@@ -264,13 +311,13 @@ red when the calls span more than a minute.
264
311
 
265
312
  The top bar is one row: the mark, branding and deployment name, the section
266
313
  links (Overview, Endpoints, Connectors, Activity, Tokens, Settings), then
267
- Search (the command palette, also ⌘K or Ctrl+K), Appearance, and Account
314
+ icon-only Search (the command palette, also ⌘K or Ctrl+K), Appearance, and Account
268
315
  (the signed-in account with Sign out or Change token). The mark is connecta's
269
316
  drawn "C" only when no product name, owner or favicon is configured; with
270
317
  `branding.favicon.svg` it is that SVG; otherwise there is none. The sign-in
271
318
  gate shows the same mark above "Sign in". Below 820px the section links move
272
319
  to a second row that scrolls sideways and keeps the current section in view,
273
- and Search shrinks to its icon. A member's top bar has only branding and
320
+ with Search remaining an icon. A member's top bar has only branding and
274
321
  Account. The command palette searches visible pages, connectors and tools,
275
322
  opening connector results on Tools.
276
323
 
@@ -13,6 +13,28 @@ uses one implementation: configure two ids for both.
13
13
 
14
14
  ## Stripe
15
15
 
16
+ ## Choose OAuth or an API key
17
+
18
+ Import `stripe` from `@zackbart/connecta/providers/stripe`. Choose one of two setup paths:
19
+
20
+ ```ts
21
+ // OAuth: Stripe's hosted MCP. Authorize the connection with Stripe.
22
+ stripe("billing", { purpose: "Payments", auth: { type: "oauth" } });
23
+ stripe("billing", { purpose: "Revenue reports", auth: { type: "oauth" }, readOnly: true });
24
+
25
+ // API key: Connecta's REST connector. Paste the key into this connection in the operator UI.
26
+ stripe("billing", { purpose: "Payments", auth: { type: "apiKey" }, mode: "production" });
27
+ stripe("billing", { purpose: "Revenue reports", auth: { type: "apiKey" }, mode: "production", readOnly: true });
28
+ ```
29
+
30
+ For an API key, set `mode` to `"production"` or `"sandbox"` to match the key.
31
+ Use a secret (`sk_`) or restricted (`rk_`) key. For read-only access, prefer a
32
+ restricted `rk_` key configured with only read permissions: Stripe enforces
33
+ those permissions too. Connecta's `readOnly: true` omits non-read tools and
34
+ refuses their calls on every endpoint. Omit it for the default writable connector;
35
+ endpoint restrictions still apply. OAuth needs no `mode` and can reach both live
36
+ and sandbox accounts through Stripe's account selectors.
37
+
16
38
  Stripe's hosted MCP server stops accepting secret keys and untagged
17
39
  restricted keys on 2026-10-31; Stripe still documents agent-tagged restricted
18
40
  keys for it. Connecta's hosted Stripe connection is OAuth only either way, and
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zackbart/connecta",
3
- "version": "0.34.0",
3
+ "version": "0.34.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 six meta-tools.",
@@ -114,6 +114,10 @@
114
114
  "types": "./dist/providers/infisical/index.d.ts",
115
115
  "import": "./dist/providers/infisical/index.js"
116
116
  },
117
+ "./providers/intercom": {
118
+ "types": "./dist/providers/intercom/index.d.ts",
119
+ "import": "./dist/providers/intercom/index.js"
120
+ },
117
121
  "./providers/linear": {
118
122
  "types": "./dist/providers/linear/index.d.ts",
119
123
  "import": "./dist/providers/linear/index.js"
@@ -18,7 +18,7 @@
18
18
  },
19
19
  "dependencies": {
20
20
  "@clerk/backend": "^3.12.0",
21
- "@zackbart/connecta": "0.34.0",
21
+ "@zackbart/connecta": "0.34.1",
22
22
  "quickjs-emscripten": "0.32.0"
23
23
  },
24
24
  "devDependencies": {