Follow-up to #2977 / ADR-0096. Deferred enhancement identified while implementing the declarative provider factories (#2994) and the boot/reload reconcile (#3001).
Context
ADR-0096 boot materialization is intentionally fail-loud for configuration faults: unknown provider, invalid providerConfig, unresolvable credentialRef, and name conflict all abort startup. That policy is correct for authoring mistakes.
An mcp provider-bound instance, however, must connect to a remote MCP server to materialize its action handlers. Today that connection happens synchronously during boot materialization, so a transient / operational fault — the MCP server being momentarily unreachable — is indistinguishable from a config fault and aborts the whole server boot. This is why the showcase demo ships a provider: 'rest' instance (synchronous, no network at boot) rather than provider: 'mcp'.
Ask
Distinguish config-invalid (stays fatal) from remote-temporarily-unreachable (should degrade, not crash boot):
- Lazy connect: materialize the connector's
def / handler surface from declared metadata without requiring a live connection at boot; establish (and cache) the MCP connection on first dispatch, with reconnect / backoff.
- or boot-time connect with a non-fatal degrade: an instance whose connection fails at boot registers in a
degraded state (dispatch returns a clear error; GET /connectors surfaces the state) and re-attempts on the next reconcile / metadata:reloaded, rather than aborting startup.
- Preserve fatal behavior for genuine config faults (malformed providerConfig, unresolvable credentialRef, name conflict).
- Once resilient, upgrade the showcase to a live
provider: 'mcp' instance — completing ADR-0096 D6's original intent.
- Tests: unreachable-at-boot degrades (boot survives), recovery on reconnect / reload, config-fault still fatal.
Refs
Follow-up to #2977 / ADR-0096. Deferred enhancement identified while implementing the declarative provider factories (#2994) and the boot/reload reconcile (#3001).
Context
ADR-0096 boot materialization is intentionally fail-loud for configuration faults: unknown provider, invalid providerConfig, unresolvable credentialRef, and name conflict all abort startup. That policy is correct for authoring mistakes.
An
mcpprovider-bound instance, however, must connect to a remote MCP server to materialize its action handlers. Today that connection happens synchronously during boot materialization, so a transient / operational fault — the MCP server being momentarily unreachable — is indistinguishable from a config fault and aborts the whole server boot. This is why the showcase demo ships aprovider: 'rest'instance (synchronous, no network at boot) rather thanprovider: 'mcp'.Ask
Distinguish config-invalid (stays fatal) from remote-temporarily-unreachable (should degrade, not crash boot):
def/ handler surface from declared metadata without requiring a live connection at boot; establish (and cache) the MCP connection on first dispatch, with reconnect / backoff.degradedstate (dispatch returns a clear error;GET /connectorssurfaces the state) and re-attempts on the next reconcile /metadata:reloaded, rather than aborting startup.provider: 'mcp'instance — completing ADR-0096 D6's original intent.Refs
docs/adr/0096-declarative-connector-instances.md), ADR-0024 (MCP adapter)close()teardown)