Repository navigation
0.29.0
Connecta 0.29.0 adopts the MCP 2026-07-28 request envelope, binding client capabilities and client identity to each request. server/discover advertises the extensions served and private cache hints. Connecta-owned access, pool and deadline refusals return JSON-RPC errors; admission codes move to -33001 and -33002. Modern clients must preserve the protocol-version and declared argument headers. tools.listChanged is false, and subscriptions/listen remains unsupported.
The tool list is six: execute_code, call_tool, call_destructive_tool, search_tools, authorize_connector and skills. get_result is removed; programs page retained direct-call results with connecta.result(id, options). resume_execution remains removed, with no paused programs to resume. Guest calls return { data, format: "json" | "text" }, programs report host-call counts, and connecta.emit delivers media without requiring await. All six tools advertise output schemas.
One fail-closed classifier decides read or write, with exact deployment overrides ahead of provider review and downstream annotations. Per-tool approval exemptions are gone. Root and named pools independently default to read-only; trusted pools allow program writes and annotate execute_code as a write. Approval belongs to the MCP host. Trust widens no connector or identity grant. Dispatched writes are never automatically replayed, and unknown outcomes require reconciliation.
Errors distinguish host authentication, downstream OAuth and provider permissions. Routing, argument and recoverable authentication failures carry a repair nextAction; other failures retain typed retry or reconciliation guidance. Argument refusals include bounded schema repair details. Discovery returns one flat page with catalog failures before tools, ranks exact tool names and addresses first, and reports endpoint-scoped service absences without substituting lookalikes. Program discovery defaults to JSON Schema; compact schemas are labeled as text.
Humans authenticate through Clerk or Cloudflare Access. Access requires trusted direct Worker context; Node uses Clerk. Machines use stored cta_ tokens, and the generic static bearer adapter is retired. Downstream OAuth starts through an identity-checked, single-use /connect/<id> page. Capable hosts receive MRTR URL elicitation; other hosts receive a connection handoff. Public HTTPS deployments default to self-hosted CIMD where the authorization server supports it, with DCR fallback and issuer-bound static clients available. Disconnect removes local authorization and attempts revocation once when the saved server advertises it. State is one grant record per connector and owner, plus one expiring flow record per consent.
Direct calls relay downstream input_required through connecta's sealed state, bound to the principal, pool, target and original arguments. Only declared form and URL input capabilities are forwarded. Programs receive direct-call repair guidance instead. A consumed continuation cannot be resent; continuation failures are not retryable. The Skills extension serves connecta guides, connector guides and opted-in downstream skills through one caller-scoped registry, shared with skills and connecta.skill(). Upward resource reads remain skill-only.
Downstream clients reuse SDK negotiation verdicts and complete SQL-backed catalog caches. Host-computed identity, credential and pool partitions bound sharing; downstream cache hints cannot widen it. Programs read advertised downstream resources with connecta.read("resource://<connectorId>/<encodedUri>"). URI template matching uses bounded forward scans and refuses ambiguous matches, authority changes and unsafe paths before dispatch.
Persistent storage is one SQL key-value store with D1 on Workers and SQLite on Node. Workers KV, the JSON file store and optional compare-and-set paths are removed. Result-stash bounds now apply across processes or isolates sharing the store. One configuration schema supplies types, validation and defaults; unknown keys and invalid values fail construction. describeConfig() supplies a secret-free snapshot for the operator UI and doctor.
Maintained providers use defineProvider and folders containing implementation, SKILL.md, drift evidence and tests; exports and check inventories are generated. Hosted MCP implementations are reviewed presets. Notion, Vercel and Cloudflare default to hosted MCP with explicit REST complements. The GitHub provider combines hosted tools and a REST complement through a GitHub App, supporting organization and repository scopes together with repository-narrowed installation tokens. It acts as the App; repository creation and forks are absent, and workflow-file writes are off by default. Provider drift checks run locally, on provider pull requests and weekly, reporting findings without filing issues. Google Workspace providers retain domain-wide delegation, including draft-only Gmail and Slides comments.
The operator UI is rebuilt on React, Radix and Tailwind with hashed immutable assets on both runtimes. It shows caller-scoped configuration, catalogs, access and activity; capability changes remain in deployment code. Activity records the real package version independently of display serverInfo, validated client name and version, call classification and result size, without payloads. Shipped executors carry lifecycle brands; custom sandboxes explicitly accept cleanup responsibility through customExecutor(executor, { lifecycle: "self-managed" }).
The built-in artifacts feature, package subpath, pages, scheduled refresh and agent tools are removed. A leftover artifacts: or artifactOrigin option throws ConfigError. Existing artifact data is ignored and untouched. Deployments without the built-in feature need no artifact migration; dedicated downstream publishing services remain ordinary connectors.
Agent evals now use the 0.29 tools and guest API with correctness grading for destination, evidence and final answers. Sonnet 5.5 and GPT-6-Luna baselines and their measured failures are recorded in eval/baselines/notes-0.29.md. Runner limitations are explicit N/A outcomes. These diagnostic trials do not establish a model ranking or native CLI URL-elicitation support.
Security fixes harden Clerk audience binding and downstream OAuth completion binding. Credential redaction and payload-free operator records cover shared request boundaries. GitHub grants bind to repository IDs, catalog sharing respects host auth partitions, and resource URI validation is tightened. OAuth token requests refuse redirects, and refresh coordination preserves one-time dispatch across cancellation and grant resets.
Contributors use oxfmt through npm run format; npm run format:check joins the verification gates. Generated files, fixtures, baseline data and released changelog history retain their existing serialization. Deployments need no formatting migration.
Before upgrading an existing deployment, back up its state and database, preserve the credential-encryption key and identity namespaces, and prepare the replacement configuration and imports. Delete discovery.persistCatalog and discovery.staleCatalogSeconds. Replace the old registry freshness policy with discovery.catalogMinTtlSeconds and discovery.catalogMaxTtlSeconds, defaulting to 0 and 86400; catalogTtlSeconds remains the 300-second fallback when a downstream omits TTL hints. Explicit zero hints disable reuse. Delete execute.approval, Connector.approval, execute.resumableWrites and execute.pausedRunTtlSeconds. Set root trust and each pools.<name>.trust deliberately; named pools do not inherit root trust. Remove artifacts configuration, the @zackbart/connecta/artifacts import, artifact bindings and refresh jobs. Replace legacy credentials with vault, move root branding into operatorUi({ branding }), and replace boolean or object accessTokens configuration with accessTokens(storage). Fix rejected options before starting the new version.
Move persistent storage before reopening traffic. On Node 22.13 or later, stop the old server and run connecta migrate-state <state.json> <connecta.sqlite> once, then use sqliteStorage and sqliteActivityStore from @zackbart/connecta/sqlite. Replace CONNECTA_STATE_FILE and CONNECTA_ACTIVITY_FILE with CONNECTA_DATABASE; the old JSONL activity log is not imported. Workers use d1Storage and d1ActivityStore from @zackbart/connecta/d1, replacing copied KV/D1 adapters. Existing connecta_kv and tool_call_activity tables remain readable; the example uses CONNECTA_DB for both. fileStorage is no longer exported from /node, and custom stores must implement list and compareAndSet. Deployments using memoryStorage() can ignore the persistent-store conversion.
For Workers KV, use the Worker example's scripts/copy-kv-to-d1.mjs or copyKvToD1 from /d1 under maintenance. Back up values with expiration metadata and D1, stop background writers, and drain requests, callbacks and refreshes. Wait at least 60 seconds or the longest KV cache TTL after the last write, and require stable listing/hash passes. Copy before switching to D1, resolve invalid entries and conflicts, and verify exact value hashes and absolute expiries. Preserve the existing vault key. Keep maintenance through startup and credential checks, then mark the source live with --mark-live or markKvToD1Live before reopening traffic. Later copies refuse stale KV state. Keep backups until the upgrade is verified. OAuth layout migration runs automatically on each owner's first grant read; issuer-stamped grants carry over, pending links and pre-issuer-binding grants need Connect again. Rolling back after that migration requires consent again.
Replace @zackbart/connecta/auth/bearer, bearerToken and assertedPrincipal with accessTokens(storage). Provision a separate stored token per machine or represented human, update grants to its metadata ID and access_token actor, then rotate clients to Authorization: Bearer cta_… and remove the static secret and X-Connecta-Principal. Keep exact principal namespaces and IDs when preserving personal state; existing unrevoked cta_ tokens survive the storage copy. Worker machines also need Access service credentials at the edge. Protect /connect/* and /oauth/callback/* with the intended Worker Access application. Clerk deployments enable aud_claim_enabled, reconnect using the advertised endpoint URL as resource, and verify refresh. Custom auth adapters replace final and finalRefusals with synchronous credential recognition; consolidate Access wrappers that depended on refusal fallthrough.
Replace upstream DynamicWorkerExecutor construction with workerExecutor({ loader: env.LOADER }) from @zackbart/connecta/worker, keeping the optional @cloudflare/codemode peer. Wrap custom executors with customExecutor(..., { lifecycle: "self-managed" }) and implement termination and cleanup. Existing quickJsExecutor() configurations need no change. Public provider import names survive the folder move. Existing Notion integration workflows select surface: "api" and rename REST tools to integration_*; Vercel and Cloudflare users migrate removed operations to live hosted schemas and configure retained REST complements under separate connector IDs. Follow documentation/provider-migration-0.29.md. Update client workflows to the flat discovery page and { data, format } guest results, page direct results through connecta.result, and remove calls to get_result or resume_execution.
Start the upgraded deployment under maintenance and run connecta doctor with its required machine and edge credentials. Doctor checks health, SDK protocol negotiation, the exact current six-tool set and an actual executor program, and reports the negotiated revision and package version. With the UI enabled, doctor --config prints the caller-scoped secret-free snapshot instead of running diagnostics. Check existing OAuth and vault credentials, intended identity and pool grants, token revocation and activity, reissue pending connection links, then reopen traffic. UI, provider and contributor changes require no additional migration for deployments that do not use them. These notes apply whenever a deployment chooses to upgrade; the release includes no owner deployment cutover.