@zackbart/connecta 0.28.1 → 0.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (332) hide show
  1. package/CHANGELOG.md +855 -5
  2. package/README.md +125 -116
  3. package/bin/connecta.mjs +121 -139
  4. package/bin/meta-tool-names.d.mts +2 -0
  5. package/bin/meta-tool-names.mjs +9 -0
  6. package/bin/version.mjs +3 -0
  7. package/dist/access-tokens.js +53 -63
  8. package/dist/activity-request.js +8 -0
  9. package/dist/activity.d.ts +76 -42
  10. package/dist/activity.js +110 -42
  11. package/dist/argument-redaction.js +230 -0
  12. package/dist/auth/clerk-sdk/client.d.ts +65 -0
  13. package/dist/auth/clerk-sdk/client.js +5 -0
  14. package/dist/auth/clerk-sdk/generated.js +1845 -0
  15. package/dist/auth/clerk-transport.js +19 -0
  16. package/dist/auth/clerk.d.ts +17 -7
  17. package/dist/auth/clerk.js +189 -107
  18. package/dist/auth/cloudflare-access.js +25 -26
  19. package/dist/auth/downstream-client-metadata.d.ts +29 -0
  20. package/dist/auth/downstream-client-metadata.js +133 -0
  21. package/dist/auth/downstream-oauth.js +1584 -1580
  22. package/dist/auth/downstream-revocation.js +106 -0
  23. package/dist/auth/oauth-token-response.js +231 -0
  24. package/dist/auth/oauth-v2-migration.js +116 -0
  25. package/dist/auth/static-oauth.js +93 -71
  26. package/dist/auth-elicitation.js +288 -0
  27. package/dist/authorization-handoff.js +111 -0
  28. package/dist/branding.d.ts +8 -16
  29. package/dist/branding.js +26 -59
  30. package/dist/byte-read-response.js +39 -0
  31. package/dist/call-admission.js +12 -16
  32. package/dist/catalog-cache.js +739 -0
  33. package/dist/catalog-drift.d.ts +50 -15
  34. package/dist/catalog-drift.js +365 -128
  35. package/dist/catalog-fingerprint.js +2 -4
  36. package/dist/catalog-freshness.js +13 -0
  37. package/dist/catalog-limits.js +2 -2
  38. package/dist/catalog-service.js +409 -225
  39. package/dist/catalog.js +43 -84
  40. package/dist/concurrency.js +3 -4
  41. package/dist/config-defaults.d.ts +39 -0
  42. package/dist/config-defaults.js +46 -0
  43. package/dist/config-schema.d.ts +181 -0
  44. package/dist/config-schema.js +435 -0
  45. package/dist/config-value-sources.js +102 -0
  46. package/dist/config.d.ts +633 -0
  47. package/dist/config.js +508 -0
  48. package/dist/connector-access.d.ts +1 -0
  49. package/dist/connector-access.js +13 -15
  50. package/dist/connector-caller.d.ts +8 -0
  51. package/dist/connector-caller.js +15 -6
  52. package/dist/connector-scope.js +1 -1
  53. package/dist/connectors/api-connector.d.ts +59 -7
  54. package/dist/connectors/api-connector.js +106 -19
  55. package/dist/connectors/api.js +4 -1
  56. package/dist/connectors/guarded-fetch.d.ts +144 -0
  57. package/dist/connectors/guarded-fetch.js +87 -38
  58. package/dist/connectors/negotiation-cache.js +46 -0
  59. package/dist/connectors/option-shapes.js +27 -0
  60. package/dist/connectors/remote-mcp.d.ts +30 -4
  61. package/dist/connectors/remote-mcp.js +1774 -320
  62. package/dist/connectors/resource-uri.js +335 -0
  63. package/dist/credential-contract.d.ts +10 -0
  64. package/dist/credential-rules.js +1 -3
  65. package/dist/credential-url.js +108 -0
  66. package/dist/credentials.d.ts +6 -1
  67. package/dist/credentials.js +27 -18
  68. package/dist/d1.d.ts +130 -0
  69. package/dist/d1.js +290 -0
  70. package/dist/describe-config.d.ts +165 -0
  71. package/dist/describe-config.js +315 -0
  72. package/dist/described.js +106 -0
  73. package/dist/downstream-input-context.js +128 -0
  74. package/dist/downstream-input.js +325 -0
  75. package/dist/errors.d.ts +132 -31
  76. package/dist/errors.js +175 -87
  77. package/dist/execute.js +798 -318
  78. package/dist/executor-admission.d.ts +1 -0
  79. package/dist/executor-admission.js +11 -15
  80. package/dist/executor-contract.d.ts +20 -0
  81. package/dist/executor-contract.js +48 -0
  82. package/dist/executor-result.js +30 -13
  83. package/dist/executors/quickjs-child.js +15 -9
  84. package/dist/executors/quickjs-protocol.js +5 -6
  85. package/dist/executors/quickjs-runtime.js +152 -59
  86. package/dist/executors/quickjs.js +49 -39
  87. package/dist/favicon.js +1 -2
  88. package/dist/fix-prompt.js +1 -3
  89. package/dist/guest-runtime.js +238 -0
  90. package/dist/guest-types.d.ts +218 -0
  91. package/dist/guest-types.js +1 -0
  92. package/dist/html-security.js +24 -0
  93. package/dist/identity.js +1 -3
  94. package/dist/inbound-credential.js +52 -0
  95. package/dist/index.d.ts +24 -256
  96. package/dist/index.js +65 -478
  97. package/dist/invocation-auth.js +69 -0
  98. package/dist/invocation.js +262 -79
  99. package/dist/json-schema.d.ts +1 -1
  100. package/dist/mcp-client-context.js +35 -0
  101. package/dist/mcp-result.js +11 -7
  102. package/dist/meta-output.js +61 -0
  103. package/dist/meta-tool-names.d.ts +2 -0
  104. package/dist/meta-tool-names.js +3 -0
  105. package/dist/meta-tools.js +419 -272
  106. package/dist/module-contracts.d.ts +8 -23
  107. package/dist/node.d.ts +0 -2
  108. package/dist/node.js +2 -2
  109. package/dist/oauth-callback-outcome.js +1 -3
  110. package/dist/oauth-handoff.js +194 -0
  111. package/dist/oauth-sealing.js +20 -0
  112. package/dist/operator-record.d.ts +137 -0
  113. package/dist/operator-record.js +420 -0
  114. package/dist/operator-ui/assets.js +31 -0
  115. package/dist/operator-ui/contract.d.ts +72 -0
  116. package/dist/operator-ui/contract.js +1 -0
  117. package/dist/operator-ui/fix-prompts.d.ts +18 -0
  118. package/dist/operator-ui/generated.js +5 -4
  119. package/dist/operator-ui/model.d.ts +12 -87
  120. package/dist/operator-ui/model.js +2 -9
  121. package/dist/operator-ui/setup-commands.js +1 -3
  122. package/dist/operator-ui/view.d.ts +323 -0
  123. package/dist/operator-ui/view.js +62 -189
  124. package/dist/page-styles.js +2 -3
  125. package/dist/program-result.js +5 -0
  126. package/dist/program-source.js +14 -2
  127. package/dist/{exempt-writes.js → program-writes.js} +60 -19
  128. package/dist/provider.d.ts +142 -0
  129. package/dist/provider.js +187 -0
  130. package/dist/providers/_shared/google/result-size.js +57 -0
  131. package/dist/providers/_shared/google/service-account.d.ts +58 -0
  132. package/dist/providers/_shared/google/service-account.js +500 -0
  133. package/dist/providers/_shared/google/workspace.d.ts +276 -0
  134. package/dist/providers/_shared/google/workspace.js +518 -0
  135. package/dist/providers/_shared/request-token.js +83 -0
  136. package/dist/providers/{basecamp.d.ts → basecamp/index.d.ts} +6 -28
  137. package/dist/providers/basecamp/index.js +997 -0
  138. package/dist/providers/basecamp/skill.generated.js +9 -0
  139. package/dist/providers/{breeze.d.ts → breeze/index.d.ts} +2 -2
  140. package/dist/providers/{breeze.js → breeze/index.js} +184 -140
  141. package/dist/providers/breeze/skill.generated.js +9 -0
  142. package/dist/providers/{ccb.d.ts → ccb/index.d.ts} +2 -2
  143. package/dist/providers/{ccb.js → ccb/index.js} +271 -116
  144. package/dist/providers/ccb/skill.generated.js +9 -0
  145. package/dist/providers/{cloudflare.d.ts → cloudflare/index.d.ts} +8 -7
  146. package/dist/providers/{cloudflare.js → cloudflare/index.js} +171 -738
  147. package/dist/providers/cloudflare/skill.generated.js +10 -0
  148. package/dist/providers/docs/index.d.ts +54 -0
  149. package/dist/providers/docs/index.js +1237 -0
  150. package/dist/providers/docs/skill.generated.js +9 -0
  151. package/dist/providers/drive/index.d.ts +53 -0
  152. package/dist/providers/drive/index.js +1523 -0
  153. package/dist/providers/drive/skill.generated.js +9 -0
  154. package/dist/providers/forms/index.d.ts +54 -0
  155. package/dist/providers/forms/index.js +1217 -0
  156. package/dist/providers/forms/skill.generated.js +11 -0
  157. package/dist/providers/github/auth.d.ts +32 -0
  158. package/dist/providers/github/auth.js +361 -0
  159. package/dist/providers/github/hosted.js +218 -0
  160. package/dist/providers/github/index.d.ts +13 -0
  161. package/dist/providers/github/index.js +140 -0
  162. package/dist/providers/github/key.js +100 -0
  163. package/dist/providers/github/rest.js +321 -0
  164. package/dist/providers/github/scope.d.ts +29 -0
  165. package/dist/providers/github/scope.js +124 -0
  166. package/dist/providers/github/skill.generated.js +8 -0
  167. package/dist/providers/gmail/index.d.ts +51 -0
  168. package/dist/providers/gmail/index.js +1436 -0
  169. package/dist/providers/gmail/skill.generated.js +9 -0
  170. package/dist/providers/infisical/index.d.ts +7 -0
  171. package/dist/providers/infisical/index.js +713 -0
  172. package/dist/providers/infisical/skill.generated.js +8 -0
  173. package/dist/providers/{linear.d.ts → linear/index.d.ts} +11 -14
  174. package/dist/providers/linear/index.js +352 -0
  175. package/dist/providers/linear/skill.generated.js +8 -0
  176. package/dist/providers/{mixpanel.d.ts → mixpanel/index.d.ts} +5 -10
  177. package/dist/providers/mixpanel/index.js +416 -0
  178. package/dist/providers/mixpanel/skill.generated.js +9 -0
  179. package/dist/providers/{notion.d.ts → notion/index.d.ts} +8 -8
  180. package/dist/providers/{notion.js → notion/index.js} +226 -239
  181. package/dist/providers/notion/skill.generated.js +10 -0
  182. package/dist/providers/{overflow.d.ts → overflow/index.d.ts} +2 -2
  183. package/dist/providers/{overflow.js → overflow/index.js} +74 -111
  184. package/dist/providers/overflow/skill.generated.js +8 -0
  185. package/dist/providers/{planning-center.d.ts → planning-center/index.d.ts} +2 -2
  186. package/dist/providers/{planning-center.js → planning-center/index.js} +264 -104
  187. package/dist/providers/planning-center/skill.generated.js +10 -0
  188. package/dist/providers/{revenuecat.d.ts → revenuecat/index.d.ts} +5 -10
  189. package/dist/providers/revenuecat/index.js +557 -0
  190. package/dist/providers/revenuecat/skill.generated.js +11 -0
  191. package/dist/providers/sheets/index.d.ts +54 -0
  192. package/dist/providers/sheets/index.js +1237 -0
  193. package/dist/providers/sheets/skill.generated.js +10 -0
  194. package/dist/providers/slides/index.d.ts +53 -0
  195. package/dist/providers/slides/index.js +2645 -0
  196. package/dist/providers/slides/skill.generated.js +9 -0
  197. package/dist/providers/{stripe.d.ts → stripe/index.d.ts} +5 -12
  198. package/dist/providers/stripe/index.js +266 -0
  199. package/dist/providers/stripe/skill.generated.js +11 -0
  200. package/dist/providers/{tithely.d.ts → tithely/index.d.ts} +2 -2
  201. package/dist/providers/{tithely.js → tithely/index.js} +60 -91
  202. package/dist/providers/tithely/skill.generated.js +8 -0
  203. package/dist/providers/{vercel.d.ts → vercel/index.d.ts} +8 -8
  204. package/dist/providers/vercel/index.js +1038 -0
  205. package/dist/providers/vercel/mcp-ownership.js +212 -0
  206. package/dist/providers/vercel/skill.generated.js +11 -0
  207. package/dist/registry.d.ts +110 -171
  208. package/dist/registry.js +588 -927
  209. package/dist/request-state.js +21 -0
  210. package/dist/resource-read.js +103 -0
  211. package/dist/result-shapes.js +17 -49
  212. package/dist/retired-toolkits.js +1 -1
  213. package/dist/routes/access-tokens.js +3 -6
  214. package/dist/routes/activity-context.js +21 -0
  215. package/dist/routes/activity-disclosure.js +40 -0
  216. package/dist/routes/activity.js +59 -21
  217. package/dist/routes/actor-labels.js +3 -50
  218. package/dist/routes/connect.js +221 -0
  219. package/dist/routes/credentials.js +15 -27
  220. package/dist/routes/mcp.js +365 -130
  221. package/dist/routes/oauth-client-metadata.js +15 -0
  222. package/dist/routes/oauth-management.js +45 -107
  223. package/dist/routes/oauth.js +110 -57
  224. package/dist/routes/operator.js +3 -3
  225. package/dist/routes/shared.d.ts +25 -64
  226. package/dist/routes/shared.js +160 -80
  227. package/dist/routes/skills.js +30 -0
  228. package/dist/routes/ui-config.js +225 -0
  229. package/dist/routes/ui-data.js +40 -35
  230. package/dist/routes/ui.js +66 -56
  231. package/dist/runtime/admission.js +4 -2
  232. package/dist/runtime/call-admission.js +3 -1
  233. package/dist/runtime/connector-scope.js +1 -4
  234. package/dist/runtime/run.js +10 -39
  235. package/dist/runtime/services.js +12 -117
  236. package/dist/runtime/shared-read.js +1 -3
  237. package/dist/runtime/storage.js +8 -1
  238. package/dist/sent-secrets.d.ts +93 -0
  239. package/dist/sent-secrets.js +1013 -0
  240. package/dist/server.js +28 -71
  241. package/dist/skills.js +416 -174
  242. package/dist/sqlite.d.ts +48 -0
  243. package/dist/sqlite.js +181 -0
  244. package/dist/storage/keys.js +443 -0
  245. package/dist/storage/memory.js +16 -4
  246. package/dist/storage/sql.d.ts +66 -0
  247. package/dist/storage/sql.js +543 -0
  248. package/dist/timeout.js +4 -2
  249. package/dist/tool-name.js +17 -0
  250. package/dist/tool-safety.d.ts +9 -35
  251. package/dist/tool-safety.js +20 -40
  252. package/dist/types.d.ts +336 -56
  253. package/dist/types.js +0 -1
  254. package/dist/ui.d.ts +7 -19
  255. package/dist/ui.js +76 -90
  256. package/dist/url-safety.js +3 -6
  257. package/dist/usage-guide.js +146 -0
  258. package/dist/validate.d.ts +7 -0
  259. package/dist/validate.js +309 -47
  260. package/dist/version.d.ts +1 -7
  261. package/dist/version.js +3 -7
  262. package/dist/worker.d.ts +11 -0
  263. package/dist/worker.js +435 -0
  264. package/documentation/README.md +63 -0
  265. package/documentation/architecture.md +696 -231
  266. package/documentation/auth.md +1069 -546
  267. package/documentation/code-mode.md +662 -356
  268. package/documentation/deploying.md +146 -0
  269. package/documentation/integrating.md +159 -0
  270. package/documentation/meta-tools.md +570 -216
  271. package/documentation/operating.md +135 -0
  272. package/documentation/operator-tests.md +97 -0
  273. package/documentation/operator-ui.md +132 -0
  274. package/documentation/provider-migration-0.29.md +65 -0
  275. package/examples/worker/AGENTS.md +34 -12
  276. package/examples/worker/README.md +293 -255
  277. package/examples/worker/kv-to-d1.wrangler.jsonc +26 -0
  278. package/examples/worker/scripts/copy-kv-to-d1.mjs +162 -0
  279. package/examples/worker/src/connecta.config.ts +151 -0
  280. package/examples/worker/src/index.ts +14 -197
  281. package/examples/worker/wrangler.jsonc +15 -35
  282. package/package.json +126 -54
  283. package/templates/node/.dockerignore +1 -2
  284. package/templates/node/.env.example +20 -21
  285. package/templates/node/AGENTS.md +21 -17
  286. package/templates/node/Dockerfile +3 -5
  287. package/templates/node/README.md +140 -58
  288. package/templates/node/docker-compose.yml +11 -12
  289. package/templates/node/package.json +4 -2
  290. package/templates/node/src/connecta.config.ts +119 -0
  291. package/templates/node/src/index.ts +9 -154
  292. package/templates/node/src/provision-token.ts +17 -0
  293. package/AGENTS.md +0 -170
  294. package/dist/artifacts/connector.d.ts +0 -58
  295. package/dist/artifacts/connector.js +0 -730
  296. package/dist/artifacts/document.js +0 -86
  297. package/dist/artifacts/guide.js +0 -140
  298. package/dist/artifacts/html-scan.js +0 -329
  299. package/dist/artifacts/json.js +0 -78
  300. package/dist/artifacts/kv-store.d.ts +0 -20
  301. package/dist/artifacts/kv-store.js +0 -140
  302. package/dist/artifacts/markdown.js +0 -478
  303. package/dist/artifacts/module.d.ts +0 -37
  304. package/dist/artifacts/module.js +0 -66
  305. package/dist/artifacts/operations.d.ts +0 -197
  306. package/dist/artifacts/operations.js +0 -1002
  307. package/dist/artifacts/refresh.d.ts +0 -55
  308. package/dist/artifacts/refresh.js +0 -236
  309. package/dist/artifacts/routes.js +0 -206
  310. package/dist/artifacts/types.d.ts +0 -214
  311. package/dist/artifacts/types.js +0 -22
  312. package/dist/artifacts/validate.d.ts +0 -62
  313. package/dist/artifacts/validate.js +0 -651
  314. package/dist/artifacts.d.ts +0 -6
  315. package/dist/artifacts.js +0 -9
  316. package/dist/auth/bearer.d.ts +0 -11
  317. package/dist/auth/bearer.js +0 -50
  318. package/dist/providers/basecamp.js +0 -445
  319. package/dist/providers/linear.js +0 -217
  320. package/dist/providers/mixpanel.js +0 -247
  321. package/dist/providers/revenuecat.js +0 -317
  322. package/dist/providers/stripe.js +0 -253
  323. package/dist/providers/vercel.js +0 -1253
  324. package/dist/storage/file.d.ts +0 -15
  325. package/dist/storage/file.js +0 -455
  326. package/ethos.md +0 -93
  327. package/examples/worker/src/cloudflare-kv.ts +0 -43
  328. package/examples/worker/src/d1-activity-row.ts +0 -155
  329. package/examples/worker/src/d1-activity.ts +0 -147
  330. package/examples/worker/src/d1-storage.ts +0 -138
  331. package/examples/worker/src/r2-artifact-blobs.ts +0 -29
  332. package/templates/node/src/file-activity.ts +0 -182
package/README.md CHANGED
@@ -2,129 +2,144 @@
2
2
 
3
3
  ![A monochrome clay Connecta hub joining many tools](https://raw.githubusercontent.com/zackbart/connecta/main/assets/connecta-clay-hero.png)
4
4
 
5
- One MCP endpoint. The integrations you chose. Your agent reaches them by
6
- writing code instead of loading a thousand tool definitions.
5
+ One connection between your agent and the services you choose.
6
+
7
+ Connecta brings your MCP servers and HTTP APIs together behind one endpoint.
8
+ Connect your agent once, then choose which integrations it can use. You run
9
+ Connecta yourself, on your own machine or infrastructure.
7
10
 
8
11
  ## The mental model
9
12
 
10
- You ask your agent a question that touches a service — Linear, Stripe, an
11
- internal API, anything you have connected. Here is what happens:
12
-
13
- 1. The agent talks to one endpoint, yours, and sees seven tools. Always seven,
14
- no matter how many services sit behind it.
15
- 2. It writes a short JavaScript program. Connecta runs it in a sandbox next to
16
- your integrations. The program can search for tools, call them, chain the
17
- calls, and shape the result.
18
- 3. Only the answer comes back into the agent's context — not raw pages of
19
- API output.
20
- 4. If the agent wants to change something — create, update, delete — it
21
- cannot do that from a program, unless your config exempts that tool. The
22
- program refuses the write before anything is sent and hands back the exact
23
- call; the agent makes it through `call_destructive_tool`, one visible call
24
- your MCP client can put in front of you first.
25
-
26
- Credentials never leave the server. The program never sees them, and neither
27
- does the agent.
13
+ Ask your agent to find open issues, compare them with customer feedback, or
14
+ prepare a report. Connecta gives it a small set of tools for finding and using
15
+ the services you connected, without loading every service's tool definitions
16
+ into the conversation.
17
+
18
+ The agent writes a short program that runs in a sandbox beside those
19
+ integrations. It can gather results, combine them, and return the parts that
20
+ answer your question. Fifty issues can become a short list grouped by owner
21
+ before the result reaches the conversation. The agent writes the code; you
22
+ ask for the work.
28
23
 
29
24
  ```mermaid
30
- flowchart TB
31
- Client["Your MCP client<br/>Claude, Cursor, …"]
25
+ flowchart LR
26
+ Agent["Your agent"] <-->|"One connection"| Connecta["Your Connecta deployment"]
27
+ Connecta <--> Work["Work tools<br/>Linear, GitHub, Notion"]
28
+ Connecta <--> Business["Business services<br/>Stripe, RevenueCat, Mixpanel"]
29
+ Connecta <--> Yours["Your other services<br/>Remote MCP servers and HTTP APIs"]
32
30
 
33
- subgraph Connecta["Connecta — one endpoint, seven tools, your credentials"]
34
- Sandbox["execute_code<br/>the agent's program runs here<br/>read-only tools, plus writes<br/>your config exempts"]
35
- Explicit["call_destructive_tool<br/>one visible call per write<br/>your client can ask you first"]
36
- end
31
+ style Connecta fill:#e0e7ff,stroke:#4338ca,color:#1e1b4b,stroke-width:2px
32
+ ```
37
33
 
38
- Integrations["The integrations you chose<br/>Linear · Stripe · Notion · Vercel · your HTTP API · any MCP server"]
34
+ You choose which services to connect and who can use them. Your agent keeps
35
+ the same connection as those services change.
39
36
 
40
- Client -->|"one connection"| Sandbox
41
- Client --> Explicit
42
- Sandbox -->|"reads"| Integrations
43
- Explicit -->|"writes"| Integrations
44
- ```
37
+ ## From a question to an answer
38
+
39
+ Say you ask, "Which open issues affect our highest-value customers?" Your agent
40
+ can gather information from your issue tracker and customer records, combine
41
+ it inside Connecta, and bring back a focused answer.
45
42
 
46
- This is the kind of thing the agent writes, not you:
47
-
48
- ```js
49
- async () => {
50
- const { nodes } = await connecta.call("tracker.list_issues", { state: "started" });
51
- const byOwner = {};
52
- for (const issue of nodes) {
53
- (byOwner[issue.assignee?.name ?? "unassigned"] ??= []).push(issue.identifier);
54
- }
55
- return byOwner;
56
- }
43
+ ```mermaid
44
+ flowchart TB
45
+ Question["You ask a question"] --> Plan["Your agent works out what to look up"]
46
+ Plan --> Gather["A program in Connecta gathers the relevant records"]
47
+ Gather --> Tracker["Open issues from your tracker"]
48
+ Gather --> Customers["Customer records from a connected service"]
49
+ Tracker --> Combine["The program matches, filters, and groups the results"]
50
+ Customers --> Combine
51
+ Combine --> Answer["Your agent explains the answer"]
52
+
53
+ style Combine fill:#e0e7ff,stroke:#4338ca,color:#1e1b4b,stroke-width:2px
54
+ style Answer fill:#dcfce7,stroke:#15803d,color:#14532d
57
55
  ```
58
56
 
59
- Fifty issues in, one small object out. Your context window notices.
57
+ The records are an example; the available information depends on the services
58
+ and access you have configured. Processing results inside Connecta keeps the
59
+ conversation focused on the answer.
60
60
 
61
61
  ## What you can do with it
62
62
 
63
- - **Put every MCP server you use behind one connection.** Add or remove
64
- services in a config file; your client never changes.
65
- - **Wrap any HTTP API by hand.** A few lines per tool. No OpenAPI conversion —
66
- generated tool sprawl is the problem, not the fix.
67
- - **Use maintained connections** for Basecamp, Breeze ChMS, Church Community
68
- Builder, Cloudflare, Linear, Mixpanel, Notion, Overflow, Planning Center,
69
- RevenueCat, Stripe, Tithe.ly, and Vercel: known endpoints, auth defaults, and
70
- vetted read/write classifications, imported one at a time. Cloudflare,
71
- Notion, and Vercel each let the deployment choose their hand-written API
72
- interface or official hosted MCP. Planning Center, Overflow, Tithe.ly,
73
- Breeze, and Church Community Builder are hand-written over their whole APIs,
74
- with every money-moving write behind approval.
75
- - **Let the agent work in code.** Search, chain, filter, join, and reduce
76
- inside the sandbox instead of round-tripping every call through the model.
77
- - **Teach undeclared result shapes by using them.** Successful read-only calls
78
- retain field names and broad types in bounded runtime memory, never scalar
79
- values, so later programs can project a remote MCP result its provider never
80
- documented.
81
- - **Keep large results usable.** Oversized direct calls return a bounded
82
- preview with a handle for paging through the rest. For read-only work, the
83
- notice also points the agent to reduce or search the result inside a
84
- program. Discovery can show compact schemas, exact JSON Schema, or a
85
- TypeScript signature to read while writing JavaScript.
86
- - **Keep writes deliberate.** Only tools marked read-only run in a program.
87
- Every other write is a separate, visible `call_destructive_tool` call your
88
- client can gate, so the host's permission prompt is the one approval there
89
- is. Config — and only config — can exempt a cheap, reversible write from
90
- asking, per tool or per connector, and then a program may make it.
91
- - **Run it on Node or Cloudflare Workers.** The core is shared; each deployment
92
- supplies its platform's executor and storage. The Node template also runs
93
- unchanged in Docker.
94
-
95
- Deployments explicitly compose optional features: `operatorUi()` from
96
- `@zackbart/connecta/ui`, `encryptedCredentialVault()` from `/credentials`,
97
- `activityHistory()` from `/activity`, `artifacts()` from `/artifacts`, and
98
- inbound authentication adapters from `/auth/*`. Omit a module and its implementation does no runtime work. Core
99
- keeps connector discovery, execution, invocation, and enforcement together.
100
-
101
- The optional UI shows each person's connections and effective permissions.
102
- Authentication controls live inside each connection, with optional activity
103
- history. The configured connection list loads before downstream checks finish;
104
- a slow provider does not hold up the page. Connector selection and access rules
105
- remain in deployment code. It also explains which tools can run in programs or
106
- need approval, offers a fixed repair prompt for classified failures, and shows
107
- client setup commands for the endpoints the signed-in person can use.
108
-
109
- One deployment may serve several authenticated people inside the same tenant.
110
- Cloudflare Access supplies Worker identity; Node can use Clerk or the optional
111
- configured bearer adapter. Connecta owns no accounts or groups and issues no
112
- client access tokens. Shared-credential administration and personal connection
113
- setup require separate explicit permissions, both denied by default. See
114
- [inbound auth](./documentation/auth.md#principals-visibility-and-operators).
115
-
116
- Connecta is not a platform, a marketplace, a policy engine, or a multi-tenant
117
- service. Those are decisions, and the [ethos](./ethos.md) records each one
118
- and why.
63
+ Connect hosted MCP services, add an internal HTTP API, and let the agent work
64
+ across them in one task. Changing your connected services does not require
65
+ changing the agent's connection. Your deployment decides which services and
66
+ operations each caller can reach.
67
+
68
+ Connecta includes maintained connections for <!-- providers:start -->Basecamp, Breeze ChMS, Church Community Builder, Cloudflare, GitHub, Gmail, Google Docs, Google Drive, Google Forms, Google Sheets, Google Slides, Infisical, Linear, Mixpanel, Notion, Overflow, Planning Center, RevenueCat, Stripe, Tithe.ly, and Vercel<!-- providers:end -->.
69
+ Each connection has its own setup guide.
70
+ Notion, Vercel, and Cloudflare offer hosted MCP connections and selected HTTP
71
+ API capabilities. You can also connect other remote MCP servers or define the
72
+ operations you need from an HTTP API.
73
+
74
+ Google Workspace connections use the account your deployment assigns to each
75
+ signed-in person. A Workspace administrator authorizes them for your domain.
76
+ Gmail reads mail and writes drafts, but does not send mail. Google Drive can
77
+ read, write, and share files, but does not permanently delete them. Available
78
+ operations and account access depend on the integration and your deployment.
79
+
80
+ Large results need not fill the conversation. The agent can filter and
81
+ summarize them in its program, or read a large result in smaller pieces.
82
+
83
+ ## Writes, credentials, and access
84
+
85
+ Connecta distinguishes reads from writes. By default, programs can read, and
86
+ each change uses a separate visible tool call. Your agent's host controls
87
+ whether it asks for approval. You can explicitly allow programs to make
88
+ changes too; the host then sees the program tool as a write. This choice does
89
+ not give a caller access to additional services.
90
+
91
+ ```mermaid
92
+ flowchart TB
93
+ Change["Your agent wants to change something"] --> Choice{"Are programs allowed<br/>to make changes?"}
94
+ Choice -->|"Default: no"| Separate["A separate visible call for each change"]
95
+ Choice -->|"Explicit choice: yes"| Program["A program that can make changes"]
96
+ Separate --> Host["Your agent's host handles approval"]
97
+ Program --> Host
98
+ Host --> Access["Connecta checks the caller's access"]
99
+ Access --> Services["The connected service receives the change"]
100
+
101
+ style Host fill:#fef3c7,stroke:#b45309,color:#78350f
102
+ style Access fill:#e0e7ff,stroke:#4338ca,color:#1e1b4b,stroke-width:2px
103
+ ```
104
+
105
+ Connecta handles integration credentials on the server. Its sandbox does not
106
+ receive them. Optional encrypted storage protects saved credentials. Connections can use
107
+ shared credentials or a person's own account, with access rules set by the
108
+ deployment owner. Permission to use a connection is separate from permission
109
+ to manage its credentials.
110
+
111
+ People sign in through Clerk on Node or Cloudflare Access on Workers. Machine
112
+ clients use tokens issued by your Connecta deployment. A deployment can serve
113
+ several people within one tenant, each with the access you assign.
114
+
115
+ ## A place to see your connections
116
+
117
+ The optional operator UI shows connected services, available tools, access,
118
+ and configuration. Authorized people can connect accounts, manage credentials,
119
+ and issue client tokens. Optional activity history shows who called what,
120
+ when, and whether it worked, without recording arguments, results, or program
121
+ code. The UI's controls follow the signed-in person's permissions.
122
+
123
+ Your agent or developer changes the integrations and access rules in deployment
124
+ code. The UI helps you inspect them and manage authentication.
125
+
126
+ ## Where it runs
127
+
128
+ Run Connecta locally or on a server with Node, including in Docker, or host it
129
+ on Cloudflare Workers. Both offer the same agent tools. Running programs on
130
+ Workers requires Cloudflare's Workers Paid plan.
119
131
 
120
132
  ## Getting started
121
133
 
122
- Setup is written for an agent. Point yours at [`AGENTS.md`](./AGENTS.md) and
123
- ask it to set up a Connecta deployment; the
124
- [documentation](./documentation/) covers the architecture, the seven tools,
125
- code mode, and inbound auth if you want to go deeper. When upgrading an
126
- existing deployment, each [changelog](./CHANGELOG.md) release opens with what
127
- breaks and what a deployment can ignore.
134
+ Give your agent the [agent documentation](./documentation/README.md) and ask it
135
+ to set up Connecta with the integrations you want. Tell it where you want to
136
+ run it and who should have access. The setup guides cover Node, Docker, and
137
+ Cloudflare Workers, including connecting your agent client.
138
+
139
+ <a id="existing-client-tokens"></a>
140
+
141
+ For an existing deployment, ask your agent to follow the
142
+ [upgrade guidance](./documentation/deploying.md#upgrade-an-existing-deployment).
128
143
 
129
144
  ## Status
130
145
 
@@ -132,13 +147,7 @@ Built for its author's deployments first and published openly. Breaking
132
147
  changes are expected before 1.0. See the [changelog](./CHANGELOG.md) and
133
148
  [security policy](./SECURITY.md).
134
149
 
135
- ### Existing client tokens
136
-
137
- Upgrading from v0.23 does not require rotating managed `cta_…` tokens. Import
138
- `accessTokens` from `@zackbart/connecta/auth/access-tokens`, replace the old
139
- `accessTokens: true` with `accessTokens: accessTokens(storage)`, and keep the
140
- same persistent storage namespace and identity/tool/pool grant rules. Enable
141
- `identity.accessTokenManagement` only for the interactive operators who should
142
- manage tokens. New issuance needs storage with atomic `compareAndSet`; older
143
- storage adapters can still verify existing tokens. See the package's
144
- `documentation/auth.md` for the migration and storage requirements.
150
+ The [principles](https://github.com/zackbart/connecta/blob/main/PRINCIPLES.md)
151
+ state the goals and tested rules. [Decision records](https://github.com/zackbart/connecta/tree/main/decisions)
152
+ explain past choices. [GitHub issues](https://github.com/zackbart/connecta/issues)
153
+ track planned work; a plan is not a shipped feature.