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