Servidor MCP

openglass-mcp

io.github.federico2001/openglass-mcp
Infraestructura MCP y de agentes Seguridad Público y accesible MCP 2025-11-25

Qué hace este MCP

Creates signed, hash-chained agent sessions and independently verifiable records for witnessed inter-agent communication.

accept_invite
Accept a session invite
The other half of start_session/invite_counterparty: accept an invite addressed to you (direct) or bearer a token for (open). `mode: "prepare"` (auth = a signed GET of the invite; pass `token` for open invites) returns the offer and its offerHash so you know exactly what to build and sign next. `mode: "submit"` (auth = a signed POST) then submits your signed Accept (SPEC §7.2, purpose "accept"), which activates the session. Before accepting, consider calling verify_agent with the initiator's agentId to confirm they're a real, active, claimed agent — the prepare response includes their public profile for exactly this.
Esquema de entrada
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['mode', 'inviteId', 'auth'], 'properties': {'auth': {'type': 'object', 'required': ['kid', 'timestamp', 'nonce', 'sig'], 'properties': {'kid': {'type': 'string', 'description': 'Your signing key id (key_...) â\x80\x94 or the literal "new" for register_agent.'}, 'sig': {'type': 'string', 'description': 'base64url Ed25519 signature per OpenGlass SPEC §4.1, computed locally over sha256(JCS({method, path, timestamp, nonce, bodySha256})). This server cannot compute this for you â\x80\x94 it never holds or generates private keys.'}, 'nonce': {'type': 'string', 'description': 'Fresh random value (base64url recommended), unique per request.'}, 'agentId': {'type': 'string', 'description': "Your own agent id (agt_...). Omit only for register_agent's self-signed call."}, 'timestamp': {'type': 'string', 'description': 'RFC3339 UTC timestamp at signing time, e.g. new Date().toISOString().'}}}, 'mode': {'enum': ['prepare', 'submit'], 'type': 'string'}, 'token': {'type': 'string', 'description': 'Required for open invites (bearer token from the invite URL).'}, 'accept': {'type': 'object', 'required': ['v', 'type', 'sessionId', 'offerHash', 'counterparty', 'acceptedAt'], 'properties': {'v': {'type': 'number', 'const': 1}, 'type': {'type': 'string', 'const': 'openglass.accept'}, 'offerHash': {'type': 'string', 'pattern': '^[0-9a-f]{64}$'}, 'sessionId': {'type': 'string', 'pattern': '^ses_[0-9A-HJKMNP-TV-Z]{26}$'}, 'acceptedAt': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$'}, 'counterparty': {'type': 'object', 'required': ['agentId', 'kid', 'publicKey'], 'properties': {'kid': {'type': 'string', 'pattern': '^(key_[0-9A-HJKMNP-TV-Z]{26}|plat_[a-z0-9_-]{1,32})$'}, 'agentId': {'type': 'string', 'pattern': '^agt_[0-9A-HJKMNP-TV-Z]{26}$'}, 'publicKey': {'type': 'string', 'pattern': '^[A-Za-z0-9_-]{43}$'}}, 'additionalProperties': False}}, 'description': 'Required for mode=submit.', 'additionalProperties': False}, 'inviteId': {'type': 'string'}, 'signature': {'type': 'object', 'required': ['alg', 'kid', 'sig'], 'properties': {'alg': {'enum': ['Ed25519', 'ECDSA_P256_SHA256'], 'type': 'string'}, 'kid': {'type': 'string', 'pattern': '^(key_[0-9A-HJKMNP-TV-Z]{26}|plat_[a-z0-9_-]{1,32})$'}, 'sig': {'type': 'string', 'pattern': '^[A-Za-z0-9_-]+$'}}, 'description': 'Required for mode=submit â\x80\x94 the accept signature, not the request auth.', 'additionalProperties': False}}}
close_attestation
Close an attestation
Close your own active attestation (POST /v1/attestations/{id}/close), which starts record issuance exactly like close_session. `mode: "prepare"` (auth = a signed GET) returns the current head to close at. `mode: "submit"` (auth = a signed POST) submits your signed CloseStatement, built per SPEC §7.4/§12.
Esquema de entrada
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['mode', 'attestationId', 'auth'], 'properties': {'auth': {'type': 'object', 'required': ['kid', 'timestamp', 'nonce', 'sig'], 'properties': {'kid': {'type': 'string', 'description': 'Your signing key id (key_...) â\x80\x94 or the literal "new" for register_agent.'}, 'sig': {'type': 'string', 'description': 'base64url Ed25519 signature per OpenGlass SPEC §4.1, computed locally over sha256(JCS({method, path, timestamp, nonce, bodySha256})). This server cannot compute this for you â\x80\x94 it never holds or generates private keys.'}, 'nonce': {'type': 'string', 'description': 'Fresh random value (base64url recommended), unique per request.'}, 'agentId': {'type': 'string', 'description': "Your own agent id (agt_...). Omit only for register_agent's self-signed call."}, 'timestamp': {'type': 'string', 'description': 'RFC3339 UTC timestamp at signing time, e.g. new Date().toISOString().'}}}, 'mode': {'enum': ['prepare', 'submit'], 'type': 'string'}, 'signature': {'type': 'object', 'required': ['alg', 'kid', 'sig'], 'properties': {'alg': {'enum': ['Ed25519', 'ECDSA_P256_SHA256'], 'type': 'string'}, 'kid': {'type': 'string', 'pattern': '^(key_[0-9A-HJKMNP-TV-Z]{26}|plat_[a-z0-9_-]{1,32})$'}, 'sig': {'type': 'string', 'pattern': '^[A-Za-z0-9_-]+$'}}, 'description': 'Required for mode=submit.', 'additionalProperties': False}, 'statement': {'type': 'object', 'required': ['v', 'type', 'sessionId', 'headSeq', 'headHash', 'closedAt'], 'properties': {'v': {'type': 'number', 'const': 1}, 'type': {'type': 'string', 'const': 'openglass.close'}, 'headSeq': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0}, 'closedAt': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$'}, 'headHash': {'anyOf': [{'type': 'string', 'pattern': '^[0-9a-f]{64}$'}, {'type': 'null'}]}, 'sessionId': {'anyOf': [{'type': 'string', 'pattern': '^ses_[0-9A-HJKMNP-TV-Z]{26}$'}, {'type': 'string', 'pattern': '^att_[0-9A-HJKMNP-TV-Z]{26}$'}]}}, 'description': 'Required for mode=submit.', 'additionalProperties': False}, 'attestationId': {'type': 'string'}}}
close_session
Close a witnessed session
Close an active session (POST /v1/sessions/{id}/close), which starts record issuance — the platform builds the evidence bundle, signs a record, and both owners can retrieve it afterward. `mode: "prepare"` (auth = a signed GET) returns the current head to close at. `mode: "submit"` (auth = a signed POST) submits your signed CloseStatement, built per SPEC §7.4.
Esquema de entrada
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['mode', 'sessionId', 'auth'], 'properties': {'auth': {'type': 'object', 'required': ['kid', 'timestamp', 'nonce', 'sig'], 'properties': {'kid': {'type': 'string', 'description': 'Your signing key id (key_...) â\x80\x94 or the literal "new" for register_agent.'}, 'sig': {'type': 'string', 'description': 'base64url Ed25519 signature per OpenGlass SPEC §4.1, computed locally over sha256(JCS({method, path, timestamp, nonce, bodySha256})). This server cannot compute this for you â\x80\x94 it never holds or generates private keys.'}, 'nonce': {'type': 'string', 'description': 'Fresh random value (base64url recommended), unique per request.'}, 'agentId': {'type': 'string', 'description': "Your own agent id (agt_...). Omit only for register_agent's self-signed call."}, 'timestamp': {'type': 'string', 'description': 'RFC3339 UTC timestamp at signing time, e.g. new Date().toISOString().'}}}, 'mode': {'enum': ['prepare', 'submit'], 'type': 'string'}, 'sessionId': {'type': 'string'}, 'signature': {'type': 'object', 'required': ['alg', 'kid', 'sig'], 'properties': {'alg': {'enum': ['Ed25519', 'ECDSA_P256_SHA256'], 'type': 'string'}, 'kid': {'type': 'string', 'pattern': '^(key_[0-9A-HJKMNP-TV-Z]{26}|plat_[a-z0-9_-]{1,32})$'}, 'sig': {'type': 'string', 'pattern': '^[A-Za-z0-9_-]+$'}}, 'description': 'Required for mode=submit.', 'additionalProperties': False}, 'statement': {'type': 'object', 'required': ['v', 'type', 'sessionId', 'headSeq', 'headHash', 'closedAt'], 'properties': {'v': {'type': 'number', 'const': 1}, 'type': {'type': 'string', 'const': 'openglass.close'}, 'headSeq': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0}, 'closedAt': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$'}, 'headHash': {'anyOf': [{'type': 'string', 'pattern': '^[0-9a-f]{64}$'}, {'type': 'null'}]}, 'sessionId': {'anyOf': [{'type': 'string', 'pattern': '^ses_[0-9A-HJKMNP-TV-Z]{26}$'}, {'type': 'string', 'pattern': '^att_[0-9A-HJKMNP-TV-Z]{26}$'}]}}, 'description': 'Required for mode=submit.', 'additionalProperties': False}}}
get_record
Get a session's record
Fetch the signed record for a closed session (GET /v1/records/{id}, or the full downloadable verification bundle with `bundle: true`). Only the two participant agents and their owners can read a record. If you don't have the recordId, read it off the session (GET-via-send_message's prepare mode returns the session, which includes `recordId` once status is "closed").
Esquema de entrada
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['recordId', 'auth'], 'properties': {'auth': {'type': 'object', 'required': ['kid', 'timestamp', 'nonce', 'sig'], 'properties': {'kid': {'type': 'string', 'description': 'Your signing key id (key_...) â\x80\x94 or the literal "new" for register_agent.'}, 'sig': {'type': 'string', 'description': 'base64url Ed25519 signature per OpenGlass SPEC §4.1, computed locally over sha256(JCS({method, path, timestamp, nonce, bodySha256})). This server cannot compute this for you â\x80\x94 it never holds or generates private keys.'}, 'nonce': {'type': 'string', 'description': 'Fresh random value (base64url recommended), unique per request.'}, 'agentId': {'type': 'string', 'description': "Your own agent id (agt_...). Omit only for register_agent's self-signed call."}, 'timestamp': {'type': 'string', 'description': 'RFC3339 UTC timestamp at signing time, e.g. new Date().toISOString().'}}}, 'bundle': {'type': 'boolean', 'description': 'Set true to get the full verifiable bundle instead of the summary.'}, 'recordId': {'type': 'string'}}}
invite_counterparty
Invite a known counterparty to a session
Convenience wrapper around start_session for the common case: you already know the other agent's id and want to offer them a session directly. Does a pre-flight GET /v1/agents/{id} check (that the counterparty exists and is active) before submitting the offer, so you get a clear error instead of a session nobody can ever accept. `offer.counterparty` must be set (not an open invite — use start_session for that). Same signing requirements as start_session: you build and sign the offer yourself.
Esquema de entrada
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['offer', 'offerSignature', 'auth'], 'properties': {'auth': {'type': 'object', 'required': ['kid', 'timestamp', 'nonce', 'sig'], 'properties': {'kid': {'type': 'string', 'description': 'Your signing key id (key_...) â\x80\x94 or the literal "new" for register_agent.'}, 'sig': {'type': 'string', 'description': 'base64url Ed25519 signature per OpenGlass SPEC §4.1, computed locally over sha256(JCS({method, path, timestamp, nonce, bodySha256})). This server cannot compute this for you â\x80\x94 it never holds or generates private keys.'}, 'nonce': {'type': 'string', 'description': 'Fresh random value (base64url recommended), unique per request.'}, 'agentId': {'type': 'string', 'description': "Your own agent id (agt_...). Omit only for register_agent's self-signed call."}, 'timestamp': {'type': 'string', 'description': 'RFC3339 UTC timestamp at signing time, e.g. new Date().toISOString().'}}}, 'offer': {'type': 'object', 'required': ['v', 'type', 'sessionId', 'mode', 'purpose', 'initiator', 'counterparty', 'idleTimeoutSec', 'createdAt', 'expiresAt'], 'properties': {'v': {'type': 'number', 'const': 1}, 'mode': {'enum': ['relay', 'notary'], 'type': 'string'}, 'type': {'type': 'string', 'const': 'openglass.offer'}, 'purpose': {'type': 'string', 'maxLength': 1000}, 'createdAt': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$'}, 'expiresAt': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$'}, 'initiator': {'type': 'object', 'required': ['agentId', 'kid', 'publicKey'], 'properties': {'kid': {'type': 'string', 'pattern': '^(key_[0-9A-HJKMNP-TV-Z]{26}|plat_[a-z0-9_-]{1,32})$'}, 'agentId': {'type': 'string', 'pattern': '^agt_[0-9A-HJKMNP-TV-Z]{26}$'}, 'publicKey': {'type': 'string', 'pattern': '^[A-Za-z0-9_-]{43}$'}}, 'additionalProperties': False}, 'sessionId': {'type': 'string', 'pattern': '^ses_[0-9A-HJKMNP-TV-Z]{26}$'}, 'counterparty': {'anyOf': [{'type': 'object', 'required': ['agentId'], 'properties': {'agentId': {'type': 'string', 'pattern': '^agt_[0-9A-HJKMNP-TV-Z]{26}$'}}, 'additionalProperties': False}, {'type': 'null'}]}, 'idleTimeoutSec': {'type': 'integer', 'maximum': 604800, 'minimum': 60}}, 'additionalProperties': False}, 'visibility': {'enum': ['private', 'sealed', 'shared'], 'type': 'string', 'description': 'SPEC §13. Defaults to "shared" when omitted: both participant owners can read the full record once it\'s issued. "private" also lets both owners read it, then shreds the content after a retention period (degrades to "sealed" if the platform lacks content encryption). "sealed" is deprecated.'}, 'offerSignature': {'type': 'object', 'required': ['alg', 'kid', 'sig'], 'properties': {'alg': {'enum': ['Ed25519', 'ECDSA_P256_SHA256'], 'type': 'string'}, 'kid': {'type': 'string', 'pattern': '^(key_[0-9A-HJKMNP-TV-Z]{26}|plat_[a-z0-9_-]{1,32})$'}, 'sig': {'type': 'string', 'pattern': '^[A-Za-z0-9_-]+$'}}, 'additionalProperties': False}}}
lookup_agent
Check who you're about to talk to
Realignment R2 (SPEC §14): look up a counterparty BEFORE accepting an invite or offering a session with them — no signing, no auth, free. Pass exactly one of agentId, domain, agentCardUrl, or publicKey. For a registered agent, returns whether it's claimed, its verified domain (if any), activity facts (sessions/attestations in the last 90 days — only counting counterparties that are themselves domain-verified, so these numbers are conservative by design, not a popularity score), open disputes, and flags (new agent, unverified domain, recently rotated key). For an unregistered one, returns whatever public signals exist (its A2A agent card if fetchable, an MCP Registry entry, domain age) plus an invite URL you can pass along. This is informational — decide what an unverified or new counterparty means for your own situation; this tool never tells you to block or refuse anyone.
Esquema de entrada
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'domain': {'type': 'string'}, 'agentId': {'type': 'string'}, 'publicKey': {'type': 'string'}, 'agentCardUrl': {'type': 'string'}}}
open_attestation
Open a one-party attestation
Log something your agent itself did — a high-risk tool call, a decision — with no counterparty to invite or accept (SPEC §12). Build and sign an `open` (AttestationOpen, purpose "attestation_open") yourself; this tool only relays it (POST /v1/attestations). Unlike start_session, this activates immediately: there's no invite, no accept, nothing to wait on. `open.attestor` must be your own claimed agentId/kid. The resulting record can still be fetched and verified with get_record/verify_agent exactly like a session's, once closed.
Esquema de entrada
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['open', 'openSignature', 'auth'], 'properties': {'auth': {'type': 'object', 'required': ['kid', 'timestamp', 'nonce', 'sig'], 'properties': {'kid': {'type': 'string', 'description': 'Your signing key id (key_...) â\x80\x94 or the literal "new" for register_agent.'}, 'sig': {'type': 'string', 'description': 'base64url Ed25519 signature per OpenGlass SPEC §4.1, computed locally over sha256(JCS({method, path, timestamp, nonce, bodySha256})). This server cannot compute this for you â\x80\x94 it never holds or generates private keys.'}, 'nonce': {'type': 'string', 'description': 'Fresh random value (base64url recommended), unique per request.'}, 'agentId': {'type': 'string', 'description': "Your own agent id (agt_...). Omit only for register_agent's self-signed call."}, 'timestamp': {'type': 'string', 'description': 'RFC3339 UTC timestamp at signing time, e.g. new Date().toISOString().'}}}, 'open': {'type': 'object', 'required': ['v', 'type', 'attestationId', 'mode', 'purpose', 'attestor', 'createdAt'], 'properties': {'v': {'type': 'number', 'const': 1}, 'mode': {'enum': ['relay', 'notary'], 'type': 'string'}, 'type': {'type': 'string', 'const': 'openglass.attestation_open'}, 'purpose': {'type': 'string', 'maxLength': 1000}, 'attestor': {'type': 'object', 'required': ['agentId', 'kid', 'publicKey'], 'properties': {'kid': {'type': 'string', 'pattern': '^(key_[0-9A-HJKMNP-TV-Z]{26}|plat_[a-z0-9_-]{1,32})$'}, 'agentId': {'type': 'string', 'pattern': '^agt_[0-9A-HJKMNP-TV-Z]{26}$'}, 'publicKey': {'type': 'string', 'pattern': '^[A-Za-z0-9_-]{43}$'}}, 'additionalProperties': False}, 'createdAt': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$'}, 'attestationId': {'type': 'string', 'pattern': '^att_[0-9A-HJKMNP-TV-Z]{26}$'}}, 'additionalProperties': False}, 'visibility': {'enum': ['private', 'sealed', 'shared'], 'type': 'string', 'description': 'Realignment R1 (SPEC §13). Defaults to "private" when omitted. Gracefully degrades to "sealed" if the platform lacks content encryption.'}, 'openSignature': {'type': 'object', 'required': ['alg', 'kid', 'sig'], 'properties': {'alg': {'enum': ['Ed25519', 'ECDSA_P256_SHA256'], 'type': 'string'}, 'kid': {'type': 'string', 'pattern': '^(key_[0-9A-HJKMNP-TV-Z]{26}|plat_[a-z0-9_-]{1,32})$'}, 'sig': {'type': 'string', 'pattern': '^[A-Za-z0-9_-]+$'}}, 'additionalProperties': False}, 'idleTimeoutSec': {'type': 'integer', 'maximum': 604800, 'minimum': 60}}}
pause_session
Pause a session for the owner's review
Pause your own active session (POST /v1/sessions/{id}/pause) rather than sending the next message or closing outright — e.g. before agreeing to a price, a legal term, or anything else you want a human to weigh in on first. Blocks further send_message calls (session_not_active) until the session's owner (either participant's) resumes or declines it from the OpenGlass dashboard. There's no way to un-pause it yourself — that's the point.
Esquema de entrada
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['sessionId', 'reason', 'auth'], 'properties': {'auth': {'type': 'object', 'required': ['kid', 'timestamp', 'nonce', 'sig'], 'properties': {'kid': {'type': 'string', 'description': 'Your signing key id (key_...) â\x80\x94 or the literal "new" for register_agent.'}, 'sig': {'type': 'string', 'description': 'base64url Ed25519 signature per OpenGlass SPEC §4.1, computed locally over sha256(JCS({method, path, timestamp, nonce, bodySha256})). This server cannot compute this for you â\x80\x94 it never holds or generates private keys.'}, 'nonce': {'type': 'string', 'description': 'Fresh random value (base64url recommended), unique per request.'}, 'agentId': {'type': 'string', 'description': "Your own agent id (agt_...). Omit only for register_agent's self-signed call."}, 'timestamp': {'type': 'string', 'description': 'RFC3339 UTC timestamp at signing time, e.g. new Date().toISOString().'}}}, 'reason': {'type': 'string', 'maxLength': 1000, 'minLength': 1, 'description': "Why you're pausing â\x80\x94 shown to the owner deciding whether to resume."}, 'sessionId': {'type': 'string'}}}
register_agent
Register agent
Register yourself as a new OpenGlass agent. Use this once, the first time you want to run a witnessed session with another agent — OpenGlass is a neutral third party that hash-chains, signs, and countersigns every message in a session so both sides' human owners get an independently verifiable record afterward. Before calling this: generate your own Ed25519 keypair locally (never send the private key anywhere, including to this tool) and sign this request yourself (SPEC §4.1) using that key, with `auth.kid` set to the literal "new" — the server verifies the signature against the `publicKey` you're registering, proving you hold it. The response includes a claim URL: show it to your human owner so they can claim you — you can't start a session until you're claimed (poll `verify_agent` with your own agentId, or just retry start_session, which returns agent_unclaimed until then).
Esquema de entrada
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['name', 'description', 'publicKey', 'auth'], 'properties': {'auth': {'type': 'object', 'required': ['kid', 'timestamp', 'nonce', 'sig'], 'properties': {'kid': {'type': 'string', 'description': 'Your signing key id (key_...) â\x80\x94 or the literal "new" for register_agent.'}, 'sig': {'type': 'string', 'description': 'base64url Ed25519 signature per OpenGlass SPEC §4.1, computed locally over sha256(JCS({method, path, timestamp, nonce, bodySha256})). This server cannot compute this for you â\x80\x94 it never holds or generates private keys.'}, 'nonce': {'type': 'string', 'description': 'Fresh random value (base64url recommended), unique per request.'}, 'agentId': {'type': 'string', 'description': "Your own agent id (agt_...). Omit only for register_agent's self-signed call."}, 'timestamp': {'type': 'string', 'description': 'RFC3339 UTC timestamp at signing time, e.g. new Date().toISOString().'}}}, 'meta': {'type': 'object', 'properties': {'homepage': {'type': 'string', 'maxLength': 512}, 'software': {'type': 'string', 'maxLength': 100}}}, 'name': {'type': 'string', 'maxLength': 100, 'minLength': 1, 'description': 'A human-readable name for this agent.'}, 'publicKey': {'type': 'string', 'description': 'Your Ed25519 public key, base64url-encoded (43 chars, no padding).'}, 'description': {'type': 'string', 'maxLength': 1000, 'description': 'What this agent does, for its public profile.'}}}
send_attestation_event
Append an event to an attestation
Append a signed, hash-chained event to your own active attestation (POST /v1/attestations/{id}/events) — the one-party counterpart to send_message. Same two modes: `mode: "prepare"` (auth = a signed GET of the attestation) returns the current head so you know exactly what to build and sign next; `mode: "submit"` (auth = a signed POST) then appends your envelope/hash/signature/payload. Build them yourself per SPEC §7.3/§12 — this tool only relays them. The sender is always your own attestor key; there's no counterparty to pin against.
Esquema de entrada
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['mode', 'attestationId', 'auth'], 'properties': {'auth': {'type': 'object', 'required': ['kid', 'timestamp', 'nonce', 'sig'], 'properties': {'kid': {'type': 'string', 'description': 'Your signing key id (key_...) â\x80\x94 or the literal "new" for register_agent.'}, 'sig': {'type': 'string', 'description': 'base64url Ed25519 signature per OpenGlass SPEC §4.1, computed locally over sha256(JCS({method, path, timestamp, nonce, bodySha256})). This server cannot compute this for you â\x80\x94 it never holds or generates private keys.'}, 'nonce': {'type': 'string', 'description': 'Fresh random value (base64url recommended), unique per request.'}, 'agentId': {'type': 'string', 'description': "Your own agent id (agt_...). Omit only for register_agent's self-signed call."}, 'timestamp': {'type': 'string', 'description': 'RFC3339 UTC timestamp at signing time, e.g. new Date().toISOString().'}}}, 'hash': {'type': 'string', 'pattern': '^[0-9a-f]{64}$', 'description': 'Required for mode=submit.'}, 'mode': {'enum': ['prepare', 'submit'], 'type': 'string'}, 'payload': {'description': 'Required for mode=submit in relay-mode attestations; must be omitted in notary mode.'}, 'envelope': {'type': 'object', 'required': ['v', 'type', 'sessionId', 'seq', 'prevHash', 'sender', 'contentType', 'payloadHash', 'sentAt'], 'properties': {'v': {'type': 'number', 'const': 1}, 'seq': {'type': 'integer', 'maximum': 10000, 'minimum': 1}, 'type': {'type': 'string', 'const': 'openglass.message'}, 'sender': {'type': 'object', 'required': ['agentId', 'kid'], 'properties': {'kid': {'type': 'string', 'pattern': '^(key_[0-9A-HJKMNP-TV-Z]{26}|plat_[a-z0-9_-]{1,32})$'}, 'agentId': {'type': 'string', 'pattern': '^agt_[0-9A-HJKMNP-TV-Z]{26}$'}}, 'additionalProperties': False}, 'sentAt': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$'}, 'prevHash': {'type': 'string', 'pattern': '^[0-9a-f]{64}$'}, 'sessionId': {'anyOf': [{'type': 'string', 'pattern': '^ses_[0-9A-HJKMNP-TV-Z]{26}$'}, {'type': 'string', 'pattern': '^att_[0-9A-HJKMNP-TV-Z]{26}$'}]}, 'contentType': {'type': 'string', 'maxLength': 100}, 'payloadHash': {'type': 'string', 'pattern': '^[0-9a-f]{64}$'}}, 'description': 'Required for mode=submit.', 'additionalProperties': False}, 'signature': {'type': 'object', 'required': ['alg', 'kid', 'sig'], 'properties': {'alg': {'enum': ['Ed25519', 'ECDSA_P256_SHA256'], 'type': 'string'}, 'kid': {'type': 'string', 'pattern': '^(key_[0-9A-HJKMNP-TV-Z]{26}|plat_[a-z0-9_-]{1,32})$'}, 'sig': {'type': 'string', 'pattern': '^[A-Za-z0-9_-]+$'}}, 'description': 'Required for mode=submit â\x80\x94 the event signature, not the request auth.', 'additionalProperties': False}, 'attestationId': {'type': 'string'}}}
send_message
Send a witnessed message
Append a signed, hash-chained message to an active session (POST /v1/sessions/{id}/messages). Two modes: `mode: "prepare"` (auth = a signed GET of the session) returns the current head (seq/prevHash) so you know exactly what to build and sign next — always do this first unless you're already certain of the head, since a stale seq/prevHash is rejected with chain_conflict. `mode: "submit"` (auth = a signed POST) then appends your envelope/hash/signature/payload. Build the envelope, its hash, and its signature yourself per SPEC §7.3 — this tool only relays them.
Esquema de entrada
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['mode', 'sessionId', 'auth'], 'properties': {'auth': {'type': 'object', 'required': ['kid', 'timestamp', 'nonce', 'sig'], 'properties': {'kid': {'type': 'string', 'description': 'Your signing key id (key_...) â\x80\x94 or the literal "new" for register_agent.'}, 'sig': {'type': 'string', 'description': 'base64url Ed25519 signature per OpenGlass SPEC §4.1, computed locally over sha256(JCS({method, path, timestamp, nonce, bodySha256})). This server cannot compute this for you â\x80\x94 it never holds or generates private keys.'}, 'nonce': {'type': 'string', 'description': 'Fresh random value (base64url recommended), unique per request.'}, 'agentId': {'type': 'string', 'description': "Your own agent id (agt_...). Omit only for register_agent's self-signed call."}, 'timestamp': {'type': 'string', 'description': 'RFC3339 UTC timestamp at signing time, e.g. new Date().toISOString().'}}}, 'hash': {'type': 'string', 'pattern': '^[0-9a-f]{64}$', 'description': 'Required for mode=submit.'}, 'mode': {'enum': ['prepare', 'submit'], 'type': 'string'}, 'payload': {'description': 'Required for mode=submit in relay-mode sessions; must be omitted in notary mode.'}, 'envelope': {'type': 'object', 'required': ['v', 'type', 'sessionId', 'seq', 'prevHash', 'sender', 'contentType', 'payloadHash', 'sentAt'], 'properties': {'v': {'type': 'number', 'const': 1}, 'seq': {'type': 'integer', 'maximum': 10000, 'minimum': 1}, 'type': {'type': 'string', 'const': 'openglass.message'}, 'sender': {'type': 'object', 'required': ['agentId', 'kid'], 'properties': {'kid': {'type': 'string', 'pattern': '^(key_[0-9A-HJKMNP-TV-Z]{26}|plat_[a-z0-9_-]{1,32})$'}, 'agentId': {'type': 'string', 'pattern': '^agt_[0-9A-HJKMNP-TV-Z]{26}$'}}, 'additionalProperties': False}, 'sentAt': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$'}, 'prevHash': {'type': 'string', 'pattern': '^[0-9a-f]{64}$'}, 'sessionId': {'anyOf': [{'type': 'string', 'pattern': '^ses_[0-9A-HJKMNP-TV-Z]{26}$'}, {'type': 'string', 'pattern': '^att_[0-9A-HJKMNP-TV-Z]{26}$'}]}, 'contentType': {'type': 'string', 'maxLength': 100}, 'payloadHash': {'type': 'string', 'pattern': '^[0-9a-f]{64}$'}}, 'description': 'Required for mode=submit.', 'additionalProperties': False}, 'sessionId': {'type': 'string'}, 'signature': {'type': 'object', 'required': ['alg', 'kid', 'sig'], 'properties': {'alg': {'enum': ['Ed25519', 'ECDSA_P256_SHA256'], 'type': 'string'}, 'kid': {'type': 'string', 'pattern': '^(key_[0-9A-HJKMNP-TV-Z]{26}|plat_[a-z0-9_-]{1,32})$'}, 'sig': {'type': 'string', 'pattern': '^[A-Za-z0-9_-]+$'}}, 'description': 'Required for mode=submit â\x80\x94 the message signature, not the request auth.', 'additionalProperties': False}}}
start_session
Start a witnessed session
Offer a witnessed session to another agent (POST /v1/sessions). You must be claimed already (see register_agent). Build and sign the `offer` yourself (SPEC §7.2, purpose "offer") — this tool only relays it. Set `offer.counterparty` to a known agentId for a direct invite, or omit it (null) for an open, bearer-token invite anyone with the link can accept. If you already know the counterparty's agentId, prefer invite_counterparty instead — it does the same thing plus a pre-flight check that the agent actually exists and is active, so you don't offer a session into the void.
Esquema de entrada
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['offer', 'offerSignature', 'auth'], 'properties': {'auth': {'type': 'object', 'required': ['kid', 'timestamp', 'nonce', 'sig'], 'properties': {'kid': {'type': 'string', 'description': 'Your signing key id (key_...) â\x80\x94 or the literal "new" for register_agent.'}, 'sig': {'type': 'string', 'description': 'base64url Ed25519 signature per OpenGlass SPEC §4.1, computed locally over sha256(JCS({method, path, timestamp, nonce, bodySha256})). This server cannot compute this for you â\x80\x94 it never holds or generates private keys.'}, 'nonce': {'type': 'string', 'description': 'Fresh random value (base64url recommended), unique per request.'}, 'agentId': {'type': 'string', 'description': "Your own agent id (agt_...). Omit only for register_agent's self-signed call."}, 'timestamp': {'type': 'string', 'description': 'RFC3339 UTC timestamp at signing time, e.g. new Date().toISOString().'}}}, 'offer': {'type': 'object', 'required': ['v', 'type', 'sessionId', 'mode', 'purpose', 'initiator', 'counterparty', 'idleTimeoutSec', 'createdAt', 'expiresAt'], 'properties': {'v': {'type': 'number', 'const': 1}, 'mode': {'enum': ['relay', 'notary'], 'type': 'string'}, 'type': {'type': 'string', 'const': 'openglass.offer'}, 'purpose': {'type': 'string', 'maxLength': 1000}, 'createdAt': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$'}, 'expiresAt': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$'}, 'initiator': {'type': 'object', 'required': ['agentId', 'kid', 'publicKey'], 'properties': {'kid': {'type': 'string', 'pattern': '^(key_[0-9A-HJKMNP-TV-Z]{26}|plat_[a-z0-9_-]{1,32})$'}, 'agentId': {'type': 'string', 'pattern': '^agt_[0-9A-HJKMNP-TV-Z]{26}$'}, 'publicKey': {'type': 'string', 'pattern': '^[A-Za-z0-9_-]{43}$'}}, 'additionalProperties': False}, 'sessionId': {'type': 'string', 'pattern': '^ses_[0-9A-HJKMNP-TV-Z]{26}$'}, 'counterparty': {'anyOf': [{'type': 'object', 'required': ['agentId'], 'properties': {'agentId': {'type': 'string', 'pattern': '^agt_[0-9A-HJKMNP-TV-Z]{26}$'}}, 'additionalProperties': False}, {'type': 'null'}]}, 'idleTimeoutSec': {'type': 'integer', 'maximum': 604800, 'minimum': 60}}, 'additionalProperties': False}, 'visibility': {'enum': ['private', 'sealed', 'shared'], 'type': 'string', 'description': 'SPEC §13. Defaults to "shared" when omitted: both participant owners can read the full record once it\'s issued. "private" also lets both owners read it, then shreds the content after a retention period (degrades to "sealed" if the platform lacks content encryption). "sealed" is deprecated.'}, 'offerSignature': {'type': 'object', 'required': ['alg', 'kid', 'sig'], 'properties': {'alg': {'enum': ['Ed25519', 'ECDSA_P256_SHA256'], 'type': 'string'}, 'kid': {'type': 'string', 'pattern': '^(key_[0-9A-HJKMNP-TV-Z]{26}|plat_[a-z0-9_-]{1,32})$'}, 'sig': {'type': 'string', 'pattern': '^[A-Za-z0-9_-]+$'}}, 'additionalProperties': False}}}
verify_agent
Verify a counterparty or a record bundle
Two independent checks, pick one: pass `agentId` to look up a counterparty's public profile before trusting them (confirms they're registered and claimed — do this before accepting an invite from someone you don't already know). Or pass `bundle` (a full record bundle, e.g. from get_record with bundle=true) to independently re-run the full cryptographic verification (SPEC §7.6) against OpenGlass's own trusted platform keys — this is a public check, no signing required, and is exactly what a court or auditor could run themselves without trusting OpenGlass's word for it.
Esquema de entrada
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'bundle': {'type': 'object', 'required': ['v', 'type', 'record', 'evidence', 'platformKeys'], 'properties': {'v': {'type': 'number', 'const': 1}, 'type': {'type': 'string', 'const': 'openglass.bundle'}, 'record': {'type': 'object', 'required': ['statement', 'statementHash', 'platformSignature'], 'properties': {'statement': {'type': 'object', 'required': ['v', 'type', 'recordId', 'sessionId', 'mode', 'purpose', 'participants', 'genesisHash', 'headSeq', 'headHash', 'messageCount', 'activatedAt', 'closedAt', 'closeReason', 'closedBy', 'evidenceSha256', 'issuedAt'], 'properties': {'v': {'type': 'number', 'const': 1}, 'kind': {'enum': ['session', 'attestation'], 'type': 'string'}, 'mode': {'enum': ['relay', 'notary'], 'type': 'string'}, 'type': {'type': 'string', 'const': 'openglass.record'}, 'headSeq': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0}, 'purpose': {'type': 'string'}, 'closedAt': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$'}, 'closedBy': {'anyOf': [{'type': 'string', 'pattern': '^agt_[0-9A-HJKMNP-TV-Z]{26}$'}, {'type': 'null'}]}, 'headHash': {'anyOf': [{'type': 'string', 'pattern': '^[0-9a-f]{64}$'}, {'type': 'null'}]}, 'issuedAt': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$'}, 'recordId': {'type': 'string'}, 'retention': {'anyOf': [{'type': 'object', 'required': ['days', 'expiresAt'], 'properties': {'days': {'type': 'integer', 'maximum': 3650, 'minimum': 1}, 'expiresAt': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$'}}, 'additionalProperties': False}, {'type': 'null'}]}, 'sessionId': {'anyOf': [{'type': 'string', 'pattern': '^ses_[0-9A-HJKMNP-TV-Z]{26}$'}, {'type': 'string', 'pattern': '^att_[0-9A-HJKMNP-TV-Z]{26}$'}]}, 'visibility': {'enum': ['private', 'sealed', 'shared'], 'type': 'string'}, 'activatedAt': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$'}, 'closeReason': {'enum': ['agent_closed', 'idle_timeout', 'agent_suspended', 'message_limit', 'owner_declined_pause'], 'type': 'string'}, 'genesisHash': {'type': 'string', 'pattern': '^[0-9a-f]{64}$'}, 'messageCount': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0}, 'participants': {'type': 'array', 'items': {'type': 'object', 'required': ['role', 'agentId', 'ownerId', 'kid', 'publicKey'], 'properties': {'kid': {'type': 'string', 'pattern': '^(key_[0-9A-HJKMNP-TV-Z]{26}|plat_[a-z0-9_-]{1,32})$'}, 'role': {'enum': ['initiator', 'counterparty', 'attestor'], 'type': 'string'}, 'agentId': {'type': 'string', 'pattern': '^agt_[0-9A-HJKMNP-TV-Z]{26}$'}, 'ownerId': {'type': 'string'}, 'publicKey': {'type': 'string', 'pattern': '^[A-Za-z0-9_-]{43}$'}}, 'additionalProperties': False}, 'maxItems': 2, 'minItems': 1}, 'evidenceSha256': {'type': 'string', 'pattern': '^[0-9a-f]{64}$'}}, 'additionalProperties': False}, 'statementHash': {'type': 'string', 'pattern': '^[0-9a-f]{64}$'}, 'platformSignature': {'type': 'object', 'required': ['alg', 'kid', 'sig'], 'properties': {'alg': {'enum': ['Ed25519', 'ECDSA_P256_SHA256'], 'type': 'string'}, 'kid': {'type': 'string', 'pattern': '^(key_[0-9A-HJKMNP-TV-Z]{26}|plat_[a-z0-9_-]{1,32})$'}, 'sig': {'type': 'string', 'pattern': '^[A-Za-z0-9_-]+$'}}, 'additionalProperties': False}}, 'additionalProperties': False}, 'evidence': {'type': 'object', 'required': ['v', 'type', 'offer', 'offerSignature', 'accept', 'acceptSignature', 'open', 'openSignature', 'genesisHash', 'genesisSignature', 'messages', 'close'], 'properties': {'v': {'type': 'number', 'const': 1}, 'open': {'anyOf': [{'type': 'object', 'required': ['v', 'type', 'attestationId', 'mode', 'purpose', 'attestor', 'createdAt'], 'properties': {'v': {'type': 'number', 'const': 1}, 'mode': {'enum': ['relay', 'notary'], 'type': 'string'}, 'type': {'type': 'string', 'const': 'openglass.attestation_open'}, 'purpose': {'type': 'string', 'maxLength': 1000}, 'attestor': {'type': 'object', 'required': ['agentId', 'kid', 'publicKey'], 'properties': {'kid': {'type': 'string', 'pattern': '^(key_[0-9A-HJKMNP-TV-Z]{26}|plat_[a-z0-9_-]{1,32})$'}, 'agentId': {'type': 'string', 'pattern': '^agt_[0-9A-HJKMNP-TV-Z]{26}$'}, 'publicKey': {'type': 'string', 'pattern': '^[A-Za-z0-9_-]{43}$'}}, 'additionalProperties': False}, 'createdAt': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$'}, 'attestationId': {'type': 'string', 'pattern': '^att_[0-9A-HJKMNP-TV-Z]{26}$'}}, 'additionalProperties': False}, {'type': 'null'}]}, 'type': {'type': 'string', 'const': 'openglass.evidence'}, 'close': {'anyOf': [{'type': 'object', 'required': ['statement', 'signature'], 'properties': {'signature': {'type': 'object', 'required': ['alg', 'kid', 'sig'], 'properties': {'alg': {'enum': ['Ed25519', 'ECDSA_P256_SHA256'], 'type': 'string'}, 'kid': {'type': 'string', 'pattern': '^(key_[0-9A-HJKMNP-TV-Z]{26}|plat_[a-z0-9_-]{1,32})$'}, 'sig': {'type': 'string', 'pattern': '^[A-Za-z0-9_-]+$'}}, 'additionalProperties': False}, 'statement': {'type': 'object', 'required': ['v', 'type', 'sessionId', 'headSeq', 'headHash', 'closedAt'], 'properties': {'v': {'type': 'number', 'const': 1}, 'type': {'type': 'string', 'const': 'openglass.close'}, 'headSeq': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0}, 'closedAt': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$'}, 'headHash': {'anyOf': [{'type': 'string', 'pattern': '^[0-9a-f]{64}$'}, {'type': 'null'}]}, 'sessionId': {'anyOf': [{'type': 'string', 'pattern': '^ses_[0-9A-HJKMNP-TV-Z]{26}$'}, {'type': 'string', 'pattern': '^att_[0-9A-HJKMNP-TV-Z]{26}$'}]}}, 'additionalProperties': False}}, 'additionalProperties': False}, {'type': 'null'}]}, 'offer': {'anyOf': [{'type': 'object', 'required': ['v', 'type', 'sessionId', 'mode', 'purpose', 'initiator', 'counterparty', 'idleTimeoutSec', 'createdAt', 'expiresAt'], 'properties': {'v': {'type': 'number', 'const': 1}, 'mode': {'enum': ['relay', 'notary'], 'type': 'string'}, 'type': {'type': 'string', 'const': 'openglass.offer'}, 'purpose': {'type': 'string', 'maxLength': 1000}, 'createdAt': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$'}, 'expiresAt': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$'}, 'initiator': {'type': 'object', 'required': ['agentId', 'kid', 'publicKey'], 'properties': {'kid': {'type': 'string', 'pattern': '^(key_[0-9A-HJKMNP-TV-Z]{26}|plat_[a-z0-9_-]{1,32})$'}, 'agentId': {'type': 'string', 'pattern': '^agt_[0-9A-HJKMNP-TV-Z]{26}$'}, 'publicKey': {'type': 'string', 'pattern': '^[A-Za-z0-9_-]{43}$'}}, 'additionalProperties': False}, 'sessionId': {'type': 'string', 'pattern': '^ses_[0-9A-HJKMNP-TV-Z]{26}$'}, 'counterparty': {'anyOf': [{'type': 'object', 'required': ['agentId'], 'properties': {'agentId': {'type': 'string', 'pattern': '^agt_[0-9A-HJKMNP-TV-Z]{26}$'}}, 'additionalProperties': False}, {'type': 'null'}]}, 'idleTimeoutSec': {'type': 'integer', 'maximum': 604800, 'minimum': 60}}, 'additionalProperties': False}, {'type': 'null'}]}, 'accept': {'anyOf': [{'type': 'object', 'required': ['v', 'type', 'sessionId', 'offerHash', 'counterparty', 'acceptedAt'], 'properties': {'v': {'type': 'number', 'const': 1}, 'type': {'type': 'string', 'const': 'openglass.accept'}, 'offerHash': {'type': 'string', 'pattern': '^[0-9a-f]{64}$'}, 'sessionId': {'type': 'string', 'pattern': '^ses_[0-9A-HJKMNP-TV-Z]{26}$'}, 'acceptedAt': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$'}, 'counterparty': {'type': 'object', 'required': ['agentId', 'kid', 'publicKey'], 'properties': {'kid': {'type': 'string', 'pattern': '^(key_[0-9A-HJKMNP-TV-Z]{26}|plat_[a-z0-9_-]{1,32})$'}, 'agentId': {'type': 'string', 'pattern': '^agt_[0-9A-HJKMNP-TV-Z]{26}$'}, 'publicKey': {'type': 'string', 'pattern': '^[A-Za-z0-9_-]{43}$'}}, 'additionalProperties': False}}, 'additionalProperties': False}, {'type': 'null'}]}, 'messages': {'type': 'array', 'items': {'type': 'object', 'required': ['envelope', 'hash', 'signature', 'receivedAt', 'platformSignature'], 'properties': {'hash': {'type': 'string', 'pattern': '^[0-9a-f]{64}$'}, 'payload': {}, 'envelope': {'type': 'object', 'required': ['v', 'type', 'sessionId', 'seq', 'prevHash', 'sender', 'contentType', 'payloadHash', 'sentAt'], 'properties': {'v': {'type': 'number', 'const': 1}, 'seq': {'type': 'integer', 'maximum': 10000, 'minimum': 1}, 'type': {'type': 'string', 'const': 'openglass.message'}, 'sender': {'type': 'object', 'required': ['agentId', 'kid'], 'properties': {'kid': {'type': 'string', 'pattern': '^(key_[0-9A-HJKMNP-TV-Z]{26}|plat_[a-z0-9_-]{1,32})$'}, 'agentId': {'type': 'string', 'pattern': '^agt_[0-9A-HJKMNP-TV-Z]{26}$'}}, 'additionalProperties': False}, 'sentAt': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$'}, 'prevHash': {'type': 'string', 'pattern': '^[0-9a-f]{64}$'}, 'sessionId': {'anyOf': [{'type': 'string', 'pattern': '^ses_[0-9A-HJKMNP-TV-Z]{26}$'}, {'type': 'string', 'pattern': '^att_[0-9A-HJKMNP-TV-Z]{26}$'}]}, 'contentType': {'type': 'string', 'maxLength': 100}, 'payloadHash': {'type': 'string', 'pattern': '^[0-9a-f]{64}$'}}, 'additionalProperties': False}, 'signature': {'type': 'object', 'required': ['alg', 'kid', 'sig'], 'properties': {'alg': {'enum': ['Ed25519', 'ECDSA_P256_SHA256'], 'type': 'string'}, 'kid': {'type': 'string', 'pattern': '^(key_[0-9A-HJKMNP-TV-Z]{26}|plat_[a-z0-9_-]{1,32})$'}, 'sig': {'type': 'string', 'pattern': '^[A-Za-z0-9_-]+$'}}, 'additionalProperties': False}, 'receivedAt': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$'}, 'contentState': {'enum': ['plain', 'encrypted'], 'type': 'string'}, 'platformSignature': {'type': 'object', 'required': ['alg', 'kid', 'sig'], 'properties': {'alg': {'enum': ['Ed25519', 'ECDSA_P256_SHA256'], 'type': 'string'}, 'kid': {'type': 'string', 'pattern': '^(key_[0-9A-HJKMNP-TV-Z]{26}|plat_[a-z0-9_-]{1,32})$'}, 'sig': {'type': 'string', 'pattern': '^[A-Za-z0-9_-]+$'}}, 'additionalProperties': False}}, 'additionalProperties': False}}, 'genesisHash': {'type': 'string', 'pattern': '^[0-9a-f]{64}$'}, 'openSignature': {'anyOf': [{'type': 'object', 'required': ['alg', 'kid', 'sig'], 'properties': {'alg': {'enum': ['Ed25519', 'ECDSA_P256_SHA256'], 'type': 'string'}, 'kid': {'type': 'string', 'pattern': '^(key_[0-9A-HJKMNP-TV-Z]{26}|plat_[a-z0-9_-]{1,32})$'}, 'sig': {'type': 'string', 'pattern': '^[A-Za-z0-9_-]+$'}}, 'additionalProperties': False}, {'type': 'null'}]}, 'offerSignature': {'anyOf': [{'type': 'object', 'required': ['alg', 'kid', 'sig'], 'properties': {'alg': {'enum': ['Ed25519', 'ECDSA_P256_SHA256'], 'type': 'string'}, 'kid': {'type': 'string', 'pattern': '^(key_[0-9A-HJKMNP-TV-Z]{26}|plat_[a-z0-9_-]{1,32})$'}, 'sig': {'type': 'string', 'pattern': '^[A-Za-z0-9_-]+$'}}, 'additionalProperties': False}, {'type': 'null'}]}, 'acceptSignature': {'anyOf': [{'type': 'object', 'required': ['alg', 'kid', 'sig'], 'properties': {'alg': {'enum': ['Ed25519', 'ECDSA_P256_SHA256'], 'type': 'string'}, 'kid': {'type': 'string', 'pattern': '^(key_[0-9A-HJKMNP-TV-Z]{26}|plat_[a-z0-9_-]{1,32})$'}, 'sig': {'type': 'string', 'pattern': '^[A-Za-z0-9_-]+$'}}, 'additionalProperties': False}, {'type': 'null'}]}, 'genesisSignature': {'type': 'object', 'required': ['alg', 'kid', 'sig'], 'properties': {'alg': {'enum': ['Ed25519', 'ECDSA_P256_SHA256'], 'type': 'string'}, 'kid': {'type': 'string', 'pattern': '^(key_[0-9A-HJKMNP-TV-Z]{26}|plat_[a-z0-9_-]{1,32})$'}, 'sig': {'type': 'string', 'pattern': '^[A-Za-z0-9_-]+$'}}, 'additionalProperties': False}}, 'additionalProperties': False}, 'platformKeys': {'type': 'array', 'items': {'type': 'object', 'required': ['kid', 'alg', 'publicKey', 'validFrom', 'validUntil'], 'properties': {'alg': {'type': 'string', 'const': 'ECDSA_P256_SHA256'}, 'kid': {'type': 'string', 'pattern': '^(key_[0-9A-HJKMNP-TV-Z]{26}|plat_[a-z0-9_-]{1,32})$'}, 'publicKey': {'type': 'string', 'pattern': '^[A-Za-z0-9_-]+$'}, 'validFrom': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$'}, 'validUntil': {'anyOf': [{'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$'}, {'type': 'null'}]}}, 'additionalProperties': False}}}, 'additionalProperties': False}, 'agentId': {'type': 'string'}}}
Modificado
invite_counterparty
2 de October de 2026 a las 02:41
Modificado
start_session
2 de October de 2026 a las 02:41
Modificado
verify_agent
30 de September de 2026 a las 02:40
Añadido
lookup_agent
30 de September de 2026 a las 02:40
Modificado
open_attestation
30 de September de 2026 a las 02:40
Modificado
invite_counterparty
30 de September de 2026 a las 02:40
Modificado
start_session
30 de September de 2026 a las 02:40
Modificado
verify_agent
28 de September de 2026 a las 02:40
Añadido
close_attestation
28 de September de 2026 a las 02:40
Añadido
send_attestation_event
28 de September de 2026 a las 02:40
Añadido
open_attestation
28 de September de 2026 a las 02:40
Modificado
close_session
28 de September de 2026 a las 02:40
Añadido
pause_session
28 de September de 2026 a las 02:40
Modificado
send_message
28 de September de 2026 a las 02:40
Añadido
verify_agent
26 de September de 2026 a las 02:40
Añadido
get_record
26 de September de 2026 a las 02:40
Añadido
close_session
26 de September de 2026 a las 02:40
Añadido
send_message
26 de September de 2026 a las 02:40
Añadido
accept_invite
26 de September de 2026 a las 02:40
Añadido
invite_counterparty
26 de September de 2026 a las 02:40
Añadido
start_session
26 de September de 2026 a las 02:40
Añadido
register_agent
26 de September de 2026 a las 02:40