Build with code
MCP
The console is a Model Context Protocol server. Any MCP client, Claude Code included, can call it to turn a sentence into a validated business process inside your tenant, and to ask everything the console's own assistant knows.
Connecting
| Endpoint | POST https://console.ductileai.com/mcp |
|---|---|
| Transport | Streamable HTTP: one JSON-RPC 2.0 request per POST, one JSON answer. No session handshake is required; initialize is answered for clients that send it. |
| Protocol version | 2026-07-28 |
| Authentication | Authorization: Bearer dpt_…, a personal access token from Settings › Tokens. A console session cookie works too, for the browser. |
| Methods | initialize, ping, tools/list, tools/call, resources/list, resources/read |
Claude Code
claude mcp add ductile --transport http https://console.ductileai.com/mcp \
--header "Authorization: Bearer dpt_…"
Then ask it, in words: "Using ductile, draft a process that reads new Shopify orders every hour and posts a summary to Slack." It calls resolve_blueprint, then compile_blueprint and validate_process, and hands you a definition you can open in the console.
Any client, by hand
curl -s https://console.ductileai.com/mcp \
-H "Authorization: Bearer dpt_…" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
curl -s https://console.ductileai.com/mcp \
-H "Authorization: Bearer dpt_…" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call",
"params":{"name":"resolve_blueprint",
"arguments":{"text":"read a CSV from Box, uppercase every field, write it to the object store and email it as an attachment"}}}'
The tools
Fifteen tools, tenant-scoped: an agent id that comes back exists, is entitled to your plan, and the connections named are yours. The usual order is resolve, adjust, compile, validate.
| Tool | What it answers |
|---|---|
resolve_blueprint | Call this first. Give the request in the person's words (or a plan already understood) and get the blueprint: the exact source agents with their vendor endpoints, credential classes and samples; the shaping steps with their formulas; the target agents; the platform half; credits per run; and the unknowns with the assumptions taken. |
compile_blueprint | Turn a blueprint into the business process definition JSON, deterministically: head nodes with credential placeholders, the shaping subprocess, the gate where applied, the tail nodes, every wire, the embedded reject process. |
validate_process | Check a definition against the agent specs and the charter: unknown agents, missing required properties, wire counts and payload types, the reject route, plus the advice a complete process would still take. |
search_agents | Find agents for a step in the vendor's nouns ("list overdue invoices", "post a Slack message"): ids, verb and object, class (source, target, step), readiness (ready, usable, preview). |
get_agent | One agent in full: charter, wires, required properties, credential class, readiness signals, vendor endpoints, the sample records' columns. |
get_endpoint | The endpoint(s) an agent reaches, of any kind: http, jdbc, jms/amqp/kafka/mqtt, filesystem, object store, sftp. |
get_dapp | A vendor group's story: the vendor and its API, the API currency, constraints and traps, what is verified against the vendor and what is assumed, credential classes, docs. |
find_examples | Worked examples: a request in a person's words and the process it became, searched by words or by shape ("src:shopify -> filter>map -> tgt:slack"). |
get_samples | The sample records an agent ships, to build and test on before anything real is connected. |
get_vocabulary | The process vocabulary the validator and the pods speak, one section by id or all of them. |
search_functions | The formula language: the functions a transformation, enrichment or filter formula may use, searched by name or by intent. |
explain_failure | A step failed or a draft will not validate: what fixed the same failure on this agent before (a shape, never a value), then the general reading. |
get_currency | How current the knowledge about an agent or a vendor is, and where to fetch the latest: API version targeted, when it was grounded, announced sunsets, docs and changelog URLs. |
fetch_docs | Fetch a vendor documentation page live, by URL, and answer its text. Only hosts the knowledge base names as a vendor's docs are allowed. |
list_my_connections | The connections (credentials) this tenant already has, by name and vendor, never a secret, so "my Salesforce" binds to the account that exists. |
Resources
resources/list names the process vocabulary and the formula language as readable resources; resources/read returns one by URI. They are the same documents the validator and the pods speak, so a client can ground itself before drafting.
Limits and behaviour
- Calls are rate-limited per tenant and per person; a
429carriesretry-after. - A blueprint that names an agent your plan does not include is not returned; the tool says so and offers the nearest entitled alternative.
- Nothing a tool answers is a secret: connections come back by name and vendor only.
- Drafting through MCP is recorded like drafting in the console: the transcript is kept for your tenant's own review, and lessons learned from repairs feed the next draft.
The other direction: your processes call MCP servers
A system that offers its actions as an MCP server - a vendor's hosted server, one your own team runs, a gateway in front of a legacy system - is no longer a dead end for a process. Save it as a credential and two steps use it, on your own pods:
| Piece | What it is |
|---|---|
| MCP server credential | The server's name inside Ductile AI, its endpoint (Streamable HTTP), and one token in one header - Authorization sends it as a bearer, any other header as is. Saved once, like any connection; the secret is never read back. |
| Call an MCP tool step | One named tool, called once per row, deterministically: the tool and its arguments (a JSON formula filled from the row) are set on the step, the answer lands in a column - JSON as data a later step can read, anything else as text. A tool that reports an error sends the row down the error path with the server's words. |
| Ask AI with tools step | A question per row, answered by your account's model with the server's tools in its hands: the model decides which tool, with what, and how many times, within a limit you set. The model is the one your organisation chose at the AI gateway (Settings › AI gateway), a default or a cheaper light one per step. |
The pod speaks MCP over Streamable HTTP (revision 2025-06-18): initialize, tools/list and tools/call, with the server's session id and the agreed protocol version carried on every call, and answers read as JSON or as an event stream. The console's own door above is such a server, so a process can call search_agents or explain_failure like any other tool.
Every tool call goes through the pod's AI gateway: a kind of tool your organisation refuses (shell, browser, MCP servers themselves) is refused before it leaves, and each call is audited - who, which server, which tool, how long, how it ended - with a fingerprint of the arguments, never their text. See the API page for the gateway's doors.
Last updated October 29, 2026