Self-hosted tool gateway for internal systems

One agent.A hundred machines.Full access to none.

bastn turns the CLIs, scripts and services on your VMs, containers and sandboxes into typed tools, with a different menu for each agent. No MCP server to write. Each machine runs one small outbound program, the bastn connector, and it can only run what you approved: no SSH keys, no open ports, no shell by default.

Early access for platform and SRE teams. Runs in your network.

bastnweb-41web-42web-43triage-agentremediation-agentsvc_restartneeds approvaloutbound only

The problem

Your ops agent is ready. Your hosts aren't open to it.

The agent can triage an alert. To finish the job it has to read logs, check a route or restart a service on real machines. Today that means one of three things, and none of them gets past a security review:

  1. 01

    SSH keys or a brokered session.

    However well it is brokered, the agent ends up with a shell, limited by the Unix account it logs in as.

  2. 02

    An MCP server for every internal tool.

    Someone writes, hosts and maintains a server per CLI, per script, per team. The long tail of internal tools never gets one.

  3. 03

    Shared credentials and job runners.

    Every agent uses the same key or the same job account, so nobody can say which agent ran what, or stop just one.

bastn gives the agent a menu instead of a shell. Each agent sees the actions it may take, on the machines it may touch, with the values it may use.

How it works

From a CLI on a host to a tool in an agent's menu.

  1. web-42inbound: noneconnectoroutbound mTLSto your bastn gateway

    01

    Put the connector on each host.

    One small binary per VM, container or sandbox. It dials out to your bastn gateway over mutual TLS, so the host needs no inbound port and no VPN. Give it labels like web, db or prod when it enrols.

    BASTN_CONNECTOR_TOKEN='wpj_…' bastn-connector enroll --hub bastn.acme.internal:18093 --name web-42
  2. deployctlstatusreadlogsreadrestartneeds approvalrollbackwriteshellnot offered

    02

    Turn your CLIs and scripts into typed actions.

    Describe a tool once: which subcommands become actions, which arguments each takes and which values are allowed. Paste the tool's --help into your own AI assistant with our authoring guide, review the result and approve it. Read-only Linux diagnostics ship ready to use.

  3. web-42triageremediationstatuslogsstatuslogsrestart

    03

    Give each agent its own menu.

    Each agent gets its own key and its own policy: which actions, on which labels, with which argument values, how often, and what waits for you.

  4. agentidentitypolicyargsapprovalauditweb-42

    04

    bastn checks every call.

    The gateway checks identity, policy, arguments, rate limits and approvals. The connector checks its own local limits, then runs the command as plain arguments. The call goes into the audit trail.

What changes

What your team gets.

webwebwebagent… 100 hosts

Agents work across your fleet without SSH access.

Label machines once (web, db, qa, prod) and actions reach every machine with that label, including new ones as soon as their connector enrols. One agent can diagnose 100 hosts and hold full access to none of them.

Fleet without SSH

cliscriptopenapimcpbastndeployctl.statusrunbook.rotatebilling.invoicesearch.query

Any CLI or script becomes a tool, without an MCP server.

Describe your CLI once and bastn serves it as typed MCP tools with validated arguments. The internal tools that will never get an MCP server (your deployctl, your runbook scripts) become agent tools. Services with an OpenAPI spec and existing MCP servers plug in the same way.

CLIs and scripts

web-43web-42web-41triage-agentsystemctl_statusjournalctl_unitweb-43web-42web-41remediation-agent+ svc_restartneeds approvalbastn

Each agent gets its own tools on the same CLI.

A triage agent gets status and logs. A remediation agent also gets restart, on web only, with approval. Rules go down to individual argument values: which units, which paths, which hosts. Every agent gets its own key. One switch disables an agent and its keys. Set rate limits per agent or caller.

web-42restartheldyou

Destructive actions wait for you.

Destructive actions are held for approval by default. New tools can be denied until you review them (new_tools: deny). You see the exact action, host and arguments, approve or deny, and the agent carries on. Approval requests can also go to a webhook per organisation, so they reach any channel, Slack included through a webhook bridge. When no action fits, the agent can write a script: it runs after you review it, and the connector re-checks the approved hash before every run.

agentproposalpropose_toolyoureviewdraftnothing applies automatically

Agents ask for the tools they are missing.

When an agent needs a tool, a flag or access it does not have, it asks with propose_tool and checks the answer with proposal_status. Your admins review each request under Approvals › Proposals in the dashboard. Nothing is applied automatically: an accepted proposal becomes a draft that goes through its own review.

seq 1seq 2seq 3seq 4seq 5seq 6your keychain intact

An audit trail you can check yourself.

Every decision (allowed, held, refused, approved) is written to a keyed, hash-chained log: which agent, which action, which machine, which arguments. Export it as JSONL and verify it offline with your key. An edited or missing row breaks the chain.

bastnoutbound only · no open ports

The gateway runs in your network.

The gateway is one Go binary and Postgres, inside your network. Connectors dial the gateway. Nothing leaves your network unless you send it.

Check it yourself

See the run. Read the specs. Verify the record.

The specs the connector enforces, the limits a host owner sets, and a captured run with its verdicts and audit check are all on the security page.

  • Captured, not mocked

    A real policy, its deny and hold verdicts, and bastn audit verify, all captured from a bastn run.

  • Shipped controls only

    The security page lists what is enforced today, and nothing else.

  • Self-hosted, no inbound ports

    bastn runs on your infrastructure, and each host's connector dials out to it.

  • One MCP endpoint

    Agents connect to /mcp with a virtual key or an OAuth sign-in.

Pricing

Priced per connected host.

Agents are not charged. Start free on up to 10 hosts.

Community

Free

No charge

  • HostsUp to 10 connected hosts
  • AgentsUp to 3 agents
  • SupportCommunity support by email
  • Commercial use is allowed.
Request access

Team

$8 per connected host per month, billed annually

$10 per connected host per month, billed monthly. Early access pricing.

  • SupportEmail support, next business day
Request access

Enterprise

Contact us

  • SupportP1 response within 4 business hours. Support is not 24/7.
  • Invoiced through Paddle by default. A direct dflux Ltd contract is available on request.
Talk to us

Every plan includes typed tools from your CLIs and scripts, per-agent menus, approvals, rate limits you set, a switch that disables an agent and its keys, and an audit log you can verify offline.

FAQ

Questions

All questions

Is bastn an MCP gateway?
Why not just SSH or Teleport plus an MCP server?
Do I have to install something on every host?
Which agents work with bastn?
Who is it not for?

Early access

Put one agent on your fleet, without handing it a shell.

Early access is open to a small number of platform and SRE teams. Tell us about your hosts and the agent you want to run.

Request access

  1. 01We read every request ourselves.
  2. 02A 30-minute call about your fleet and your agent.
  3. 03bastn running in your network, for one agent and one set of hosts.
No newsletter. We only write about access.