@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
@@ -0,0 +1,146 @@
1
+ # Deploying Connecta
2
+
3
+ Use this guide when creating or maintaining a deployment. For changes to the
4
+ Connecta package itself, follow [repository policy](https://github.com/zackbart/connecta/blob/main/AGENTS.md).
5
+ For work through an already connected endpoint, use [Operating an endpoint](./operating.md).
6
+ [All agent routes](./README.md) are in the index.
7
+
8
+ ## Choose a deployment
9
+
10
+ | Platform | Runnable instructions | Required runtime and state |
11
+ | ------------------ | ----------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------- |
12
+ | Node | [Node template](../templates/node/README.md) | Node 22.13 or later, QuickJS peer, one SQLite file |
13
+ | Docker | [Container setup in the same Node template](../templates/node/README.md#run-it-in-docker) | Same source and config, persistent named volume |
14
+ | Cloudflare Workers | [Worker example](../examples/worker/README.md#deploy) | Workers Paid plan, Worker Loader binding, one D1 database, Cloudflare Access |
15
+
16
+ These are the two deployment shapes. Docker packages the Node project.
17
+ Templates and their configuration files own the full runnable steps and
18
+ environment-variable names; follow them rather than rebuilding their setup
19
+ from the contract reference.
20
+
21
+ ## Start on Node
22
+
23
+ Create a new deployment directory with the CLI. `init` refuses an existing
24
+ path and pins the generated project's Connecta dependency to the CLI version:
25
+
26
+ ```sh
27
+ npx @zackbart/connecta init my-connecta
28
+ cd my-connecta
29
+ npm install
30
+ npm run --silent provision-token -- "local-machine"
31
+ # Save the returned cta_ token privately. It is shown only once.
32
+ npm start
33
+ ```
34
+
35
+ The client connects to `http://localhost:8787/mcp` with
36
+ `Authorization: Bearer <returned-cta-token>`. The generated project always
37
+ installs `accessTokens(storage)`. An empty database admits no MCP caller even
38
+ though `/health` works. `CONNECTA_TOKEN` is only a client/doctor variable;
39
+ it never configures server authentication. The local commands read the process
40
+ environment and do not load `.env`; Docker Compose does.
41
+
42
+ Edit `src/connecta.config.ts` for connectors, public URL, auth, identity rules,
43
+ and optional modules. `src/index.ts` only constructs and starts the deployment.
44
+ Follow the [template README](../templates/node/README.md) for storage paths,
45
+ backups, Docker provisioning, secrets, and optional modules. Run the deployment's
46
+ `npm run typecheck` after configuration changes.
47
+
48
+ ## Start on Workers
49
+
50
+ Follow the [Worker example](../examples/worker/README.md#deploy) to create D1,
51
+ set secrets, configure `PUBLIC_URL` and `LOADER`, and deploy with Wrangler.
52
+ When copying it into a separate repository, follow
53
+ [the separate-project installation](../examples/worker/README.md#copied-into-its-own-repository)
54
+ and pin Connecta's exact version. The optional `@cloudflare/codemode` peer
55
+ must be installed for the Worker executor.
56
+
57
+ Attach Cloudflare Access to the Worker destination. Interactive MCP clients
58
+ need Managed OAuth, Dynamic Client Registration, and the documented redirect
59
+ allowlist. Machines need Access service headers at the edge plus a stored
60
+ `cta_` bearer inside Connecta; service identity alone is refused. Keep
61
+ `enable_request_signal`, construct Connecta once per isolate, and pass `ctx`
62
+ through to `fetch`. The example owns those details and
63
+ [the machine-token procedure](../examples/worker/README.md#machine-tokens).
64
+
65
+ ## Compose capabilities and access
66
+
67
+ Both configurations use `defineConfig((env) => …)` and a required executor.
68
+ [Integrating services](./integrating.md) explains the `connectors` array.
69
+ Configuration selects optional factories through explicit slots:
70
+
71
+ | Slot | Factory/import | Purpose |
72
+ | -------------- | -------------------------------------------------------------------- | -------------------------------------------------- |
73
+ | `ui` | `operatorUi()` from `@zackbart/connecta/ui` | Operator pages and scoped config inspection |
74
+ | `vault` | `encryptedCredentialVault()` from `@zackbart/connecta/credentials` | Encrypted operator-managed credentials |
75
+ | `activity` | `activityHistory()` from `@zackbart/connecta/activity` | Payload-free history over the platform's SQL store |
76
+ | `auth` | Clerk or Cloudflare Access from `@zackbart/connecta/auth/*` | Interactive inbound authentication |
77
+ | `accessTokens` | `accessTokens(storage)` from `@zackbart/connecta/auth/access-tokens` | Stored machine-token authentication |
78
+
79
+ Omitting an optional module leaves its implementation inactive. Invalid or
80
+ unknown configuration refuses construction; do not catch it and silently
81
+ fall back. [Configuration](./architecture.md#configuration) owns validation
82
+ and `describeConfig()`, and [optional modules](./architecture.md#optional-deployment-modules)
83
+ owns their composition contracts.
84
+
85
+ Enable `encryptedCredentialVault(storage, key)` before persisting downstream
86
+ OAuth credentials. Without a sealing vault, OAuth grants are stored as plaintext.
87
+ The platform templates describe the base64 32-byte encryption key. Keep it
88
+ outside the database and source control, and preserve it across upgrades.
89
+ [OAuth state at rest](./auth.md#downstream-oauth-state-at-rest) owns sealing and
90
+ existing-record migration.
91
+
92
+ One deployment serves one tenant and may admit several people. Node uses Clerk
93
+ for human auth; Access is Workers-only. Keep credential administration,
94
+ personal connection, token management, and activity access explicit.
95
+ [Auth](./auth.md#principals-visibility-and-operators) owns identity and grants;
96
+ [Clerk setup](./auth.md#clerk-oauth-tokens-and-operator-sessions) owns resource-bound
97
+ tokens and `aud_claim_enabled`. A person's operator session is not an MCP token.
98
+
99
+ Root and named pools default to `read-only`. A `trusted` pool allows writes
100
+ inside programs and marks `execute_code` as a write. Host approval remains the
101
+ host's decision. Pool membership intersects the caller's grants; it never
102
+ widens them. See [pools](./auth.md#pools) before changing trust.
103
+
104
+ ## Verify and diagnose
105
+
106
+ With the deployment running, replace the placeholder with its saved client
107
+ token and run doctor:
108
+
109
+ ```sh
110
+ CONNECTA_TOKEN='<stored-cta-token>' npx connecta doctor --url http://localhost:8787
111
+ ```
112
+
113
+ Doctor checks health, the required executor, and the current six-tool set.
114
+ For a Worker protected by Access, follow the example's doctor credentials
115
+ and service-header setup. If the operator UI is enabled, authenticated
116
+ `connecta doctor --config --url <public-url>` prints the caller-scoped
117
+ configuration snapshot as JSON. It runs no diagnostic program and prints no
118
+ raw HTTP failure body. [Operator UI](./operator-ui.md) describes the returned
119
+ configuration, live facts, and permission rules.
120
+
121
+ Health success alone does not prove a client can authenticate or reach an
122
+ integration. Check client connection and a bounded read through a chosen
123
+ connector; resolve credentials using [authorization recovery](./meta-tools.md#authorization-recovery).
124
+
125
+ ## Upgrade an existing deployment
126
+
127
+ Bump the exact package pin, read the [changelog](../CHANGELOG.md) for every
128
+ intervening release, and apply the relevant migration before startup. `init`
129
+ does not merge changes into an existing deployment.
130
+
131
+ - [Managed tokens from v0.23](./auth.md#managed-client-tokens-and-upgrading-from-v023) keep their secrets when storage, namespaces, and grants are retained. Replace the old boolean config with `accessTokens(storage)`; machine tokens gain no operator authority.
132
+ - [Node storage from 0.28](../templates/node/README.md#storage) uses `connecta migrate-state` to copy the JSON state into SQLite. Activity JSONL is not imported.
133
+ - [Worker storage from 0.28](../examples/worker/README.md#upgrading-from-028) copies KV into D1 with a one-shot migration.
134
+ - [Notion, Vercel, and Cloudflare for 0.29](./provider-migration-0.29.md) change defaults and retained API tool names.
135
+ - [Executor wiring](./code-mode.md#deploy-time-capability) requires branded shipped executors or a self-managed custom executor.
136
+
137
+ ## Implementation and evidence
138
+
139
+ Check the [CLI](https://github.com/zackbart/connecta/blob/main/bin/connecta.mjs),
140
+ [Node configuration](../templates/node/src/connecta.config.ts), and
141
+ [Worker configuration](../examples/worker/src/connecta.config.ts) when changing
142
+ setup. [Deployment-shape tests](https://github.com/zackbart/connecta/blob/main/test/deployment-shapes.node.test.ts),
143
+ [config tests](https://github.com/zackbart/connecta/blob/main/test/config.test.ts),
144
+ and [package smoke](https://github.com/zackbart/connecta/blob/main/scripts/check-package.mjs)
145
+ check the deployment and published package boundaries. Repository verification
146
+ requirements remain in AGENTS.md.
@@ -0,0 +1,159 @@
1
+ # Integrating services
2
+
3
+ Use this guide to add a connector to deployment configuration. To implement a
4
+ new maintained provider in Connecta itself, follow the repository's
5
+ [add-provider skill](https://github.com/zackbart/connecta/blob/main/.claude/skills/add-provider/SKILL.md)
6
+ and [AGENTS.md](https://github.com/zackbart/connecta/blob/main/AGENTS.md).
7
+ [All agent routes](./README.md) are in the index.
8
+
9
+ ## Choose a connector
10
+
11
+ | Need | Configuration path | Check before using |
12
+ | -------------------------------- | ------------------------------------------------- | ------------------------------------------------------------------------------------- |
13
+ | A maintained integration | Its `@zackbart/connecta/providers/<name>` factory | Provider `SKILL.md`, options, auth ownership, supported tools |
14
+ | Another hosted remote MCP server | `remoteMcp()` from the root package | Endpoint, authentication, current catalog, and read/write annotations |
15
+ | A selected HTTP API capability | `api()` from the root package | Input/output schemas, explicit read/write hints, bounded handler, credential handling |
16
+
17
+ All produce connectors in the deployment's `connectors` array and use the same
18
+ registry enforcement, caller grants, result bounds, and activity paths. There
19
+ is no runtime installation or registration. Keep connector IDs unique and
20
+ stable because they prefix canonical `<connectorId>.<toolName>` addresses.
21
+
22
+ ## Maintained integrations
23
+
24
+ Import a provider individually. For example, Linear requires an explicit
25
+ choice of its downstream endpoint:
26
+
27
+ ```ts
28
+ import { linear } from "@zackbart/connecta/providers/linear";
29
+
30
+ const tracker = linear("tracker", {
31
+ purpose: "Engineering issues in our workspace",
32
+ access: "read-only",
33
+ });
34
+ // Add tracker to the deployment's connectors array.
35
+ ```
36
+
37
+ Linear defaults to OAuth; its read-only endpoint requests only the downstream
38
+ read scope. That is separate from Connecta pool trust. Read the
39
+ [Linear skill](https://github.com/zackbart/connecta/blob/main/src/providers/linear/SKILL.md)
40
+ and [factory options](https://github.com/zackbart/connecta/blob/main/src/providers/linear/index.ts)
41
+ for API-key framing, workspace instructions, and admission choices.
42
+
43
+ The [human README](../README.md#what-you-can-do-with-it) lists available
44
+ integrations. Each [provider folder](https://github.com/zackbart/connecta/tree/main/src/providers)
45
+ contains its scoped guide, options, tests, fixtures, and review data. Prefer
46
+ that guide to general assumptions about a service's API. Google Workspace
47
+ providers require administrator-managed domain-wide delegation and a deployment
48
+ mapping from admitted identity to the downstream account; a request must not
49
+ choose its own account. Gmail never sends mail, and Drive never permanently
50
+ deletes files.
51
+
52
+ Notion, Vercel, and Cloudflare default to hosted MCP. Their explicit
53
+ `surface: "api"` choices retain selected REST capabilities, with Notion's
54
+ internal-integration identity preserved. To use both, configure distinct IDs
55
+ and independent credentials. Read the [0.29 migration guide](./provider-migration-0.29.md)
56
+ and its provider reconciliation tables for retained and removed names.
57
+
58
+ ## Another remote MCP server
59
+
60
+ Declare its endpoint and intended auth mode. This fragment uses a server-stored
61
+ credential slot; replace the illustrative URL with the real endpoint:
62
+
63
+ ```ts
64
+ import { remoteMcp } from "@zackbart/connecta";
65
+
66
+ const service = remoteMcp("service", {
67
+ url: "https://mcp.example.com/mcp",
68
+ description: "Our team's hosted service",
69
+ auth: { type: "credential" },
70
+ });
71
+ // Add service to connectors. Configure the vault and permitted operators
72
+ // before supplying its credential through the operator UI.
73
+ ```
74
+
75
+ Credential auth defaults to an `Authorization: Bearer` header. Choose framing
76
+ from the downstream contract, not from its HTTP API's convention. Remote auth
77
+ also supports OAuth, static headers, and request-local token resolution. Use
78
+ [shared and personal auth](./auth.md#shared-and-personal-auth),
79
+ [client registration](./auth.md#downstream-oauth-client-registration), and
80
+ [request-local tokens](./auth.md#request-local-downstream-bearer-tokens)
81
+ for those cases. Secrets belong in deployment secret storage or the vault,
82
+ not source literals.
83
+
84
+ Remote catalogs evolve. Discovery, direct calls, and program calls all enforce
85
+ classification against the current catalog. Missing or contradictory read hints
86
+ fail closed as writes. `classify` can supply a reviewed per-tool verdict;
87
+ schema changes can invalidate a reviewed read. Exact deployment classification
88
+ overrides take precedence. See
89
+ [reviewed classification](./architecture.md#providers-and-reviewed-classification)
90
+ for precedence, schema digests, and `unlisted: "hide"`. Review the behavior
91
+ before declaring a read, and do not use classification to bypass provider target
92
+ scopes or caller grants.
93
+
94
+ ## A hand-written HTTP capability
95
+
96
+ Define only the operations the deployment needs. Every `api()` tool needs a
97
+ nonempty description and explicit `readOnlyHint`. This local time tool matches
98
+ the shape used by the deployment templates:
99
+
100
+ ```ts
101
+ import { api } from "@zackbart/connecta";
102
+
103
+ const time = api("time", {
104
+ description: "Time, current timestamp",
105
+ tools: [{
106
+ name: "get_now",
107
+ description: "Return the current time as an ISO 8601 timestamp.",
108
+ inputSchema: { type: "object", properties: {} },
109
+ outputSchema: {
110
+ type: "object",
111
+ properties: { now: { type: "string" } },
112
+ required: ["now"],
113
+ },
114
+ annotations: { readOnlyHint: true },
115
+ handler: async () => ({ now: new Date().toISOString() }),
116
+ }],
117
+ });
118
+ ```
119
+
120
+ For an HTTP handler, use its supplied `ctx.fetch` to register outgoing secrets
121
+ for redaction, pass the request signal, and bound any pagination or fanout.
122
+ Read declared credential slots through `ctx.credential`; do not return their
123
+ values. With a declared static OAuth configuration, use `ctx.oauth.fetch`,
124
+ which binds the grant to configured API origins and manages authentication.
125
+ `api()` refuses simultaneous `oauth` and `credential` declarations.
126
+ [Downstream OAuth on api()](./auth.md#downstream-oauth-on-api) owns a concrete
127
+ HTTP example and the client setup contract.
128
+
129
+ Mark every side-effecting tool `readOnlyHint: false`. On read-only endpoints
130
+ writes use `call_destructive_tool`; trusted programs may write within their
131
+ grants. Host approval is independent of tool definition. Use declared output
132
+ schemas when known; runtime observations cannot replace them.
133
+
134
+ ## Separate ownership from visibility
135
+
136
+ `authScope: "shared"` uses deployment-owned downstream auth; `"personal"` uses
137
+ the admitted principal's partition. Visibility is a different decision,
138
+ controlled by identity and pool grants. A personal connector must not close
139
+ over a shared secret or derive its owner from arguments. Remote MCP refuses
140
+ literal header credentials with personal scope. Review
141
+ [principals and grants](./auth.md#principals-visibility-and-operators) and
142
+ [management permissions](./auth.md#management-permissions) before exposing a
143
+ new integration or its authentication controls.
144
+
145
+ After editing configuration, run the deployment's typecheck and doctor, then
146
+ perform a bounded read. Add negative checks for target restrictions and writes
147
+ when authoring a handler or provider. Follow repository verification policy
148
+ when changing package code.
149
+
150
+ ## Implementation and evidence
151
+
152
+ Factory contracts live in [remote MCP](https://github.com/zackbart/connecta/blob/main/src/connectors/remote-mcp.ts),
153
+ [API connector](https://github.com/zackbart/connecta/blob/main/src/connectors/api-connector.ts),
154
+ and [provider construction](https://github.com/zackbart/connecta/blob/main/src/provider.ts).
155
+ [Remote tests](https://github.com/zackbart/connecta/blob/main/test/remote-mcp.test.ts),
156
+ [API tests](https://github.com/zackbart/connecta/blob/main/test/api-connector.test.ts),
157
+ [provider contracts](https://github.com/zackbart/connecta/blob/main/test/provider-contracts.test.ts),
158
+ and [classification tests](https://github.com/zackbart/connecta/blob/main/test/classified-decorators.test.ts)
159
+ check shared behavior. Provider-specific tests remain beside each provider.