managing-on-premise-agents — Claude Code skill: setup
Guides configuration and maintenance for Celigo on-premise agents. It connects integrator.io to internal databases and local files using outbound tunnels without opening firewall ports.
npx skills add celigo/ai --skill managing-on-premise-agents -a claude-codeWhat managing-on-premise-agents does
The Celigo on-premise agent runs as a background service on a local Windows or Linux host. It opens an outbound connection to integrator.io, giving cloud integrations access to private databases, file shares, and internal APIs without inbound firewall rules. This skill distinguishes connectivity agents (/agents) from compute stacks and AI agents. It keeps integration roles separate.
Management runs through the CLI or the /v1/agents REST API, while connections bind to the daemon via _agentId. Standard GET responses do not return the pairing access token, so fetching it requires the display-token endpoint. Oracle connections require an agent permanently. Any stopped service halts dependent flows with an agent_not_running status.
What it helps with
- connect private databases or network file shares to
integrator.io - attach an on-premise daemon to connections using
_agentId - rotate agent access tokens through the CLI or API
- diagnose integration failures triggered by
agent_not_runningerrors
Example prompts for the agent
- How do I route a private PostgreSQL connection through a Celigo on-premise agent?
- Explain how to rotate the access token for an agent using the Celigo CLI.
- Troubleshoot flow failures caused by an offline agent status.
How to install managing-on-premise-agents
1Skills CLI (Vercel)
npx skills add celigo/ai --skill managing-on-premise-agents -a claude-code2Manually: put the files in place
~/.claude/skills/managing-on-premise-agents/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/managing-on-premise-agents/
1Skills CLI (Vercel)
npx skills add celigo/ai --skill managing-on-premise-agents -a codex2Manually: put the files in place
.agents/skills/managing-on-premise-agents/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add celigo/ai --skill managing-on-premise-agents -a cursor2Manually: put the files in place
.cursor/skills/managing-on-premise-agents/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install celigo/ai managing-on-premise-agents2Manually: put the files in place
.github/skills/managing-on-premise-agents/SKILL.md1Skills CLI (Vercel)
npx skills add celigo/ai --skill managing-on-premise-agents -a gemini-cli2Platform CLI
gemini skills install https://github.com/celigo/ai --path skills/managing-on-premise-agentsManually: put the files in place
.devin/skills/managing-on-premise-agents/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add celigo/ai --skill managing-on-premise-agents -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about managing-on-premise-agents
How do I install managing-on-premise-agents in Claude Code?
Run npx skills add celigo/ai --skill managing-on-premise-agents -a claude-code.
How does an on-premise agent differ from an AI agent in Celigo?
An on-premise agent creates a network tunnel to reach private infrastructure, whereas an AI agent processes and transforms data records using LLMs.
Which Celigo connections strictly require an on-premise agent?
Local filesystem connections and Oracle database integrations always require an agent to route traffic through your network.
Source text
SKILL.md · MIT
---
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.
---
<!-- TIER:1 -->
# 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 <id>` (`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
<!-- TIER:2 -->
## 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 <id> --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 <id> # 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 <id>
```
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 <id> # 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 <id>
celigo on-premise-agents create < agent.json
celigo on-premise-agents update <id> < agent.json
celigo on-premise-agents set <id> name="<name>" # GET + PUT; name and description are the only writable fields
celigo on-premise-agents delete <id> [-y]
celigo on-premise-agents dependencies <id> # connections that use it -- empty means safe to delete
celigo on-premise-agents audit <id> # change history
# Token and installer
celigo on-premise-agents token <id> # prints the access token (never on get/create) -- keep it out of chat
celigo on-premise-agents rotate-token <id> [-y] # asks first (-y skips), full mode; prints a new token, the old one stops working immediately
celigo on-premise-agents installer-url <id> --os <linux|windows>
```
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`.
<!-- TIER:3 -->
## 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 <id>`) was applied to the installed software
- [ ] `celigo on-premise-agents get <id>` 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 <id>` 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 <id>`, then `token <id>` 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 <id>` 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 <id>`; bring the agent back online rather than editing each connection |
| `agent_not_running` -- "Unable to connect to Agent with id: <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 <id>`) 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 <id>`, 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` |
© celigo · MIT · celigo/ai