@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,1347 @@
1
+ # Maintained provider setup
2
+
3
+ Each section below sets up one maintained provider: a construction example,
4
+ its credential, the options that change behavior or data boundaries, what the
5
+ vendor must enable first, and its limits. [Change the connector
6
+ roster](./integrating.md#add-or-remove-a-connector) covers the general
7
+ procedure and the providers not listed here. Agent guidance for each
8
+ provider ships with its connection's usage guide, not here.
9
+
10
+ ## API sources and tool inventory
11
+
12
+ Maintained providers pair reviewed API contracts and indexes with Connecta's
13
+ adapters and tools. Sources include upstream OpenAPI,
14
+ Google Discovery conversions, reviewed HTML/documentation conversions and
15
+ hand-authored endpoint contracts. Tithe.ly and Overflow use endpoint checks
16
+ without vendored OpenAPI documents. `remoteMcp()` discovers live server tools
17
+ instead.
18
+
19
+ QuickBooks Online uses a restricted hand-authored Accounting API contract with
20
+ manual vendor review; its read hatch cannot execute arbitrary query SQL.
21
+
22
+ These generated reference catalogs separate named workflows from API tools
23
+ and reads from writes. API search/details inspect indexed contracts, including
24
+ refused operations. Raw read/write calls accept only reviewed operations within
25
+ configured scope and safety rules. Gmail has no generic write tool.
26
+
27
+ Addresses use your connector ID: Stripe configured as `billing` exposes
28
+ `billing.stripe_api_read`. Configuration, credentials and read-only policy affect
29
+ availability. Planning Center labels identify required products. Use live
30
+ discovery for your deployment's catalog.
31
+
32
+ <!-- provider-inventory:start -->
33
+
34
+ <details>
35
+ <summary>Breeze ChMS (15 tools)</summary>
36
+
37
+ [Setup](#breeze-chms). **API source:** [Reviewed HTML/documentation conversion](https://app.breezechms.com/api).
38
+
39
+ - **Named reads:** `get_account_summary`, `get_person`, `list_attendance`, `list_contributions`, `list_events`, `list_funds`, `list_people`, `list_profile_fields`, `list_tags`.
40
+ - **Named writes:** `add_person`, `update_person`.
41
+ - **API reads:** `breeze_api_details`, `breeze_api_read`, `breeze_api_search`.
42
+ - **API writes:** `breeze_api_write`.
43
+
44
+ **Contributor evidence (optional):** [contracts, adapters and review](https://github.com/zackbart/connecta/tree/main/src/providers/breeze).
45
+
46
+ </details>
47
+
48
+ <details>
49
+ <summary>Church Community Builder (20 tools)</summary>
50
+
51
+ [Setup](#church-community-builder). **API source:** [Upstream OpenAPI](https://docs.pushpay.io/chms-v2/openapi/chms-api-specs.json?download=1).
52
+
53
+ - **Named reads:** `get_event_attendance`, `get_event`, `get_family`, `get_giving_metrics`, `get_group`, `get_individual`, `get_me`, `list_event_attendees`, `list_events`, `list_families`, `list_group_members`, `list_groups`, `list_individual_groups`, `list_individual_notes`, `list_individuals`, `search_records`.
54
+ - **Named writes:** None.
55
+ - **API reads:** `ccb_api_details`, `ccb_api_read`, `ccb_api_search`.
56
+ - **API writes:** `ccb_api_write`.
57
+
58
+ **Contributor evidence (optional):** [contracts, adapters and review](https://github.com/zackbart/connecta/tree/main/src/providers/ccb).
59
+
60
+ </details>
61
+
62
+ <details>
63
+ <summary>Cloudflare (9 tools)</summary>
64
+
65
+ [Setup](#cloudflare). **API source:** [Upstream OpenAPI](https://raw.githubusercontent.com/cloudflare/api-schemas/main/openapi.json). [Supplemental reviewed contract](https://developers.cloudflare.com/analytics/graphql-api/).
66
+
67
+ - **Named reads:** `graphql_query`, `list_accounts`, `list_zones`, `verify_credential`.
68
+ - **Named writes:** None.
69
+ - **API reads:** `cloudflare_api_details`, `cloudflare_api_read`, `cloudflare_api_search`.
70
+ - **API writes:** `cloudflare_api_upload`, `cloudflare_api_write`.
71
+
72
+ **Contributor evidence (optional):** [contracts, adapters and review](https://github.com/zackbart/connecta/tree/main/src/providers/cloudflare).
73
+
74
+ </details>
75
+
76
+ <details>
77
+ <summary>Google Docs (10 tools)</summary>
78
+
79
+ [Setup](#google-docs). **API source:** [Google Discovery conversion](https://docs.googleapis.com/$discovery/rest?version=v1).
80
+
81
+ - **Named reads:** `get_document`.
82
+ - **Named writes:** `append_text`, `batch_update_document`, `create_document`, `insert_text`, `replace_all_text`.
83
+ - **API reads:** `docs_api_details`, `docs_api_read`, `docs_api_search`.
84
+ - **API writes:** `docs_api_write`.
85
+
86
+ **Contributor evidence (optional):** [contracts, adapters and review](https://github.com/zackbart/connecta/tree/main/src/providers/docs).
87
+
88
+ </details>
89
+
90
+ <details>
91
+ <summary>Google Drive (21 tools)</summary>
92
+
93
+ [Setup](#google-drive). **API source:** [Google Discovery conversion](https://developers.google.com/workspace/drive/api/reference/rest/v3).
94
+
95
+ - **Named reads:** `get_file_content`, `get_file`, `list_folder_items`, `list_permissions`, `list_shared_drives`, `search_files`.
96
+ - **Named writes:** `copy_file`, `create_file`, `create_folder`, `delete_permission`, `move_file`, `restore_file`, `share_file`, `trash_file`, `update_file_content`, `update_file`, `update_permission`.
97
+ - **API reads:** `drive_api_details`, `drive_api_read`, `drive_api_search`.
98
+ - **API writes:** `drive_api_write`.
99
+
100
+ **Contributor evidence (optional):** [contracts, adapters and review](https://github.com/zackbart/connecta/tree/main/src/providers/drive).
101
+
102
+ </details>
103
+
104
+ <details>
105
+ <summary>Google Forms (10 tools)</summary>
106
+
107
+ [Setup](#google-forms). **API source:** [Google Discovery conversion](https://developers.google.com/workspace/forms/api/reference/rest).
108
+
109
+ - **Named reads:** `get_form`, `get_response`, `list_responses`.
110
+ - **Named writes:** `batch_update_form`, `create_form`, `update_form_info`.
111
+ - **API reads:** `forms_api_details`, `forms_api_read`, `forms_api_search`.
112
+ - **API writes:** `forms_api_write`.
113
+
114
+ **Contributor evidence (optional):** [contracts, adapters and review](https://github.com/zackbart/connecta/tree/main/src/providers/forms).
115
+
116
+ </details>
117
+
118
+ <details>
119
+ <summary>GitHub (7 tools)</summary>
120
+
121
+ [Setup](#github). **API source:** [Upstream OpenAPI](https://raw.githubusercontent.com/github/rest-api-description/main/descriptions/api.github.com/api.github.com.json).
122
+
123
+ - **Named reads:** `list_scopes`, `search_scoped`.
124
+ - **Named writes:** `merge_pull_request`.
125
+ - **API reads:** `github_api_details`, `github_api_read`, `github_api_search`.
126
+ - **API writes:** `github_api_write`.
127
+
128
+ **Contributor evidence (optional):** [contracts, adapters and review](https://github.com/zackbart/connecta/tree/main/src/providers/github).
129
+
130
+ </details>
131
+
132
+ <details>
133
+ <summary>Gmail (12 tools)</summary>
134
+
135
+ [Setup](#gmail). **API source:** [Google Discovery conversion](https://developers.google.com/workspace/gmail/api/reference/rest).
136
+
137
+ - **Named reads:** `get_attachment`, `get_draft`, `get_message`, `get_thread`, `list_drafts`, `list_labels`, `search_threads`.
138
+ - **Named writes:** `create_draft`, `update_draft`.
139
+ - **API reads:** `gmail_api_details`, `gmail_api_read`, `gmail_api_search`.
140
+ - **API writes:** None.
141
+
142
+ **Contributor evidence (optional):** [contracts, adapters and review](https://github.com/zackbart/connecta/tree/main/src/providers/gmail).
143
+
144
+ </details>
145
+
146
+ <details>
147
+ <summary>Overflow (17 tools)</summary>
148
+
149
+ [Setup](#overflow). **API source:** Hand-authored endpoint contracts; [upstream endpoint checks](https://server.stage.overflow.co/api/docs/openapi.json). No vendored OpenAPI document.
150
+
151
+ - **Named reads:** `get_contribution`, `get_deposit_summary`, `get_deposit`, `get_donor`, `list_campaigns`, `list_chargebacks`, `list_contributions`, `list_deposits`, `list_donors`, `list_locations`, `list_payment_methods`, `list_refunds`, `list_subscriptions`.
152
+ - **Named writes:** None.
153
+ - **API reads:** `overflow_api_details`, `overflow_api_read`, `overflow_api_search`.
154
+ - **API writes:** `overflow_api_write`.
155
+
156
+ **Contributor evidence (optional):** [contracts, adapters and review](https://github.com/zackbart/connecta/tree/main/src/providers/overflow).
157
+
158
+ </details>
159
+
160
+ <details>
161
+ <summary>Planning Center (27 tools)</summary>
162
+
163
+ [Setup](#planning-center). **API source:** Composed upstream OpenAPI contracts: [/people/v2](https://developer.planning.center/docs/#/people/2026-06-04), [/services/v2](https://developer.planning.center/docs/#/services/2018-11-01), [/groups/v2](https://developer.planning.center/docs/#/groups/2023-07-10), [/check-ins/v2](https://developer.planning.center/docs/#/check-ins/2025-05-28), [/calendar/v2](https://developer.planning.center/docs/#/calendar/2026-06-22), [/registrations/v2](https://developer.planning.center/docs/#/registrations/2025-05-01), [/giving/v2](https://developer.planning.center/docs/#/giving/2019-10-18), [/publishing/v2](https://developer.planning.center/docs/#/publishing/2024-03-25), [/webhooks/v2](https://developer.planning.center/docs/#/webhooks/2022-10-20), [/api/v2](https://developer.planning.center/docs/#/api/2026-09-24).
164
+
165
+ - **Named reads:** `get_me`, `get_person`, `get_plan` (services enabled), `list_donations` (giving enabled), `list_funds` (giving enabled), `list_group_memberships` (groups enabled), `list_groups` (groups enabled), `list_person_field_data`, `list_person_notes`, `list_person_schedules` (services enabled), `list_plans` (services enabled), `list_service_types` (services enabled), `list_teams` (services enabled), `list_workflow_cards`, `list_workflows`, `search_people`.
166
+ - **Named writes:** `add_group_member` (groups enabled), `add_person_note`, `add_workflow_card`, `apply_workflow_card_action`, `create_person`, `schedule_plan_person` (services enabled), `update_person`.
167
+ - **API reads:** `pco_api_details`, `pco_api_read`, `pco_api_search`.
168
+ - **API writes:** `pco_api_write`.
169
+
170
+ **Contributor evidence (optional):** [contracts, adapters and review](https://github.com/zackbart/connecta/tree/main/src/providers/planning-center).
171
+
172
+ </details>
173
+
174
+ <details>
175
+ <summary>QuickBooks Online (10 tools)</summary>
176
+
177
+ [Setup](#quickbooks-online). **API source:** Hand-authored endpoint contracts. No vendored OpenAPI document.
178
+
179
+ - **Named reads:** `get_company_info`, `get_record`, `get_report`, `search_records`.
180
+ - **Named writes:** `create_customer`, `create_invoice`, `update_customer`.
181
+ - **API reads:** `quickbooks_api_details`, `quickbooks_api_read`, `quickbooks_api_search`.
182
+ - **API writes:** None.
183
+
184
+ **Contributor evidence (optional):** [contracts, adapters and review](https://github.com/zackbart/connecta/tree/main/src/providers/quickbooks).
185
+
186
+ </details>
187
+
188
+ <details>
189
+ <summary>Google Sheets (13 tools)</summary>
190
+
191
+ [Setup](#google-sheets). **API source:** [Google Discovery conversion](https://developers.google.com/workspace/sheets/api/reference/rest).
192
+
193
+ - **Named reads:** `get_spreadsheet`, `get_values`.
194
+ - **Named writes:** `add_sheet`, `append_values`, `batch_update_spreadsheet`, `batch_update_values`, `clear_values`, `create_spreadsheet`, `update_values`.
195
+ - **API reads:** `sheets_api_details`, `sheets_api_read`, `sheets_api_search`.
196
+ - **API writes:** `sheets_api_write`.
197
+
198
+ **Contributor evidence (optional):** [contracts, adapters and review](https://github.com/zackbart/connecta/tree/main/src/providers/sheets).
199
+
200
+ </details>
201
+
202
+ <details>
203
+ <summary>Google Slides (19 tools)</summary>
204
+
205
+ [Setup](#google-slides). **API source:** [Google Discovery conversion](https://developers.google.com/workspace/slides/api/reference/rest).
206
+
207
+ - **Named reads:** `get_page`, `get_presentation`, `get_slide_thumbnail`, `list_comments`, `list_layouts`.
208
+ - **Named writes:** `batch_update_presentation`, `create_comment_reply`, `create_comment`, `create_presentation`, `create_slide`, `delete_comment_reply`, `delete_comment`, `replace_all_text`, `update_comment_post`, `update_comment_thread`.
209
+ - **API reads:** `slides_api_details`, `slides_api_read`, `slides_api_search`.
210
+ - **API writes:** `slides_api_write`.
211
+
212
+ **Contributor evidence (optional):** [contracts, adapters and review](https://github.com/zackbart/connecta/tree/main/src/providers/slides).
213
+
214
+ </details>
215
+
216
+ <details>
217
+ <summary>Stripe (6 tools)</summary>
218
+
219
+ [Setup](#stripe). **API source:** [Upstream OpenAPI](https://raw.githubusercontent.com/stripe/openapi/master/latest/openapi.spec3.json).
220
+
221
+ - **Named reads:** `get_balance_summary`, `get_stripe_account_info`.
222
+ - **Named writes:** None.
223
+ - **API reads:** `stripe_api_details`, `stripe_api_read`, `stripe_api_search`.
224
+ - **API writes:** `stripe_api_write`.
225
+
226
+ **Contributor evidence (optional):** [contracts, adapters and review](https://github.com/zackbart/connecta/tree/main/src/providers/stripe).
227
+
228
+ </details>
229
+
230
+ <details>
231
+ <summary>Tithe.ly (11 tools)</summary>
232
+
233
+ [Setup](#tithely). **API source:** Hand-authored endpoint contracts; [upstream endpoint checks](https://docs.tithe.ly/reference/). No vendored OpenAPI document.
234
+
235
+ - **Named reads:** `get_charge`, `get_recurring_charge`, `list_accounts`, `list_charges`, `list_organizations`, `list_payment_methods`, `list_recurring_charges`.
236
+ - **Named writes:** None.
237
+ - **API reads:** `tithely_api_details`, `tithely_api_read`, `tithely_api_search`.
238
+ - **API writes:** `tithely_api_write`.
239
+
240
+ **Contributor evidence (optional):** [contracts, adapters and review](https://github.com/zackbart/connecta/tree/main/src/providers/tithely).
241
+
242
+ </details>
243
+
244
+ <details>
245
+ <summary>Vercel (11 tools)</summary>
246
+
247
+ [Setup](#vercel). **API source:** [Upstream OpenAPI](https://openapi.vercel.sh/).
248
+
249
+ - **Named reads:** `get_deployment_build_logs`, `get_runtime_logs`, `list_project_env_vars`, `list_teams`.
250
+ - **Named writes:** `update_project_env_var`, `upsert_project_env_var`.
251
+ - **API reads:** `vercel_api_details`, `vercel_api_read`, `vercel_api_search`.
252
+ - **API writes:** `vercel_api_upload`, `vercel_api_write`.
253
+
254
+ **Contributor evidence (optional):** [contracts, adapters and review](https://github.com/zackbart/connecta/tree/main/src/providers/vercel).
255
+
256
+ </details>
257
+
258
+ <!-- provider-inventory:end -->
259
+
260
+ ## API operation discovery and boundaries
261
+
262
+ Standard API operation search accepts resource nouns, actions and conversational
263
+ phrasing. A leading create/add/update/edit/make/set/apply/change/rename/send/delete/remove/cancel/stop
264
+ with an object prefers reviewed writes and keeps later read words as nouns, as in
265
+ `update list` or `update subscription status`. Make, set, apply, change, edit and
266
+ rename use update synonyms. Otherwise, read words anywhere prefer reviewed reads,
267
+ including after refund/charge/issue/process. The requested verb or a synonym in
268
+ an operation's summary, id or path sorts next, followed by resource focus.
269
+ A refused operation with a matching verb shares the intent tier when it covers
270
+ more query nouns than any admitted operation matching that verb and intent.
271
+ Its original indexed `summary` stays separate from the reviewed `refusal`, and
272
+ it omits the read/write hatch pointer; a named alternative can still be shown.
273
+ Search keeps up to 512 UTF-16 units of refusal text and marks any cut reason as
274
+ `operations[i].refusal` in `truncated`. Details supplies complete refusal text,
275
+ in 32 KiB pages/chunks when necessary. The summary has its separate 300-unit
276
+ search budget; ranking uses the indexed language, not attached refusal prose.
277
+
278
+ Use `_api_details` with the indexed method and path when a refused method lies
279
+ outside the call tool's schema. For example, `gmail_api_details` with
280
+ `method: "POST", path: "/messages/send"` explains the sending refusal; Gmail's
281
+ read hatch still has no method argument and there is no Gmail write hatch.
282
+ `forms_api_details` likewise explains `DELETE /forms/{formId}/watches/{watchId}`
283
+ even though DELETE remains absent from the Forms write schema. GitHub
284
+ `PUT /repos/{owner}/{repo}/pulls/{pull_number}/merge` also remains outside its raw
285
+ write schema; inspect its refusal and named alternative through details. All such calls
286
+ remain refused before authentication or downstream I/O.
287
+
288
+ Partial lexical matches are included even when other operations match every
289
+ term. Short function words and id-shaped tokens do not count toward noun
290
+ coverage. For action/read queries, an operation must cover every content noun in
291
+ its text, or match a noun in its path or operation id while covering at least
292
+ half the nouns. Field-only matches need half-noun coverage across the text and
293
+ declared field names. Verb-less noun phrases keep their broader rule: any noun
294
+ in the path/id, or every noun in the text. Framing-only queries return no matches.
295
+
296
+ A noun phrase first prefers fuller noun coverage and an exact summary phrase
297
+ prefix, then an exact terminal
298
+ resource (its last literal segment matches the last noun or the complete
299
+ compound phrase). An authored read whose
300
+ summary/id covers every noun shares the terminal-resource tier when an exact
301
+ terminal resource exists and its
302
+ description begins with a read action; the action word does not supply resource
303
+ noun coverage. When both terminal
304
+ resources match, reviewed reads precede writes and refusals. Path depth with a
305
+ one-segment authored-tool preference, exact resource nouns and authored tools
306
+ break remaining ties. A pointer to another hatch receives no authored preference.
307
+ Literal namespaces on either side of a version segment count as resource nouns;
308
+ version markers and parameters do not. A single noun, or a leading
309
+ `list` with only one exact resource noun plus modifiers, prefers the root
310
+ collection before nested routes. Other `list` phrases prefer an authored tool
311
+ whose summary/id covers every noun. Lexical relevance and stable index order
312
+ resolve remaining ties; field-only matches follow all primary matches.
313
+ For example, search a configured `crm` connection's API index for `person`,
314
+ then follow `page.nextCursor` to reach operations beyond the leading profile
315
+ results. Responses contain at most eight compact hits within 16 KiB; fetch
316
+ operation details separately and keep the same query when continuing.
317
+
318
+ Maintained REST hatches validate path parameters against their pinned contracts
319
+ before dispatch. Integer ids use canonical ASCII decimal notation within the
320
+ safe-integer range and obey the operation's declared bounds; for example,
321
+ `/individuals/42` is valid for an unbounded integer id while `/individuals/01`
322
+ is refused.
323
+
324
+ Stripe, Cloudflare and Vercel accept non-JSON success bodies only for reviewed
325
+ operation/media pairs from their pins. Cloudflare also preserves three raw Worker
326
+ content downloads with any non-JSON media. R2/KV object downloads use the full
327
+ JSON value-safety boundary for application/json and +json replies; other stored
328
+ media return bounded bytes with sent-secret checks. An unexpected HTML or text answer to a
329
+ JSON write reports an unknown outcome after one send; check the target before
330
+ repeating the write. Documented PDFs, text exports and streaming formats retain
331
+ their reviewed handling.
332
+
333
+ Vercel project-environment partial replies withhold failure prose before `fields`
334
+ selection. Named upsert partial-write reports identify the sent key and reviewed
335
+ failure codes, with reconciliation guidance; safe created and failed entries are retained, and submitted env values are private
336
+ write-only inputs on both named tools and raw env writes. Shared-env POST, PATCH
337
+ and DELETE failure prose is withheld too.
338
+
339
+ Overflow refund initiation accepts an `application/json` string or a bounded
340
+ `text/plain` acknowledgement, a narrow NestJS compatibility exception. Empty 2xx
341
+ refund acknowledgements also succeed. Nonempty HTML, binary, other media and
342
+ JSON-object replies fail with an unknown outcome after one dispatch;
343
+ check whether the refund took effect before repeating it.
344
+
345
+ ## Planning Center
346
+
347
+ `planningCenter()` connects one organization's reviewed product APIs.
348
+
349
+ ```ts
350
+ import { planningCenter } from "@zackbart/connecta/providers/planning-center";
351
+
352
+ const crm = planningCenter("crm", {
353
+ purpose: "Staff follow-up, groups and service planning",
354
+ excludeApps: ["giving"],
355
+ });
356
+ ```
357
+
358
+ **Credential.** Create a Personal Access Token in Planning Center's API
359
+ applications dashboard as a user whose product permissions match this
360
+ connection's purpose. Enter its Application ID and Secret in the operator UI.
361
+ The credential test reads `/people/v2/me` with the organization included.
362
+ A missing or malformed pair is refused before transport. Personal auth ownership
363
+ is available with `authScope: "personal"`; agents use shared credentials.
364
+
365
+ **Options and boundaries.** `readOnly: true` omits and refuses writes.
366
+ `defaultPageSize` sets the named lists' default limit (25 normally, at most 100).
367
+ `userAgent` identifies the deployment and a contact; a nonempty single line is
368
+ required. `baseUrl` is an HTTPS proxy override, or HTTP on loopback for tests.
369
+ The connector supplies each product's reviewed `X-PCO-API-Version`; tool calls
370
+ cannot override it.
371
+
372
+ `excludeApps` removes product endpoints and named tools. People cannot be
373
+ excluded because its identities join other products and its me endpoint tests
374
+ the token. While any product is excluded, People lists/results/rules/conditions
375
+ are also refused by path or include: a saved list can query another product.
376
+ Webhook event/delivery payloads and changes to existing subscriptions are
377
+ refused because their ids do not name a product. A new subscription must name
378
+ a reachable product's event. Paths must be literal while exclusions apply:
379
+ no traversal, ambiguous separators, whitespace or encoded delimiters. Checks
380
+ run before credentials and again on the exact URL to fetch.
381
+
382
+ Exclusion controls live API access. It cannot identify information staff or
383
+ automations copied into reachable notes, workflows, forms or custom fields.
384
+ For a hard product boundary, use a PAT belonging to a user with No Access in
385
+ that product. No tool argument or nominal `sensitiveFields` option returns
386
+ stored credentials. Signing secrets, organization secrets, private calendar
387
+ codes, private file destinations and opaque webhook payload/header fields
388
+ stay withheld in named and hatch replies, including included resources.
389
+
390
+ **Vendor prerequisites.** The organization must subscribe to each product it
391
+ uses, and the PAT's user needs that product's permissions. Permissions are
392
+ per user and product; organization administrator status does not grant every
393
+ product. File uploads use a separate host this connector does not reach.
394
+
395
+ **Limits.** Planning Center meters 100 requests per 20 seconds per user,
396
+ shared with every integration using that user's tokens. The default per-runtime
397
+ admission budget is 100 calls per 20 seconds, concurrency five; `callAdmission`
398
+ can narrow or split it when connections share a user. Isolates and other
399
+ integrations share no local counter, so this is an approximation. `get_plan`
400
+ issues three bounded reads. A response is capped at 8 MiB; named lists request
401
+ at most 100 rows. Search answers have at most eight hits and 16 KiB of tool
402
+ JSON; details have 32 KiB with explicit continuation for larger contracts.
403
+ Named lists use signed cursors over the vendor offset; paged hatch reads return
404
+ `page.nextCursor` for the `offset` query parameter. Keep the other query and
405
+ field arguments unchanged when continuing a hatch read.
406
+
407
+ Named lists and paged hatch reads expose `page.total` only when Planning Center
408
+ supplies a nonnegative safe integer in `meta.total_count`. This is the vendor's
409
+ count for the requested collection and vendor filters, across all pages;
410
+ `meta.count` describes one vendor page. For example, a filtered collection can
411
+ report `page.total: 57` while this reply emits two items. Local filtering,
412
+ projection and size truncation can reduce the items shown without changing the
413
+ vendor total. Missing, malformed or oversized optional totals are omitted.
414
+ `page.hasMore` and signed continuation still follow `meta.next.offset`, never
415
+ the total, item count, offset or limit.
416
+
417
+ Excluded products' unavailable named tools are omitted from authored and
418
+ generated guide sections and from hatch search/details suggestions. For example,
419
+ excluding Services removes `list_plans` suggestions while retaining People
420
+ identity tools. The indexed vendor contract remains inspectable; exclusion
421
+ still refuses those operations before dispatch. Changing the credential owner
422
+ or original filters invalidates a continuation; totals add no new cursor scope.
423
+
424
+ ## Stripe
425
+
426
+ `stripe()` connects one Stripe account in one mode through the pinned REST API.
427
+
428
+ ```ts
429
+ import { stripe } from "@zackbart/connecta/providers/stripe";
430
+
431
+ const billing = stripe("billing", {
432
+ purpose: "Payment investigations and reconciliation",
433
+ auth: { type: "apiKey" },
434
+ mode: "sandbox",
435
+ readOnly: true,
436
+ });
437
+ ```
438
+
439
+ **Credential.** Enter one secret (`sk_test_…`/`sk_live_…`) or restricted
440
+ (`rk_test_…`/`rk_live_…`) key in this connection in the operator UI. Prefer a
441
+ restricted key with only the required permissions. The key prefix must match
442
+ the declared mode; publishable and organization keys are refused. The Test
443
+ action reads the account. If account-read permission is absent, the test can
444
+ still establish that the key was accepted. Stored keys never reach agents.
445
+
446
+ **Options.** `mode` is required: `"sandbox"` or `"production"`.
447
+ `connectedAccount: "acct_example"` binds every call to that Connect account
448
+ using Stripe-Account on v1 and Stripe-Context on v2. `readOnly: true` omits
449
+ writes and refuses their calls on every endpoint. `authScope: "personal"`
450
+ partitions stored credentials by admitted owner instead of sharing a grant.
451
+ `maxResultBytes` narrows this connector's inline result budget. There is no
452
+ separate optional sensitive-field set: reviewed secret withholding applies to
453
+ every result, and `fields` only reduces the remaining data. No tool argument
454
+ widens that boundary.
455
+
456
+ **Vendor prerequisites.** The key must have permission for each API operation
457
+ the workflow needs. Hosted MCP is a separate generic connection; follow
458
+ [the hosted Stripe migration](./hosted-mcp-migration.md#stripe).
459
+
460
+ **Limits.** The index is pinned to Stripe-Version `2026-09-30.endive`.
461
+ Responses are bounded to 8 MiB and request reads to 60 seconds. Default
462
+ admission is 100 calls/second and 8 concurrent calls in production, or
463
+ 25 calls/second and 4 concurrent calls in sandbox; Stripe can apply stricter
464
+ endpoint limits. Stripe v1 lists normally default to 10 and cap at 100;
465
+ the hatch keeps the pinned operation's vendor query parameters. Files can be
466
+ read as quote PDFs from the confined files origin; multipart uploads and
467
+ the meter-event stream are refused. POST writes take an optional
468
+ `idempotencyKey` (up to 255 characters), generating and returning one when
469
+ omitted; DELETE and the invoice-preview read send no key.
470
+
471
+ **Paging example.** A first read can set a raw record-id anchor in
472
+ `query.starting_after` or `query.ending_before`. To continue, pass the signed
473
+ `page.nextCursor` as the top-level `cursor`, keeping the path, filters and
474
+ `fields` unchanged. Omit both raw anchors on continuation. Do not combine
475
+ directions. Search and v2 lists also continue through `cursor`; their raw
476
+ vendor page tokens are not accepted there.
477
+ If a v2 next-page URL adds omitted parameters, the fetched data remains
478
+ available with `page.hasMore: true` but no `nextCursor`. It is incomplete;
479
+ repeat with explicit parameters or narrow the request to continue safely.
480
+
481
+ ```ts
482
+ const first = await connecta.call("billing.stripe_api_read", {
483
+ path: "/v1/charges",
484
+ query: { customer: "cus_example", starting_after: "ch_example", limit: 20 },
485
+ fields: ["data.id", "data.amount"],
486
+ });
487
+ if (first.data.page?.hasMore) {
488
+ const next = await connecta.call("billing.stripe_api_read", {
489
+ path: "/v1/charges",
490
+ query: { customer: "cus_example", limit: 20 },
491
+ fields: ["data.id", "data.amount"],
492
+ cursor: first.data.page.nextCursor,
493
+ });
494
+ }
495
+ ```
496
+
497
+ ## Breeze ChMS
498
+
499
+ `breeze()` connects one church's Breeze account through its API.
500
+
501
+ ```ts
502
+ import { breeze } from "@zackbart/connecta/providers/breeze";
503
+
504
+ const church = breeze("church", {
505
+ purpose: "Attendance and giving reports",
506
+ subdomain: "church",
507
+ });
508
+ ```
509
+
510
+ **Credential.** Enter the church's API key from **Extensions → API** on the
511
+ connection in the operator UI. The Test action reads the account summary and
512
+ checks its reported subdomain. The key has no scopes: it reaches the whole
513
+ account, giving included. It is sent only to the configured church hostname.
514
+
515
+ **Options.** `subdomain` is one hostname label before `.breezechms.com`, never
516
+ a URL. `readOnly: true` omits and refuses writes on every endpoint, including
517
+ writes that Breeze sends as GET requests. `defaultPageSize` sets paged-list
518
+ sizes from 1 to 1,000 (default 100). `list_events` separately defaults to 100
519
+ and caps at 1,000 without a continuation. `authScope` selects shared or
520
+ personal credential ownership. `callAdmission` sets a per-runtime budget;
521
+ none is declared by default because Breeze publishes no rate limit.
522
+
523
+ There is no `sensitiveFields` option: profile detail maps contain church-specific
524
+ field ids, and this provider declares no configurable sensitive set. Select
525
+ only needed fields and reduce personal records in code. Calendar feed addresses
526
+ and embed keys are always removed from every result.
527
+
528
+ **Vendor prerequisites.** An administrator must enable/access Extensions → API
529
+ and supply the account-wide key. Giving, funds and pledges use archival routes
530
+ that are no longer in Breeze's public reference; verify the church still
531
+ supports them before depending on those workflows.
532
+
533
+ **Limits.** Requests stay below the church's `/api` path. Responses are bounded
534
+ to 8 MiB and standard hatch successes must be JSON. People page by offset;
535
+ other paged named lists window a bounded vendor response locally. Events and
536
+ account logs have vendor caps; narrow date ranges when a reply fills its limit.
537
+
538
+ ## Overflow
539
+
540
+ `overflow()` connects one nonprofit's Overflow v3 API, with an explicit
541
+ production or staging environment.
542
+
543
+ ```ts
544
+ import { overflow } from "@zackbart/connecta/providers/overflow";
545
+
546
+ const giving = overflow("giving", {
547
+ purpose: "Giving reports and donor care for the nonprofit",
548
+ environment: "staging",
549
+ });
550
+ ```
551
+
552
+ **Authentication.** An operator saves the environment's `clientId` and `apiKey`
553
+ on this connection. They are sent as `x-client-id` and `x-api-key`; neither
554
+ identifies which environment it belongs to. Staging and production credentials
555
+ are separate. The credential test reads one location with the candidate pair;
556
+ `/health` is not an authenticated credential test.
557
+
558
+ **Options.** `environment` is required, with no default. `defaultPageSize`
559
+ controls numbered named lists (default 25, maximum 100). `readOnly` refuses
560
+ all writes. `authScope` selects shared or personal credential ownership.
561
+ `instructions` appends nonprofit conventions. `baseUrl` is an optional proxy
562
+ or test origin; Connecta appends `/api/v3`. `maxResultBytes` limits inline
563
+ results, and `callAdmission` replaces the default policy.
564
+
565
+ Named reads retain lean projections; `get_donor` is the full-contact lookup.
566
+ There is no configurable sensitive-field set. The indexed hatch returns other
567
+ nonsecret vendor fields and `fields` only narrows them. Webhook signing secrets
568
+ are always removed, including bare, wrapped and list responses.
569
+
570
+ **Prerequisites.** Obtain API credentials from Overflow for the intended
571
+ nonprofit and environment. A donor-account-owned profile cannot be edited
572
+ through this API even when the credentials can read it. Resolve donor,
573
+ payment-method, campaign and location ids before authorizing money writes.
574
+
575
+ **Limits.** Overflow documents 120 requests per minute per API client. The
576
+ default admission policy approximates it per runtime with a rolling 60-second
577
+ budget, concurrency four and a bounded queue. Other integrations and runtimes
578
+ share the vendor allowance without sharing this local counter. The connection
579
+ reads at most 4 MiB per response. Named lists use opaque cursors; keep the same
580
+ limit when continuing a numbered list. A vendor-stated exact count appears as
581
+ `page.total`; no count is synthesized when it is absent. Payment methods are
582
+ windowed locally from one bounded response. The webhook-log hatch accepts at
583
+ most 50 rows and returns its native continuation inside a signed cursor.
584
+
585
+ ## Tithe.ly
586
+
587
+ `tithely()` connects one Tithe.ly giving account through its v1 REST API.
588
+
589
+ ```ts
590
+ import { tithely } from "@zackbart/connecta/providers/tithely";
591
+
592
+ const giving = tithely("giving", {
593
+ purpose: "Weekly giving reports for the finance team",
594
+ environment: "live",
595
+ });
596
+ ```
597
+
598
+ **Credential.** Each connection has one operator-managed key pair: the public
599
+ key (`pub_…`, sent as the HTTP Basic user name) and the private key (`pri_…`,
600
+ the password). Enter both on the connection in the operator UI; the Test action
601
+ reads one organization to prove the pair. A missing, swapped, or malformed pair
602
+ is refused before any request leaves. Keys never reach agents.
603
+
604
+ **Options.**
605
+
606
+ - `environment` is required: `"live"` (tithe.ly) or `"test"`
607
+ (tithelydev.com). Keys are issued per environment and nothing in a key says
608
+ which, so a key pair used against the other environment fails every call
609
+ with `auth_required`. Connecta does not guess.
610
+ - `sensitiveFields` defaults to `"drop"`, which removes an organization's
611
+ payout `bank` (bank name and account last four) and `legal` contact (name
612
+ and date of birth), by field name at any depth, from every result:
613
+ named reads, `tithely_api_read` and `tithely_api_write` replies. `"return"`
614
+ lets the hatch return them; the named reads never include them. The names
615
+ are exported as `TITHELY_SENSITIVE_FIELDS`. No tool argument changes this.
616
+ - `readOnly: true` serves only reads on every endpoint, so refunds, charges,
617
+ recurring gifts, payment methods, and accounts cannot change.
618
+ - `defaultPageSize` sets the list tools' default page, 1 to 99 (default 25).
619
+ - `baseUrl` replaces the environment's endpoint for a proxy or test double;
620
+ it must be https, or http on loopback.
621
+ - `callAdmission` sets a per-runtime call budget. Tithe.ly publishes no rate
622
+ limit, so none is declared by default; set one if the account has a limit
623
+ you know.
624
+
625
+ **Vendor prerequisites.** Tithe.ly issues API keys on request: email
626
+ support@tithe.ly with the church or organization and what you are building,
627
+ and Tithe.ly sends a link to generate the key pair. Live and test are separate
628
+ accounts with separate key pairs.
629
+
630
+ **Limits.** Only API v1 is reachable; Tithe.ly's undocumented v2 is not. Card
631
+ and bank tokens for one-time charges and new payment methods come only from
632
+ Tithely.js in a donor's browser. A response is read up to 4 MiB.
633
+
634
+ ## Vercel
635
+
636
+ ```ts
637
+ import { vercel } from "@zackbart/connecta/providers/vercel";
638
+
639
+ vercel("hosting", {
640
+ purpose: "Projects and deployments for the assistant",
641
+ auth: { type: "token" },
642
+ teamId: "team_example",
643
+ });
644
+ ```
645
+
646
+ Add the access token from Vercel Account Settings → Tokens in the connection's
647
+ operator UI. Choose the account/team and expiry the deployment needs. It is
648
+ stored encrypted; it is sent only to api.vercel.com, or a configured baseUrl proxy.
649
+ `authScope: "personal"` selects per-owner credentials; the default is shared.
650
+ The legacy hosted selector is unsupported; connect hosted MCP with generic
651
+ `remoteMcp()` as described in [Hosted MCP migration](./hosted-mcp-migration.md).
652
+
653
+ Without `pin`, `teamId` is a routing default, not a tenant restriction. On operations accepting
654
+ team selectors, an explicit `teamId` or `slug` overrides it. `teamId: null` omits
655
+ the default for personal-account calls. All named tools, hatch calls and uploads
656
+ use the same routing. For example, a `hosting` call with
657
+ `query: { slug: "studio" }` targets that team; it is not forced into team_example.
658
+ Vercel token permissions enforce access. Set a suitably scoped token when access
659
+ must be restricted. Signed paging binds the resolved selectors, so reuse the
660
+ same team, path, filters and fields when passing `page.nextCursor` in
661
+ `query[page.param]`. Team path ids remain vendor identifiers, not a deployment pin.
662
+
663
+ Set `pin: { teamId: "team_example" }` to confine this connection to one Vercel
664
+ team independently of the token's permissions. If `teamId` is also configured,
665
+ it must match the pin. The pin requires a canonical `team_…` id, not a slug.
666
+ It applies to named tools, bounded logs, uploads and all hatch requests. Explicit
667
+ foreign ids, personal/null scope, duplicate/ambiguous selectors and encoded path
668
+ spellings are refused. A supplied `slug` is checked against the pinned team's
669
+ current id and slug; ordinary project, environment and flag slugs keep their
670
+ documented meaning. Token permissions can restrict access further.
671
+
672
+ Pinned calls make at most eight additional sequential ownership reads, charged
673
+ to the same call-admission budget before each request. No ownership result is
674
+ cached between calls or credential owners. Project and deployment references,
675
+ including every target in supported multi-project inputs, must prove ownership;
676
+ missing or malformed ownership refuses the affected request. For example, a
677
+ domain move to another project checks both projects before sending the write.
678
+ Unprovable global/account operations, organizations, cross-team grants and project
679
+ transfers are unavailable. The pinned `list_teams` returns one terminal item,
680
+ and the credential probe reads that team. No user/account read is an exception.
681
+ Pinned hatch search and details mark these unavailable operations as refused;
682
+ the usage guide's refusal count includes the configured team boundary.
683
+ Signed continuations bind the pin policy as well as the credential owner and
684
+ existing call scope; changing the pin or adding/removing it requires a new first
685
+ page. Writes still have one physical attempt after successful preflights.
686
+
687
+ `readOnly: true` refuses every write. `baseUrl` is only for an explicitly trusted
688
+ proxy or test double. Set `callAdmission` for downstream endpoint limits and
689
+ `maxResultBytes` for inline output sizing. Permanent credentials and environment
690
+ values cannot be returned; there is no option to widen this boundary. The token
691
+ must have the permissions and Vercel plan required by the selected endpoint.
692
+
693
+ Team lists default to 20 and allow 100 rows. Build logs default to 200 and allow
694
+ 2,000 events; runtime logs default to 200 and allow 1,000 rows over 1–20 seconds.
695
+ Log prefixes stop at 1 MiB; each projected text field stops at 4,000 characters.
696
+ Uploads accept at most 8 MiB of explicit bytes. Regular response bodies stop at
697
+ 8 MiB and calls at 60 seconds. JSON-only operations reject unexpected HTML/text
698
+ acknowledgements; check the target after an unknown write outcome before repeating.
699
+
700
+ A numeric hatch `query.until` can set the initial upper time boundary on timestamp
701
+ lists. Subsequent pages use signed `page.nextCursor` in that same parameter.
702
+ Named `list_teams` uses only its top-level `cursor` for continuation.
703
+
704
+ ## GitHub
705
+
706
+ ```ts
707
+ import { github } from "@zackbart/connecta/providers/github";
708
+
709
+ const source = github("source", {
710
+ purpose: "Repository issue triage and release work",
711
+ app: { appId: env.GITHUB_APP_ID },
712
+ scopes: [{ org: "alice", access: "read-write" }],
713
+ });
714
+ ```
715
+
716
+ Create a GitHub App with repository Metadata permission and install it on each
717
+ configured owner. Omit privateKey to populate the connector's encrypted privateKey
718
+ vault field, or supply app.privateKey from an environment secret. No per-user
719
+ OAuth is supported. Installation tokens remain in bounded memory and refresh
720
+ before expiry; key rotation partitions caches by key fingerprint.
721
+
722
+ Each scope names an organization or an exact owner/repository and explicit
723
+ read or read-write access. Exact repository grants can narrow their organization
724
+ grant. Org grants require an organization installation with All repositories,
725
+ including future repositories. Exact grants can use selected-repository installs.
726
+ A grant binds repository IDs for the provider instance; reconfigure after reviewing
727
+ a replacement repository or installation. Set readOnly:true for deployment-wide
728
+ write refusal. Only deployment code can grant workflows:"write", and only on a
729
+ read-write scope. A merge requires this explicit grant because GitHub's head-SHA
730
+ guard does not bind a concurrent base retarget.
731
+
732
+ Enable only vendor permissions needed by the workflows: Metadata read for
733
+ repository lookup; Issues read for issues/comments/labels; Pull requests read
734
+ for PRs/reviews/review comments/changed files/PR commits; Contents read for
735
+ repository commits/comparisons/contents/releases; Actions read for workflows,
736
+ runs and jobs. Release writes require Contents write. The guarded merge retains
737
+ Contents, Pull requests and Workflows write. Code search retains Contents read
738
+ and GitHub's own search restrictions. Each operation token is narrowed to its
739
+ reviewed permission and repository IDs; an org grant does not permit org admin.
740
+
741
+ The four github_api tools cover a pinned operation index with a bounded reviewed
742
+ repository read and release-write allowlist. All other operations are refused.
743
+ Use search_scoped for account data search and merge_pull_request for merges; the
744
+ corresponding raw routes are refused. Native tools present these same operations
745
+ and enforcement. Each named list defaults to 30 items, maximum 100. Search
746
+ continuation visits one partition page per call, at most twenty partitions and
747
+ ten vendor pages per partition; incomplete_results preserves capped/incomplete
748
+ searches. Cursors bind the configured grants, arguments, limit and deployment storage.
749
+ Keep the same limit with a cursor. Omission uses 30 and is accepted for a cursor
750
+ issued with limit 30; other limits must be repeated. Mismatches name the expected limit.
751
+
752
+ The transport reads at most 4 MiB per response. Inline UTF-8 file text and patch
753
+ values are redacted before a 32,768-character cut, with dot paths in truncated.
754
+ File contents retain base64 encoding; the character bound applies after decoding.
755
+ Use `/repos/alice/widget/contents/src/index.ts` for a nested file and
756
+ `/repos/alice/widget/contents` for the root directory. Contents paths must be
757
+ canonical relative paths, without dot/empty segments, backslashes or encoded
758
+ traversal. Encode branch-name slashes as `%2F` in `commits/{ref}` and
759
+ `compare/{basehead}`. Owner-prefixed object refs and cross-repository compares are
760
+ refused before authentication. PR-list head filters require `login:branch`, for
761
+ example `head:"alice:feature/x"`; they filter the selected repository's PRs.
762
+ Bare head branches are refused because GitHub silently ignores them. The base
763
+ filter stays a branch name. Configured App private keys are withheld from echoed content.
764
+ Identifiers remain beside cut patches. Raw diffs, binary files, log downloads,
765
+ archives, uploads and secret/admin operations are unavailable. Download URLs and
766
+ credentials remain withheld. fields narrows safe output and does not reduce the
767
+ bytes the vendor sends. Directory listings and search also have vendor caps;
768
+ missing content/patches do not establish completeness.
769
+
770
+ ## Cloudflare
771
+
772
+ `cloudflare()` connects the reviewed v4 API with an operator-managed credential.
773
+
774
+ ```ts
775
+ import { cloudflare } from "@zackbart/connecta/providers/cloudflare";
776
+
777
+ const edge = cloudflare("edge", {
778
+ purpose: "Domain DNS, Workers and storage administration",
779
+ auth: { type: "apiToken" },
780
+ pin: { accountIds: ["0123456789abcdef0123456789abcdef"] },
781
+ });
782
+ ```
783
+
784
+ **Credential.** Prefer a scoped user or account API token with only the required
785
+ permissions and resources. Enter it in the operator UI. Verification first tests
786
+ a user token; with `accountId`, it can test an account-owned token too. A legacy
787
+ `auth: { type: "globalApiKey" }` uses the key owner's email and API key fields;
788
+ it requires `pin` unless `unpinned: true` explicitly accepts the whole estate.
789
+ R2 accepts API tokens only. `authScope: "personal"` partitions human credentials;
790
+ agents use the shared credential.
791
+
792
+ **Options and boundaries.** `pin.accountIds` includes zones owned by those
793
+ accounts; `pin.zoneIds` admits those zones directly. Every call checks its named
794
+ account/zone ids, and scoped lists filter their results. Unscoped operations
795
+ are refused except reviewed public and identity/list routes. `accountId` and
796
+ `zoneId` fill existing path placeholders and do not impose a boundary; use `pin`
797
+ for that. Account pins may spend an extra zone-ownership read. `readOnly: true`
798
+ omits and refuses writes. No argument or sensitive-data option returns secrets;
799
+ credential values and private destinations remain unavailable. `baseUrl` is an
800
+ HTTPS proxy override (HTTP is allowed on loopback for tests).
801
+
802
+ **Vendor prerequisites.** Grant the token the required DNS, Workers, KV, R2 or
803
+ Analytics permissions for the pinned resources. Connector pins narrow the token;
804
+ they grant no additional Cloudflare permission. Global API Keys cannot change
805
+ user settings or memberships through this connector.
806
+
807
+ **Limits.** Cloudflare's global limit is 1,200 requests per five minutes per
808
+ user across the dashboard and all tokens. Connecta approximates that window
809
+ per runtime and defaults to six simultaneous requests (`maxConcurrency`). Zone
810
+ ownership checks are capped at three per call and 60 per five minutes per
811
+ connection. Responses are bounded to 8 MiB and calls to 60 seconds. Named
812
+ account/zone lists default to 20 rows, accept `limit` from 5 to 50, and return
813
+ signed `cursor` continuations. Hatch limits retain each operation's pinned
814
+ bounds; put its signed `page.nextCursor` into the parameter named by `page.param`
815
+ and `page.in`. Keep the other arguments unchanged. Discovery is bounded to eight
816
+ hits/16 KiB per search and 32 KiB per details page, with explicit continuation.
817
+
818
+ ## Church Community Builder
819
+
820
+ ```ts
821
+ import { ccb } from "@zackbart/connecta/providers/ccb";
822
+
823
+ const crm = ccb("crm", {
824
+ purpose: "Household and group coordination",
825
+ environment: "production",
826
+ mode: "system",
827
+ clientId: env.CCB_CLIENT_ID,
828
+ clientSecret: env.CCB_CLIENT_SECRET,
829
+ });
830
+ ```
831
+
832
+ Obtain a v2 OAuth client from Pushpay and register the deployment's exact
833
+ `<publicUrl>/oauth/callback/crm` redirect URI and required scopes. Production
834
+ and sandbox clients use different hosts and credentials. `environment` and
835
+ `mode` are required. System Auth stores one shared church grant authorized by
836
+ an administrator. Identity Auth stores personal grants with each person's
837
+ permissions and requires prior System Auth for the same client. Start consent
838
+ from the connector's operator connection page; catalog and status reads do
839
+ not start consent. The connector manages token rotation.
840
+
841
+ `access: "read"` is the default. `access: "read-write"` requests the maintained
842
+ write scope set; alternatively specify a nonempty exact `scopes` list.
843
+ `access` and `scopes` are exclusive. Read-only configured scopes omit the
844
+ write hatch and never dispatch a write. `readOnly: true` additionally enforces
845
+ read-only access on every endpoint. Optional `subdomain` pre-fills consent.
846
+
847
+ `sensitiveFields: "drop"` is the default. `"return"` permits the documented
848
+ sensitive fields through the hatches; named projections stay narrow. OAuth
849
+ credentials, private file download destinations, payment-session links and
850
+ private calendar feeds remain withheld. No tool argument changes this boundary.
851
+ Advanced-search filters can still test
852
+ dropped sensitive fields, so matching rows can reveal their values by inference.
853
+ Where that matters, omit `read:advanced_searches` from the exact configured
854
+ OAuth scopes.
855
+
856
+ Named lists take `limit` equal to 25, 50, 75 or 100; the vendor default is 25.
857
+ `defaultPerPage` optionally chooses another allowed deployment default. Return
858
+ `page.nextCursor` unchanged as `cursor` and keep the same effective limit.
859
+ Named `page.total` is present only when CCB states an exact `X-Total` count. Indexed reads retain vendor
860
+ `query.per_page` plus a top-level signed `cursor`; use operation details for
861
+ filters and JSON request bodies. Advanced POST searches are reads.
862
+
863
+ The default admission rule is a per-runtime, per-endpoint rolling window of
864
+ 60 calls per minute. It does not coordinate other runtimes sharing this OAuth
865
+ client or emulate the vendor's no-burst exceptions. Individual gets allow one
866
+ call per second, individual advanced searches one per five seconds, and
867
+ category schedule lists one per two seconds. Override `callAdmission` to match
868
+ shared usage, and respect the vendor's rate-limit wait. Replies are bounded
869
+ at 8 MiB. The legacy per-church v1 XML API is outside this provider's scope.
870
+
871
+ ## Gmail
872
+
873
+ Gmail uses a service account with Workspace domain-wide delegation. Enable
874
+ Gmail API, create a service account with no IAM roles, and provide its JSON
875
+ key as a deployment secret. A Workspace super administrator grants the
876
+ service account's numeric client id exactly these scopes in Admin console →
877
+ Security → Access and data control → API controls → Domain-wide delegation:
878
+ `https://www.googleapis.com/auth/gmail.readonly` and
879
+ `https://www.googleapis.com/auth/gmail.compose`. Changes can take up to 24 hours.
880
+ If key creation is blocked, an organization policy administrator must review
881
+ `iam.disableServiceAccountKeyCreation` for that project.
882
+
883
+ ```ts
884
+ import { gmail } from "@zackbart/connecta/providers/gmail";
885
+
886
+ gmail("mail", {
887
+ purpose: "Read mail and prepare reply drafts",
888
+ serviceAccount: env.GOOGLE_SERVICE_ACCOUNT_JSON,
889
+ subject: (identity) => mailboxes[identity.principal?.id ?? ""],
890
+ });
891
+ ```
892
+
893
+ Map admitted callers to Workspace addresses in deployment code. A fixed
894
+ `subject: "alice@example.com"` instead shares that mailbox with every caller.
895
+ Anonymous callers cannot use a subject function. No tool argument selects a
896
+ mailbox. Both modes retain ownerless-pool hiding and the endpoint's read-only
897
+ policy. `gmail.compose` technically permits sending; this provider admits no
898
+ send route. Drafts are written only through `create_draft` and `update_draft`.
899
+ Gmail is the documented three-hatch exception to the four-hatch default.
900
+
901
+ Named reads return projected records or `{ items, page }`; `fields` narrows a
902
+ record or each list item. Size cuts appear in `truncated`. The pinned index
903
+ contains 79 methods and admits eleven reads. Settings, forwarding,
904
+ delegation, CSE, S/MIME, watches, mailbox mutation and every send method are
905
+ refused. Full MIME JSON crosses the same decoded sent-secret safety boundary.
906
+ Use the named attachment tool for immutable part identity, charset rendering,
907
+ one-MiB download bounds and decoded-size validation.
908
+
909
+ A hatch read has three layers: the direct-call delivery contains the tool's
910
+ `{ status, data, page? }` result, whose `data` is Google's JSON. In a program:
911
+
912
+ ```js
913
+ const { data: first } = await connecta.call("mail.gmail_api_read", {
914
+ path: "/messages",
915
+ query: { q: "is:unread from:alice@example.com", maxResults: 10 },
916
+ fields: ["messages.id"],
917
+ });
918
+ return { messageIds: first.data.messages, continuation: first.page };
919
+ ```
920
+
921
+ On continuation repeat the same arguments and add top-level
922
+ `cursor: first.page.nextCursor`. Use `query.maxResults` from 1 to 500. Omit raw `query.pageToken`, even if Google's
923
+ safe body includes it. The last page has no cursor. An empty page can still
924
+ continue, and `resultSizeEstimate` never establishes an exact total. Named
925
+ thread/content cursors are separate and reject changed earlier content.
926
+
927
+ ## Google Docs
928
+
929
+ ```ts
930
+ import { docs } from "@zackbart/connecta/providers/docs";
931
+
932
+ const documents = docs("documents", {
933
+ purpose: "Team notes and drafts",
934
+ serviceAccount: env.GOOGLE_SERVICE_ACCOUNT_JSON,
935
+ subject: (identity) => accounts[identity.principal?.id ?? ""],
936
+ });
937
+ ```
938
+
939
+ Enable Google Docs API in the service account's Google Cloud project. Create
940
+ a service account and JSON key; no project IAM role grants document access.
941
+ A Workspace super administrator must authorize its numeric client ID for
942
+ `https://www.googleapis.com/auth/documents` under Admin console → Security →
943
+ Access and data control → API controls → Manage Domain Wide Delegation.
944
+ Add this scope to the same entry as other Workspace products; changes can take
945
+ 24 hours. Store the key as a deployment secret. If key creation is blocked,
946
+ an organization administrator must resolve the key-creation policy.
947
+
948
+ Configure inbound auth and map admitted identities to Workspace addresses.
949
+ Each call acts as that user and reaches documents shared with them in Drive.
950
+ An unmapped caller is refused. A fixed `subject: "alice@example.com"` instead
951
+ shares one Workspace account across callers. See [Workspace delegation](./auth.md#pool-owners-for-google-workspace).
952
+ `readOnly: true` omits and refuses all writes. Optional `instructions` append
953
+ connection-specific guidance; `baseUrl` is an operator-controlled API root.
954
+ There is no configurable sensitive-field set: document text is requested data.
955
+
956
+ Six named tools retain rendered reads and common edits. Four `docs_api_*`
957
+ hatches discover all three pinned methods and expose JSON reads and writes.
958
+ `docs_api_search` searches operations; use Drive to find document data.
959
+ Batch hatch writes require `writeControl.requiredRevisionId`, 1–100 requests,
960
+ and exactly one supported generally available request kind each. Preview
961
+ comment and suggestion writes are refused. All hatch writes are destructive.
962
+ The additive named create/append/insert catalog entries retain
963
+ `destructiveHint:false` and remain writes. Writes
964
+ are never replayed and take no idempotency key. A named create with text uses
965
+ two explicit steps: one create POST and at most one initial-text batch POST.
966
+
967
+ `get_document` supports `fields`, a shared text budget (20,000 characters by
968
+ default, at most 1,000,000), and 64 KiB pages of UTF-16 index rows. Keep the
969
+ same read arguments when passing its signed content cursor. Changed content
970
+ requires a fresh read. Docs has no vendor list pagination. `truncated` lists
971
+ size cuts; `notRendered` describes semantic omissions. Direct rendering
972
+ results can reach 4 MiB when `maxChars` is explicit; programs carry at most
973
+ 256 KiB per result. Read one tab or reduce `maxChars` to fit.
974
+
975
+ For complete styles or named ranges, use a hatch read:
976
+
977
+ ```ts
978
+ const reply = await connecta.call("documents.docs_api_read", {
979
+ path: "/documents/doc_123",
980
+ query: { includeTabsContent: true },
981
+ fields: ["documentId", "revisionId", "tabs"],
982
+ });
983
+ // The guest delivery wraps the hatch value; vendor data is under data.data.
984
+ const document = reply.data.data;
985
+ ```
986
+
987
+ With `includeTabsContent:true`, named ranges are in
988
+ `document.tabs[].documentTab.namedRanges`; select `tabs` as above to read them.
989
+ `fields` selects vendor-body paths. Hatch values are `{status,data}` inside
990
+ Connecta's [guest call delivery](./code-mode.md). Caller headers,
991
+ credential query arguments, alternate origins and media transport are refused.
992
+ A 404 cannot distinguish missing from inaccessible documents and reports
993
+ `connector_call_failed`; only reviewed revision-precondition facts report
994
+ `conflict`. Token and JSON response handling use the same safety boundary as
995
+ named tools.
996
+
997
+ Google Docs image `contentUri` values are temporary access capabilities and are
998
+ withheld in all responses. Authored links and image `sourceUri` remain available.
999
+
1000
+ ## Google Sheets
1001
+
1002
+ ```ts
1003
+ import { sheets } from "@zackbart/connecta/providers/sheets";
1004
+
1005
+ const workbook = sheets("workbook", {
1006
+ purpose: "Review tables and quarterly budgets",
1007
+ serviceAccount: env.GOOGLE_SERVICE_ACCOUNT_JSON,
1008
+ subject: (identity) => accounts[identity.principal?.id ?? ""],
1009
+ });
1010
+ ```
1011
+
1012
+ **Authentication.** Enable Google Sheets API in a Google Cloud project. Create
1013
+ a service account with domain-wide delegation and a JSON private key; no
1014
+ project IAM role grants spreadsheet access. In the Workspace Admin console,
1015
+ a super admin adds its numeric client id to API controls → Domain Wide
1016
+ Delegation with `https://www.googleapis.com/auth/spreadsheets`. Add to an
1017
+ existing client's scopes instead of replacing them. A grant can take up to
1018
+ 24 hours to propagate. Supply the key through the deployment's secret store;
1019
+ there is no operator credential slot or per-user consent flow. If organization
1020
+ policy disables key creation, a Workspace administrator must authorize it.
1021
+
1022
+ **Options and boundaries.** `subject` is a fixed Workspace address or a
1023
+ function mapping admitted identities. Unmapped callers fail `auth_required`;
1024
+ agent pools need an owner unless a fixed subject is configured. Configure
1025
+ inbound authentication. `readOnly: true` omits and refuses writes, including
1026
+ hatch mutations. `instructions` appends deployment guidance. `baseUrl` may
1027
+ select a confined HTTPS proxy (HTTP loopback for tests). Cell values, notes,
1028
+ formulas and metadata are requested content; no `sensitiveFields` switch is
1029
+ provided. Sent credentials and private signed destinations remain withheld.
1030
+
1031
+ **Coverage and limits.** Thirteen tools include the nine named workflows and
1032
+ four indexed hatches over all 17 pinned Sheets v4 methods. Seven are reviewed
1033
+ reads, including three POST methods: spreadsheet/get values by data filter
1034
+ and developer metadata search. Ten are writes. Generic batches accept 1–100
1035
+ requests, exactly one reviewed kind each; preview comments and external
1036
+ data-source kinds are refused. Values use at most 20 read/clear ranges,
1037
+ 100 batch write ranges, 10,000 rows per value block and 50,000 cells per write.
1038
+ No new OAuth scopes, revision guarantee or automatic write replay is added.
1039
+
1040
+ `get_values` pages whole rows with `maxCells` (2,000 default, 10,000 maximum),
1041
+ `maxBytes` (192 KiB default, 4 MiB maximum) and `maxCellChars` (5,000 default,
1042
+ 50,000 maximum). A row that cannot fit is refused before returning that page;
1043
+ narrow the columns or adjust the budgets. Use large byte budgets only with
1044
+ direct calls; reduce within code for its bounded result bridge. Sheets has no
1045
+ vendor page token. Standard result `fields` selects dot paths after safety;
1046
+ Google's `query.fields` and batch field masks are distinct vendor syntax.
1047
+
1048
+ For full metadata, read `workbook.sheets_api_read` with
1049
+ `{ method: "GET", path: "/spreadsheets/workbook_123" }`. A direct call's
1050
+ Connecta delivery contains the hatch result `{ status, data }`; in code,
1051
+ `const { data: reply } = await connecta.call("workbook.sheets_api_read", args)`
1052
+ and `reply.data.sheets` accesses the vendor sheets. Paths are relative to
1053
+ `/v4`. Range colons can be literal or `%3A`; action suffixes such as `:append`
1054
+ must be literal. Prefer `append_values` for pinned `INSERT_ROWS`; generic
1055
+ append's explicit `OVERWRITE` can overwrite cells.
1056
+
1057
+ Named-read field selection keeps `truncated` metadata, and value reads keep
1058
+ `page` for continuation. `get_values` cursors are signed and bind the connection
1059
+ and read arguments through the shared deployment store. Mapped Workspace
1060
+ subjects also bind the admitted caller. Restart an old unsigned continuation
1061
+ after upgrading; changing mapped callers requires a new read.
1062
+
1063
+ ## Google Forms
1064
+
1065
+ ```ts
1066
+ import { forms } from "@zackbart/connecta/providers/forms";
1067
+
1068
+ forms("forms", {
1069
+ purpose: "Registration forms and response summaries",
1070
+ serviceAccount: env.GOOGLE_SERVICE_ACCOUNT_JSON,
1071
+ subject: (identity) => accounts[identity.principal?.id ?? ""],
1072
+ });
1073
+ ```
1074
+
1075
+ Enable the Google Forms API in a Google Cloud project. Create a service
1076
+ account without project IAM roles, enable domain-wide delegation, and store
1077
+ its JSON key as a deployment secret. A Workspace super administrator must
1078
+ add the key's numeric `client_id` to Admin console → Security → Access and
1079
+ data control → API controls → Manage Domain Wide Delegation, with exactly
1080
+ `https://www.googleapis.com/auth/forms.body,https://www.googleapis.com/auth/forms.responses.readonly`.
1081
+ A grant can take up to 24 hours to apply. If key creation is disabled by
1082
+ `iam.disableServiceAccountKeyCreation`, an organization policy administrator
1083
+ must permit it for the project.
1084
+
1085
+ Configure inbound authentication. `subject` may be one fixed Workspace
1086
+ address or a function mapping the admitted identity to an address. Calls
1087
+ without a mapped account fail `auth_required`; tool arguments cannot select
1088
+ an account. A fixed subject gives every admitted caller that account's view.
1089
+ Each logical call resolves its subject once, including form/answer joins.
1090
+ A missing form and one the account cannot open are indistinguishable.
1091
+
1092
+ `readOnly: true` omits and refuses writes. There is no configurable sensitive
1093
+ field set: answers, respondent email and quiz answer keys are requested data
1094
+ on both named tools and the hatch. Vendor-minted temporary image URLs and
1095
+ credentials remain permanently withheld. Listing forms, sharing and deleting
1096
+ files require a separate Drive connection and scopes. Publish-settings
1097
+ mutation and every watch operation remain refused even though discoverable.
1098
+
1099
+ Named responses default to 25 items, at most 100, and may end earlier for
1100
+ size. Results target 240 KiB; vendor responses are bounded at 8 MiB.
1101
+ `list_responses` and `get_response` each read both the form and its answers.
1102
+ Batches allow 1–100 reviewed request objects and require a current revision
1103
+ on the batch wrapper and hatch. Google supplies no idempotency key. Set
1104
+ `callAdmission` for the deployment's shared quota; the connector does not
1105
+ reserve a Workspace-wide quota.
1106
+
1107
+ ## Google Slides
1108
+
1109
+ ```ts
1110
+ import { slides } from "@zackbart/connecta/providers/slides";
1111
+
1112
+ const decks = slides("decks", {
1113
+ purpose: "Team presentations",
1114
+ serviceAccount: env.GOOGLE_SERVICE_ACCOUNT_JSON,
1115
+ subject: (identity) => accounts[identity.principal?.id ?? ""],
1116
+ });
1117
+ ```
1118
+
1119
+ **Authentication.** Enable the Google Slides API in a Google Cloud project.
1120
+ Create a service account and JSON key; no project IAM role grants access to
1121
+ users' decks. A Workspace super admin must add its numeric client ID under
1122
+ Security → Access and data control → API controls → Manage Domain Wide
1123
+ Delegation, with `https://www.googleapis.com/auth/presentations`. The grant
1124
+ can take up to 24 hours to apply. If key creation is blocked by
1125
+ `iam.disableServiceAccountKeyCreation`, an organization policy administrator
1126
+ can allow it for that project. Store the key in a deployment secret.
1127
+
1128
+ Configure inbound authentication and a subject mapping for admitted callers.
1129
+ A fixed `subject: "alice@example.com"` acts as one shared account; a function
1130
+ maps the admitted identity to an account. An agent uses its pool owner unless
1131
+ a fixed account is configured. Unmapped callers fail `auth_required` before
1132
+ minting; no tool selects another subject. A deck's absence and lack of access
1133
+ are indistinguishable. Delegation is resolved when a data call needs it.
1134
+
1135
+ **Options and boundaries.** `readOnly: true` omits and refuses every write.
1136
+ `baseUrl` is an HTTPS proxy override, or HTTP on loopback for tests. There is
1137
+ no configurable sensitive-field set; field selection only narrows replies.
1138
+ The five-method frozen index includes four generic executable JSON routes.
1139
+ Thumbnails mint temporary access links and are refused in the generic hatch;
1140
+ `get_slide_thumbnail` remains the reviewed named workflow. Existing comment
1141
+ methods and request kinds remain available without adding preview methods.
1142
+ Slides cannot search, share, move or delete presentation files; use Drive for
1143
+ those separately authorized workflows.
1144
+
1145
+ **Limits.** Named content windows default to 20 slides (maximum 100), 50 page
1146
+ elements (maximum 500), 100 layout rows (maximum 500), and 50 comment threads
1147
+ (maximum 500). Batches allow 1–100 reviewed requests and the generic batch
1148
+ requires `writeControl.requiredRevisionId`. Revision ids are preconditions,
1149
+ not idempotency keys. Deck and comment changes can save separately; uncertain
1150
+ comment saves require reading both outcomes before another edit. Responses
1151
+ are bounded at 16 MiB; named results use a smaller content budget and provide
1152
+ continuation. Set `callAdmission` when the deployment needs a tighter budget.
1153
+
1154
+ ## Google Drive
1155
+
1156
+ Import `drive` from `@zackbart/connecta/providers/drive`. Enable Google Drive API
1157
+ in a Google Cloud project, create a service account with domain-wide delegation,
1158
+ and retain its JSON private key in a deployment secret. As a Workspace super
1159
+ admin, authorize the service account's numeric client id for exactly
1160
+ `https://www.googleapis.com/auth/drive`. Delegation changes can take 24 hours.
1161
+ No Google Cloud IAM role grants access to a person's Drive.
1162
+
1163
+ ```ts
1164
+ drive("files", {
1165
+ purpose: "Team files and shared drives",
1166
+ serviceAccount: env.GOOGLE_SERVICE_ACCOUNT_JSON,
1167
+ subject: (identity) => accounts[identity.principal?.id ?? ""],
1168
+ });
1169
+ ```
1170
+
1171
+ The subject mapping is deployment code. An agent uses its pool owner's mapped
1172
+ identity; an ownerless pool has no delegated account unless `subject` is a fixed
1173
+ Workspace address. Anonymous requests cannot invoke a subject function. The
1174
+ scope reaches everything that user can open, including shared drives. The
1175
+ provider's reviewed surface confines the available actions. Options are the
1176
+ shared Workspace `purpose`, `instructions`, `serviceAccount`, `subject` and
1177
+ optional `baseUrl`; there is no caller-selected account or sensitive-data mode.
1178
+
1179
+ The 17 named workflows remain available. `drive_api_search` and
1180
+ `drive_api_details` discover the frozen 64-method inventory; `drive_api_read`
1181
+ and destructive `drive_api_write` execute only 13 reviewed JSON metadata methods.
1182
+ Refusals explain unreviewed methods. All grants use `share_file`, including
1183
+ `anyone` and domain grants. There is no hatch media upload/download, watch,
1184
+ permanent deletion or ownership transfer. Named content tools keep their bounded
1185
+ export/download and the separately confined upload connection.
1186
+
1187
+ Named lists return `{ items, page }`; terminal pages omit `nextCursor`.
1188
+ Continuation is bound to the connection, caller and listing arguments; named
1189
+ `fields` and `maxBytes` may change between pages. A local byte cap can end a page
1190
+ early, and a changed source page fails `conflict`. Named page
1191
+ limits default to 25 and allow 1–100 rows; whole-result budgets default to 192 KiB
1192
+ and allow 64 KiB–4 MiB. Large direct results use Connecta's result pager; keep
1193
+ the default for programs. Named uploads allow one million text characters or
1194
+ one MiB of decoded binary; content reads may return a whole-withheld binary
1195
+ when credential scanning changes any byte. Size reports use `truncated` paths.
1196
+
1197
+ Hatch paging keeps Google's query parameters inside `query`. Omit `pageToken`
1198
+ on the first request; pass the signed `page.nextCursor` as top-level `cursor`
1199
+ thereafter. An empty vendor page may continue. `query.fields` is Google's wire
1200
+ mask; Connecta's `fields` narrows safe returned JSON and preserves paging.
1201
+ `incompleteSearch` describes incomplete corpus search, never an exact total.
1202
+
1203
+ ```js
1204
+ const { data: result } = await connecta.call("files.drive_api_read", {
1205
+ path: "/files/file_123/revisions",
1206
+ query: { pageSize: 20 },
1207
+ fields: ["revisions.id", "revisions.modifiedTime"],
1208
+ });
1209
+ const revisions = result.data.revisions;
1210
+ const cursor = result.page?.nextCursor;
1211
+ ```
1212
+
1213
+ The outer `data` is Connecta delivery; the hatch's `result.data` is the Google
1214
+ body and `result.page` carries continuation. Resource keys, decryption JWTs and
1215
+ private download destinations remain withheld on named and hatch responses.
1216
+ A 404 does not prove absence. Auxiliary lookup failures send no move; an actual
1217
+ write failure can have an unknown outcome and requires a read before repetition.
1218
+
1219
+ ## QuickBooks Online
1220
+
1221
+ Available from 0.36.0. Use the deployment's own Intuit app and configure one
1222
+ fixed QuickBooks Online company per connector. Multiple companies need separate
1223
+ connector IDs and separate consent; tool arguments cannot select another
1224
+ company or environment.
1225
+
1226
+ ```ts
1227
+ import { quickbooks } from "@zackbart/connecta/providers/quickbooks";
1228
+
1229
+ const accounting = quickbooks("accounting", {
1230
+ purpose: "Company accounting reports and invoice reconciliation",
1231
+ realmId: process.env.QUICKBOOKS_REALM_ID!,
1232
+ environment: "sandbox",
1233
+ clientId: process.env.QUICKBOOKS_CLIENT_ID!,
1234
+ clientSecret: process.env.QUICKBOOKS_CLIENT_SECRET!,
1235
+ });
1236
+ ```
1237
+
1238
+ Create an Intuit QuickBooks Online app, enable the Accounting API and obtain
1239
+ the client ID and secret for the selected environment. Sandbox and production
1240
+ credentials are separate. Register
1241
+ `<publicUrl>/oauth/callback/accounting` as an exact redirect URI. Set the
1242
+ numeric company/realm ID in deployment configuration, then connect through
1243
+ the operator UI or `authorize_connector`. After valid OAuth state, the callback
1244
+ must contain exactly one `realmId` equal to the configured value before any
1245
+ code exchange. Selecting another company fails authorization. Store app
1246
+ credentials in deployment secrets; token import and endpoint overrides are
1247
+ not supported.
1248
+
1249
+ OAuth defaults to one shared grant; `authScope: "personal"` instead gives each
1250
+ owner a grant for the same fixed company. The requested
1251
+ `com.intuit.quickbooks.accounting` scope permits both reads and writes at Intuit.
1252
+ This provider defaults to `readOnly: true`. Set `readOnly: false` explicitly in
1253
+ deployment code to enable the three bounded named writes below. Connector,
1254
+ endpoint and pool read-only policy still refuses writes before validation or
1255
+ dispatch. It reuses sealed grants, coordinated refresh,
1256
+ rotation and revocation. Access tokens last one hour; refresh authorization
1257
+ requires use within 100 days and expires absolutely after five years. Reconnect
1258
+ when Intuit requires consent again. Do not assume refresh extends the absolute
1259
+ window or infer expiry from provider-specific fields.
1260
+
1261
+ `get_company_info`, `search_records`, `get_record` and `get_report` are the
1262
+ named reads. The reviewed record families are customers, vendors, accounts,
1263
+ items, invoices, bills, received accounting payments and bill payments.
1264
+ `search_records` accepts at most eight structured AND filters and returns up to
1265
+ 100 rows per page (25 by default; configurable with `defaultPageSize`). Its
1266
+ signed continuation binds the original arguments, company, environment,
1267
+ connector and credential owner. Continue with unchanged arguments and cursor.
1268
+ Search is not a snapshot; concurrent accounting changes can alter later pages.
1269
+
1270
+ Reports are allowlisted to ProfitAndLoss, BalanceSheet, CashFlow,
1271
+ AgedReceivables and AgedPayables. P&L and Cash Flow accept `start_date`; all
1272
+ accept `end_date` (translated to `report_date` with `aging_method: "Report_Date"`
1273
+ for AR/AP aging). P&L and Balance Sheet accept `accounting_method` (`Cash` or
1274
+ `Accrual`). No verified currency override is exposed; inspect the returned
1275
+ Header.Currency and never combine unlike currencies. Unsupported combinations fail before
1276
+ dispatch. Report Header, Columns and nested Rows retain section identity,
1277
+ column metadata and empty amount strings. Check the returned period, basis
1278
+ and currency; an empty amount is never converted to zero. Responses use the
1279
+ modernized report service in effect since August 31, 2026. Requests explicitly
1280
+ use the supported minor-version floor 75.
1281
+
1282
+ `quickbooks_api_search` and `quickbooks_api_details` inspect reviewed
1283
+ operations. `quickbooks_api_read` reaches only indexed record/company/report
1284
+ GETs inside this company's configured host and path. `/query` is refused;
1285
+ use the named structured search. Unreviewed entities, arbitrary SQL, URL,
1286
+ realm, scope and token overrides and arbitrary writes are unavailable. Desktop,
1287
+ Payments and Payroll APIs are outside this provider.
1288
+
1289
+ With `readOnly: false`, `create_customer` accepts only DisplayName and optional
1290
+ CompanyName. `update_customer` requires caller-observed Id and SyncToken and
1291
+ uses `sparse: true` for those naming fields; a stale version fails without a
1292
+ version fetch or overwrite. DisplayName must be unique across customers,
1293
+ vendors and employees.
1294
+
1295
+ `create_invoice` creates a real accounting transaction, never a draft, only
1296
+ for a verified US company and a customer using USD. The reviewed autosend
1297
+ contract is US-specific; the initial money contract uses two-decimal USD
1298
+ units. It requires an observed active customer, currency USD, an explicit positive
1299
+ exchange rate, transaction/due dates, DocNumber and 1–20 active Service-item
1300
+ lines. Amounts are positive decimal-unit strings with exactly two fractional
1301
+ digits, at most 999999999.99 per line. Every line explicitly supplies one unit
1302
+ and its price. Preflight reads verify the fixed company Country is US, then
1303
+ recheck the customer currency and item type and activity; they are not an atomic snapshot. No default prices, dates or rates,
1304
+ and no implicit customer/item creation, are used. QuickBooks computes taxes and
1305
+ totals, and locale/company rules may reject the narrow request. Inspect the
1306
+ returned CurrencyRef, ExchangeRate and totals.
1307
+ Each request after the first charges the same call-admission budget before
1308
+ dispatch. Returned references, dates, rate and service prices must match the
1309
+ admitted intent; contradictions produce an unknown, non-retryable outcome.
1310
+
1311
+ Creation fixes EmailStatus to `NotSet` and IPN/online/card/ACH/PayPal/Affirm
1312
+ payment flags to false, accepts no email fields, and never calls a send endpoint.
1313
+ Intuit's documented autosend path requires company opt-in, enabled online
1314
+ payments and `NeedToSend` with BillEmail; the fixed creation body withholds
1315
+ those request conditions. Invoice updates remain unavailable because retaining
1316
+ an existing send-ready state is not established safe, and resetting that state
1317
+ would change existing payment settings. Deletes, voids, delivery, payment
1318
+ execution, batch and other accounting writes remain unavailable. The API hatch
1319
+ refuses POSTs even when named writes are enabled.
1320
+
1321
+ Each write requires `requestId`, a stable identifier for the exact intent,
1322
+ unique across all requests/tools for this company: 1–50 ASCII letters, digits,
1323
+ underscores or hyphens, beginning with a letter or digit. It is sent as Intuit's
1324
+ `requestid` query parameter with minorversion 75. The vendor recognizes repeated
1325
+ content and ID; no retention duration is established. This never permits
1326
+ Connecta to replay automatically: every dispatched write has one attempt,
1327
+ including 401, timeout, server failure and malformed success.
1328
+
1329
+ Reconcile an unknown create through reads before another intent: customer
1330
+ DisplayName (including inactive matches when relevant), or invoice DocNumber
1331
+ plus CustomerRef and currency, dates, lines and computed amounts. DocNumber may
1332
+ repeat and is not proof by itself. Do not blindly create again with a new ID;
1333
+ report ambiguity. Reconcile unknown updates by the known record Id and version.
1334
+ The requestId supplies no lookup endpoint or permanent retention guarantee.
1335
+
1336
+ All named and hatch responses apply the same closed privacy projection before
1337
+ `fields` narrows it. Public Id and SyncToken versions, accounting references,
1338
+ amounts and minimal display names remain; contact emails/phones/addresses,
1339
+ bank/card/tax identifiers, private notes, credentials and private URLs are
1340
+ withheld. No `sensitiveFields` or `raw` option widens these results. Reduce
1341
+ financial records to task-relevant aggregates before returning them to a user.
1342
+ `maxResultBytes`, `callAdmission` and the standard provider title/instructions
1343
+ options remain available. No default admission budget is declared: account for
1344
+ other integrations sharing the app when configuring one. Intuit documents
1345
+ 500 requests per minute per company and 10 per second per company/app in both
1346
+ environments; after HTTP 429, wait at least 60 seconds. Local admission is per
1347
+ runtime and cannot coordinate other deployments' spending.