HonorNet agent presentation client (MCP-first)
Make any MCP-capable agent HonorNet-capable. This client holds an agent's credential and its owner's mandate, mints the per-transaction proof of possession, and presents the three-part ADR-009 bundle to the network. The agent decides what the transaction is; this client presents it and relays the network's decision.
What this is — and what it is deliberately not
This is a protocol shim, not an agent framework. The analog is Visa publishing an EMV kernel and a reference terminal: the kernel holds the card's key, mints the cryptogram, and presents it — it decides nothing about what the cardholder buys. (See the four-party model and hard rule 3 in CLAUDE.md.)
The tool surface is closed at exactly three tools:
| Tool | Does | Does not |
|---|---|---|
load_credential |
Hold an issuer-signed identity credential | Issue, mint, or modify a credential |
load_mandate |
Hold an owner-signed spend mandate | Mint a mandate or set spending policy |
present |
Mint the proof, assemble the bundle, present it, relay the reply | Decide, rank, choose, score, or call a model |
There is no fourth tool. A tool that makes a purchase decision, ranks options,
or calls an LLM is a hard-rule-3 regression and fails CI
(tests/test_presentation_client_is_not_an_agent_framework.py).
Design
- Dependency-free. No
mcpPyPI package, no LLM SDK, no HTTP library — the MCP stdio transport is a small JSON-RPC 2.0 loop, signing comes fromac-authz(the in-repo reference of the SDK proof/mandate helpers), and transport is stdliburllib. Same no-supply-chain discipline asac-decision-recordand the AC-620 verifier. - Issuer-blind. A credential is held and presented unchanged in whatever recognized format it arrives in; no issuer is named in any code path.
- Operator-configured endpoint. Where
presentPOSTs is set by the operator (env), never chosen by the agent in a tool call — the shim never "chooses where to shop."
Run it
# Sign proofs with a known agent key (the credential must be issued to it):
export HONORNET_AGENT_SEED=$(python3 -c "import os;print(os.urandom(32).hex())")
# Where to present (omit for a dry run that returns the bundle only):
export HONORNET_PRESENT_ENDPOINT=http://localhost:8000 # /authorize is appended
python3 -m honornet_presentation.server
The server then speaks MCP over stdin/stdout. Configure it in an MCP host (Claude Desktop, an OpenAI-Agents/LangChain MCP client) as a stdio server:
{
"mcpServers": {
"honornet": {
"command": "python3",
"args": ["-m", "honornet_presentation.server"],
"env": {
"HONORNET_AGENT_SEED": "…64 hex chars…",
"HONORNET_PRESENT_ENDPOINT": "http://localhost:8000"
}
}
}
}
| Env var | Meaning |
|---|---|
HONORNET_AGENT_SEED |
Hex Ed25519 seed the agent signs proofs with. If unset, an ephemeral key is generated and its public key printed to stderr (demo only). |
HONORNET_PRESENT_ENDPOINT |
Where present POSTs the bundle (a /authorize URL). Unset → present is a dry run. |
HONORNET_PRESENT_API_KEY |
Optional network caller key (hn_sandbox_… / hn_live_…) sent as Authorization: Bearer. Required by enforced endpoints like the sandbox. Operator-set, never an agent tool argument. |
HONORNET_TRUSTED_ISSUER_KEYS |
Optional JSON {label: issuer_pubkey_hex} used only for the dry-run self-check. |
Library use
from honornet_presentation import PresentationClient
client = PresentationClient(agent_seed=seed, endpoint="http://localhost:8000")
client.load_credential(credential) # issuer-signed, issued to `seed`'s public key
client.load_mandate(mandate) # owner-signed
result = client.present(transaction) # {bundle, response: <the network's verdict, relayed>}
Tutorial
The end-to-end walkthrough — off-the-shelf MCP agent → sandbox checkout — is
docs/tutorials/agent-mcp-checkout.md.
Metadata
Release files for honornet-agent-presentation 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| honornet_agent_presentation-0.1.0.tar.gz | 28.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| honornet_agent_presentation-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 62.2 kB
Release files / honornet_agent_presentation-0.1.0.tar.gz
| Download URL | honornet_agent_presentation-0.1.0.tar.gz |
|---|---|
| Size | 28.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2d6078d5e08b09e839a06aefa4b9caff8c3d70bee0986a188f3ea0fcfe3ef267
|
|
BLAKE2b-256 checksum How to use checksums |
ecf20354aed3e617a4250d5b2a13cc0e1320a95a36c420a5b7d4c9642ca36f0b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 12, 2026.
Transparency logRelease files / honornet_agent_presentation-0.1.0-py3-none-any.whl
| Download URL | honornet_agent_presentation-0.1.0-py3-none-any.whl |
|---|---|
| Size | 33.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e69f41752ffb902bce56d5ebdd55a6cf40f120178c1aa46945ce78312b5b752b
|
|
BLAKE2b-256 checksum How to use checksums |
c4473fc0b5e76bf20a51c74fa5b5510c3e814e42f5c410ae61a787b2034791c8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 12, 2026.
Transparency log