iqa-mcp
The IQA attestation primitives — derived intent addressing and AE-128 envelope verification — exposed as Model Context Protocol tools, so any MCP agent (Claude Desktop, Cline, your own client, an Uber-style MCP Gateway) can verify trust offline, fail-closed.
A thin, stateless wrapper around the published iqa-org 1.3.1 reference
implementation. No network. No accounts. No key storage. No state.
PyPI · iqa-mcp · Apache-2.0 Spec · draft-li-rttp-iqa-addressing — Independent Submission, in review Landing page · iqa.org/MCP/
Why
Agent platforms are converging on MCP as the tool-calling layer, at industrial scale. What none of them standardize is trust semantics: what intent is being addressed, and whether the counterparty holds standing — verifiable without a network call. These four tools make that layer native to any MCP agent.
Install
Requires Python ≥ 3.11.
# from PyPI — installs the `iqa-mcp` console command
pip install iqa-mcp
# launcher equivalents — same `iqa-mcp` command, they fetch and wrap the Python package above
npm install -g iqa-mcp # or run once: npx iqa-mcp
cargo install iqa-mcp
# or run from source
pip install "iqa-org>=1.3.1" "mcp>=2"
python server.py # stdio transport
All three install paths end at the same iqa-mcp command; the MCP client configuration below works unchanged for any of them.
MCP client configuration (Claude Desktop / Cline style):
{
"mcpServers": {
"iqa": {
"command": "iqa-mcp"
}
}
}
(From source, use "command": "python", "args": ["/path/to/server.py"]
instead.)
Tools
| Tool | Input | Returns | Key needed |
|---|---|---|---|
derive_route_shard |
authority string | SHA-256(authority)[0:16] hex — the derived, action-independent intent address |
no |
parse_envelope |
AE-128 frame hex | structural decode: version, lease, shard, organ, nonce, standing — fails closed on every layout rule | no |
verify_envelope |
frame hex + organ key | full verification: constant-time HMAC-SHA256 over the whole 128-byte frame (attestation zeroed) + lease check. REJECT is a result, not an error | yes (caller-supplied) |
published_vector |
— | the published AE128-VECTOR-1 (authority, test key, frame hex — see iqa-org) for byte-for-byte self-test | — |
Try it in thirty seconds
published_vector -> AE128-VECTOR-1: authority + test key + frame hex
parse_envelope(frame) -> standing radiant · nonce 1 · lease unexpired
verify_envelope(frame, key) -> PASS
flip one byte of standing -> REJECT (HMAC mismatch)
That last line is the point: tampering is not detected by anyone watching — the frame simply stops verifying, offline, for any verifier, forever.
Self-test
# installed from PyPI — runs against the iqa-mcp console script
python -m test_mcp
# or from a source checkout — runs against ./server.py
python test_mcp.py
# [PASS] 1 · list_tools -> 4 tools
# [PASS] 2 · derive_route_shard -> 5c378581f92754d0bc88adaed84b7c5a
# [PASS] 3 · published_vector -> f3b2a1c4.pillar.example
# [PASS] 4 · parse_envelope -> standing radiant
# [PASS] 5 · verify_envelope -> [PASS] radiant · nonce 1
# [PASS] 6 · tampered frame -> REJECT (HMAC mismatch)
# [PASS] 7 · malformed hex -> REJECT
# ALL 7/7 PASS
Design invariants
Inherited from the schemes:
- Zero-parser — fixed offsets, no TLV, no heap-shaped parsing.
- Fail-closed — malformed input is a REJECT result, never a normalised partial answer.
- Offline — verification needs the frame, the key, and a hash function. Nothing else.
- Stateless — the server stores nothing; the organ key is passed per call by the client and never persisted.
What this is not
Stated plainly, because evidence tooling that oversells is just marketing:
- Not real-time governance. Gateways and policy engines decide in the moment; this server proves after the fact. The two compose; neither replaces the other.
- Not a delegation scheme. v1.3.x intentionally specifies no delegation semantics — see the draft's honest-boundary notes.
- Not a key custodian. The organ key never touches this server's state; verification is caller-supplied, per call. Never pass a production organ key through a host you do not control — whoever sees the key holds the verification power.
- Not a benchmark. The demos at iqa.org execute real WebCrypto in the browser; this server wraps the same published primitives.
Status
- Published on PyPI: https://pypi.org/project/iqa-mcp/ — current version in the badge above.
- Transport: stdio. A hosted streamable-HTTP endpoint is under consideration; the tools are stateless, so hosting adds no custody.
- Underlying schemes:
iqa-org 1.3.1(PyPI / npm / crates.io — four registries, byte-exact vectors, offline self-test). - Specification:
draft-li-rttp-iqa-addressing— Independent Submission, in review.
Sister repositories
- iqa-org — the reference implementation (addressing, envelope, verification).
- rttp — the addressing scheme: design notes and open questions.
- Organization discussions — start-here map and cross-repo threads.
Public record
Everything this tool wraps is public and checkable — no asking us:
- Landing page: https://iqa.org/MCP/
- Public record, dated: https://iqa.org/brief/
- Live demos — the audit chain this tool joins: https://iqa.org/demo/compare/ · https://iqa.org/demo/delegation/
- Whitepaper: https://iqa.org/whitepaper/ (also at rttp.com/whitepaper)
- Internet-Draft: draft-li-rttp-iqa-addressing — Independent Submission, in review
- The library this server wraps: iqa-org 1.3.1 on PyPI — four registries, byte-exact vectors, offline self-test
License
Apache-2.0 — © RTTP & IQA Organization
Metadata
Release files for iqa-mcp 1.0.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| iqa_mcp-1.0.2.tar.gz | 11.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| iqa_mcp-1.0.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 24.0 kB
Release files / iqa_mcp-1.0.2.tar.gz
| Download URL | iqa_mcp-1.0.2.tar.gz |
|---|---|
| Size | 11.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a504687562f39320edbb1880718a5962c3b8527619725db9f173866a02caf738
|
|
BLAKE2b-256 checksum How to use checksums |
3f79bfd9d2b7af52e2e0d23f70bdbf73b26391f71b5e61f639fa2c7182d110aa
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.2
|
Release files / iqa_mcp-1.0.2-py3-none-any.whl
| Download URL | iqa_mcp-1.0.2-py3-none-any.whl |
|---|---|
| Size | 12.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c518c657a12ec2cc09cc1d863688274d599a2b28cc12cec3a6181009dc6eaf00
|
|
BLAKE2b-256 checksum How to use checksums |
4219866c863ef8efd1328bf3cce07e88d36af7fbfe241c9bd196155c69e8d869
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.2
|