Elizon Docs
Workflows

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

FieldTypeDefaultDescription
serverIdstring''The MCP server, from Settings → Tools.
serverNamestring''Its name, kept for display.
toolNamestring''The tool to call, from the server's tool list.
inputModemanual | jsonmanualForm (one field per argument) or JSON (one object).
argRowslist of { id, name, value, valueMode, argType, required }[]The form's arguments. valueMode is fixed or expression; argType is the type the tool declared.
argsJsonstring''The JSON arguments. Expressions are filled in before it is parsed.
timeoutSecondsinteger 1–30030Overrides the server's own timeout for this step.
binaryHandlingfile | base64fileStore images and audio as files, or keep the base64.
continueOnToolErrorbooleanfalseTurn 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 — 15 typed into an integer field arrives as the number 15, 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

FieldTypeDescription
structuredunknownThe tool's structured content.
textstringEvery text part, joined.
filesfile[]Images and audio the tool returned, stored as files.
contentarrayEvery content part as sent, with stored files replaced by their reference.
toolNamestringThe tool that was called.
serverIdstringThe server's id.
serverNamestringThe server's name.
isErrorbooleanThe tool reported an error (only with Continue when the tool reports an error).
errorMessagestring | nullThe 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: true and errorMessage) 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

workflows/log-to-crm.yaml
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 (a tools.<name> reference)
  • Never carried: none