You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat: default preset ships the three generic connector executors + live provider:'mcp' showcase demo (#3056)
Closes the last authoring gap in ADR-0097's 'expressible AND executable as
pure metadata' promise, and lands the provider:'mcp' acceptance demo the ADR
originally envisioned (deferred at #3017).
create-objectstack (blank template):
- plugins: gains new ConnectorRestPlugin() / ConnectorOpenApiPlugin() /
ConnectorMcpPlugin() (zero-arg = provider factory only), so a scaffolded
app materializes declarative provider-bound connectors with no
plugin-wiring step. README documents the default providers, credentialRef
rule, and the #3055 declarativeStdio opt-in. Deps added at ^15.0.0.
examples/app-showcase (live mcp demo):
- scripts/mcp-fixture.mjs — tiny in-repo stdio MCP server (one deterministic
echo_upper tool): no network, no ports, no boot-ordering coupling, so the
demo is CI-deterministic.
- DevToolsMcpConnector (provider: 'mcp', stdio transport 'node
./scripts/mcp-fixture.mjs') + ShowcaseMcpConnectorEchoFlow dispatching
echo_upper end-to-end; coverage notes updated.
- objectstack.config.ts wires new ConnectorMcpPlugin({ declarativeStdio:
['node'] }) — dogfooding the #3055 default-deny opt-in, with the
coarse-boundary caveat spelled out.
dogfood:
- showcase-declarative-mcp.dogfood.test.ts boots the REAL showcase (chdir to
the app root, exactly how os dev runs), injects the three executors, and
pins: GET /connectors lists showcase_mcp_tools origin=declarative
state=ready with echo_upper (rest + openapi siblings ready too; catalog
descriptor absent), and the flow trigger round-trips OBJECTSTACK from the
fixture's tools/call into the run output.
docs: flows.mdx explains where connector_action connectors come from, the
default preset, and the stdio opt-in.
Verified: dogfood proof 2/2; turbo test dogfood+showcase+create-objectstack
63 tasks green; showcase validate (23 flows / 8 plugins) + typecheck clean;
eslint clean; lockfile updated for the new deps.
Refs #3056 (template + showcase + demo + docs; issue also tracks nothing
further after this — see closing comment)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pbmw3pMqNJfPbkvwh9Fkjs
Copy file name to clipboardExpand all lines: content/docs/automation/flows.mdx
+2Lines changed: 2 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -117,6 +117,8 @@ Each node performs a specific action in the flow.
117
117
|`map`| Sequential multi-instance — run a per-item subflow for each element, one at a time (each may pause); batch approval (ADR-0039) |
118
118
|`connector_action`| Execute an external connector action |
119
119
120
+
`connector_action` dispatches against the runtime **connector registry**, which connector plugins populate. Scaffolded apps ship the three **generic executors** — `rest`, `openapi`, and `mcp` — in their default `plugins:` (remove any you don't want), so a declarative `connectors:` entry that names a `provider` is materialized into a live, dispatchable connector at boot with no plugin code (ADR-0097). Brand connectors (Slack, …) are installed separately. One security note: a declarative `mcp` instance using a **stdio** transport spawns a local process from metadata and is therefore denied by default — the host opts in with `new ConnectorMcpPlugin({ declarativeStdio: ['<trusted-command>'] })`; `http` transports need no opt-in.
'Both connector kinds are demonstrated. (1) Provider-bound INSTANCES (ADR-0097 / #2977): StatusApiConnector declares `provider: rest` (inline config) and StatusOpenApiConnector declares `provider: openapi` with its OpenAPI document referenced as a package-relative FILE PATH (#3016, read at boot and confined to the package root) — both are materialized into live, dispatchable connectors at boot; ShowcaseDeclarativeConnectorPingFlow calls the rest instance via connector_action and both appear in GET /connectors. (2) Catalog DESCRIPTOR (#2612): ErpCatalogConnector has no provider, so it stays inert metadata; enabled:false marks the deliberate catalog entry and silences the boot audit. Plugin-registered connectors (ConnectorRestPlugin/ConnectorSlackPlugin in objectstack.config.ts) are also exercised by the connector flows.',
187
+
'Both connector kinds are demonstrated. (1) Provider-bound INSTANCES (ADR-0097 / #2977) cover all three generic executors: StatusApiConnector declares `provider: rest` (inline config), StatusOpenApiConnector declares `provider: openapi` with its OpenAPI document referenced as a package-relative FILE PATH (#3016, read at boot and confined to the package root), and DevToolsMcpConnector declares `provider: mcp` against the in-repo stdio fixture (scripts/mcp-fixture.mjs, #3056) — spawned under the host declarativeStdio allowlist (#3055) and mapped tools/list → actions. All three are materialized into live, dispatchable connectors at boot; ShowcaseDeclarativeConnectorPingFlow calls the rest instance and ShowcaseMcpConnectorEchoFlow calls the mcp instance via connector_action, and all appear in GET /connectors. (2) Catalog DESCRIPTOR (#2612): ErpCatalogConnector has no provider, so it stays inert metadata; enabled:false marks the deliberate catalog entry and silences the boot audit. Plugin-registered connectors (ConnectorRestPlugin/ConnectorSlackPlugin in objectstack.config.ts) are also exercised by the connector flows.',
0 commit comments