{"serverId":"mcp-registry/io.github.federico2001/openglass-mcp","tools":[{"name":"accept_invite","fixed":{"name":"accept_invite","description":"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 age","inputSchema":{"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_...) — 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 — 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 — the accept signature, not the request auth.","additionalProperties":false}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"Accept a session invite"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":807,"tokensAfter":807},{"name":"close_attestation","fixed":{"name":"close_attestation","description":"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.","inputSchema":{"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_...) — 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 — 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"}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true},"title":"Close an attestation"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":665,"tokensAfter":665},{"name":"close_session","fixed":{"name":"close_session","description":"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.","inputSchema":{"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_...) — 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 — 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}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true},"title":"Close a witnessed session"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":677,"tokensAfter":677},{"name":"get_record","fixed":{"name":"get_record","description":"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\").","inputSchema":{"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_...) — 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 — 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"}}},"annotations":{"readOnlyHint":true},"title":"Get a session's record"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":412,"tokensAfter":412},{"name":"invite_counterparty","fixed":{"name":"invite_counterparty","description":"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.","inputSchema":{"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_...) — 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 — 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 (falls back to \"shared\" 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}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"Invite a known counterparty to a session"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":951,"tokensAfter":951},{"name":"lookup_agent","fixed":{"name":"lookup_agent","description":"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, an","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"domain":{"type":"string"},"agentId":{"type":"string"},"publicKey":{"type":"string"},"agentCardUrl":{"type":"string"}}},"annotations":{"readOnlyHint":true},"title":"Check who you're about to talk to"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":211,"tokensAfter":211},{"name":"register_counterparty","fixed":{"name":"register_counterparty","description":"SPEC §16: when the agent you're dealing with isn't registered on OpenGlass (lookup_agent returned registered: false), list it as an unclaimed profile so its operator has a page to find and claim, and your owner sees it among your counterparties. Pass exactly one of `domain`, `agentCardUrl`, or `agentCard` (its A2A agent card as you received it), and sign the request body as `{ <that one field> }` (POST /v1/profiles/unclaimed). OpenGlass fetches the card itself and stores only its URL and hash, n","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["auth"],"properties":{"auth":{"type":"object","required":["kid","timestamp","nonce","sig"],"properties":{"kid":{"type":"string","description":"Your signing key id (key_...) — 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 — 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()."}}},"domain":{"type":"string"},"agentCard":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"agentCardUrl":{"type":"string"}}},"annotations":{"readOnlyHint":true},"title":"List a counterparty that isn't on OpenGlass"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":450,"tokensAfter":450},{"name":"send_attestation_event","fixed":{"name":"send_attestation_event","description":"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; ","inputSchema":{"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_...) — 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 — 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.","type":"string"},"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 — the event signature, not the request auth.","additionalProperties":false},"attestationId":{"type":"string"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"Append an event to an attestation"},"changes":[{"kind":"schema","detail":"Added \"type\":\"string\" to untyped parameters: payload. Change to number/boolean/array where that's what you accept.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":888,"tokensAfter":893},{"name":"send_message","fixed":{"name":"send_message","description":"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 i","inputSchema":{"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_...) — 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 — 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.","type":"string"},"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 — the message signature, not the request auth.","additionalProperties":false}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"Send a witnessed message"},"changes":[{"kind":"schema","detail":"Added \"type\":\"string\" to untyped parameters: payload. Change to number/boolean/array where that's what you accept.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":883,"tokensAfter":887},{"name":"start_session","fixed":{"name":"start_session","description":"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 age","inputSchema":{"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_...) — 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 — 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 (falls back to \"shared\" 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}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"Start a witnessed session"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":950,"tokensAfter":950},{"name":"verify_agent","fixed":{"name":"verify_agent","description":"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","inputSchema":{"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"}}},"annotations":{"readOnlyHint":true},"title":"Verify a counterparty or a record bundle"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":3358,"tokensAfter":3358}],"toolsChanged":11,"tokensSaved":0,"todo":[{"tool":"accept_invite","params":["auth","mode","inviteId"]},{"tool":"close_attestation","params":["auth","mode","attestationId"]},{"tool":"close_session","params":["auth","mode","sessionId"]},{"tool":"get_record","params":["auth","recordId"]},{"tool":"invite_counterparty","params":["auth","offer","offerSignature"]},{"tool":"lookup_agent","params":["domain","agentId","publicKey","agentCardUrl"]},{"tool":"open_attestation","params":["auth","open","openSignature","idleTimeoutSec"]},{"tool":"pause_session","params":["auth","sessionId"]},{"tool":"register_agent","params":["auth","meta"]},{"tool":"register_counterparty","params":["auth","domain","agentCard","agentCardUrl"]},{"tool":"send_attestation_event","params":["auth","mode","attestationId"]},{"tool":"send_message","params":["auth","mode","sessionId"]},{"tool":"start_session","params":["auth","offer","offerSignature"]},{"tool":"verify_agent","params":["bundle","agentId"]}],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}