MCP Tool
Call one tool on a connected MCP server, with arguments you set.
An MCP Tool node (mcp_tool) calls one tool on an MCP server registered under Settings → Tools, with arguments you set. Like HTTP Request, it is deterministic: the same tool with the same arguments every run.
Configuration
| Field | Type | Default | Description |
|---|---|---|---|
serverId | string | '' | The MCP server, from Settings → Tools. |
serverName | string | '' | Its name, kept for display. |
toolName | string | '' | The tool to call, from the server's tool list. |
inputMode | manual | json | manual | Form (one field per argument) or JSON (one object). |
argRows | list of { id, name, value, valueMode, argType, required } | [] | The form's arguments. valueMode is fixed or expression; argType is the type the tool declared. |
argsJson | string | '' | The JSON arguments. Expressions are filled in before it is parsed. |
timeoutSeconds | integer 1–300 | 30 | Overrides the server's own timeout for this step. |
binaryHandling | file | base64 | file | Store images and audio as files, or keep the base64. |
continueOnToolError | boolean | false | Turn a tool-reported error into output instead of failing the node. |
This is not the same thing as giving an agent its MCP tools. An agent is offered its tools and decides whether and how to call them; this node calls one, every time. Use the node when the step has to happen; bind the tool to an agent when the decision is the point.
Picking the server and the tool
The server list holds the MCP servers available to this workflow: the ones in its project, plus your organization's organization-level ones. The tool list is the one the server last reported; Refresh tools asks it again, which is also how a tool added since you connected the server shows up.
Arguments
Two modes, and switching between them keeps both:
- Form — one field per argument the tool declares, generated from the tool's own input schema, with the same Fixed / Expression toggle the rest of the canvas uses. Each field shows the type the tool declared, and a Fixed value is sent as that type —
15typed into anintegerfield arrives as the number15, not the string"15". - JSON — one object, for nested arguments. The expressions are filled in first and the result is then parsed, so
{"options": {"limit": {{ trigger.body.n }}}}works; you can also point the whole field at a single expression that resolves to an object.
A tool whose input schema cannot be read generates no fields. Use the JSON mode for it — the tool is the authority on its own input, and Elizon does not guess.
Output
| Field | Type | Description |
|---|---|---|
structured | unknown | The tool's structured content. |
text | string | Every text part, joined. |
files | file[] | Images and audio the tool returned, stored as files. |
content | array | Every content part as sent, with stored files replaced by their reference. |
toolName | string | The tool that was called. |
serverId | string | The server's id. |
serverName | string | The server's name. |
isError | boolean | The tool reported an error (only with Continue when the tool reports an error). |
errorMessage | string | null | The tool's error message, in that case; otherwise null. |
What comes back
structured— the tool's own structured content, as JSON.text— every text part the tool returned, joined.files— images and audio the tool returned, stored as files. The reference is the ordinary one, so{{ upstream.<nodeId>.output.files.0 }}can be attached to an AI Prompt, sent as an email attachment or passed to another API.content— every content part as the server sent it, with each stored file's data replaced by its reference.
Options
- Timeout — 30 seconds by default, up to 300. It overrides the timeout configured on the server itself, which is the right bound for testing a tool by hand but not necessarily for a step in a run.
- Images and audio — stored as files by default. Switch to Keep the base64 when you are passing the data straight to something else and do not want a stored file.
- Continue when the tool reports an error — off by default, so a tool that reports a failure fails the node with the tool's own message. On, the error becomes ordinary output (
isError: trueanderrorMessage) and the run carries on.
A tool reporting a failure is not the same as the server refusing the call. An unknown tool name or arguments the server rejects outright always fail the node, whatever this option says — otherwise a typo would pass silently as "the tool said no".
Credentials
Nothing about the credential is on the node. The server authenticates with what you configured under Settings → Tools, which is also why a Package can carry this node whole: the reference travels, the credential never does, and an installed node works as soon as the Package's MCP server is connected in your organization.
A server can authenticate with a bearer token, a custom header, several headers, OAuth (either Dynamic Client Registration or your own client credentials), or nothing at all. For the first three, the value is a reference to a secret — {{secret.MCP_TOKEN}} — held in Settings → Secrets, so rotating the secret takes effect on the next call with nothing to re-save. Agents bound to the same server use the same credential.
Example
name: Log to CRM
description: Records every new lead through the CRM's MCP server.
graph:
nodes:
- id: lead
type: trigger_http
position: { x: 0, y: 0 }
data:
method: POST
fields:
- { name: email, type: string, required: true }
- id: create-contact
type: mcp_tool
position: { x: 280, y: 0 }
data:
server: tools.crm
serverName: CRM
toolName: create_contact
inputMode: json
argsJson: '{"email": "{{ trigger.body.email }}", "source": "webhook"}'
timeoutSeconds: 30
binaryHandling: file
continueOnToolError: false
edges:
- { id: lead-to-contact, source: lead, target: create-contact }In a Package
Declare the MCP server under tools: in the manifest; the node references it as tools.<name>, and its credential is configured by the installer.
- Travels:
serverName,toolName,inputMode,argRows,argsJson,timeoutSeconds,binaryHandling,continueOnToolError - Converted:
serverId→server(atools.<name>reference) - Never carried: none