tool_id, Ed25519 keypair, and optional model_provenance hash declared by the developer.
Same ltx_* account auth as agent passports — no new account type. Mutating routes require the root ltx_* key (scoped sub-keys are rejected).
Register a tool passport
tool_id, passport_did (did:lithtrix:tool:{tool_id}), public_key, private_key, model_provenance, key_algorithm, risk_class.
Optional risk_class: low (default) or high — registrant-declared only; Lithtrix logs, does not verify.
Public read (no auth)
TOOL_PASSPORT_NOT_FOUND when the tool is missing or revoked.
Rotate and revoke
POST /v1/me/tools/{tool_id}/rotate— root key only; optional newmodel_provenance; previous public key honored untilgrace_until.POST /v1/me/tools/{tool_id}/revoke— root key only; public GET returns 404 after revoke.
model_provenance discipline
Captured, not verified — same trust level as agent_type self-declaration. Lithtrix stores whatever hash or label the developer submits; consumers compare against their own model-provider queries.
Model swapped — worked example
- Register with
model_provenance: "sha256:abc123..."(hash of e.g."openai/gpt-4o-2024-05-13"). - Silent swap — developer changes the model but does not rotate. Public GET still shows
"sha256:abc123...". Divergence from the provider is the signal. - Auditable swap — developer calls rotate with a new
model_provenance. A row intool_passport_rotation_eventsrecords the prior hash + timestamp.
Distinction from model_attestation_hash
| Field | Surface | Scope |
|---|---|---|
model_provenance | Tool passport (tool_passports) | Passport-level declaration at register/rotate |
model_attestation_hash | Browse + content feedback only | Per-interaction optional hash on browse_logs / feedback_events |
risk_class and HITL approval events (G28.3)
Tools declare risk_class: low or high at register (and optionally on rotate). Public GET includes the declared value. Lithtrix does not intercept MCP calls — client-side enforcement is expected for high-risk tools.
When a human approves a high-risk action, log an immutable event:
GET /v1/me/activity).
Endpoints
| Method | Path | Auth |
|---|---|---|
POST | /v1/me/tools | Root ltx_* |
POST | /v1/me/tools/{tool_id}/rotate | Root ltx_* |
POST | /v1/me/tools/{tool_id}/revoke | Root ltx_* |
GET | /v1/tools/{tool_id}/passport | Public |
GET /v1/capabilities under passport.tool_passport.