--- name: managing-on-premise-agents description: Manage Celigo on-premise agents -- lightweight software you install on a host inside your own network that opens a secure OUTBOUND tunnel to integrator.io, letting the platform reach private systems (on-prem databases, file shares, internal apps) without opening inbound firewall ports. An on-premise agent is a connectivity resource on the `/agents` page -- not a stack (compute) and not an AI agent (LLM processing). Use when connecting to a system behind a firewall, installing or pairing an agent, rotating its access token, or diagnosing agent-offline flow failures. --- # Managing On-Premise Agents An on-premise agent is a **secure tunnel between your own network and integrator.io**. You install a small piece of Celigo software on a Windows or Linux host *inside* your network; it dials **outbound** to integrator.io and holds the connection open so the platform can send work back through it. Because the agent reaches out to Celigo, you open **no inbound** firewall ports for it; a network that restricts outbound traffic only has to let the agent host reach Celigo (see Gotcha 2). There are two things sharing the name -- keep them apart: - **The installed software** -- the agent daemon running on a host inside your network. It maintains the tunnel and does the reaching. - **The `/agents` resource** -- the *registration* of that daemon in integrator.io: a `name`, `description`, and pairing/health metadata. This is what you manage via the API and CLI. Concerns when managing an on-premise agent: - **Reachability** -- giving Celigo a path to systems that have no public endpoint (private DBs, file shares, internal apps) - **Pairing** -- installing the software and configuring it with the agent's access token to bring the tunnel up - **Health** -- heartbeats determine `offline`; a stopped host or service breaks every connection routed through the agent - **Token lifecycle** -- rotating the sensitive access token (which authorizes a tunnel into your network) on exposure or on schedule Referenced by connections via `_agentId`. The agent resource is read and managed with the CLI, the REST API (`/v1/agents`) or the UI; no MCP tool reads it, and its id isn't an AI agent's, so don't look it up among AI agents. Over MCP, the connections that carry its `_agentId`, their `offline` flag, and the `agent_not_running` errors on their flows say what you need to know. ## On-Premise Agent vs Stack vs AI Agent The word "agent" is overloaded in Celigo. An on-premise agent is **none** of the others: | Term | What it is | About | |---|---|---| | **On-premise agent** (`/agents`) | Network tunnel daemon installed inside your network | **Connectivity** -- reach private systems behind your firewall | | **Stack** | Runs your extension code (hooks/wrappers) on your own server or AWS Lambda | **Compute** -- run your custom code | | **AI agent** (`/aiagents`) | LLM processor that classifies or transforms records inside a flow | **AI processing** of records | Smell test: if it is about *reaching a system on a private network*, it is an on-premise agent. If it is about *running your custom code*, that is a stack. If it is about *an LLM doing work on records*, that is an AI agent. A single flow can use both an agent (to reach a private database) and a stack (to run a custom hook). When a request just says "the agent," confirm which one is meant before acting. ## Quick Reference ### Do You Need an On-Premise Agent? The deciding question: **is the system reachable from the public internet, or only from inside your network?** | Target system | Public endpoint? | Agent needed? | |---|---|---| | Public SaaS API (Salesforce, Shopify, Stripe, public REST) | Yes | No -- Celigo's cloud connects directly | | Cloud database with a public endpoint | Yes | No | | On-prem / private database (SQL Server, MySQL, Postgres, MongoDB) with no public listener | No | Yes | | Oracle database | -- | Yes -- Oracle runs in agent mode only | | Local host directory or mounted network file share | No | Yes | | Internal-only application -- an HTTP/REST or SOAP API on the private network, or a JDBC-accessible system | No | Yes | ### Minimum Required Fields Creating an agent resource needs at minimum: `name`. Optional but common: `description`. ### Connections That Route Through an Agent A connection that needs private-network or filesystem access sets `_agentId` on the connection object. The agent supplies reachability; the connection supplies the target system's credentials and config. | Connection | `_agentId` | Notes | |---|---|---| | `filesystem` | Required | Local/network file access always needs an agent. An export on it can't take an EDI profile: the spec accepts `_ediProfileId` on FTP, AS2, S3 and HTTP file exports only | | `jdbc` (`agent` / `activedirectory`) | Required | POST fails 422 without it; other JDBC types commonly run on an agent too | | `rdbms` -- Oracle | Required | Oracle is agent-mode only; even a placeholder connection needs a real `_agentId` | | `rdbms` -- SQL Server, MySQL, PostgreSQL on a private network | Set for an on-premise instance | The connection's on-premise mode. SQL Server through an agent uses database-user (`basic`) auth only, and a create still needs `password` (422 `Expected field: password to be present.` without it) | | `mongodb` -- on-premise instance | Required for a private instance | Cloud-reachable instances (including Atlas) need no agent | | `http` -- an API reachable only inside the network | Set for an on-premise endpoint | The connection's on-premise mode: `baseURI` is the address as the agent host sees it (an internal hostname, or `localhost` on the agent host itself). With OAuth, the agent performs the token exchange locally, so the authorization server can be private too | The schemas' `_agentId` description lists only the types where an agent is **required**. Celigo documents agent support for SQL databases, MongoDB, DynamoDB, and HTTP connections, in addition to filesystem and JDBC. Wiring `_agentId` onto a connection is a connection-configuration task -- see [configuring-connections](../configuring-connections/SKILL.md#how-to-build-a-connection). ### Health & Metadata Fields These are server-managed (read-only) on the response -- you do not set them: | Field | Meaning | |---|---| | `lastHeartbeatAt` | Timestamp of the last heartbeat received from the installed agent | | `offline` | Derived from heartbeats -- `true` when heartbeats stop (host down, service stopped, network blip) | | `version` | Agent software version reported by the host. Agents 4.6.0 and later update themselves while they run as a service (on Windows, with administrator rights); Windows Server 2012 R2 hosts stay on 4.3.0 (Gotcha 10) | The pairing **access token** is not on the resource at all -- create, get, and update never return it. Read it with `celigo on-premise-agents token ` (`GET /v1/agents/{id}/display-token`). ## Related Skills - [configuring-connections > How to Build a Connection](../configuring-connections/SKILL.md#how-to-build-a-connection) -- setting `_agentId` on filesystem, JDBC, database, MongoDB, and HTTP connections that reach a private network - [managing-stacks](../managing-stacks/SKILL.md) -- the compute counterpart; use a stack to run custom code, an agent to reach private systems - [configuring-ai-agents](../configuring-ai-agents/SKILL.md) -- the *AI* agent (LLM processor), a different resource despite the shared name - [troubleshooting-flows > Diagnostic Workflow](../troubleshooting-flows/SKILL.md#diagnostic-workflow) -- diagnosing flow failures caused by an offline agent - [getting-started > Which Skill to Use](../getting-started/SKILL.md#which-skill-to-use) -- orientation across resource types ## How to Set Up an On-Premise Agent ### 1. Confirm you actually need one Only when the target system is not reachable from the public internet (see [Do You Need an On-Premise Agent?](#do-you-need-an-on-premise-agent)). Public SaaS APIs and cloud databases with public endpoints need no agent. ### 2. Check for an existing agent A single agent can back many connections -- every flow that reaches systems on that network can route through it. Reuse before creating: ```bash # List all on-premise agents celigo on-premise-agents list ``` `celigo account search` won't find them: the account index behind it doesn't include agents, so `list` is the check. An agent registered in another environment isn't in this list either (Gotcha 9). ### 3. Create the agent resource Create the registration first. The response is the agent record **without** its access token -- read the token separately when you're ready to pair. ```bash # Create a new agent registration echo '{"name":"On-Prem DC1 - Oracle & File Share","description":"Tunnel for the datacenter-1 private network"}' | celigo on-premise-agents create ``` ### 4. Install the agent software on a host inside the network Download and install the Celigo agent software on a Windows or Linux host that can reach the private systems. The installer download is a short-lived (about 15 minutes) pre-signed URL: ```bash celigo on-premise-agents installer-url --os linux # or --os windows ``` Running the installer happens **on the host** -- the CLI only fetches the download link. ### 5. Pair the installed agent with the access token Configure the installed agent with the agent's access token. This pairs the daemon to the `/agents` resource and brings the outbound tunnel up. Heartbeats begin flowing once it connects. ```bash celigo on-premise-agents token # prints the access token ``` The command prints the secret, so have the user run it on the host (or read the token in the UI) and enter it straight into the agent's configuration -- don't run it where the value lands in a chat transcript. ### 6. Verify the agent is online ```bash # Confirm the resource shows heartbeats and is not offline celigo on-premise-agents get ``` Check that `offline` is `false` and `lastHeartbeatAt` is recent. `version` confirms what is running on the host. ### 7. Reference the agent from connections On each connection that needs private-network access, set `_agentId` to this agent's `_id`. This applies to `filesystem`, `jdbc` agent/activedirectory, and Oracle `rdbms` connections (required), and to any private SQL Server, MySQL, PostgreSQL, MongoDB, or HTTP endpoint (see [Connections That Route Through an Agent](#connections-that-route-through-an-agent)). See [configuring-connections](../configuring-connections/SKILL.md#how-to-build-a-connection). For Oracle, install and pair the agent **before** creating the connection -- Oracle rejects even a placeholder connection without a real `_agentId`. `_agentId` is a top-level field of the connection, beside `type`; the host in the connection's own block is the address as the agent host sees it. Routing through an agent doesn't waive the database credentials: a SQL Server create without `password` is refused with 422. When the user will enter the password themselves, create the connection with a placeholder, and say in your reply that it holds a placeholder until they enter the real password in the connection's settings in the Celigo UI -- the connection stays offline until they do. Never ask for the password in chat. ## Rotating the Access Token Rotate when the token may be exposed or on a security schedule. Rotation **regenerates the access token and invalidates the previous one immediately**, so the installed agent disconnects and reconnects only after it is reconfigured with the new token -- expect a brief outage for every connection routed through it. ```bash celigo on-premise-agents rotate-token # PUT /v1/agents/{id}/change-token; prints the new token ``` The rotation itself is an API call; applying the new token happens **on the host**. Like `token`, the command prints the secret -- have the user run it where the value goes straight into the host's configuration, during a quiet window. ## Running More Than One Agent Default to **one agent per network location**. Reasons to run more are about topology and resilience, not raw volume: - **Segmentation** -- an agent in each network segment or data center it must reach. - **Availability** -- a second agent so one host going down takes out fewer connections. It doesn't take over for the first: every connection names one agent (`_agentId`), so each agent serves only the connections pointed at it. Moving a connection to another agent is a full update of the connection, because `_agentId` isn't among the fields a PATCH can change: read the connection, change `_agentId` (and the host in its own block, if the new agent's host reaches the system by another name), and send it back with every secret left as the `******` mask you read ([configuring-connections > Credential Discipline & Runtime Behavior](../configuring-connections/SKILL.md#credential-discipline--runtime-behavior)). ## CLI Commands ```bash # CRUD celigo on-premise-agents list celigo on-premise-agents get celigo on-premise-agents create < agent.json celigo on-premise-agents update < agent.json celigo on-premise-agents set name="" # GET + PUT; name and description are the only writable fields celigo on-premise-agents delete [-y] celigo on-premise-agents dependencies # connections that use it -- empty means safe to delete celigo on-premise-agents audit # change history # Token and installer celigo on-premise-agents token # prints the access token (never on get/create) -- keep it out of chat celigo on-premise-agents rotate-token [-y] # asks first (-y skips), full mode; prints a new token, the old one stops working immediately celigo on-premise-agents installer-url --os ``` Note: only `name` and `description` are writable. Installing the software and applying a token happen on the host. `celigo account search` doesn't index agents; use `list`. ## Pre-Submit Checklist Before creating or wiring up an on-premise agent, verify: - [ ] The target is genuinely private -- a public SaaS API or public cloud database needs no agent - [ ] `name` identifies the network location it serves (e.g. "On-Prem DC1"), not a single flow or operation - [ ] The access token (`celigo on-premise-agents token `) was applied to the installed software - [ ] `celigo on-premise-agents get ` shows `offline: false` with a recent `lastHeartbeatAt` before relying on it - [ ] The agent is registered in the same environment as the connections that will use it (Gotcha 9) - [ ] For Oracle: the agent is installed and paired **before** the connection is created - [ ] Dependent connections set `_agentId` to this agent's `_id` (see [Connections That Route Through an Agent](#connections-that-route-through-an-agent)) ## Gotchas 1. **"Agent" is overloaded.** An on-premise agent (`/agents`, connectivity) is not a stack (compute) and not an AI agent (`/aiagents`, LLM processing). Confirm which one is meant before acting. 2. **The tunnel is outbound-only.** The agent dials out to integrator.io, so no inbound firewall port opens for it -- not the database's port either. A network that restricts outbound traffic must let the agent host connect out over HTTPS (443) and SSH (22) to Celigo's published addresses for its region: the integrator.io addresses for HTTPS and the agent-extension server addresses for SSH, listed in Celigo's on-premise agent documentation. 3. **The resource is not the software.** Creating the `/agents` resource only registers it and mints a token -- which the create response doesn't include (`celigo on-premise-agents token ` reads it). Nothing connects until you install the software on a host and pair it with that token. 4. **Agent offline breaks dependent flows -- fix the agent, not the flow.** When a flow to a private system fails (`agent_not_running`) and credentials look fine, check whether the agent is `offline` (host down, service stopped, network blip). Bringing the agent back online recovers every connection routed through it; rotating its token or recreating the connections doesn't. 5. **Rotating the token forces a re-pair.** `rotate-token` invalidates the old token immediately; the installed agent must be reconfigured with the new one and reconnects only after re-pairing. Rotate during a quiet window. 6. **The access token is a credential.** It authorizes a tunnel into your network. Do not commit or share it; rotate it if it may have been exposed. 7. **Oracle is agent-mode only.** Oracle `rdbms` connections always require a real `_agentId` -- you cannot create even a placeholder Oracle connection without an installed agent first. 8. **One agent can serve many connections.** Add more agents for network segmentation, or so one host's failure takes out fewer connections -- not for throughput. A second agent doesn't take over the first one's connections; each connection names one agent. 9. **Agents belong to one environment.** A connection in a sandbox or other environment needs an agent registered there, installed and paired with that agent's own token. Each environment's agents count against that environment's agent entitlement (`celigo subscriptions entitlement-usage` reports `agentUsage`). `celigo promote` never copies an agent: it binds each one to the target's single agent of the same name, or the one you pin with `--map`, and otherwise refuses unless `--create-connections` registers a new agent there, which still has to be installed and paired. 10. **Update an agent in place.** If `version` stays behind on an agent that should update itself (4.6.0 or later, running as a service), reinstall on the same host with this agent's installer and token (`celigo on-premise-agents installer-url `, then `token ` on the host). Creating a new agent instead leaves every connection on the old one. 11. **A delete is refused while connections use the agent, and doesn't touch the host.** Deleting fails with 422 while any connection's `_agentId` names the agent: repoint or remove those connections first (`celigo on-premise-agents dependencies ` lists them). The API answers an unknown id's dependencies with the same empty `{}`; the CLI reads the agent too, so a wrong id fails with 404 there. A deleted agent stays in the recycle bin for 30 days, and its software stays installed on the host: stop and uninstall it there. ## Common Errors | Error | Cause | Fix | |---|---|---| | Agent shows `offline: true` | Heartbeats stopped -- host down, service stopped, or network interruption | Restart the agent software on the host; confirm outbound connectivity to integrator.io, then re-check `lastHeartbeatAt` | | Flows to a private system suddenly fail; credentials fine | The shared agent is offline | Check `celigo on-premise-agents get `; bring the agent back online rather than editing each connection | | `agent_not_running` -- "Unable to connect to Agent with id: , make sure you installed it properly and it is running." -- on a connection test or a flow's errors; the agent's connections go `offline: true` | The agent isn't connected: its host or service stopped, or a firewall or proxy blocks its outbound connection. The agent shows `offline: true`, and `lastHeartbeatAt` says when it stopped | Restart the agent on its host and check its outbound access (Gotcha 2); every connection through it recovers once it reconnects. Don't rotate the agent's token -- that also cuts off the agent until it's re-paired -- and don't recreate the connections, which would route through the same agent | | `422` "Expected field: password to be present." creating a SQL Server connection through an agent | The agent doesn't replace the database credentials | Send a placeholder password and have the user enter the real one in the Celigo UI | | Installed agent will not connect after rotation | Old, invalidated token still configured on the host | Reconfigure the agent with the new token (`celigo on-premise-agents token `) and let it re-pair | | `422` creating an Oracle / JDBC / filesystem connection -- `_agentId` missing (Oracle: `agent_mode_only`) | The connection type requires an agent but none is referenced | Install and pair an agent, then set `_agentId` on the connection | | `422` deleting an agent | Connections still reference it through `_agentId` | List them with `celigo on-premise-agents dependencies `, repoint or remove them, then delete | | Connection routed through agent times out (`ETIMEDOUT`) | Agent host cannot reach the target system on the private network | Verify the host can reach the target's host/port; check internal firewall/routing between the agent host and the system | | `404` on agent get/update | Wrong agent ID or the agent was deleted | Verify the ID with `celigo on-premise-agents list` |