How adapters compose

Adapters are additive. You add them to the builder and call .start() once; each adapter receives the full action set and registers it in its own dialect.

silkweave({ name: 'my-server', version: '1.0.0' })
  .adapter(stdio())     // MCP for the agent
  .adapter(fastify())   // REST for the dashboard
  .adapter(trpc())      // typed procedures for the frontend
  .action(GreetAction)
  .start()

Per-action isEnabled filtering lets you gate an action to specific transports - say, an admin action exposed over the CLI but hidden from public MCP.

The adapters

Streaming, per transport

A streaming action (an async function* with a chunk schema) is delivered the right way by each adapter: MCP notifications/progress, SSE or NDJSON over Fastify, and native tRPC subscriptions. You write the generator once; the wire format is the adapter's problem. See streaming.

Keep exploring