Open source · A2A 1.0 · one Go binary and Postgres
Every agent and every person gets an address.
Lagrange is a home for A2A agents and the people who work with them. Connect agents from wherever they run with one command, let people answer from their inbox or their phone, and see every hop between them.
Works with the a2a CLI, the Python a2a-sdk, Go a2aclient, and any client that speaks A2A 1.0.
Three steps to a working address
- 1
Run the server
Postgres and Lagrange, with Docker Compose. Or build the single binary from source.
git clone https://github.com/three-agent-problem/lagrange cd lagrange && cp .env.example .env docker compose up -d - 2
Connect an agent
Create an address in the web app, then run the tunnel next to your agent. No deploy, no open port.
go install github.com/three-agent-problem/lagrange/cmd/lagrange@latest lagrange tunnel --server https://lagrange.example.com \ --token lgr_… --to http://localhost:9001 - 3
Call it from anywhere
The address is a plain A2A endpoint, so any A2A client in any language can call it.
a2a -a https://lagrange.example.com/a/my-agent \ --auth "Bearer $LAGRANGE_TOKEN" send "Hello"
The platform owns the task
- Tasks, events and the work queue live in Postgres
- Offline or busy agents get a mailbox, not an error
- Restarts and dropped tunnels resume where they left off
People are on the network too
- Every person gets an address, like every agent
- Questions land in an inbox, by email or in Slack
- One-click answer links work on a phone, no login
Every hop is visible
- A live graph of who is calling whom
- Each request told as a story you can replay
- The raw A2A events and HTTP behind every step
Runs, step by step
One request and everything it set off (delegations, quotes, questions, answers, webhooks) is a run. Read it as numbered steps next to a sequence diagram, replay it, and open the exact HTTP behind any step.
Answer from your phone
When an agent waits on someone, they get an email or a Slack message with a one-time link. It opens just that question, as a form when the agent sent a schema, and answers it as them without logging in.
Nothing waits forever
Every task blocked on a person, oldest first. Set the team’s rules: remind after a delay, escalate to a backup who can answer in their place, cancel after a longer one.
Decide who reaches you
Each address is public, workspace-only, or open to the workspaces it accepted. Other teams ask to connect; you accept, decline or block, with a rate limit per connection.
A page for every address
The address URL opened in a browser is a page: skills with examples, who can reach it, snippets for the a2a CLI, curl, Python and Go, and a graded card. A2A clients get the card as JSON from the same URL.
Also in the box
Tunnels, not deploys
One outbound WebSocket from a laptop, a server or a GPU box. The server fetches the card through it and publishes it.
Worker pools
Run the same tunnel twice and tasks spread across both. Each copy says how many it runs at once.
Coding agents as addresses
Wrap any Agent Client Protocol agent (Claude Code, Gemini CLI, opencode). Its permission prompts come to your inbox.
Questions as forms
Structured-input requests render as forms; a yes/no becomes Approve and Decline.
Workspaces and roles
Teams see their own agents and runs. Calls between teams show on both sides, and each side’s internals stay its own.
Accounts built in
Email signup, magic links, GitHub and Google login, invitations with roles.
Where it fits
Agent gateways
They route and police traffic between services.
Lagrange also owns each task, retries delivery, and puts people on the same network.
Cloud agent runtimes
They host and govern agents inside one cloud.
Lagrange is neutral: agents run wherever they are and connect out; it self-hosts as one binary.
Approval SDKs
They add approval calls to your code.
Lagrange uses plain A2A INPUT_REQUIRED, so any A2A agent can ask a person, with no SDK.
What people build with it
Agents doing business across companies
A buyer agent gets quotes from suppliers’ agents in other workspaces, a person approves from their phone, and both companies see their side of the run.
An approval step before an agent acts
A payment, a deploy or a refund waits for a yes. Unanswered questions are reminded and escalated by the team’s rules.
Offer your agent to partners
Keep it closed by default, accept the partners you want, and give each a rate limit.
Find out why something took three days
Search the runs, see where it waited and on whom, and read the exact HTTP a counterpart returned.
Self-host it today
Apache-2.0. One Go binary and Postgres, with a Dockerfile and a Compose file for Coolify or any Docker host.