Getting Started

Install tailbus, register your first agent, and make it reachable from anywhere — in under five minutes.

1

Install tailbus

Run the install script. It downloads two binaries — tailbusd (the daemon) and tailbus (the CLI) — and places them in ~/.local/bin.

$ curl -sSL https://tailbus.co/install | sh
Downloading tailbus v0.1.0 for darwin/arm64...
Installing to ~/.local/bin...
tailbus v0.1.0 installed!

Works on Linux (amd64, arm64) and macOS (Apple Silicon, Intel). No dependencies.

2

Start the daemon

Run tailbusd to start the daemon. It will prompt you to log in with Google. Once authenticated, your machine joins the mesh and can discover other nodes on your account.

$ tailbusd
Open https://coord.tailbus.co/oauth/verify
Enter code: ABCD-EFGH

Connected as you@company.com
MCP gateway listening on :1423
Agent socket at /tmp/tailbusd.sock

The daemon runs in the foreground. It opens a Unix socket for local agents and an MCP gateway on port 1423.

3

Install the Python SDK

The Python SDK talks to the local daemon over a Unix socket. No network config needed — if tailbusd is running, the SDK connects automatically.

$ pip install tailbus
4

Write your first agent

An agent is any process that registers a handle and listens for messages. Here's a minimal example — a finance agent that responds to budget queries.

finance.py
from tailbus import AsyncAgent, Manifest, CommandSpec

agent = AsyncAgent("finance",
  manifest=Manifest(
    description="Budget and spend queries",
    commands=[
      CommandSpec("budget", "Check remaining budget"),
    ],
  )
)

@agent.on_message
async def handle(msg):
  await agent.resolve(
    msg.session,
    "Q3 marketing budget: $48,200 remaining"
  )

await agent.run_forever()

What happens here

  • AsyncAgent("finance") — connects to the local daemon via Unix socket and registers the handle finance
  • Manifest — declares what this agent does. Commands become MCP tools that Claude and Cursor can call.
  • @agent.on_message — called whenever another agent (or an MCP client) opens a session to this handle
  • agent.resolve() — sends the response and closes the session
5

Run it

Start your agent. It registers with the daemon and is immediately discoverable by every other agent on your mesh.

$ python finance.py

Verify it's registered using the CLI:

$ tailbus list
finance Budget and spend queries
6

Talk to it from another agent

On the same machine — or any other machine on your mesh — write a second agent that opens a session to finance.

strategy.py
from tailbus import AsyncAgent

agent = AsyncAgent("strategy")

# Open a session to finance — wherever it is
response = await agent.open_session(
  "finance",
  "What's the Q3 marketing budget?"
)

print(response.payload)
# → "Q3 marketing budget: $48,200 remaining"

The daemon resolves the handle, opens a peer-to-peer gRPC connection (with mTLS), and delivers the message. If the agents are on different machines behind NATs, it handles traversal automatically.

7

Use it from Claude or Cursor

The daemon's MCP gateway exposes every registered handle as a tool. Add a single line to your MCP config:

mcp-config.json
{
  "mcpServers": {
    "tailbus": {
      "url": "http://localhost:1423/mcp"
    }
  }
}

Claude and Cursor now see your agents as tools. If your agent declared commands in its manifest, each command becomes a separate tool:

Available tools
finance.budgetCheck remaining budget
strategyno commands — generic send

Agents with commands get tools named handle.command. Agents without commands get a single tool named after their handle.

Next steps

  • Install on a second machine — run the same install script and login. Agents on both machines discover each other automatically.
  • Use @-mentions — agents can pull other agents into a session mid-conversation by mentioning their handle with @.
  • Multi-turn sessions — use agent.send() instead of agent.resolve() to keep a session open for multiple exchanges before resolving.
  • Read the full docs GitHub README covers Docker Compose setup, service manifests, tracing, and the full CLI reference.