axp
App Listed
An open protocol that gives AI agents a secure, sandboxed place to run code and use tools — with lean context usage. AXP works alongside MCP
- Downloads
- Not measured
- Dependents
- Not applicable
- Stars
- 3
- Forks
- 0
- Contributors
- 1
- Commits
- 72
About
A protocol for sandboxed agent execution with lean context use.
AXP gives AI agents a sandboxed place to run code and tools. On Linux, `kernel-lsm` jobs run under Landlock and seccomp-bpf.
Protocol · Sandbox · MCP · Example · Contributing
AXP (Agent Execution Protocol) gives each agent a session. The session binds a workspace, capability grants, and a streamed job log. The agent reads a compact tool index and loads a tool's schema only when it selects that tool. AXP works alongside MCP.
AXP is an early draft. The protocol and the runtime will change.
- What is here: a JSON-RPC over HTTP protocol, a runtime server (
axp serve), and a Rust client (axp-client). Agents run shell commands, WebAssembly components, and named capabilities as jobs. - Language: the runtime and client are Rust. Python is not needed. The sandbox calls the Linux kernel through Landlock and seccomp. Code mode runs WebAssembly through
wasmtime. - Built on:
tokio,axum,landlock,seccompiler, andwasmtime.
Read the full README
Not supported yet
- Sandbox tiers
containerandprocess-token. Job start fails. - Sandboxing on macOS and Windows. Only
dev-none, which enforces nothing, runs there. - Network filtering for
net.connectand a PTY forpty.open. - SDKs for TypeScript, Python, and Go.
- Persistent sessions. A server restart ends all sessions and jobs.
Protocol
An agent opens a session with session.open. The session holds a workspace, a sandbox tier, and capability grants.
Agent ──► session.open ──► Session
├─► Workspace (root directory for file access)
├─► Sandbox tier (enforced for each job)
├─► Capabilities (grants, checked per call)
├─► Discovery (axp.index, axp.describe)
├─► Jobs (command, code, capability)
└─► Audit (session.audit)
- Capabilities. A grant names one permission:
fs.read(<path>),fs.write(<path>),proc.spawn,tool:<name>,net.connect(<domain>), orpty.open. A job can request only the grants that its session holds. The Sandbox tiers section lists what each grant enforces. - Discovery.
axp.indexreturns each capability with a one-line description.axp.describereturns the signature and JSON Schema for one name. - Jobs.
job.startruns a shell command, a base64 WebAssembly component, or a named capability. Output streams as log frames. Jobs keep running when the client disconnects.GET /job/attachreplays the log from a sequence offset. - Audit.
session.auditreturns session open and close events and job start and finish events. The audit log does not cover file or network activity.
The methods, parameters, and error codes are listed in docs/RUNTIME-API.md.
The protocol design is in docs/AXP-ARCHITECTURE.md. Changes to the protocol go through an RFC in rfcs/.
Quick Start
Prerequisites: Rust 1.85 or later. AXP is not on crates.io, so build it from this repo.
cargo build --release -p axp-cli
./target/release/axp serve
The server prints AXP runtime listening on http://127.0.0.1:7300 and runs until you stop it.
Open a second terminal. Open a session that allows command jobs:
curl -s http://127.0.0.1:7300/ \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"session.open","params":{"workspace":"/absolute/path/to/project","sandbox_tier":"dev-none","capabilities":["proc.spawn"]}}'
The result object holds session_id and cap_token. Copy both values into the next requests. The dev-none tier enforces no sandbox. Use kernel-lsm on Linux to enforce one.
Start a command job:
curl -s http://127.0.0.1:7300/ \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":2,"method":"job.start","params":{"session_id":"<session_id>","cap_token":"<cap_token>","kind":"command","command":"echo hello"}}'
The result object holds job_id. Stream the job log:
curl -N 'http://127.0.0.1:7300/job/attach?session_id=<session_id>&cap_token=<cap_token>&job_id=<job_id>&from_offset=0'
Each data: line holds the frame. The data field is a byte array. For echo hello, it is [104,101,108,108,111,10].
axp demo runtime runs one session through index, job, and attach against a running server.
Serve flags
| Flag | Default | Purpose |
|---|---|---|
--addr <socket-addr> | 127.0.0.1:7300 | Address to bind. |
--mcp-provider <id> | None | Provider id for one static MCP tool. Use with the other three --mcp-* flags. |
--mcp-tool <name> | None | Tool name for one static MCP tool. |
--mcp-desc <text> | None | Description for one static MCP tool. |
--mcp-bridge <program> | None | Bridge program that runs the tool. |
--mcp-config <path> | None | JSON file that mounts one or more tools. Do not combine with the other --mcp-* flags. |
Sandbox tiers
Each session declares a sandbox tier. A job fails to start when the host cannot enforce its tier. The runtime never falls back to a weaker tier.
| Tier | Enforcement | Support |
|---|---|---|
kernel-lsm | Landlock limits file access. A seccomp-bpf filter blocks ptrace, process_vm_readv, process_vm_writev, and io_uring calls. | Linux with Landlock. Other systems fail the job at start. |
dev-none | None | All systems. Development only. |
container | Not implemented | Job start fails. |
process-token | Not implemented | Job start fails. |
Under kernel-lsm, a job reads the workspace and the fs.read paths. It writes only to fs.write paths.
| Grant | Enforced by | Notes |
|---|---|---|
fs.read(<path>) | Landlock under kernel-lsm | The workspace root is always readable. |
fs.write(<path>) | Landlock under kernel-lsm | The workspace root is read-only unless a write grant covers it. |
proc.spawn | Engine check | Required for command jobs. The seccomp filter does not block execve. |
tool:<name> | Engine check | Required for capability jobs. Authorizes one named capability. |
net.connect(<domain>) | None | Accepted and parsed. The runtime does not filter or block network access. |
pty.open | None | Accepted and parsed. The runtime does not open a PTY. |
Sandboxing limits what a job can reach. It does not stop prompt injection. The design also covers macOS Seatbelt and Windows AppContainer backends. See docs/AXP-ARCHITECTURE.md.
MCP mounts
AXP does not implement the MCP wire protocol. axp serve mounts static tool descriptors. Each call runs a bridge program that you supply. This repo does not ship a bridge program.
axp serve \
--mcp-provider docs \
--mcp-tool search \
--mcp-desc "Search documentation with an external MCP bridge" \
--mcp-bridge axp-mcp-bridge
To mount one or more tools from one provider, pass a JSON file with --mcp-config mcp.json. The file format, validation rules, and call argv are in docs/MCP-MOUNTS.md.
Status
| Area | State |
|---|---|
| Protocol | Early draft. See docs/AXP-ARCHITECTURE.md. |
Runtime (axp serve) | Early development. Sessions and jobs live in memory, so a server restart ends them. |
| Sandbox | kernel-lsm on Linux only. |
| Code mode | WebAssembly components only. |
| Static MCP mounts | Available. |
| Rust client | axp-client crate in this workspace. |
| SDKs (TypeScript, Python, Go) | Planned. |
Contributing
Contributions are welcome. See CONTRIBUTING.md for conventions and checks.
Questions and design discussion happen on Discord.
License
Licensed under Apache-2.0. See LICENSE.
Compatibility
- License
- Apache-2.0
- Crate facts
- Not measured
- Runs on, Native code and Python bindings read crates on crates.io. This entry lists no crate.
Compare with similar projects
Order: strongest tier first, then most downloads, then name, with unmeasured values last. A library counts downloads over 30 days. An app counts binary downloads per release. An app with none counts its crate downloads over 30 days.
| Project | Downloads | Dependents | Stars | Latest release | Runs on (GPU) | Native code | License |
|---|---|---|---|---|---|---|---|
|
An open protocol that gives AI agents a secure, sandboxed place to run code and use tools — with lean context usage. AXP works alongside MCP |
Not measured | Not applicable | 3 | Not measured | Not measured | Not measured | Apache-2.0 |
|
rust-mcp-schema Featured
Type-safe implementation of the Model Context Protocol in Rust, designed to reduce errors and accelerate development with powerful utilities. |
107,187 downloads over 30 days | 19 | 79 | 2.0.0 | GPU support unknown | No native code found | MIT |
|
an open source, extensible AI agent that goes beyond code suggestions - install, execute, edit, and test with any LLM |
63,795 binary downloads per release | Not applicable | 56,377 | Not measured | Not measured | Apache-2.0 | |
|
adk-rust Listed
Rust Agent Development Kit - Build AI agents in Rust with modular components for models, tools, memory, and more. |
5,419 downloads over 30 days | 25 | 743 | 2.3.0 | CUDA, Metal | Binds native code: alsa-sys (feature desktop-audio), audiopus_sys (feature openai-webrtc), cxx (feature livekit), espeak-rs-sys (feature kokoro), libsqlite3-sys (feature sqlite) and 4 more | Apache-2.0 |
|
Cut AI context cost without trusting the compressor. Every reduction is reversible, byte-exact recoverable, and carries an auditable receipt. Local-first, works through proxy, MCP, SDK, or agent wrapper. |
18 binary downloads per release | Not applicable | 483 | Not measured | Not measured | Apache-2.0 | |
|
YC (S26) | Open Computer History | Continuously record your company computer work, map your workflows, help you find work worth automating, and power your agents' context |
0 binary downloads per release | Not applicable | 22,279 | Not measured | Not measured | Not measured |
Why ListedNo archive, New or Featured rule places it, so it is Listed.
What it lacks for Featured
- The check holds no value for Homebrew installs on request over 365 days, Docker pull growth over 90 days. A gate that lacks its signal does not pass.
What else the check found
- The last activity is on 6 Nov 2026, 3 days ago. The rules expect an update within 365 days. Dormancy rule
Not measured: First release, Homebrew installs on request over 365 days, Docker pull growth over 90 days.
Exact rules: Listed, Featured app. The check on applied thresholds version 9.
Every rule outcome, as the check records it
expected-interval: app: E = 365 daysdormancy: last activity 2026-11-06, 3 days ago, E = 365: activefeatured: not featured: unknown homebrew_on_request_365d, docker_pull_growth_90dlisted: listed: no archive, new or featured rule applies
Measurements and sources
Each signal row shows the raw value, its source and the fetch date. The Sources list gathers every distinct source on this page. Movement needs more history.
Sources5 sources
- Description: the GitHub repository description
- GitHub repository, fetched
- GitHub releases, fetched
- Repology project, fetched
- GitHub contributors, fetched
AdoptionNot measured
| Signal | Value | Source | Fetched | Counts |
|---|---|---|---|---|
| Active dependents | Not measured | Yes | ||
| New dependents (365 days) | Not measured | Yes | ||
| Peak active dependents | Not measured | Yes | ||
| Active dependents as a share of the peak | Not measured | Yes | ||
| Binary downloads per release | Not measured | Yes |
MaintenanceLatest human commit: 3 days ago8 not measured
| Signal | Value | Source | Fetched | Counts |
|---|---|---|---|---|
| Latest human commit | 2026-11-06 | GitHub repository | Yes | |
| Latest release | Not measured | Yes | ||
| First release | Not measured | Yes | ||
| Latest version | Not measured | Yes | ||
| Days the oldest outside issue waits for a reply | 0 | GitHub repository | Yes | |
| Maintainer replies over 365 days | 0 | GitHub repository | Yes | |
| Repository archived | false | GitHub repository | Yes | |
| Repository gone | false | GitHub repository | Yes | |
| Release commit or manifest in the repo | Not measured | Yes | ||
| Published docs | Not measured | Yes | ||
| Latest release fails cargo check | Not measured | Yes | ||
| Build check date | Not measured | Yes | ||
| Build check toolchain | Not measured | Yes |
SecurityNot measured
| Signal | Value | Source | Fetched | Counts |
|---|---|---|---|---|
| Unpatched vulnerabilities past the grace window | Not measured | Yes | ||
| RustSec unmaintained advisory | Not measured | Yes | ||
| Deprecation notice | Not measured | Yes | ||
| Deprecated requirement | Not measured | Yes |
Distribution0 binary downloads over the last 3 releases9 not measured
| Signal | Value | Source | Fetched | Counts |
|---|---|---|---|---|
| Releases | Not measured | Yes | ||
| Downloads over 30 days | Not measured | Yes | ||
| Binary downloads over the last 3 releases | 0 | GitHub releases | Yes | |
| Homebrew installs on request over 365 days | Not measured | Yes | ||
| Repology repository families | 2 | Repology project | Yes | |
| Docker pull growth over 90 days | Not measured | Yes | ||
| Docker pulls at the growth baseline | Not measured | Yes | ||
| Every version a prerelease | Not measured | Yes | ||
| Every version 0.0.x | Not measured | Yes | ||
| Every version yanked | Not measured | Yes | ||
| Crate deleted from crates.io | Not measured | Yes |
Repository3 stars, 0 forks, 1 contributors, 72 commits. Stars alone never qualify a project.1 not measured
| Signal | Value | Source | Fetched | Counts |
|---|---|---|---|---|
| GitHub stars | 3 | GitHub repository | Yes — one part of the repository route | |
| GitHub forks | 0 | GitHub repository | Yes — one part of the repository route | |
| Contributors with a GitHub account | 1 | GitHub contributors | Yes — one part of the repository route | |
| Commits on the default branch | 72 | GitHub repository | No | |
| Repository's main crate left out of the entry | Not measured | Yes |
Facts that never count
| Signal | Value | Source | Fetched | Counts |
|---|---|---|---|---|
| License | Apache-2.0 | GitHub repository | No | |
| Runs on, from listed crates and their direct dependencies | Not measured | No | ||
| What shows each backend | Not measured | No | ||
| Native code, from listed crates and their dependencies | Not measured | No | ||
| Python bindings, from direct dependencies of listed crates | Not measured | No | ||
| Crates that depend on a listed crate directly | Not measured | No |
Corrections and review history
No correction applies to this entry.
Judgments
A judgment enters only through an approved issue and a merged pull request.
No judgment applies to this entry.