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

Checked · Sources

Downloads
Not measured
Dependents
Not applicable
Stars
3
Forks
0
Contributors
1
Commits
72

About

From the project README ·

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, and wasmtime.
Read the full README
Not supported yet
  • Sandbox tiers container and process-token. Job start fails.
  • Sandboxing on macOS and Windows. Only dev-none, which enforces nothing, runs there.
  • Network filtering for net.connect and a PTY for pty.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>), or pty.open. A job can request only the grants that its session holds. The Sandbox tiers section lists what each grant enforces.
  • Discovery. axp.index returns each capability with a one-line description. axp.describe returns the signature and JSON Schema for one name.
  • Jobs. job.start runs 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/attach replays the log from a sequence offset.
  • Audit. session.audit returns 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
FlagDefaultPurpose
--addr <socket-addr>127.0.0.1:7300Address to bind.
--mcp-provider <id>NoneProvider id for one static MCP tool. Use with the other three --mcp-* flags.
--mcp-tool <name>NoneTool name for one static MCP tool.
--mcp-desc <text>NoneDescription for one static MCP tool.
--mcp-bridge <program>NoneBridge program that runs the tool.
--mcp-config <path>NoneJSON 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.

TierEnforcementSupport
kernel-lsmLandlock 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-noneNoneAll systems. Development only.
containerNot implementedJob start fails.
process-tokenNot implementedJob start fails.

Under kernel-lsm, a job reads the workspace and the fs.read paths. It writes only to fs.write paths.

GrantEnforced byNotes
fs.read(<path>)Landlock under kernel-lsmThe workspace root is always readable.
fs.write(<path>)Landlock under kernel-lsmThe workspace root is read-only unless a write grant covers it.
proc.spawnEngine checkRequired for command jobs. The seccomp filter does not block execve.
tool:<name>Engine checkRequired for capability jobs. Authorizes one named capability.
net.connect(<domain>)NoneAccepted and parsed. The runtime does not filter or block network access.
pty.openNoneAccepted 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

AreaState
ProtocolEarly draft. See docs/AXP-ARCHITECTURE.md.
Runtime (axp serve)Early development. Sessions and jobs live in memory, so a server restart ends them.
Sandboxkernel-lsm on Linux only.
Code modeWebAssembly components only.
Static MCP mountsAvailable.
Rust clientaxp-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.

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.

axp beside the projects that share a topic with it
ProjectDownloadsDependentsStarsLatest releaseRuns on (GPU)Native codeLicense
axp This page 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

Not measured Not applicable 3 Not measured Not measured Not measured Apache-2.0

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
goose App Featured

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
entroly App Listed

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
screenpipe App Listed

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 days
  • dormancy: last activity 2026-11-06, 3 days ago, E = 365: active
  • featured: not featured: unknown homebrew_on_request_365d, docker_pull_growth_90d
  • listed: 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
AdoptionNot measured
Adoption measurements
SignalValueSourceFetchedCounts
Active dependentsNot measuredYes
New dependents (365 days)Not measuredYes
Peak active dependentsNot measuredYes
Active dependents as a share of the peakNot measuredYes
Binary downloads per releaseNot measuredYes
MaintenanceLatest human commit: 3 days ago8 not measured
Maintenance measurements
SignalValueSourceFetchedCounts
Latest human commit2026-11-06GitHub repositoryYes
Latest releaseNot measuredYes
First releaseNot measuredYes
Latest versionNot measuredYes
Days the oldest outside issue waits for a reply0GitHub repositoryYes
Maintainer replies over 365 days0GitHub repositoryYes
Repository archivedfalseGitHub repositoryYes
Repository gonefalseGitHub repositoryYes
Release commit or manifest in the repoNot measuredYes
Published docsNot measuredYes
Latest release fails cargo checkNot measuredYes
Build check dateNot measuredYes
Build check toolchainNot measuredYes
SecurityNot measured
Security measurements
SignalValueSourceFetchedCounts
Unpatched vulnerabilities past the grace windowNot measuredYes
RustSec unmaintained advisoryNot measuredYes
Deprecation noticeNot measuredYes
Deprecated requirementNot measuredYes
Distribution0 binary downloads over the last 3 releases9 not measured
Distribution measurements
SignalValueSourceFetchedCounts
ReleasesNot measuredYes
Downloads over 30 daysNot measuredYes
Binary downloads over the last 3 releases0GitHub releasesYes
Homebrew installs on request over 365 daysNot measuredYes
Repology repository families2Repology projectYes
Docker pull growth over 90 daysNot measuredYes
Docker pulls at the growth baselineNot measuredYes
Every version a prereleaseNot measuredYes
Every version 0.0.xNot measuredYes
Every version yankedNot measuredYes
Crate deleted from crates.ioNot measuredYes
Repository3 stars, 0 forks, 1 contributors, 72 commits. Stars alone never qualify a project.1 not measured
Repository measurements
SignalValueSourceFetchedCounts
GitHub stars3GitHub repositoryYes — one part of the repository route
GitHub forks0GitHub repositoryYes — one part of the repository route
Contributors with a GitHub account1GitHub contributorsYes — one part of the repository route
Commits on the default branch72GitHub repositoryNo
Repository's main crate left out of the entryNot measuredYes
Facts that never count
Facts that never count measurements
SignalValueSourceFetchedCounts
LicenseApache-2.0GitHub repositoryNo
Runs on, from listed crates and their direct dependenciesNot measuredNo
What shows each backendNot measuredNo
Native code, from listed crates and their dependenciesNot measuredNo
Python bindings, from direct dependencies of listed cratesNot measuredNo
Crates that depend on a listed crate directlyNot measuredNo

Corrections and review history

Report a correction

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.