@zackbart/connecta 0.34.1 → 0.36.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 (441) hide show
  1. package/CHANGELOG.md +418 -0
  2. package/README.md +65 -105
  3. package/SECURITY.md +3 -2
  4. package/bin/connecta.mjs +41 -16
  5. package/bin/version.mjs +1 -1
  6. package/dist/access-tokens.d.ts +2 -1
  7. package/dist/access-tokens.js +66 -30
  8. package/dist/activity.d.ts +1 -1
  9. package/dist/activity.js +2 -0
  10. package/dist/agent-config.d.ts +23 -0
  11. package/dist/agent-config.js +59 -0
  12. package/dist/agent-description.js +16 -0
  13. package/dist/agent-identity.js +4 -4
  14. package/dist/agent-observation.js +39 -0
  15. package/dist/auth/clerk-sdk/client.d.ts +2 -0
  16. package/dist/auth/clerk-sdk/generated.js +554 -563
  17. package/dist/auth/clerk-transport.js +70 -3
  18. package/dist/auth/clerk.d.ts +13 -0
  19. package/dist/auth/clerk.js +653 -246
  20. package/dist/auth/cloudflare-access.js +46 -42
  21. package/dist/auth/downstream-client-metadata.js +2 -2
  22. package/dist/auth/downstream-oauth.js +2044 -1161
  23. package/dist/auth/downstream-revocation.js +88 -88
  24. package/dist/auth/native-call.js +20 -0
  25. package/dist/auth/native.js +184 -0
  26. package/dist/auth/oauth-start-reset.js +11 -5
  27. package/dist/auth/oauth-token-response.js +121 -102
  28. package/dist/auth/oauth-v2-migration.js +97 -78
  29. package/dist/auth/renewable-grant.js +10 -0
  30. package/dist/auth/static-oauth.js +751 -281
  31. package/dist/auth/vercel-agent.js +266 -0
  32. package/dist/auth-admission.js +204 -0
  33. package/dist/auth-elicitation.js +350 -241
  34. package/dist/authorization-handoff.js +164 -90
  35. package/dist/call-admission-context.js +3 -10
  36. package/dist/call-admission.js +2 -0
  37. package/dist/call-classification.js +9 -0
  38. package/dist/call-recovery.js +32 -13
  39. package/dist/canonical-json.js +8 -0
  40. package/dist/catalog-cache.js +369 -213
  41. package/dist/catalog-service.js +659 -530
  42. package/dist/catalog.js +5 -1
  43. package/dist/concurrency.js +0 -25
  44. package/dist/config-defaults.d.ts +1 -0
  45. package/dist/config-defaults.js +1 -0
  46. package/dist/config-schema.d.ts +3 -1
  47. package/dist/config-schema.js +13 -3
  48. package/dist/config.d.ts +40 -6
  49. package/dist/config.js +40 -26
  50. package/dist/connector-caller.d.ts +4 -0
  51. package/dist/connector-caller.js +17 -4
  52. package/dist/connectors/api-connector.d.ts +29 -7
  53. package/dist/connectors/api-connector.js +145 -57
  54. package/dist/connectors/guarded-fetch.d.ts +51 -17
  55. package/dist/connectors/guarded-fetch.js +215 -121
  56. package/dist/connectors/negotiation-cache.js +20 -10
  57. package/dist/connectors/remote-mcp.d.ts +10 -30
  58. package/dist/connectors/remote-mcp.js +955 -563
  59. package/dist/d1.js +10 -243
  60. package/dist/derived-context.js +5 -0
  61. package/dist/describe-config.d.ts +3 -1
  62. package/dist/describe-config.js +2 -0
  63. package/dist/downstream-input.js +347 -260
  64. package/dist/errors.d.ts +87 -6
  65. package/dist/errors.js +114 -4
  66. package/dist/execute.js +87 -50
  67. package/dist/executor-admission.js +3 -0
  68. package/dist/executors/quickjs.js +163 -112
  69. package/dist/guarded-transport.js +50 -0
  70. package/dist/guest-runtime.js +1 -1
  71. package/dist/http/client.js +439 -0
  72. package/dist/http/errors.js +558 -0
  73. package/dist/http/fields.js +49 -0
  74. package/dist/http/hatch-paging.js +318 -0
  75. package/dist/http/hatch.js +1279 -0
  76. package/dist/http/json-schema.js +267 -0
  77. package/dist/http/node-transport.js +241 -0
  78. package/dist/http/oauth.js +162 -0
  79. package/dist/http/paging.js +227 -0
  80. package/dist/http/provider.js +221 -0
  81. package/dist/http/safety.js +82 -0
  82. package/dist/http/services.js +79 -0
  83. package/dist/http/tools.js +379 -0
  84. package/dist/http/vendor-index.js +138 -0
  85. package/dist/http/vendor.js +448 -0
  86. package/dist/http/write-request.js +66 -0
  87. package/dist/http-policy.d.ts +11 -0
  88. package/dist/http-policy.js +45 -0
  89. package/dist/inbound-credential.js +1 -1
  90. package/dist/index.d.ts +2 -2
  91. package/dist/index.js +4 -0
  92. package/dist/invocation-auth.js +30 -19
  93. package/dist/invocation.js +218 -85
  94. package/dist/mcp-result.js +0 -4
  95. package/dist/membership.d.ts +4 -0
  96. package/dist/meta-output.js +1 -1
  97. package/dist/meta-tools.js +531 -406
  98. package/dist/native-recovery.js +52 -0
  99. package/dist/native-tools.js +382 -0
  100. package/dist/node.d.ts +4 -3
  101. package/dist/node.js +45 -8
  102. package/dist/oauth-handoff.js +177 -104
  103. package/dist/oauth-partition.js +6 -20
  104. package/dist/oauth-sealing.js +6 -7
  105. package/dist/operation-vocabulary.js +101 -0
  106. package/dist/operator-record.d.ts +2 -2
  107. package/dist/operator-record.js +17 -4
  108. package/dist/operator-ui/contract.d.ts +8 -3
  109. package/dist/operator-ui/generated.js +4 -4
  110. package/dist/operator-ui/model.d.ts +2 -3
  111. package/dist/program-writes.js +47 -26
  112. package/dist/provider-call-facts.d.ts +115 -0
  113. package/dist/provider-call-facts.js +182 -0
  114. package/dist/provider-call.d.ts +112 -0
  115. package/dist/provider-call.js +271 -0
  116. package/dist/provider.d.ts +65 -31
  117. package/dist/provider.js +116 -39
  118. package/dist/providers/_shared/google/hatch.js +91 -0
  119. package/dist/providers/_shared/google/kit.js +427 -0
  120. package/dist/providers/_shared/google/result-size.js +15 -2
  121. package/dist/providers/_shared/google/service-account.d.ts +2 -1
  122. package/dist/providers/_shared/google/service-account.js +8 -4
  123. package/dist/providers/_shared/google/workspace.d.ts +6 -210
  124. package/dist/providers/_shared/google/workspace.js +6 -425
  125. package/dist/providers/_shared/rest/compact-index.js +86 -0
  126. package/dist/providers/_shared/rest/kit.js +146 -0
  127. package/dist/providers/_shared/rest/operation-index.js +230 -14
  128. package/dist/providers/_shared/rest/response-media.js +11 -0
  129. package/dist/providers/_shared/rest/value-safety.js +353 -195
  130. package/dist/providers/_shared/sensitive-fields.js +27 -0
  131. package/dist/providers/breeze/api.js +584 -0
  132. package/dist/providers/breeze/index.d.ts +1 -3
  133. package/dist/providers/breeze/index.js +67 -1420
  134. package/dist/providers/breeze/openapi.generated.js +60 -0
  135. package/dist/providers/breeze/skill.generated.js +2 -6
  136. package/dist/providers/breeze/tools.js +696 -0
  137. package/dist/providers/ccb/api.js +496 -0
  138. package/dist/providers/ccb/index.d.ts +15 -37
  139. package/dist/providers/ccb/index.js +77 -1702
  140. package/dist/providers/ccb/lib/constants.d.ts +34 -0
  141. package/dist/providers/ccb/lib/constants.js +74 -0
  142. package/dist/providers/ccb/lib/guide.js +9 -0
  143. package/dist/providers/ccb/lib/verdicts.js +387 -0
  144. package/dist/providers/ccb/openapi.generated.js +397 -0
  145. package/dist/providers/ccb/safety.js +295 -0
  146. package/dist/providers/ccb/skill.generated.js +2 -6
  147. package/dist/providers/ccb/tools.js +853 -0
  148. package/dist/providers/cloudflare/api.js +1066 -0
  149. package/dist/providers/cloudflare/index.d.ts +5 -22
  150. package/dist/providers/cloudflare/index.js +79 -197
  151. package/dist/providers/cloudflare/lib/config.d.ts +16 -0
  152. package/dist/providers/cloudflare/lib/config.js +2 -0
  153. package/dist/providers/cloudflare/lib/discovery.js +29 -0
  154. package/dist/providers/cloudflare/{graphql.js → lib/graphql.js} +1 -1
  155. package/dist/providers/cloudflare/lib/hatch.js +103 -0
  156. package/dist/providers/cloudflare/lib/path-bounds.js +28 -0
  157. package/dist/providers/cloudflare/lib/response-media.js +75 -0
  158. package/dist/providers/cloudflare/openapi.generated.js +4 -3
  159. package/dist/providers/cloudflare/{value-safety.js → safety.js} +487 -0
  160. package/dist/providers/cloudflare/skill.generated.js +2 -10
  161. package/dist/providers/cloudflare/tools.js +360 -0
  162. package/dist/providers/docs/api.js +51 -0
  163. package/dist/providers/docs/index.d.ts +1 -12
  164. package/dist/providers/docs/index.js +53 -1165
  165. package/dist/providers/docs/lib/constants.d.ts +18 -0
  166. package/dist/providers/docs/lib/constants.js +18 -0
  167. package/dist/providers/docs/lib/discovery.js +26 -0
  168. package/dist/providers/docs/lib/requests.js +48 -0
  169. package/dist/providers/docs/lib/schemas.js +168 -0
  170. package/dist/providers/docs/openapi.generated.js +16 -0
  171. package/dist/providers/docs/safety.js +54 -0
  172. package/dist/providers/docs/skill.generated.js +2 -6
  173. package/dist/providers/docs/tools.js +801 -0
  174. package/dist/providers/drive/api.js +177 -0
  175. package/dist/providers/drive/index.d.ts +1 -12
  176. package/dist/providers/drive/index.js +38 -1448
  177. package/dist/providers/drive/lib/constants.d.ts +6 -0
  178. package/dist/providers/drive/lib/constants.js +6 -0
  179. package/dist/providers/drive/lib/contracts.js +532 -0
  180. package/dist/providers/drive/lib/hatch.js +197 -0
  181. package/dist/providers/drive/openapi.generated.js +77 -0
  182. package/dist/providers/drive/safety.js +90 -0
  183. package/dist/providers/drive/skill.generated.js +2 -6
  184. package/dist/providers/drive/tools.js +1290 -0
  185. package/dist/providers/forms/api.js +71 -0
  186. package/dist/providers/forms/index.d.ts +1 -12
  187. package/dist/providers/forms/index.js +49 -1145
  188. package/dist/providers/forms/lib/constants.d.ts +14 -0
  189. package/dist/providers/forms/lib/constants.js +19 -0
  190. package/dist/providers/forms/lib/hatch.js +72 -0
  191. package/dist/providers/forms/openapi.generated.js +23 -0
  192. package/dist/providers/forms/safety.js +34 -0
  193. package/dist/providers/forms/skill.generated.js +2 -8
  194. package/dist/providers/forms/tools.js +1023 -0
  195. package/dist/providers/github/api.js +150 -0
  196. package/dist/providers/github/index.d.ts +4 -5
  197. package/dist/providers/github/index.js +30 -87
  198. package/dist/providers/github/{auth.d.ts → lib/auth.d.ts} +5 -3
  199. package/dist/providers/github/{auth.js → lib/auth.js} +40 -43
  200. package/dist/providers/github/lib/discovery.js +132 -0
  201. package/dist/providers/github/lib/operations.js +58 -0
  202. package/dist/providers/github/{scope.d.ts → lib/scope.d.ts} +2 -0
  203. package/dist/providers/github/{scope.js → lib/scope.js} +25 -1
  204. package/dist/providers/github/openapi.generated.js +1216 -0
  205. package/dist/providers/github/safety.js +216 -0
  206. package/dist/providers/github/skill.generated.js +2 -5
  207. package/dist/providers/github/tools.js +506 -0
  208. package/dist/providers/gmail/api.js +114 -0
  209. package/dist/providers/gmail/index.d.ts +1 -12
  210. package/dist/providers/gmail/index.js +73 -1621
  211. package/dist/providers/gmail/lib/constants.d.ts +13 -0
  212. package/dist/providers/gmail/lib/constants.js +16 -0
  213. package/dist/providers/gmail/lib/index.js +173 -0
  214. package/dist/providers/gmail/lib/schemas.js +176 -0
  215. package/dist/providers/gmail/lib/threading.js +120 -0
  216. package/dist/providers/gmail/openapi.generated.js +92 -0
  217. package/dist/providers/gmail/safety.js +21 -0
  218. package/dist/providers/gmail/skill.generated.js +2 -6
  219. package/dist/providers/gmail/tools.js +1435 -0
  220. package/dist/providers/overflow/api.js +1008 -0
  221. package/dist/providers/overflow/index.d.ts +1 -17
  222. package/dist/providers/overflow/index.js +60 -1488
  223. package/dist/providers/overflow/skill.generated.js +2 -5
  224. package/dist/providers/overflow/tools.js +873 -0
  225. package/dist/providers/planning-center/api.js +467 -0
  226. package/dist/providers/planning-center/index.d.ts +4 -35
  227. package/dist/providers/planning-center/index.js +69 -2445
  228. package/dist/providers/planning-center/lib/constants.d.ts +58 -0
  229. package/dist/providers/planning-center/lib/constants.js +83 -0
  230. package/dist/providers/planning-center/lib/discovery.js +40 -0
  231. package/dist/providers/planning-center/lib/guide.js +39 -0
  232. package/dist/providers/planning-center/lib/json-api.js +83 -0
  233. package/dist/providers/planning-center/lib/verdicts.js +1758 -0
  234. package/dist/providers/planning-center/openapi.generated.js +1764 -0
  235. package/dist/providers/planning-center/safety.js +188 -0
  236. package/dist/providers/planning-center/skill.generated.js +2 -27
  237. package/dist/providers/planning-center/tools.js +1010 -0
  238. package/dist/providers/quickbooks/api.js +299 -0
  239. package/dist/providers/quickbooks/index.d.ts +13 -0
  240. package/dist/providers/quickbooks/index.js +93 -0
  241. package/dist/providers/quickbooks/lib/query.js +118 -0
  242. package/dist/providers/quickbooks/lib/writes.js +168 -0
  243. package/dist/providers/quickbooks/safety.js +222 -0
  244. package/dist/providers/quickbooks/skill.generated.js +5 -0
  245. package/dist/providers/quickbooks/tools.js +117 -0
  246. package/dist/providers/sheets/api.js +133 -0
  247. package/dist/providers/sheets/index.d.ts +4 -16
  248. package/dist/providers/sheets/index.js +61 -1172
  249. package/dist/providers/sheets/lib/constants.d.ts +14 -0
  250. package/dist/providers/sheets/lib/constants.js +14 -0
  251. package/dist/providers/sheets/lib/hatch.js +163 -0
  252. package/dist/providers/sheets/lib/requests.js +105 -0
  253. package/dist/providers/sheets/lib/schemas.js +138 -0
  254. package/dist/providers/sheets/openapi.generated.js +30 -0
  255. package/dist/providers/sheets/safety.js +27 -0
  256. package/dist/providers/sheets/skill.generated.js +2 -7
  257. package/dist/providers/sheets/tools.js +733 -0
  258. package/dist/providers/slides/api.js +147 -0
  259. package/dist/providers/slides/index.d.ts +2 -10
  260. package/dist/providers/slides/index.js +48 -2555
  261. package/dist/providers/slides/lib/constants.d.ts +11 -0
  262. package/dist/providers/slides/lib/constants.js +11 -0
  263. package/dist/providers/slides/lib/requests.js +60 -0
  264. package/dist/providers/slides/lib/schemas.js +565 -0
  265. package/dist/providers/slides/openapi.generated.js +18 -0
  266. package/dist/providers/slides/skill.generated.js +2 -6
  267. package/dist/providers/slides/tools.js +1968 -0
  268. package/dist/providers/stripe/api.js +401 -0
  269. package/dist/providers/stripe/index.d.ts +5 -27
  270. package/dist/providers/stripe/index.js +74 -210
  271. package/dist/providers/stripe/lib/config.d.ts +4 -0
  272. package/dist/providers/stripe/lib/config.js +2 -0
  273. package/dist/providers/stripe/openapi.generated.js +4 -3
  274. package/dist/providers/stripe/{value-safety.js → safety.js} +5 -5
  275. package/dist/providers/stripe/skill.generated.js +2 -11
  276. package/dist/providers/stripe/tools.js +77 -0
  277. package/dist/providers/tithely/api.js +531 -0
  278. package/dist/providers/tithely/index.d.ts +17 -0
  279. package/dist/providers/tithely/index.js +86 -965
  280. package/dist/providers/tithely/skill.generated.js +2 -5
  281. package/dist/providers/tithely/tools.js +426 -0
  282. package/dist/providers/vercel/api.js +551 -0
  283. package/dist/providers/vercel/index.d.ts +9 -25
  284. package/dist/providers/vercel/index.js +65 -260
  285. package/dist/providers/vercel/lib/config.d.ts +2 -0
  286. package/dist/providers/vercel/lib/config.js +2 -0
  287. package/dist/providers/vercel/lib/index.js +117 -0
  288. package/dist/providers/vercel/lib/logs.js +100 -0
  289. package/dist/providers/vercel/lib/pin.js +270 -0
  290. package/dist/providers/vercel/openapi.generated.js +10 -5
  291. package/dist/providers/vercel/{value-safety.js → safety.js} +247 -38
  292. package/dist/providers/vercel/skill.generated.js +2 -7
  293. package/dist/providers/vercel/tools.js +642 -0
  294. package/dist/redaction-identity.js +47 -0
  295. package/dist/redaction-marker.js +125 -0
  296. package/dist/registry.d.ts +21 -15
  297. package/dist/registry.js +409 -376
  298. package/dist/routes/access-tokens.js +1 -1
  299. package/dist/routes/actor-labels.js +1 -1
  300. package/dist/routes/connect.js +1 -1
  301. package/dist/routes/dispatch.js +103 -0
  302. package/dist/routes/mcp.js +170 -79
  303. package/dist/routes/oauth.js +6 -1
  304. package/dist/routes/operator.js +2 -2
  305. package/dist/routes/shared.d.ts +5 -4
  306. package/dist/routes/shared.js +244 -177
  307. package/dist/routes/skills.js +10 -8
  308. package/dist/routes/ui-config.js +27 -3
  309. package/dist/routes/ui-data.js +21 -20
  310. package/dist/routes/ui.js +1 -1
  311. package/dist/runtime/call-admission.js +0 -26
  312. package/dist/runtime/call-entry.js +30 -0
  313. package/dist/runtime/call.js +552 -0
  314. package/dist/runtime/connector-scope.js +7 -0
  315. package/dist/runtime/credential-probe.js +34 -0
  316. package/dist/runtime/executor.js +40 -0
  317. package/dist/runtime/native-storage.js +63 -0
  318. package/dist/runtime/registry.js +27 -0
  319. package/dist/runtime/request-scope.js +72 -0
  320. package/dist/runtime/run.js +15 -7
  321. package/dist/runtime/shared-read.js +34 -5
  322. package/dist/runtime/storage.js +34 -21
  323. package/dist/sent-secrets.d.ts +194 -37
  324. package/dist/sent-secrets.js +1743 -340
  325. package/dist/server.js +5 -56
  326. package/dist/skills.js +322 -223
  327. package/dist/sqlite.js +15 -14
  328. package/dist/storage/d1-copy.js +255 -0
  329. package/dist/storage/d1-driver.js +15 -0
  330. package/dist/storage/keys.js +28 -0
  331. package/dist/storage/sql-driver.js +88 -0
  332. package/dist/storage/sql-native.js +544 -0
  333. package/dist/storage/sql-schema.d.ts +6 -0
  334. package/dist/storage/sql-schema.js +15 -0
  335. package/dist/storage/sql.d.ts +14 -20
  336. package/dist/storage/sql.js +29 -535
  337. package/dist/timeout.js +0 -26
  338. package/dist/tool-safety.js +20 -10
  339. package/dist/types.d.ts +9 -109
  340. package/dist/ui.d.ts +1 -1
  341. package/dist/ui.js +0 -1
  342. package/dist/upward.js +3 -0
  343. package/dist/usage-guide.js +3 -1
  344. package/dist/validate.d.ts +4 -2
  345. package/dist/validate.js +86 -9
  346. package/dist/version.d.ts +1 -1
  347. package/dist/version.js +1 -1
  348. package/dist/worker.js +312 -292
  349. package/dist/workspace-subject.js +5 -1
  350. package/dist/write-outcome.js +454 -34
  351. package/documentation/README.md +28 -7
  352. package/documentation/architecture.md +2409 -255
  353. package/documentation/auth.md +867 -114
  354. package/documentation/code-mode.md +49 -16
  355. package/documentation/deploying.md +164 -20
  356. package/documentation/hosted-mcp-migration.md +460 -0
  357. package/documentation/integrating.md +129 -144
  358. package/documentation/meta-tools.md +409 -32
  359. package/documentation/operating.md +27 -3
  360. package/documentation/operator-tests.md +3 -0
  361. package/documentation/operator-ui.md +84 -48
  362. package/documentation/provider-auth-migration.md +16 -63
  363. package/documentation/provider-migration-0.29.md +10 -5
  364. package/documentation/provider-migration-0.35.md +975 -0
  365. package/documentation/providers.md +1347 -0
  366. package/examples/worker/AGENTS.md +23 -9
  367. package/examples/worker/README.md +254 -135
  368. package/examples/worker/alchemy.run.ts +116 -0
  369. package/examples/worker/gitignore +10 -0
  370. package/examples/worker/src/connecta.config.ts +23 -21
  371. package/examples/worker/wrangler.jsonc +14 -5
  372. package/guides/connecting-agents.md +157 -0
  373. package/guides/how-it-works.md +156 -0
  374. package/guides/safety-and-trust.md +153 -0
  375. package/package.json +30 -50
  376. package/templates/node/.env.example +3 -0
  377. package/templates/node/README.md +22 -2
  378. package/templates/node/docker-compose.yml +1 -0
  379. package/templates/node/package.json +3 -2
  380. package/templates/node/src/connecta.config.ts +8 -0
  381. package/dist/catalog-drift.d.ts +0 -138
  382. package/dist/catalog-drift.js +0 -578
  383. package/dist/operator-ui/agents.d.ts +0 -74
  384. package/dist/operator-ui/agents.js +0 -104
  385. package/dist/operator-ui/config-summary.js +0 -565
  386. package/dist/operator-ui/connection-map.js +0 -376
  387. package/dist/operator-ui/endpoints.js +0 -221
  388. package/dist/operator-ui/fix-prompts.d.ts +0 -18
  389. package/dist/operator-ui/fix-prompts.js +0 -87
  390. package/dist/operator-ui/health.js +0 -52
  391. package/dist/operator-ui/member-page.js +0 -97
  392. package/dist/operator-ui/overview.js +0 -123
  393. package/dist/operator-ui/setup-commands.js +0 -51
  394. package/dist/operator-ui/view.d.ts +0 -401
  395. package/dist/operator-ui/view.js +0 -705
  396. package/dist/providers/_shared/request-token.js +0 -83
  397. package/dist/providers/_shared/rest/dispatch.js +0 -41
  398. package/dist/providers/_shared/rest/operation-index.d.ts +0 -133
  399. package/dist/providers/_shared/rest/tools.d.ts +0 -141
  400. package/dist/providers/_shared/rest/tools.js +0 -569
  401. package/dist/providers/_shared/rest/value-safety.d.ts +0 -201
  402. package/dist/providers/basecamp/index.d.ts +0 -45
  403. package/dist/providers/basecamp/index.js +0 -997
  404. package/dist/providers/basecamp/skill.generated.js +0 -9
  405. package/dist/providers/cloudflare/rest.d.ts +0 -37
  406. package/dist/providers/cloudflare/rest.js +0 -1097
  407. package/dist/providers/github/hosted.js +0 -218
  408. package/dist/providers/github/rest.js +0 -321
  409. package/dist/providers/infisical/index.d.ts +0 -7
  410. package/dist/providers/infisical/index.js +0 -713
  411. package/dist/providers/infisical/skill.generated.js +0 -8
  412. package/dist/providers/intercom/index.d.ts +0 -24
  413. package/dist/providers/intercom/index.js +0 -121
  414. package/dist/providers/intercom/skill.generated.js +0 -8
  415. package/dist/providers/linear/index.d.ts +0 -55
  416. package/dist/providers/linear/index.js +0 -537
  417. package/dist/providers/linear/skill.generated.js +0 -8
  418. package/dist/providers/mixpanel/index.d.ts +0 -59
  419. package/dist/providers/mixpanel/index.js +0 -472
  420. package/dist/providers/mixpanel/operations.js +0 -20
  421. package/dist/providers/mixpanel/rest.js +0 -603
  422. package/dist/providers/mixpanel/skill.generated.js +0 -10
  423. package/dist/providers/mixpanel/value-safety.js +0 -16
  424. package/dist/providers/notion/index.d.ts +0 -67
  425. package/dist/providers/notion/index.js +0 -368
  426. package/dist/providers/notion/openapi.generated.js +0 -75
  427. package/dist/providers/notion/rest.d.ts +0 -24
  428. package/dist/providers/notion/rest.js +0 -1226
  429. package/dist/providers/notion/skill.generated.js +0 -11
  430. package/dist/providers/notion/value-safety.js +0 -56
  431. package/dist/providers/revenuecat/index.d.ts +0 -51
  432. package/dist/providers/revenuecat/index.js +0 -697
  433. package/dist/providers/revenuecat/skill.generated.js +0 -11
  434. package/dist/providers/stripe/rest.d.ts +0 -14
  435. package/dist/providers/stripe/rest.js +0 -402
  436. package/dist/providers/vercel/rest.d.ts +0 -20
  437. package/dist/providers/vercel/rest.js +0 -1020
  438. package/dist/providers/wispr-flow/index.d.ts +0 -14
  439. package/dist/providers/wispr-flow/index.js +0 -117
  440. package/dist/providers/wispr-flow/skill.generated.js +0 -8
  441. /package/dist/providers/github/{key.js → lib/key.js} +0 -0
@@ -0,0 +1,460 @@
1
+ # Migrate hosted MCP presets
2
+
3
+ Basecamp, Intercom, Linear, RevenueCat, and Wispr Flow no longer have provider
4
+ subpath exports. Replace their imports and factories with `remoteMcp` from
5
+ `@zackbart/connecta`. The remote server supplies its catalog at runtime.
6
+ Stripe, Vercel, Cloudflare, and GitHub also lose their hosted halves.
7
+ The vendored Notion and Mixpanel API providers are removed in 0.35.0; connect
8
+ their hosted servers through the generic entries below. The mappings below describe the
9
+ former settings as of 2026-10-23, not a promise about current vendor availability.
10
+
11
+ ## Replace a connection without expanding access
12
+
13
+ 1. Before upgrading, record each connector's id, selected URL/region/access,
14
+ auth mode, ownership, OAuth client identity and scope, credential header
15
+ framing, `readOnly`, pool grants, and deployment classification overrides.
16
+ Record settings without recording token or secret values.
17
+ 2. Remove the old provider import, factory, endpoint constants, and review
18
+ constants. Construct a generic entry with the same id and the mapping
19
+ below. Preserve explicit settings over historical defaults. Keep each old
20
+ connector as one connection; never combine grants from separate accounts,
21
+ projects, regions, or credential owners.
22
+ 3. Preserve `authScope` explicitly. A personal connector must remain personal;
23
+ changing it to shared would expose one person's grant to other callers.
24
+ Keep the original pool `tools` entries and membership. An existing exact
25
+ `crm.get_record` grant stays exact; do not replace it with `crm`.
26
+ 4. Preserve `requireHttps: true` on every migrated connection. Copy explicit `title`,
27
+ `maxResultBytes`, `readOnly`, and `callAdmission` unchanged. The five removed presets supplied no default call admission; see Stripe below
28
+ for its former fixed hosted policy. Their local `readOnly` default was
29
+ false, independent of a remote endpoint's read-only variant.
30
+ 5. Move `purpose` to `description`, and deployment-specific `instructions` to
31
+ `usageGuide.content`. Generic entries do not accept `purpose` or
32
+ `instructions` and do not reconstruct the old maintained vendor guide,
33
+ summary, required-guide setting, slot label, or default title. Choose
34
+ explicit descriptive labels and retain needed account/region context.
35
+ 6. Check classification settings against the live catalog. Tools the retired
36
+ review held as write or destructive must stay non-read. When live hints
37
+ mark them read, an exact `"write"` or `"hidden"` override in
38
+ `ConnectaConfig.classification` is allowed and expected. Never copy a
39
+ retired review map wholesale, migrate schema pins, or use historical
40
+ verdicts to broaden access.
41
+
42
+ For example, an existing connector named `crm` remains `crm`. Substitute its
43
+ preserved URL from the table and its existing auth settings in this deployment
44
+ fragment, retaining the surrounding storage, executor, inbound auth, pools,
45
+ and endpoint `readOnly` settings:
46
+
47
+ ```ts
48
+ import { remoteMcp } from "@zackbart/connecta";
49
+
50
+ const crm = remoteMcp("crm", {
51
+ url: "https://crm.example.com/mcp", // replace with the preserved server URL
52
+ title: "Customer support",
53
+ description: "Support triage for the existing workspace",
54
+ requireHttps: true,
55
+ authScope: "personal", // preserve the old connection's ownership
56
+ auth: { type: "oauth" },
57
+ readOnly: true, // preserve the old local flag
58
+ usageGuide: { content: "Use this workspace for customer support triage." },
59
+ });
60
+ // Replace the old crm factory entry with crm in connectors.
61
+ // Retain existing grants, for example tools: ["crm.search"] for assistant.
62
+ ```
63
+
64
+ ## Historical endpoint and auth mapping
65
+
66
+ These are the former preset settings, not a guarantee of current vendor
67
+ availability or permission policy. Keep any explicit operator-selected scope,
68
+ client, or framing instead of replacing it with a historical default.
69
+ “No extra headers” excludes normal MCP protocol and authentication headers,
70
+ which `remoteMcp()` constructs itself.
71
+
72
+ | Removed factory / selection | Generic `url` | Auth and ownership to preserve | Scopes, headers, and read-only variants |
73
+ | ------------------------------------------- | -------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
74
+ | `basecamp(id, options)` | `https://mcp.basecamp.com/mcp` | OAuth only; default `authScope: "shared"`. Use `auth: { type: "oauth", scope: "full mcp offline_access" }`. Move top-level `clientMetadataUrl` into `auth.clientMetadataUrl` if present. | The scope is a fallback: server challenges, then resource scopes take precedence; advertised `offline_access` is added by the client. Keep CIMD (see below). No extra headers or remote read-only variant. |
75
+ | `intercom(id, { region: "us", ... })` | `https://mcp.intercom.com/mcp` | Default `auth: { type: "oauth" }`: explicitly set `authScope: "personal"` to preserve the old OAuth default, because `remoteMcp()` defaults to shared. Non-OAuth auth defaulted shared; preserve explicit ownership. | Discovered scopes, historically `mcp` and `operator`; no preset fallback or extra headers. Credential auth uses `Authorization: Bearer <value>`. Preserve local `readOnly`. |
76
+ | `intercom(id, { region: "eu", ... })` | `https://mcp.eu.intercom.com/mcp` | For OAuth, explicitly set `authScope: "personal"` as in US; `remoteMcp()` defaults to shared. Non-OAuth auth defaulted shared. Preserve explicit ownership and this region's resource. | Keep the EU URL and region-specific grant. Never substitute US. No AU preset existed. No remote read-only variant. |
77
+ | `linear(id, { access: "read-write", ... })` | `https://mcp.linear.app/mcp` | Default OAuth, shared unless explicitly personal; use `auth: { type: "oauth" }` or preserve the explicit auth object. | No preset scope fallback or extra headers. A credential is a personal API key sent as `Authorization: Bearer <value>`, not the bare GraphQL framing. |
78
+ | `linear(id, { access: "read-only", ... })` | `https://mcp.linear.app/mcp/readonly` | Same auth/ownership rules as read-write. `access` becomes this exact URL, not a generic option. | This endpoint historically advertises only `read`. Do not switch to `/mcp` and substitute local `readOnly`: downstream scope restriction is separate. Preserve the old local flag; it was not implicitly true. |
79
+ | `revenuecat(id, options)` | `https://mcp.revenuecat.ai/mcp` | Default OAuth, shared unless explicitly personal; use `auth: { type: "oauth" }` or preserve explicit auth. | No preset scope fallback or extra headers. Credential auth sends an API v2 secret key as `Authorization: Bearer <value>`. Keep one connection per project key; do not replace a project key with an account-wide OAuth grant. Preserve local `readOnly`. |
80
+ | `wisprFlow(id, options)` | `https://api.wisprflow.ai/connect/mcp` | OAuth only, shared unless explicitly personal. Use `auth: { type: "oauth", scope: "openid offline_access", ...oldAuth }`, where `oldAuth` is the existing OAuth options. | `openid offline_access` was a fallback, overridden by an explicit old `auth.scope`. Preserve existing `auth.client` or `auth.clientMetadataUrl`. No extra headers or remote read-only variant; preserve the local flag. Personal and work accounts contain separate content. |
81
+
82
+ Intercom's non-loopback OAuth callbacks historically needed Customer Support
83
+ to allowlist the deployment's redirect URI. Preserve that URI and approval.
84
+ Fin Operator requires teammate OAuth, workspace availability, and permissions;
85
+ a static token is not an equivalent grant.
86
+
87
+ ## Run a hosted connection beside its API connector
88
+
89
+ The Notion and Mixpanel API providers are [removed in 0.35.0](./provider-migration-0.35.md#remove-infisical-notion-and-mixpanel);
90
+ their generic hosted entries replace the removed connections.
91
+
92
+ Keep the existing API connector and its id. Add the generic hosted entry under a
93
+ **distinct id**, then add only intended tool addresses to its pools. If replacing
94
+ an old hosted entry, keep that hosted id and put the API connector under another
95
+ id. A new id does not inherit stored credentials or grants: connect it through
96
+ the operator UI as the intended owner. Do not copy tokens between ids or owners.
97
+ All examples below are deployment fragments to place in the existing
98
+ `connectors` array; preserve the surrounding deployment configuration.
99
+
100
+ The old OAuth selections on Stripe, Vercel, and Cloudflare throw at
101
+ construction. They never fall through to an API credential. `remoteMcp({ classify })`
102
+ throws too; move checked deployment policy to `ConnectaConfig.classification`.
103
+ Do not migrate schema pins, `optional`, or `unlisted: "hide"` as live reviews.
104
+
105
+ ### Stripe
106
+
107
+ Former URL: `https://mcp.stripe.com/`. Auth was OAuth only, shared unless
108
+ explicitly personal, with discovered scopes and no preset scope fallback or
109
+ extra headers. Preserve an explicit OAuth client, scope, redirect policy and
110
+ version negotiation. API-key `mode` and `connectedAccount` still belong only to
111
+ the API connector; OAuth could reach both live and sandbox accounts.
112
+
113
+ ```ts
114
+ import { stripe } from "@zackbart/connecta/providers/stripe";
115
+ import { remoteMcp } from "@zackbart/connecta";
116
+
117
+ const billingApi = stripe("billing_api", {
118
+ purpose: "Sandbox billing", auth: { type: "apiKey" }, mode: "sandbox",
119
+ });
120
+ const billingHosted = remoteMcp("billing_hosted", {
121
+ url: "https://mcp.stripe.com/", requireHttps: true,
122
+ description: "Billing across authorized Stripe accounts",
123
+ auth: { type: "oauth" }, authScope: "shared",
124
+ callAdmission: { rules: [{
125
+ maxConcurrency: 4, queueTimeoutMs: 5000, retryAfterMs: 1000,
126
+ budget: { kind: "rolling-window", maxCalls: 25, windowMs: 1000 },
127
+ }] },
128
+ });
129
+ ```
130
+
131
+ The explicit admission policy reproduces the former fixed hosted default:
132
+ 25 calls/second and four concurrent calls, even for a live account. Preserve
133
+ it when migrating; generic connections supply no Stripe admission default.
134
+ Discover account selectors and current classifications before account-scoped use.
135
+ Keep `stripe_analytics` non-read: it can create asynchronous query runs, even
136
+ when used to analyze existing data. If live hints mark it read, set an exact
137
+ `"write"` or `"hidden"` deployment override.
138
+
139
+ ### Vercel
140
+
141
+ Former URL: `https://mcp.vercel.com`. Auth was OAuth only, shared unless
142
+ explicitly personal. Scopes were discovered; there was no preset fallback,
143
+ extra header, or default call admission. Preserve explicit call admission.
144
+ Vercel historically admitted only approved MCP clients; retain the registered
145
+ client and callback approval. `teamId` and `baseUrl` remain API-only options;
146
+ the hosted grant controls reachable teams.
147
+
148
+ ```ts
149
+ import { vercel } from "@zackbart/connecta/providers/vercel";
150
+ import { remoteMcp } from "@zackbart/connecta";
151
+
152
+ const hostingApi = vercel("hosting_api", {
153
+ purpose: "Deployment operations", auth: { type: "token" },
154
+ });
155
+ const hostingHosted = remoteMcp("hosting_hosted", {
156
+ url: "https://mcp.vercel.com", requireHttps: true,
157
+ description: "Authorized hosting teams", authScope: "shared",
158
+ auth: { type: "oauth" },
159
+ });
160
+ ```
161
+
162
+ Preserve non-read exposure for `filter_project_envs` and `get_project_env`,
163
+ which can return decrypted environment values; `get_access_to_vercel_url`,
164
+ whose returned URL is a credential; and `cancel_deployment`, which changes an
165
+ existing deployment. If live hints mark any of them read, set a `"write"` or
166
+ `"hidden"` override. For example, add this map to the surrounding deployment:
167
+
168
+ ```ts
169
+ classification: {
170
+ hosting_hosted: {
171
+ filter_project_envs: "hidden",
172
+ get_project_env: "hidden",
173
+ get_access_to_vercel_url: "hidden",
174
+ cancel_deployment: "write",
175
+ },
176
+ },
177
+ ```
178
+
179
+ ### Cloudflare
180
+
181
+ Former URL: `https://mcp.cloudflare.com/mcp`. Auth was OAuth only, shared
182
+ unless explicitly personal, with discovered scopes, no preset scope fallback,
183
+ extra headers, or default hosted admission. Preserve explicit admission.
184
+ API `accountId`, `zoneId`, `pin`, and Global API Key boundaries do not constrain
185
+ the generic server; authorize the intended hosted account separately.
186
+
187
+ ```ts
188
+ import { cloudflare } from "@zackbart/connecta/providers/cloudflare";
189
+ import { remoteMcp } from "@zackbart/connecta";
190
+
191
+ const infrastructureApi = cloudflare("infrastructure_api", {
192
+ purpose: "Infrastructure operations", auth: { type: "apiToken" },
193
+ });
194
+ const infrastructureHosted = remoteMcp("infrastructure_hosted", {
195
+ url: "https://mcp.cloudflare.com/mcp", requireHttps: true,
196
+ description: "Authorized infrastructure accounts", authScope: "shared",
197
+ auth: { type: "oauth" },
198
+ });
199
+ ```
200
+
201
+ The former reviewed `execute` verdict is gone. Check the live annotations and
202
+ set an explicit deployment `"write"` or `"hidden"` override when required.
203
+
204
+ ### Notion
205
+
206
+ Former URL: `https://mcp.notion.com/mcp`. Auth was OAuth only, shared unless
207
+ explicitly personal, acting as the authorized user. Scopes were discovered;
208
+ there was no preset fallback, extra header, or default hosted admission.
209
+ An API integration token does not replace user OAuth. Preserve any explicit
210
+ hosted call admission; no provider preset supplies a default.
211
+
212
+ ```ts
213
+ import { remoteMcp } from "@zackbart/connecta";
214
+
215
+ const notesHosted = remoteMcp("notes_hosted", {
216
+ url: "https://mcp.notion.com/mcp", requireHttps: true,
217
+ description: "User-authorized notes", authScope: "personal",
218
+ auth: { type: "oauth" },
219
+ });
220
+ ```
221
+
222
+ The example explicitly selects personal ownership; preserve the old setting
223
+ when replacing an existing connection. Generic hosted results do not inherit
224
+ the removed integration connector's URL redaction or file safety rules.
225
+ Keep confirmation-flag destructive tools such as `notion-delete-databases`
226
+ and `notion-delete-pages` non-read. An optional confirmation flag does not
227
+ make the whole tool read-only. If live hints mark them read, set exact
228
+ `"write"` or `"hidden"` deployment overrides.
229
+
230
+ ### Mixpanel
231
+
232
+ Former regional URLs:
233
+
234
+ | Region | Generic `url` |
235
+ | -------------- | --------------------------------- |
236
+ | `us` (default) | `https://mcp.mixpanel.com/mcp` |
237
+ | `eu` | `https://mcp-eu.mixpanel.com/mcp` |
238
+ | `in` | `https://mcp-in.mixpanel.com/mcp` |
239
+
240
+ Preserve the project's exact region. OAuth was the default, with discovered
241
+ scopes and no preset fallback. Explicit credential, inline `headers`, and
242
+ `request` auth were also accepted. Ownership defaulted shared for every mode;
243
+ no extra headers or default hosted admission were supplied. Copy explicit
244
+ headers/request callbacks with their existing secret sources and restrictions.
245
+
246
+ ```ts
247
+ import { remoteMcp } from "@zackbart/connecta";
248
+
249
+ const analyticsHosted = remoteMcp("analytics_hosted", {
250
+ url: "https://mcp-eu.mixpanel.com/mcp", requireHttps: true,
251
+ description: "EU product analytics", authScope: "shared",
252
+ auth: { type: "oauth" },
253
+ });
254
+ ```
255
+
256
+ For a service account, replace the generic entry's `auth` with
257
+ `{ type: "credential", header: "Authorization", scheme: "Bearer Basic",
258
+ credential: { label: "Service account" } }`. Store the original `username:secret`
259
+ pair in its vault slot. Generic `remoteMcp()` base64-encodes a credential whose
260
+ scheme ends in `Basic`, producing `Authorization: Bearer Basic <base64(pair)>`.
261
+ Ordinary `Basic` or `Bearer <pair>` is not equivalent. Preserve an explicit old
262
+ header/scheme instead of overriding it with these historical defaults.
263
+ Keep `Get-Experiment` non-read: its optional compute flags can persist refreshed
264
+ result caches and auto-conclude an experiment. If live hints mark it read, set
265
+ an exact `"write"` or `"hidden"` deployment override.
266
+
267
+ ### GitHub
268
+
269
+ `github()` has no hosted selector. Its REST connection keeps the configured
270
+ App identity and repository scopes. From 0.35 it exposes the four github_api
271
+ hatches, list_scopes, search_scoped and guarded merge_pull_request. The raw
272
+ search and merge routes, secret/admin operations and downloads are refused.
273
+ See [GitHub's 0.35 migration](./provider-migration-0.35.md#github) for removed
274
+ release-tool names and paging/result changes.
275
+
276
+ Former URL: `https://api.githubcopilot.com/mcp/`, shared request auth with
277
+ `Authorization: Bearer <installation token>`, `requireHttps: true`, and
278
+ `redirects: "none"`. The old headers were
279
+ `X-MCP-Toolsets: repos,git,issues,pull_requests,actions,labels` and `X-MCP-Tools`
280
+ containing the 26 reviewed names. These become generic top-level `headers` when
281
+ needed. They select vendor tools; they do not confer repository permissions.
282
+ No OAuth scopes or consent applied to this App-token path; each call minted a
283
+ token narrowed to repository IDs and reviewed permissions.
284
+
285
+ ```ts
286
+ import { github } from "@zackbart/connecta/providers/github";
287
+ import { remoteMcp, type ConnectorContext } from "@zackbart/connecta";
288
+
289
+ // The deployment supplies the request-bound token minter and its restrictions.
290
+ function sourceConnections(token: (ctx: ConnectorContext) => Promise<string>) {
291
+ return [
292
+ github("source_api", {
293
+ purpose: "Repository administration", app: { appId: "12345" },
294
+ scopes: [{ repo: "alice/notes", access: "read" }],
295
+ }),
296
+ remoteMcp("source_hosted", {
297
+ url: "https://api.githubcopilot.com/mcp/", requireHttps: true,
298
+ redirects: "none", description: "Authorized repository tools", authScope: "shared",
299
+ auth: { type: "request", token },
300
+ headers: { "X-MCP-Toolsets": "repos,git,issues,pull_requests,actions,labels",
301
+ "X-MCP-Tools": "get_file_contents,list_commits" },
302
+ }),
303
+ ];
304
+ }
305
+ ```
306
+
307
+ For reference, the former complete `X-MCP-Tools` value was:
308
+
309
+ ```text
310
+ get_file_contents,get_commit,list_commits,list_branches,get_tag,list_tags,get_latest_release,get_release_by_tag,list_releases,list_issues,issue_read,get_label,list_pull_requests,pull_request_read,actions_list,actions_get,issue_write,add_issue_comment,create_pull_request,update_pull_request,pull_request_review_write,create_branch,create_or_update_file,delete_file,push_files,actions_run_trigger
311
+ ```
312
+
313
+ The example deliberately selects two tools; set the exact intended vendor
314
+ selection and pool grants after checking the live catalog. A separately scoped static token can instead use generic
315
+ `auth: { type: "credential", header: "Authorization", scheme: "Bearer" }`
316
+ in its own vault slot. OAuth is a separate generic option
317
+ only when supported by the chosen server/client; preserve its own scopes and
318
+ registration rather than reusing App credentials.
319
+
320
+ **GitHub App hosted routing does not carry over.** The generic connection does
321
+ not reuse the vendored App's private-key vault, mint or narrow installation
322
+ tokens, resolve installation/repository identity, validate owner/repo arguments,
323
+ or enforce its workflow-file and method guards. `github().scopes` constrain only
324
+ the six REST tools. Only generic `auth: { type: "request", token: async (ctx) =>
325
+ … }` can supply an operator-minted App token per request; the deployment must own
326
+ its minting, renewal, confinement and subject isolation. A static token does not restore the removed per-call App identity or restrictions.
327
+
328
+ ## Preserve credentials and registration
329
+
330
+ Intercom, Linear, and RevenueCat accepted the generic `oauth`, `credential`,
331
+ `headers`, and `request` auth modes. Copy an explicit `auth` object unchanged,
332
+ including credential `header`/`scheme`, OAuth `client`, `clientMetadataUrl`,
333
+ `scope`, and other options. `headers` remains inline deployment auth; `request`
334
+ remains the operator's request-bound credential supplier. Preserve their secret
335
+ sources and owner restrictions. Basecamp and Wispr Flow were OAuth-only.
336
+
337
+ For a stored token, the equivalent generic configuration is:
338
+
339
+ ```ts
340
+ const tickets = remoteMcp("tickets", {
341
+ url: "https://tickets.example.com/mcp", // substitute the old regional URL
342
+ requireHttps: true,
343
+ authScope: "shared", // use the old explicit owner setting
344
+ auth: {
345
+ type: "credential",
346
+ header: "Authorization",
347
+ scheme: "Bearer",
348
+ credential: { label: "Workspace API token" },
349
+ },
350
+ });
351
+ ```
352
+
353
+ Keep the same connector id and vault store/key configuration so the encrypted
354
+ `value` slot remains addressable. Do not put a stored value into source or
355
+ extra headers, print it, or move it to another owner. Customize the credential
356
+ label if needed; labels are not vault keys. An unchanged id alone does not
357
+ prove OAuth compatibility: reproduce the resource `url`, scope, client
358
+ identity, `redirects`, and `versionNegotiation` (including their old defaults),
359
+ and retain the deployment's public URL and callback. Never transfer tokens or
360
+ client secrets between issuers, regions, accounts, or owners.
361
+
362
+ Existing CIMD grants keep working when their client and resource binding is
363
+ unchanged. For new registrations without an explicit `auth.client`, Connecta
364
+ uses CIMD when the authorization server advertises it, then advertised dynamic
365
+ client registration (DCR). If neither is available, configure an
366
+ operator-registered client with its exact issuer, client id, authentication
367
+ method, and secret source. An explicit `auth.client` selects that registered
368
+ client directly. A rejected CIMD consent is not silently retried as DCR under a
369
+ different identity.
370
+
371
+ Basecamp requires CIMD for public HTTPS callbacks because it restricts dynamic
372
+ registration for those callbacks. Keep the deployment's public HTTPS
373
+ `publicUrl` so Connecta can serve its self-hosted client metadata document, or
374
+ preserve the old external `clientMetadataUrl` inside `auth`. The external
375
+ HTTPS document must keep its URL as `client_id`, the exact callback URI, and
376
+ public-client authentication. Do not turn that URL into `auth.client.clientId`
377
+ or remove it merely to force DCR. Moving between external and self-hosted CIMD,
378
+ DCR, or an operator client can require Disconnect and reconnect with new
379
+ consent. See [downstream OAuth](./auth.md#downstream-oauth-client-registration) for the registration
380
+ configuration and credential connection procedures in the installed package.
381
+
382
+ ## Recheck exposure and tool routes
383
+
384
+ Generic connections classify from the live server's annotations and explicit
385
+ deployment policy. A tool is a read exactly when `readOnlyHint === true &&
386
+ destructiveHint !== true`; otherwise it is a write. The old preset's review no longer supplies a read verdict or hides
387
+ unlisted names. Server descriptions and schemas supply tool guidance; the
388
+ operator owns auth, scope, subject isolation, and result-safety choices.
389
+
390
+ Retain deployment-authored overrides that you have checked against the live
391
+ catalog in the top-level `ConnectaConfig.classification` map, under the preserved
392
+ connector id. These are exact tool names, not arguments or `remoteMcp()` options:
393
+
394
+ ```ts
395
+ classification: {
396
+ crm: {
397
+ list_tickets: "read",
398
+ update_ticket: "write",
399
+ internal_export: "hidden",
400
+ },
401
+ },
402
+ ```
403
+
404
+ `"read"` sets the effective read class for tool routing and read-only exposure.
405
+ `"write"` selects the host approval path. `"hidden"` omits the tool from search
406
+ and describe and refuses guessed-name calls, including programs. An absent
407
+ runtime tool leaves its override dormant, with one operator warning per catalog
408
+ change; the override applies if that exact name returns. Use `"write"` or
409
+ `"hidden"` to keep formerly reviewed writes and destructive tools non-read
410
+ when live hints would expose them as reads. Never copy a retired review map
411
+ wholesale or use it to broaden access or merely recover an old route.
412
+
413
+ An override does not change replay safety. A call is write-like when either its
414
+ effective class or its source class is write. The source class uses only the server's annotations: missing hints or
415
+ `destructiveHint: true` count as write even when deployment policy sets read. Write-like
416
+ calls get one attempt across OAuth renewal, reconnect, authorization recovery
417
+ and program re-runs. An ambiguous dispatched failure, including timeout or
418
+ cancellation, reports an unknown outcome with no retry or wait advice. Approval,
419
+ read-only gating and catalog presentation keep using the effective class. See
420
+ [generic remote connections](./integrating.md#another-remote-mcp-server) for the configuration rules.
421
+
422
+ Across the former hosted presets and hosted halves, about 290 of roughly 350 reviewed reads lacked retained evidence of
423
+ `readOnlyHint: true`. The estimate for these five is up to 105 Basecamp, 53
424
+ RevenueCat, 16 Wispr Flow, 11 Intercom, and 2 Linear tools. These are historical
425
+ evidence gaps, not counts of the current live catalog. Check the live hints
426
+ before concluding a tool is still a read. The six hosted halves now follow the same annotations-only rule.
427
+
428
+ A formerly reviewed read can disappear from a read-only connector or endpoint.
429
+ On a writable endpoint it can move from `call_tool` to
430
+ `call_destructive_tool` or `execute_code`. Host approval behavior may therefore
431
+ change; Connecta does not guarantee a separate human prompt for every call.
432
+ Never relax endpoint `readOnly`, replace a restricted token, or promote a tool
433
+ to read merely to recover an old route.
434
+
435
+ A whole-connection pool grant such as `tools: ["crm"]` can expose new live names
436
+ as soon as they are eligible. Existing exact grants such as
437
+ `tools: ["crm.search"]` do not expand automatically. If the old preset hid
438
+ unknown names, inspect the current catalog before rollout and explicitly
439
+ retain only the approved tool addresses in pools. Maintainers on plain `/mcp`
440
+ see the connector's eligible catalog; a pool allowlist does not restrict that
441
+ endpoint. Acknowledgment or reading a status page is not an access grant.
442
+
443
+ ## Verify the upgrade
444
+
445
+ Run the deployment's `npm run typecheck` (or its existing Worker typecheck),
446
+ restart Node or redeploy the Worker, and run `npx connecta doctor` against the
447
+ configured endpoint. These commands operate in the deployment project; no
448
+ Connecta source checkout is required.
449
+
450
+ Use the operator UI to verify shared ownership as a maintainer and personal
451
+ auth as the intended person. If a grant's binding changed, Disconnect and
452
+ reconnect through explicit consent; passive discovery does not register a
453
+ client or start authorization. Discover tools from the intended pool, inspect
454
+ current descriptions and classifications, and perform a bounded read. Confirm
455
+ that an excluded pool still cannot discover or call the connection and that
456
+ writes remain refused on read-only endpoints. Update agent instructions that
457
+ name removed tool routes using the newly discovered catalog, without widening
458
+ the pool's grant. Follow [Operating an endpoint](./operating.md) and
459
+ [Verify and diagnose](./deploying.md#verify-and-diagnose) for the installed
460
+ operator procedures.