Agent-native SSH
An MCP server for SSH.
Termalin is a normal SSH/terminal client — with a built-in MCP server. Add it to claude.ai or ChatGPT as a connector, or point Claude Code or any agent that speaks the Model Context Protocol at your hosts — it runs commands and reads or writes files over SSH and SFTP. Your keys never leave the key agent, and every move is mirrored live, recorded and written to an audit log.
The hosted server is listed in the official MCP Registry as in.termal/termalin-web.
What it does
MCP is the open standard for connecting AI agents to tools. Most MCP servers wrap an API; Termalin's wraps your servers — so an agent can actually operate infrastructure: tail a log, restart a service, check disk, edit a config, deploy. It authenticates through Termalin's SSH key agent, so no private key is ever handed to the agent or the model.
The tools
The hosted endpoint exposes 23 tools; the local termalin-mcp server exposes 22 — the shared core below, plus session, tunnel and live-terminal tools; the rows marked hosted exist only there. The full list with arguments lives in the MCP tools reference. The core set:
| Tool | What it does |
|---|---|
hosts_list | List the hosts the agent may reach. |
ssh_exec | Run a one-off command on a host and return its output + exit code. |
ssh_exec_many | Run the same command on several hosts at once — hosted endpoint. |
job_start / status / stop / list | Start a long build or migration in the background, come back for its log and exit code, stop it — hosted endpoint. Jobs survive the agent's turn and the connection. |
server_metrics | Latest CPU, memory, disk, load and network numbers for every server, or one server's detail with averages and peaks over the last hours; read from Termalin's monitoring, nothing is run on the server — hosted endpoint only. |
alerts_list | What monitoring says is wrong right now (disk filling, memory or load pinned, a failed service, an expiring certificate, a server offline) and what cleared in the last seven days — hosted endpoint only. |
backup_create | Take an encrypted backup of a server before a risky change, with a note saying why — hosted endpoint; the server needs a backup job set up in the cabinet. |
backup_list | The backup jobs and recent archives of a server: when they ran, whether they worked, how big they are — hosted endpoint. |
backup_job_create | Draft a backup job — files and/or databases, schedule, how many to keep, where — for you to confirm in the cabinet with one click (the key is made in your browser); it runs only after you confirm — hosted endpoint; full access. |
web_link_create / list / update / delete | Put a dashboard or admin panel that only the server's network reaches (localhost:3000, 10.0.0.5:8080) into your cabinet as an internal site, list them, rename one or point it at the app's new address, remove one — hosted endpoint. One site opens every page of an app. Only you open it, signed in; sharing stays with you in the cabinet. |
sftp_list | List a directory over SFTP. |
sftp_read | Read a text file over SFTP (capped, text-only) — hosted endpoint; the local server uses sftp_get. |
sftp_write | Write a text file over SFTP — hosted endpoint; the local server uses sftp_put. |
generate_password | Generate a strong password on demand — length and character sets under your control. |
data_query | Query a database on a host — passwordless: runs the engine's own client over the keyless tunnel using local trust (Postgres peer auth, MySQL socket auth, redis-cli, mongosh, sqlite3). Read-only by default. |
data_tables | List the tables / collections / keys of a database on a host — same passwordless path. |
data_schema | Describe one table's columns. |
The local server adds these on top:
| Tool | What it does |
|---|---|
session_open / exec / close / list | Open a persistent SSH session, run commands in it, and manage it. |
sftp_get / sftp_put | Download and upload files. |
tunnel_open / close / list | Open port forwards on a host — reach a service behind it, expose a local one, or route through it — and manage them. |
terminal_open / run / run_many / sessions / hosts | Drive the running desktop app: open live terminal tabs, or step into a session you already have open and run alongside you (consent-gated). |
data_list / tables / schema / query | Explore and query your saved databases — list databases, tables and columns, and run a read-only query. Off by default, per-connection, consent-gated. |
On a Windows server reached through a Connector, ssh_exec and the background-job tools run in PowerShell; the data tools need a Unix shell, so they're Linux (and macOS) only.
Three ways to connect
1 · claude.ai / ChatGPT — in the chat you already use
No install, no key to paste. Add Termalin as a connector and manage your servers by talking:
- claude.ai: open the Termalin connector listing → Connect (or Settings → Connectors → Add custom connector →
https://termal.in/mcp) - ChatGPT: add Termalin from the app directory (search for Termalin under Apps), or Settings → Connectors → same URL
- Claude Code:
claude mcp add --transport http termalin https://termal.in/mcp, then run/mcpand sign in. Other clients that support remote MCP servers with sign-in (Codex, Cursor, VS Code) take the same URL.
The chat opens Termalin's sign-in page; you approve once and it can list your servers, run commands, read or write files and check monitoring and alerts — "check disk on prod", "tail the nginx log", "fix that config" straight from the conversation. Access is granted with OAuth — scoped to your own enrolled servers, audited, and revocable any time. Each connected app gets its own command policy — full access, an allowlist of commands, or read-only — set in the AI apps card of your account.
Full walkthroughs: the ChatGPT connector and the claude.ai connector.
Prefer a button over copy-paste? The Termalin Chrome extension adds a Run on server button to code blocks on ChatGPT, Claude and sites like GitHub and Stack Overflow, with a side panel for your servers, metrics and alerts — signed in with your Termalin account.
Prerequisites first-time users miss: the hosted server needs an account on Pro or the 14-day trial; the chat reaches enrolled servers only — sign in at termal.in/account, click Add Connector, copy the one-line install command and run it on the server (a host that only exists in the desktop app stays out of reach). And in the conversation itself, enable Termalin via the composer's tools menu — adding the connector in settings isn't always enough.
2 · Local server (runs on your machine)
Point your agent's MCP client at the bundled termalin-mcp binary. With Claude Code:
claude mcp add termalin -- <path>/termalin-mcp
Or in an MCP client config:
{
"mcpServers": {
"termalin": { "command": "<path>/termalin-mcp" }
}
} It reaches the hosts you choose in Settings → MCP (written with agent-only auth — no passwords on disk). Each host also carries its own agent access level — full, an allowlist of commands, or blocked — set on the host itself.
3 · Hosted endpoint with an API key (CI, scripts, other agents)
Create an API key in the web cabinet and point any agent at the HTTP MCP endpoint:
{
"mcpServers": {
"termalin": {
"url": "https://termal.in/mcp",
"headers": { "Authorization": "Bearer tk_live_…" }
}
}
} It runs commands and moves files on your tunnelled servers — the ones running the one-line install agent — even when nothing is open on your machine. It authenticates with a short-lived certificate, so no key is handed out. Keys can be scoped to specific servers, set to a command policy — full access, an allowlist of commands, or read-only — given an expiry (30 / 90 / 365 days) and revoked any time.
Setup guides
Step-by-step for each client:
- Claude Code — one
claude mcp addline. - ChatGPT and claude.ai — the OAuth chat connector.
- Cursor — one entry in
mcp.json. - Codex — one entry in
config.toml. - Gemini CLI — Google's CLI over SSH.
Staying in control
- Agent access is off by default; letting an agent type into your live sessions is a separate toggle again.
- Access is granular: per host on the desktop (full / allowlist / blocked), and per API key and per connected AI app on the hosted endpoint (full / allowlist / read-only) — so an agent can be read-only on one server and run only
giton another. - The agent never holds a key — it authenticates through Termalin's SSH key agent or a short-lived cert.
- Every agent command is marked in the session recording, visible live in the watch grid, and written to the audit log.
- Hosted runs are rate-limited and time-boxed per API key.
FAQ
How do I connect my servers to claude.ai or ChatGPT?
In claude.ai: open Termalin's connectors-directory listing and click Connect (or add it by URL under Settings → Connectors → Add custom connector → https://termal.in/mcp). Termalin's sign-in page opens; approve, and Claude can list your servers, run commands and manage files right in the chat. In ChatGPT, add Termalin from the app directory (search for Termalin under Apps), or add the same URL under Settings → Connectors. No API key to paste — access is granted with OAuth, scoped to your own enrolled servers, and revocable any time.
What is an MCP server for SSH?
An MCP server for SSH exposes SSH and SFTP as tools an AI agent can call through the Model Context Protocol, so the agent can run commands and read or write files on your servers. They come in two shapes: standalone servers (e.g. ssh-mcp, mcp-ssh) that hold a key where they run, and SSH clients with one built in (Conduit, XPipe, Termalin). Termalin ships one built into the SSH client: you choose which hosts the agent may reach, and Termalin does the authenticating, so the agent never handles a private key.
How do I give an AI agent access to my servers over SSH?
Two ways. Hosted: enroll your servers with a Connector, then add https://termal.in/mcp to your agent and sign in once — with Claude Code that's claude mcp add --transport http termalin https://termal.in/mcp, then /mcp to sign in; scripts and CI use https://termal.in/api/v1/mcp with an API key. No desktop app has to run. Local: install Termalin, enable the hosts you want in Settings → MCP, then register the bundled server with claude mcp add termalin -- <path>/termalin-mcp. Either way, any MCP-capable agent — Claude Code, Cursor, Codex, or your own — can then list those hosts and work them over SSH and SFTP.
Can an AI agent use SSH without seeing my private key?
Yes. Termalin acts as a key custodian: you unlock your keys once and it signs on the agent's behalf, so no private key is ever handed to the agent or passed to the model. The hosted endpoint goes further, authenticating each run with a short-lived SSH certificate rather than a key.
Which SSH clients have a built-in MCP server?
As of October 2026: Conduit (SSH, RDP, VNC and web, around 60 local tools, Apache-2.0, local socket only); XPipe (a local HTTP MCP server, off by default, read-only until you enable changes); VibeShell (around 28 tools, MIT, local); and Termalin (22 local tools plus a 23-tool hosted endpoint at https://termal.in/mcp with OAuth sign-in for claude.ai, ChatGPT, Claude Code, Codex and Cursor — servers reached keylessly through a Connector, with per-connection command rules, an audit log, on Windows, macOS, Linux, iOS and the browser). Conduit fits if you want one open-source app across SSH/RDP/VNC; XPipe if you live in Docker and VMs; Termalin if the agent must also work from CI or a chat with no desktop running. See the full landscape comparison.
Does the MCP server work without the desktop app running?
Both modes exist. The local server runs alongside the desktop app for the hosts you export from it. The hosted server — https://termal.in/mcp with a one-time sign-in, or https://termal.in/api/v1/mcp with an API key — needs no desktop at all — it reaches servers enrolled with the keyless Termalin Connector, authenticating with short-lived certificates, so agents in CI or cloud sandboxes work too. It's listed in the official MCP Registry as in.termal/termalin-web.