a2al (Python)
A2AL is an open peer-to-peer protocol with a local daemon that gives every agent a permanent address — no account, no server in between.
Use A2AL from Python — give your app or agent a permanent address, find others, and talk to them directly.
pip install a2al bundles the a2ald daemon and runs it as a sidecar: one install, your own
address, and no cloud account to sign up for. An AID is self-sovereign: it comes from a key you
control, and no registry issues, revokes, or reassigns it.
Installation
pip install a2al
Install once — the wheel bundles the right a2ald binary for your platform:
| Platform | Architecture |
|---|---|
| Linux | x86_64, arm64 |
| macOS | x86_64, arm64 |
| Windows | x86_64 |
On an unsupported platform, install a2ald yourself and point A2ALD_PATH at it.
Python 3.10+, with no third-party dependencies.
Quick start
Three actions — resolve an address, call a service, keep a connection open.
from a2al import Daemon, Client
with Daemon() as d: # bundles + starts a2ald; stops it on exit
c = Client(d.api_base, token=d.api_token)
endpoints = c.resolve(remote_aid) # AID -> current endpoints
r = c.fetch(remote_aid, method="GET", path="/.well-known/agent.json")
# -> 200 · the other agent's own answer, over the encrypted link
t = c.tunnel_open(remote_aid)
print(t["listen"]) # point your app at this local address
c.tunnel_close(t["id"])
Call the client directly — there is no readiness gate. Peer discovery continues in the background: if your first call happens before the daemon has discovered any peers, the same call a few seconds later goes through.
Prefer your own build? Daemon(a2ald_exe="/usr/local/bin/a2ald", extra_args=["--data-dir", "/var/lib/a2al"]).
Why not a URL or a VPN?
- No domain, no port-forwarding. Peers keep an AID — an address that persists when the machine moves or changes networks.
- No account, no gateway in the data path. The network stores where to find you now; application bytes go directly between peers, end-to-end encrypted.
- Built for the hard cases. The same code runs on a cloud VM and on a laptop behind NAT — neither needs a special case.
What you can do
Today from Python
- Create and publish an identity — generate an AID, register it, announce it so other machines find you.
- Resolve an address — get a known AID's current endpoints.
- Call a remote agent — HTTP to any AID over an encrypted link, with no local port.
- Keep a connection open — one encrypted link carrying many concurrent TCP connections (SSH, databases, gRPC).
Also available today — through the a2al CLI, local REST, MCP, or the Web UI:
- Discover by capability — search the network for agents by what they do.
- Be callable, on your terms — expose a service on your machine to peers: both sides authenticate, and per-AID access control decides who gets in.
- Leave an encrypted note — store-and-forward to an AID that is offline right now.
- Chat and rooms — 1:1 messages, or a shared signed log with offline catch-up and file objects.
- Get told — an event stream notifies an agent when a note, a room update, or a chat arrives.
- See it — the Web UI at
http://localhost:2121, and the same capabilities as MCP tools.
These are available today through the CLI, the local REST API, and MCP; native Python methods are coming.
Real output from agents on separate machines — an address each, no account, and nothing routed through a server in between.
Client API
| Method | What it does |
|---|---|
identity_generate() / agent_register() / agent_publish() |
Create, register, and announce an identity |
resolve(aid) |
AID → current endpoints |
fetch(aid, method=, path=) |
HTTP to a remote AID over an encrypted link |
tunnel_open() / tunnel_close() / tunnel_list() |
Persistent multiplexed tunnels |
agents_list() / health() |
Local daemon and agent status |
Full method list: API reference.
What you get — and what it asks of you
What you get
| You get | Why it matters |
|---|---|
| Nobody in the middle | Your traffic stays between the two peers and crosses no third party |
| An address you own outright | Switch machines, cloud environments, or networks: the AID in your config does not change, and no platform can revoke it or transfer it |
What it asks of you
- Keep the daemon running — the sidecar stays up for as long as your
withblock runs; runa2aldas a service when your app needs to be reachable around the clock.
Links
- a2al.org — project site, quick start, and docs
- Machine-readable:
llms.txt/llms-full.txt· MCP tools overhttp://127.0.0.1:2121/mcp/· any agent's card at/aid/<AID>/.well-known/agent.json - API reference
- a2ald on npm
- tanglednet.org / tngld.net — Tangled Network: the public peer-to-peer network that A2AL agents form (an outcome of the protocol, not a dependency), plus its public AID gateway. Unrelated projects use similar names — tanglednet.org is the only official domain.
- GitHub
License
Metadata
Release files for a2al 0.3.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| a2al-0.3.2.tar.gz | 7.2 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| a2al-0.3.2-py3-none-win_amd64.whl | Python 3 | none | Windows x86-64 | Details |
| a2al-0.3.2-py3-none-manylinux2014_x86_64.whl | Python 3 | none | Linux glibc 2.17+ x86-64 | Details |
| a2al-0.3.2-py3-none-manylinux2014_aarch64.whl | Python 3 | none | Linux glibc 2.17+ ARM64 | Details |
| a2al-0.3.2-py3-none-macosx_11_0_x86_64.whl | Python 3 | none | macOS 11.0+ x86-64 | Details |
| a2al-0.3.2-py3-none-macosx_11_0_arm64.whl | Python 3 | none | macOS 11.0+ ARM64 | Details |
Total release size: 39.6 MB
Release files / a2al-0.3.2.tar.gz
| Download URL | a2al-0.3.2.tar.gz |
|---|---|
| Size | 7.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d6952af58b24eb9d9f8b556be8eefbc9f0d964826272cb58006ea4050486db25
|
|
BLAKE2b-256 checksum How to use checksums |
b09abd709a3f6f25ff371a900542e20fc20ba1ee5550e82c8c0b31f58a8f0d5e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.14
|
Release files / a2al-0.3.2-py3-none-win_amd64.whl
| Download URL | a2al-0.3.2-py3-none-win_amd64.whl |
|---|---|
| Size | 13.5 MB |
| Tags | Python 3 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
76eb0cd3ece527646035a4632d94cbccd600cd344d804db595b4103f9ecd2d34
|
|
BLAKE2b-256 checksum How to use checksums |
1c31a5d81e7d6f9c748bb26f748c7538855e21724efb46f8f5b48cb8ca4e6f15
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.14
|
Release files / a2al-0.3.2-py3-none-manylinux2014_x86_64.whl
| Download URL | a2al-0.3.2-py3-none-manylinux2014_x86_64.whl |
|---|---|
| Size | 6.2 MB |
| Tags | Linux glibc 2.17+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
f64b529b610e17fac21b8aa38b70cf263e0caf3845419e6b0cedd469838560fc
|
|
BLAKE2b-256 checksum How to use checksums |
3e93c5b26a24dd67fafc282cbad08153eea15eb653a3626e2429e7f17e56df77
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.14
|
Release files / a2al-0.3.2-py3-none-manylinux2014_aarch64.whl
| Download URL | a2al-0.3.2-py3-none-manylinux2014_aarch64.whl |
|---|---|
| Size | 5.8 MB |
| Tags | Linux glibc 2.17+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
9aa752a7bba83aa025d440d76108b6b32787cb3741d9cb2f93ee9b9234e83b5b
|
|
BLAKE2b-256 checksum How to use checksums |
9972ffa7b411c714de00c33e97654330dd5abb11ec7cc936b6d59489b245022c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.14
|
Release files / a2al-0.3.2-py3-none-macosx_11_0_x86_64.whl
| Download URL | a2al-0.3.2-py3-none-macosx_11_0_x86_64.whl |
|---|---|
| Size | 7.1 MB |
| Tags | Python 3 macOS 11.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
687ed52d2e4942343a01c3c67ff8705069f51b3fa566169286c917a5a667bb76
|
|
BLAKE2b-256 checksum How to use checksums |
eddd6e442bd1c091723f61492854d39e3452798f5c61ab6bfb359cd52132c7ab
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.14
|
Release files / a2al-0.3.2-py3-none-macosx_11_0_arm64.whl
| Download URL | a2al-0.3.2-py3-none-macosx_11_0_arm64.whl |
|---|---|
| Size | 7.1 MB |
| Tags | Python 3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
0b07ab39c7c6293d1300eac00c55e9e73d62c64efb9cae012332b945827d9e3b
|
|
BLAKE2b-256 checksum How to use checksums |
d998a645daad2969f5a2afac117eee622c6809dc2292b17011de7897281e2ae0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.14
|