Skip to main content
Glama
@proof-holdings/mcp-server

@proof-holdings/mcp-server

Official

get_hitl_keys

Read-only

Retrieve the encryption keypair for a HITL config. Returns the public key and kid for sealing confirmations, or full key material including encrypted private key and KDF salt with hitl:read.

Instructions

Get the encryption keypair for a HITL config. With hitl:read it returns the public key, encrypted private key, KDF salt, and key ID (kid). A key holding confirmations:create without hitl:read receives only public_key and kid — what a confirmation message is sealed to, never the private-key material.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

Input Schema

NameRequiredDescriptionDefault
hitl_idYesHITL config ID

Output Schema

NameRequiredDescriptionDefault
kidYesThe key id: lowercase hex SHA-256 of the public key's SPKI DER
dek_ivNo
dek_tagNo
kdf_saltNoThe salt the wrapping key is derived with. Absent for a key holding `confirmations:create` without `hitl:read`.
public_keyYesThe RSA public key (SPKI PEM) messages are sealed to. Null means the stored key material could not be read: a degraded state to report, not "no key yet" (a config with no keypair answers 404 `no_keypair`).
wrapped_dekNoThe per-config data key wrapped under the master key; null for a keypair stored before it existed. Absent for a requester key, as are the five fields below.
backup_dek_ivNo
backup_dek_tagNo
backup_wrapped_dekNoThe same data key wrapped under the recovery key; null until recovery is set up
encrypted_private_keyNoThe private key as stored, wrapped client-side. Absent for a key holding `confirmations:create` without `hitl:read`.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changedv1.7.2
    • removedInput schema / additionalProperties
      Removed value: -false
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": {},
      +  "description": "A HITL config's keypair. A caller with `hitl:read` (or a dashboard session) gets every field; a key holding `confirmations:create` without `hitl:read` gets `public_key` and `kid` only.",
      +  "properties": {
      +    "backup_dek_iv": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "backup_dek_tag": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "backup_wrapped_dek": {
      +      "description": "The same data key wrapped under the recovery key; null until recovery is set up",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "dek_iv": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "dek_tag": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "encrypted_private_key": {
      +      "description": "The private key as stored, wrapped client-side. Absent for a key holding `confirmations:create` without `hitl:read`.",
      +      "type": "string"
      +    },
      +    "kdf_salt": {
      +      "description": "The salt the wrapping key is derived with. Absent for a key holding `confirmations:create` without `hitl:read`.",
      +      "type": "string"
      +    },
      +    "kid": {
      +      "description": "The key id: lowercase hex SHA-256 of the public key's SPKI DER",
      +      "type": "string"
      +    },
      +    "public_key": {
      +      "description": "The RSA public key (SPKI PEM) messages are sealed to. Null means the stored key material could not be read: a degraded state to report, not \"no key yet\" (a config with no keypair answers 404 `no_keypair`).",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "wrapped_dek": {
      +      "description": "The per-config data key wrapped under the master key; null for a keypair stored before it existed. Absent for a requester key, as are the five fields below.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    }
      +  },
      +  "required": [
      +    "public_key",
      +    "kid"
      +  ],
      +  "type": "object"
      +}
  2. First observedv1.1.0

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=true; the description goes well beyond that by disclosing permission-dependent return shapes, that private-key material is withheld without `hitl:read`, and a hard setup dependency with a restart. This is exactly the auth and scope context an agent needs before calling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the resource and the primary return shape, then uses a single compact paragraph for the permission-scoped alternative and access requirements. No filler or repetition; the negated start_login warning earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Even though an output schema exists, the description usefully flags that the returned keys vary by scope, which the schema cannot express. Combined with the access prerequisite, an agent has everything needed to call this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single parameter is documented as "HITL config ID". The description adds only "for a HITL config", so it does not meaningfully extend parameter meaning beyond the schema; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb and resource ("Get the encryption keypair for a HITL config") and immediately clarifies the two possible payload shapes. It is clearly distinct from siblings like delete_hitl_keys, upload_hitl_keys, and get_hitl.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives strong context on who gets which response based on the caller's scopes, plus an explicit prerequisite path (set PROOF_API_KEY, restart, retry) and a negative exclusion (start_login does NOT open this tool). It does not name the sibling tools to use for key rotation or upload, but the when-to-use conditions are clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Deploy Server

Other Tools