Integrations
Jelliu agents act on other systems through tools. A voice or chat agent can look up a customer in your CRM, book on your calendar or run an automation while the conversation is still going. Those tools come from three places:
Information also flows the other way, from Jelliu to your systems, through webhooks and Zapier triggers.
How it works
Tools are resolved when the agent runs, on voice and on text channels alike. A tool call acts immediately with the credential of the connection, so the permissions of the connected account are the outer limit of what an agent can do there.
Connected apps
Connect apps in the dashboard under Integrations. Each app is authorized with its own sign-in or API key, and the connection belongs to the workspace.
Once an app is connected, its tools are made available to every agent in the workspace. Connecting an app is the request for your agents to use it; there is no separate step per agent. To narrow that, use per-agent access.
Connection status
The Integrations screen shows each connection’s state:
Reconnecting an app that is already connected, to refresh an expired grant, does not count as a new app against your plan.
Writing interactions back to your CRM
When a connected CRM holds the contact, Jelliu writes each finished interaction (a call or a text conversation) back to it. The result is reported to your webhooks as crm_sync.completed or crm_sync.failed:
A write that fails temporarily is retried before it is reported, so you do not receive crm_sync.failed followed by crm_sync.completed for the same interaction. A write that was already made by an earlier attempt counts as a success. To build your own writeback instead, see CRM sync with webhooks.
Importing contacts from a CRM
Filling a campaign’s call list from a connected CRM is done in the dashboard, from the campaign’s contact import dialog. To load contacts through the API, use the campaign contacts endpoints described in Contacts.
Control access per agent
Four fields on PATCH /api/agents/{agentId} decide what an agent may do with the workspace’s connected apps and MCP servers. Apps are named by their lowercase catalogue slug, such as hubspot or gmail.
Which connected apps the agent may use. null (the default) means every app the workspace connects, including apps connected later. A list means exactly those apps. An empty list [] means none: the agent gets no app tools at all. Up to 300 slugs.
Read or write, per app: { "hubspot": "read", "gmail": "read_write" }. An app that is not listed, or null, keeps read_write. read restricts the agent to reading in that app.
Individual tools to switch off inside allowed apps, keyed by app: { "hubspot": ["HUBSPOT_DELETE_DEAL"] }. null and {} both mean nothing is disabled.
Whether the agent may carry MCP servers and app tools at all. Setting it to false also detaches every server already attached, in the same request. Setting it back to true attaches nothing; assign servers again explicitly.
A write key is enough. Slugs are not checked against the catalogue: naming an app the workspace has not connected is harmless, because an agent only ever receives apps that are actually connected. The new tool surface is applied to the agent in the background after the update returns.
Agents that talk to anonymous people, such as a public website widget, turn whatever a visitor says into tool calls made with your business’s credentials. Give those agents allowedToolkits: [] or mcpEnabled: false unless they genuinely need a tool, and prefer read access.
Custom MCP servers
Register an MCP server once per workspace with /api/mcp-servers, then assign it to the agents that should use it.
The MCP server object
The list endpoints (GET /api/mcp-servers and the per-agent list) return the same fields without toolOverrides. The secret token and custom headers are never returned by any endpoint.
Create a server
Up to 200 characters. Optional for a hosted provider, which defaults to the provider’s name.
The MCP endpoint, up to 2000 characters. It must resolve to a public address: private, internal and loopback URLs are rejected. Optional for Zapier and Alegra, whose endpoint is fixed.
Sent to your server as Authorization: Bearer .... Up to 2000 characters. Stored encrypted.
Extra headers, as name/value strings. Up to 20 headers; names up to 200 characters, values up to 2000. Stored encrypted.
STREAMABLE_HTTP or SSE. Set it to what your server actually speaks.
always_ask, fine_grained or no_approval. Hosted providers default to no_approval.
Per-tool decisions, { "tool_name": "auto_approved" | "requires_approval" }. Only valid with approvalMode: "fine_grained". Up to 50 per request.
Up to 2000 characters.
zapier, make or alegra to use a hosted provider preset.
Response 201:
Creating a server registers it with the voice engine before anything is saved. If registration fails, nothing is created and the API answers 502 with code MCP_SYNC_FAILED.
When you send toolOverrides and some of them could not be applied, the server is still created, the response status is 207, and a toolOverridesSync object (synced, removed, failed, failures) sits next to data. Only the decisions that were applied are stored.
Match the transport. A server registered with the wrong transport looks healthy and never answers a tool call. If yours only speaks streamable HTTP, send "transport": "STREAMABLE_HTTP". You can fix it later with PATCH, which re-registers the server and keeps its id and assignments.
Approval modes and per-tool decisions
There is no per-tool off switch. toolOverrides accepts auto_approved and requires_approval; sending disabled is refused with 400:
The voice engine has no per-tool off switch (only auto_approved / requires_approval). To stop an agent using create_invoice, detach this MCP server from the agent instead.
Per-tool decisions with any mode other than fine_grained are also refused, because they would have no effect:
Per-tool decisions only apply when the server's approval mode is 'fine_grained'; this one is 'always_ask'. Set approvalMode to fine_grained in the same request, or drop the per-tool decisions.
To stop an agent using a server’s tools, remove the server from the agent or delete the server.
Update and delete
PATCH /api/mcp-servers/{mcpServerId} accepts name, description, serverUrl, secretToken, customHeaders, approvalMode, toolOverrides and transport. Send at least one field, otherwise the response is 400 with At least one field must be provided. Changing serverUrl or transport re-registers the server with the voice engine; the id and agent assignments are kept.
DELETE /api/mcp-servers/{mcpServerId} first detaches the server from every agent, then deletes it, and answers 204. If one agent cannot be detached, the delete is refused with 502 MCP_SYNC_FAILED and the server stays in place, so no agent is left pointing at a server that no longer exists. Retry after a moment.
Assign servers to agents
A custom server does nothing until you assign it to an agent.
Response 201. This endpoint answers with a message rather than a data object:
The assignment is pushed to the voice engine in the same request. If that fails, the assignment is rolled back and the error is returned, so a 201 means the agent really has the server.
GET /api/agents/{agentId}/mcp-serverslists the servers on an agent, in the list shape above. It can include Jelliu’s own tool gateway (mcp.jelliu.co), which the platform manages.DELETE /api/agents/{agentId}/mcp-servers/{mcpServerId}removes one server from the agent and answers204.
Hosted automation providers
Zapier MCP, Make and Alegra’s MCP have fixed connection facts, so Jelliu offers them as presets. You supply the token; Jelliu sets the transport and approval mode, and attaches the server to every agent as soon as it is created.
GET /api/mcp-servers/providers returns the catalogue:
All three use STREAMABLE_HTTP; sending another transport is refused. A token is required:
Zapier needs the connection token from https://mcp.zapier.com
If you paste a provider URL that carries the token (Zapier’s ?token= variant, or Make’s /u/TOKEN/ path), Jelliu moves the token out of the URL into the encrypted secret, so it is never stored or displayed as part of the address. The same provider rules apply when you register a provider URL without setting provider.
When you later PATCH a provider server, clearing its token is refused (Zapier needs its connection token; rotate it instead of clearing it). Send the new token instead.
Errors
See Errors for the envelope and validation details.
Limits
MCP servers per agent, not counting Jelliu’s own tool gateway:
Re-assigning a server that is already on the agent never counts against the cap.
Rate limits. The MCP server and assignment endpoints use the general per-workspace limit (see Rate limits). PATCH /api/agents/{agentId} shares the 10-per-minute budget for configuration changes.
The /api/integrations endpoints in the API reference predate the app catalogue. CRMs such as HubSpot, Salesforce or Pipedrive are no longer connected through them: creating one there saves an integration in error status with last_error set to, for example, hubspot ya no se conecta por aquí: conéctalo desde el catálogo de aplicaciones. Connect CRMs from Integrations in the dashboard.

