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