HonorNet agent presentation client (MCP-first) — a protocol shim that mints proofs and presents three-part ADR-009 bundles. It decides nothing (hard rule 3).
Project description
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.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file honornet_agent_presentation-0.1.0.tar.gz.
File metadata
- Download URL: honornet_agent_presentation-0.1.0.tar.gz
- Upload date:
- Size: 28.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2d6078d5e08b09e839a06aefa4b9caff8c3d70bee0986a188f3ea0fcfe3ef267
|
|
| MD5 |
1dd77bf9f05f26d33516760229bfb429
|
|
| BLAKE2b-256 |
ecf20354aed3e617a4250d5b2a13cc0e1320a95a36c420a5b7d4c9642ca36f0b
|
Provenance
The following attestation bundles were made for honornet_agent_presentation-0.1.0.tar.gz:
Publisher:
publish-agent-presentation.yml on HonorNetAI/HonornetAI
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
honornet_agent_presentation-0.1.0.tar.gz -
Subject digest:
2d6078d5e08b09e839a06aefa4b9caff8c3d70bee0986a188f3ea0fcfe3ef267 - Sigstore transparency entry: 1797490123
- Sigstore integration time:
-
Permalink:
HonorNetAI/HonornetAI@276a8e3d2ab32d94506e9fd3bbe4eba8c874df95 -
Branch / Tag:
refs/tags/honornet-agent-presentation-v0.1.0 - Owner: https://github.com/HonorNetAI
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-agent-presentation.yml@276a8e3d2ab32d94506e9fd3bbe4eba8c874df95 -
Trigger Event:
push
-
Statement type:
File details
Details for the file honornet_agent_presentation-0.1.0-py3-none-any.whl.
File metadata
- Download URL: honornet_agent_presentation-0.1.0-py3-none-any.whl
- Upload date:
- Size: 33.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e69f41752ffb902bce56d5ebdd55a6cf40f120178c1aa46945ce78312b5b752b
|
|
| MD5 |
c082db745874e1ac9c5e1c6832a754cc
|
|
| BLAKE2b-256 |
c4473fc0b5e76bf20a51c74fa5b5510c3e814e42f5c410ae61a787b2034791c8
|
Provenance
The following attestation bundles were made for honornet_agent_presentation-0.1.0-py3-none-any.whl:
Publisher:
publish-agent-presentation.yml on HonorNetAI/HonornetAI
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
honornet_agent_presentation-0.1.0-py3-none-any.whl -
Subject digest:
e69f41752ffb902bce56d5ebdd55a6cf40f120178c1aa46945ce78312b5b752b - Sigstore transparency entry: 1797490474
- Sigstore integration time:
-
Permalink:
HonorNetAI/HonornetAI@276a8e3d2ab32d94506e9fd3bbe4eba8c874df95 -
Branch / Tag:
refs/tags/honornet-agent-presentation-v0.1.0 - Owner: https://github.com/HonorNetAI
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-agent-presentation.yml@276a8e3d2ab32d94506e9fd3bbe4eba8c874df95 -
Trigger Event:
push
-
Statement type: