AgentVM · Machine Payments Protocol
AgentVM + Stripe MPP
Purchase bounded Hetzner VMs or OpenAI-compatible inference through the same machine-payable MPP surface. AgentVM keeps provider credentials server-side and publishes the price and request shape before payment.
Discovery
Choose a purchase path
POST https://mpp.agentvm.sh/compute/quote
0.50 USD per request. Buy the live Hetzner catalog first when the agent needs time to compare regions, capacity, runtime, and goals.
MPP currently supports Hetzner only. AWS and OVHcloud are intentionally unavailable until their quote and provisioning paths are production-ready.
POST https://mpp.agentvm.sh/compute/runs/{runId}
Dynamic price starting at 0.50 USD. The requested budget selects an approved plan and a bounded runtime. Every purchased VM has an expiration time and is automatically destroyed.
POST https://mpp.agentvm.sh/compute/sessions/{runId}
Incremental MPP Session lease. The initial payment starts a paid-through VM lease. Renewals purchase only additional runtime and extend the same VM before its deadline.
GET https://mpp.agentvm.sh/inference/v1/models
Free discovery. Returns the current Hetzner Experiments model list through the AgentVM inference gateway.
POST https://mpp.agentvm.sh/inference/sessions/v1/chat/completions or POST https://mpp.agentvm.sh/inference/sessions/v1/completions
0.01 USD per request through Tempo MPP Session. This is the preferred low-cost inference rail and can reuse a retained Tempo payment channel across calls.
POST https://mpp.agentvm.sh/inference/v1/chat/completions or POST https://mpp.agentvm.sh/inference/v1/completions
0.50 USD per request through Stripe MPP. This remains the fixed-price fallback when the Tempo session rail is unavailable.
Inspect machine-payments.json before purchasing inference. Prefer the Tempo session resource when published. Stripe Shared Payment Tokens have a minimum charge of $0.50 USD. Arbitrary VM plans, images, startup scripts, commands, user data, box types, and runtimes are rejected; agentic compute payments can launch only the published run profiles.
Predefined runs
hetzner-shell— A temporary Linux server for shell work, builds, package installation, and API tasks. Budget: 0.50-25.00 USD.hetzner-mcp-sandbox— A disposable isolated Linux VM for safely testing MCP servers with Node.js, Python, MCP Inspector, an unprivileged runner, and automatic expiry. Budget: 0.50-50.00 USD.
curl -s 'https://mpp.agentvm.sh/compute/runs' | jq
MPP Session leases
hetzner-shell— initial lease 600 seconds, renewable in 300-second increments up to 21600 seconds.hetzner-mcp-sandbox— initial lease 600 seconds, renewable in 300-second increments up to 21600 seconds.
Creation returns an opaque X-AgentVM-Session-Token. Present that capability to inspect or renew the session. Optional maximumSpend and maximumRuntimeSeconds fields set hard ceilings. Renew before paidThrough; expired leases are not resurrected.
MPP Session VMs are isolated from the dashboard prepaid ledger. Direct dashboard and AgentVM CLI launches still reserve the selected maximum estimate and draw down actual usage from the prepaid balance.
curl -s 'https://mpp.agentvm.sh/compute/sessions' | jq
Install Link CLI
Install the command globally:
npm install -g @stripe/link-cli
Or run it without a global installation:
npx @stripe/link-cli
Add it as an agent skill when needed:
npx skills add stripe/link-cli
Authenticate once:
link-cli auth login
link-cli auth status
Purchase inference
List the currently available models and payment resources without paying:
curl -s 'https://mpp.agentvm.sh/inference/v1/models' | jq
curl -s 'https://mpp.agentvm.sh/machine-payments.json' | jq '.resources[] | select(.id | startswith("hetzner-inference"))'
Preferred low-cost Tempo session request:
mppx 'https://mpp.agentvm.sh/inference/sessions/v1/chat/completions' --session auto -X POST -H 'content-type: application/json' -d '{"model":"Qwen/Qwen3.6-35B-A3B-FP8","messages":[{"role":"user","content":"Give me a one-sentence description of AgentVM."}]}'
Stripe Link remains the bounded fallback:
link-cli mpp pay -X POST 'https://mpp.agentvm.sh/inference/v1/chat/completions' -H 'content-type: application/json' -d '{"model":"Qwen/Qwen3.6-35B-A3B-FP8","messages":[{"role":"user","content":"Give me a one-sentence description of AgentVM."}]}' --context "Purchase one OpenAI-compatible AgentVM inference request backed by Hetzner Experiments without exposing the underlying provider token."
The dedicated OpenAI-compatible origin is https://inference.agentvm.sh/v1. Its completion routes use the same AgentVM MPP authorization boundary; clients never receive the Hetzner Experiments token. Streaming requests are intentionally rejected on the current buffered API Gateway path.
Purchase a compute quote
link-cli mpp pay -X POST 'https://mpp.agentvm.sh/compute/quote' \
-H 'content-type: application/json' \
-d '{"provider":"hetzner","region":"fsn1"}' \
--context "Purchase a live managed compute quote so the agent can compare approved Hetzner regions, capacity, runtime, and budget before provisioning a temporary VM."
The quote remains 0.50 USD so an agent can inspect current approved choices before deciding which bounded run fits its budget and goal.
Purchase a time-limited VM
mkdir -p .agentvm-mpp && chmod 700 .agentvm-mpp
if test -f .agentvm-mpp/request.env; then
source .agentvm-mpp/request.env
else
REQUEST_ID="run-$(date +%s)-$(openssl rand -hex 4)"
IDEMPOTENCY_KEY="$(openssl rand -hex 24)"
SSH_KEY_PATH="$PWD/.agentvm-mpp/keys/$REQUEST_ID"
printf 'REQUEST_ID=%q
IDEMPOTENCY_KEY=%q
SSH_KEY_PATH=%q
' "$REQUEST_ID" "$IDEMPOTENCY_KEY" "$SSH_KEY_PATH" > .agentvm-mpp/request.env
chmod 600 .agentvm-mpp/request.env
fi
if test -z "${SSH_KEY_PATH:-}"; then
if test -s .agentvm-mpp/provision.json; then
echo 'Existing AgentVM response predates persisted SSH key state; do not create a replacement key or repurchase.' >&2
exit 1
fi
SSH_KEY_PATH="$PWD/.agentvm-mpp/keys/$REQUEST_ID"
printf 'SSH_KEY_PATH=%q
' "$SSH_KEY_PATH" >> .agentvm-mpp/request.env
chmod 600 .agentvm-mpp/request.env
fi
mkdir -p "$(dirname "$SSH_KEY_PATH")" && chmod 700 "$(dirname "$SSH_KEY_PATH")"
test -f "$SSH_KEY_PATH" || ssh-keygen -q -t ed25519 -N '' -f "$SSH_KEY_PATH" -C "agentvm-mpp-$REQUEST_ID"
test -f "$SSH_KEY_PATH.pub" || exit 1
chmod 600 "$SSH_KEY_PATH"
PUBLIC_KEY="$(cat "$SSH_KEY_PATH.pub")"
umask 077
LINK_RESULT_PATH=".agentvm-mpp/link-result.json"
link-cli mpp pay -X POST 'https://mpp.agentvm.sh/compute/runs/hetzner-shell' \
-H 'content-type: application/json' \
-d "$(jq -n \
--arg requestId "$REQUEST_ID" \
--arg idempotencyKey "$IDEMPOTENCY_KEY" \
--arg budget '1.00' \
--arg publicKey "$PUBLIC_KEY" \
'{requestId:$requestId,idempotencyKey:$idempotencyKey,budget:$budget,publicKey:$publicKey}')" \
--context "Purchase a predefined time-limited AgentVM shell box that will be destroyed automatically and return its endpoint, access token, SSH details, and expiration." \
--format json > "$LINK_RESULT_PATH"
chmod 600 "$LINK_RESULT_PATH"
jq -e -r '.body' "$LINK_RESULT_PATH" > .agentvm-mpp/provision.json
chmod 600 .agentvm-mpp/provision.json
jq -e . .agentvm-mpp/provision.json >/dev/null
rm -f "$LINK_RESULT_PATH"
The payment challenge uses the requested budget. After successful payment, the response includes a safe top-level display summary, the VM, HTTPS endpoint, bearer access token, SSH details, selected capacity, exact expiration time, and private guest-dashboard links.
If the payment client writes the complete JSON response to a protected file, print the safe machine summary without exposing its bearer or renewal credentials:
chmod 600 ./agentvm-mpp-response.json
agentvm mpp receipt ./agentvm-mpp-response.json
The private claim link opens a read-only accountless receipt. After sign-in, the user can explicitly add the machine and its MPP history to their dashboard without moving it onto prepaid billing or changing its spend/runtime limits.
Keep the generated REQUEST_ID and IDEMPOTENCY_KEY. Repeating the identical request recovers an interrupted response without launching another VM.
Inspect a challenge
curl -i -X POST 'https://mpp.agentvm.sh/compute/quote' \
-H 'content-type: application/json' \
-d '{"provider":"hetzner","region":"fsn1"}'
The unpaid request returns HTTP 402 with an MPP WWW-Authenticate challenge. Compatibility routes remain available under https://api.agentvm.sh/mpp/compute/.