Two channels, and they never cross
A node has two ways of being triggered, and it is worth keeping them apart.
A service call returns to its caller and fires no output connectors. Nothing leaks from
one channel into the other.
A node can have both. A node that only ever answers other nodes has no inputs and no outputs
at all.
Offering a service
Declare the connector ininterface.yaml, with isService: true and the methods you offer.
interface.yaml
api/service.yaml, keyed by name.
api/service.yaml
params is what the caller passed. A method reads its arguments there, the way a call
reads settings from config.
returns says what the caller gets back. It is returns rather than an events table,
because a service call hands back one value and emits nothing.
A methodβs calls are a list, the same shape as api/run.yaml. A method needing two
requests is the same idea as a node needing two.
Every method name in service.yaml must appear in the connectorβs methods list, and lint
checks that they agree.
Consuming a service
Declare the sameserviceType with isService: false. The node now accepts a service edge
from any node that provides it.
interface.yaml
service handle to the consumerβs
serviceConsumer handle.
Whether anything is wired is a run-time fact, and templates read it through the services
root. That is how a node adapts to what it was actually given.
Service types
There are two.mcp is the larger of the two and has its own page: MCP Services.
A provider may also carry instructions, which tell an Agent how to use its tools well
together. That is strategy, and it is separate from the description of each method.
When it goes wrong
Next: MCP Services

