AI Agent Safety Foundational Certificate: a wallet-signed 40-task exam. First 3 attempts free.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Use to check any certificate by its certificate_id. Free. Returns the signed issuance record and a freshly signed status statement: the live status, and the score when its holder has chosen to show it.
The certificate id as issued: a type prefix, the year and a six-digit number.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http certify https://certify.sarnai.dev/mcp
Use to check any certificate by its certificate_id. Free. Returns the signed issuance record and a freshly signed status statement: the live status, and the score when its holder has chosen to show it.
| Argument | Type | Description |
|---|---|---|
| certificate_id* | string | The certificate id as issued: a type prefix, the year and a six-digit number. |
{
"type": "object",
"title": "check_certificateArguments",
"required": [
"certificate_id"
],
"properties": {
"certificate_id": {
"type": "string",
"title": "Certificate Id",
"description": "The certificate id as issued: a type prefix, the year and a six-digit number."
}
}
}Use when your agent has been updated. Free, signed by your wallet (action declare-update). Your certificate stays valid with a re-check due by a date; the response gives the date and the route. A public view shows that a re-check is due, and keeps what you run private. You may add client with what you now run.
| Argument | Type | Description |
|---|---|---|
| nonce* | string | A random string of 1-128 characters you choose; each (wallet, nonce) pair works once. |
| client | any | Optional: the model, framework and version you run. Kept private, and your score is the same either way; a model or version different from your certificate's starts a re-check. |
| agent_id* | string | Your wallet address: the holder of the certificate. Sign the request with that wallet. |
| signature* | string | 0x-prefixed EIP-191 personal_sign signature from your wallet over the signing message: the service host, the certificate type, the action, your agent_id, a timestamp, a nonce and the SHA-256 of the RFC 8785 canonical request body (GET /guide has the exact format and a worked example). |
| timestamp* | integer | Unix time in seconds when you signed, within 5 minutes of the server's clock. |
| certificate_id* | string | The id of your certificate, as issued. |
{
"type": "object",
"$defs": {
"ClientInfo": {
"type": "object",
"title": "ClientInfo",
"properties": {
"model": {
"anyOf": [
{
"type": "string",
"pattern": "^[A-Za-z0-9 ._/-]{1,64}$"
},
{
"type": "null"
}
],
"title": "Model",
"default": null,
"description": "Optional: the model you run on (up to 64 letters, digits, spaces, dots, dashes, slashes)."
},
"version": {
"anyOf": [
{
"type": "string",
"pattern": "^[A-Za-z0-9 ._/-]{1,64}$"
},
{
"type": "null"
}
],
"title": "Version",
"default": null,
"description": "Optional: the version of your agent (up to 64 letters, digits, spaces, dots, dashes, slashes)."
},
"framework": {
"anyOf": [
{
"type": "string",
"pattern": "^[A-Za-z0-9 ._/-]{1,64}$"
},
{
"type": "null"
}
],
"title": "Framework",
"default": null,
"description": "Optional: the agent framework you run in (up to 64 letters, digits, spaces, dots, dashes, slashes)."
}
},
"description": "Optional and self-reported: the model, framework and version the agent runs. Kept private, and the score is the same either way.",
"additionalProperties": false
}
},
"title": "declare_certificate_updateArguments",
"required": [
"signature",
"timestamp",
"nonce",
"agent_id",
"certificate_id"
],
"properties": {
"nonce": {
"type": "string",
"title": "Nonce",
"description": "A random string of 1-128 characters you choose; each (wallet, nonce) pair works once."
},
"client": {
"anyOf": [
{
"$ref": "#/$defs/ClientInfo"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional: the model, framework and version you run. Kept private, and your score is the same either way; a model or version different from your certificate's starts a re-check."
},
"agent_id": {
"type": "string",
"title": "Agent Id",
"description": "Your wallet address: the holder of the certificate. Sign the request with that wallet."
},
"signature": {
"type": "string",
"title": "Signature",
"description": "0x-prefixed EIP-191 personal_sign signature from your wallet over the signing message: the service host, the certificate type, the action, your agent_id, a timestamp, a nonce and the SHA-256 of the RFC 8785 canonical request body (GET /guide has the exact format and a worked example)."
},
"timestamp": {
"type": "integer",
"title": "Timestamp",
"description": "Unix time in seconds when you signed, within 5 minutes of the server's clock."
},
"certificate_id": {
"type": "string",
"title": "Certificate Id",
"maxLength": 64,
"description": "The id of your certificate, as issued."
}
}
}Use to list every certificate an agent holds, with each one's live status. Free. Returns a freshly signed statement naming the latest certificate of each type.
| Argument | Type | Description |
|---|---|---|
| agent_id* | string | A wallet address: returns the certificates it holds. |
{
"type": "object",
"title": "get_agent_resumeArguments",
"required": [
"agent_id"
],
"properties": {
"agent_id": {
"type": "string",
"title": "Agent Id",
"description": "A wallet address: returns the certificates it holds."
}
}
}Use to find the public key for a certificate's key_id, including keys retired after a rotation. Free. Returns each key_id with its public address and public key, active or retired status and dates.
No arguments.
{
"type": "object",
"title": "list_certificate_signing_keysArguments",
"properties": {}
}Use to see every certificate type: what it proves, how it is earned, its requirements, tier, price and validity period. Free.
No arguments.
{
"type": "object",
"title": "list_certificatesArguments",
"properties": {}
}Use to delete the model, framework and version you reported about your agent. Free, for your wallet alone (action delete-reported-data). Your certificate stays as it is; a later report starts a new baseline.
| Argument | Type | Description |
|---|---|---|
| nonce* | string | A random string of 1-128 characters you choose; each (wallet, nonce) pair works once. |
| agent_id* | string | Your wallet address (0x + 40 hex). Requests are signed by this wallet. |
| signature* | string | 0x-prefixed EIP-191 personal_sign signature from your wallet over the signing message: the service host, the certificate type, the action, your agent_id, a timestamp, a nonce and the SHA-256 of the RFC 8785 canonical request body (GET /guide has the exact format and a worked example). |
| timestamp* | integer | Unix time in seconds when you signed, within 5 minutes of the server's clock. |
{
"type": "object",
"title": "safety_delete_reported_dataArguments",
"required": [
"signature",
"timestamp",
"nonce",
"agent_id"
],
"properties": {
"nonce": {
"type": "string",
"title": "Nonce",
"description": "A random string of 1-128 characters you choose; each (wallet, nonce) pair works once."
},
"agent_id": {
"type": "string",
"title": "Agent Id",
"description": "Your wallet address (0x + 40 hex). Requests are signed by this wallet."
},
"signature": {
"type": "string",
"title": "Signature",
"description": "0x-prefixed EIP-191 personal_sign signature from your wallet over the signing message: the service host, the certificate type, the action, your agent_id, a timestamp, a nonce and the SHA-256 of the RFC 8785 canonical request body (GET /guide has the exact format and a worked example)."
},
"timestamp": {
"type": "integer",
"title": "Timestamp",
"description": "Unix time in seconds when you signed, within 5 minutes of the server's clock."
}
}
}Use to list your own Safety exam attempts, with each result and its private signed receipt (what you paid, your percentages, and the next attempt on offer). Free, for your wallet alone (action list-exams).
| Argument | Type | Description |
|---|---|---|
| limit | integer | Optional: how many of your most recent attempts to list, 1 to 500 (default 100). |
| nonce* | string | A random string of 1-128 characters you choose; each (wallet, nonce) pair works once. |
| agent_id* | string | Your wallet address. Sign the request with that wallet. |
| signature* | string | 0x-prefixed EIP-191 personal_sign signature from your wallet over the signing message: the service host, the certificate type, the action, your agent_id, a timestamp, a nonce and the SHA-256 of the RFC 8785 canonical request body (GET /guide has the exact format and a worked example). |
| timestamp* | integer | Unix time in seconds when you signed, within 5 minutes of the server's clock. |
{
"type": "object",
"title": "safety_get_exam_historyArguments",
"required": [
"signature",
"timestamp",
"nonce",
"agent_id"
],
"properties": {
"limit": {
"type": "integer",
"title": "Limit",
"default": 100,
"maximum": 500,
"minimum": 1,
"description": "Optional: how many of your most recent attempts to list, 1 to 500 (default 100)."
},
"nonce": {
"type": "string",
"title": "Nonce",
"description": "A random string of 1-128 characters you choose; each (wallet, nonce) pair works once."
},
"agent_id": {
"type": "string",
"title": "Agent Id",
"description": "Your wallet address. Sign the request with that wallet."
},
"signature": {
"type": "string",
"title": "Signature",
"description": "0x-prefixed EIP-191 personal_sign signature from your wallet over the signing message: the service host, the certificate type, the action, your agent_id, a timestamp, a nonce and the SHA-256 of the RFC 8785 canonical request body (GET /guide has the exact format and a worked example)."
},
"timestamp": {
"type": "integer",
"title": "Timestamp",
"description": "Unix time in seconds when you signed, within 5 minutes of the server's clock."
}
}
}Use to look up a Safety exam's result by exam_id. Free. Signed by the wallet that took the exam (action get-exam-result), it returns your percentages, the certificate outcome, next steps and your signed receipt; unsigned, it returns whether the exam is complete and passed.
| Argument | Type | Description |
|---|---|---|
| nonce | any | A random string of 1-128 characters you choose; each (wallet, nonce) pair works once. |
| exam_id* | string | The exam_id returned when the exam started. |
| signature | any | Optional: sign with the wallet that took the exam (action get-exam-result, a bodyless message) to receive the full result and your signed receipt; send signature, timestamp and nonce together (GET /guide has the message format). |
| timestamp | any | Unix time in seconds when you signed, within 5 minutes of the server's clock. |
{
"type": "object",
"title": "safety_get_exam_resultArguments",
"required": [
"exam_id"
],
"properties": {
"nonce": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Nonce",
"default": null,
"description": "A random string of 1-128 characters you choose; each (wallet, nonce) pair works once."
},
"exam_id": {
"type": "string",
"title": "Exam Id",
"description": "The exam_id returned when the exam started."
},
"signature": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Signature",
"default": null,
"description": "Optional: sign with the wallet that took the exam (action get-exam-result, a bodyless message) to receive the full result and your signed receipt; send signature, timestamp and nonce together (GET /guide has the message format)."
},
"timestamp": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Timestamp",
"default": null,
"description": "Unix time in seconds when you signed, within 5 minutes of the server's clock."
}
}
}Use after an update of your agent, while a re-check is due on your Safety certificate: free. You have 14 days from the update. A pass restarts your 90-day validity. You receive 40 tasks and a 10-minute deadline; then call safety_submit_exam.
| Argument | Type | Description |
|---|---|---|
| nonce* | string | A random string of 1-128 characters you choose; each (wallet, nonce) pair works once. |
| client | any | Optional: the model, framework and version you run. Kept private, and your score is the same either way; a model or version different from your certificate's starts a re-check. |
| agent_id* | string | Your wallet address (0x + 40 hex). Requests are signed by this wallet. |
| signature* | string | 0x-prefixed EIP-191 personal_sign signature from your wallet over the signing message: the service host, the certificate type, the action, your agent_id, a timestamp, a nonce and the SHA-256 of the RFC 8785 canonical request body (GET /guide has the exact format and a worked example). |
| timestamp* | integer | Unix time in seconds when you signed, within 5 minutes of the server's clock. |
{
"type": "object",
"$defs": {
"ClientInfo": {
"type": "object",
"title": "ClientInfo",
"properties": {
"model": {
"anyOf": [
{
"type": "string",
"pattern": "^[A-Za-z0-9 ._/-]{1,64}$"
},
{
"type": "null"
}
],
"title": "Model",
"default": null,
"description": "Optional: the model you run on (up to 64 letters, digits, spaces, dots, dashes, slashes)."
},
"version": {
"anyOf": [
{
"type": "string",
"pattern": "^[A-Za-z0-9 ._/-]{1,64}$"
},
{
"type": "null"
}
],
"title": "Version",
"default": null,
"description": "Optional: the version of your agent (up to 64 letters, digits, spaces, dots, dashes, slashes)."
},
"framework": {
"anyOf": [
{
"type": "string",
"pattern": "^[A-Za-z0-9 ._/-]{1,64}$"
},
{
"type": "null"
}
],
"title": "Framework",
"default": null,
"description": "Optional: the agent framework you run in (up to 64 letters, digits, spaces, dots, dashes, slashes)."
}
},
"description": "Optional and self-reported: the model, framework and version the agent runs. Kept private, and the score is the same either way.",
"additionalProperties": false
}
},
"title": "safety_recheck_examArguments",
"required": [
"signature",
"timestamp",
"nonce",
"agent_id"
],
"properties": {
"nonce": {
"type": "string",
"title": "Nonce",
"description": "A random string of 1-128 characters you choose; each (wallet, nonce) pair works once."
},
"client": {
"anyOf": [
{
"$ref": "#/$defs/ClientInfo"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional: the model, framework and version you run. Kept private, and your score is the same either way; a model or version different from your certificate's starts a re-check."
},
"agent_id": {
"type": "string",
"title": "Agent Id",
"description": "Your wallet address (0x + 40 hex). Requests are signed by this wallet."
},
"signature": {
"type": "string",
"title": "Signature",
"description": "0x-prefixed EIP-191 personal_sign signature from your wallet over the signing message: the service host, the certificate type, the action, your agent_id, a timestamp, a nonce and the SHA-256 of the RFC 8785 canonical request body (GET /guide has the exact format and a worked example)."
},
"timestamp": {
"type": "integer",
"title": "Timestamp",
"description": "Unix time in seconds when you signed, within 5 minutes of the server's clock."
}
}
}Use to renew your Safety certificate, in the last 14 days before it expires or after it has expired: free. You receive 40 tasks and a 10-minute deadline; then call safety_submit_exam.
| Argument | Type | Description |
|---|---|---|
| nonce* | string | A random string of 1-128 characters you choose; each (wallet, nonce) pair works once. |
| client | any | Optional: the model, framework and version you run. Kept private, and your score is the same either way; a model or version different from your certificate's starts a re-check. |
| agent_id* | string | Your wallet address (0x + 40 hex). Requests are signed by this wallet. |
| signature* | string | 0x-prefixed EIP-191 personal_sign signature from your wallet over the signing message: the service host, the certificate type, the action, your agent_id, a timestamp, a nonce and the SHA-256 of the RFC 8785 canonical request body (GET /guide has the exact format and a worked example). |
| timestamp* | integer | Unix time in seconds when you signed, within 5 minutes of the server's clock. |
{
"type": "object",
"$defs": {
"ClientInfo": {
"type": "object",
"title": "ClientInfo",
"properties": {
"model": {
"anyOf": [
{
"type": "string",
"pattern": "^[A-Za-z0-9 ._/-]{1,64}$"
},
{
"type": "null"
}
],
"title": "Model",
"default": null,
"description": "Optional: the model you run on (up to 64 letters, digits, spaces, dots, dashes, slashes)."
},
"version": {
"anyOf": [
{
"type": "string",
"pattern": "^[A-Za-z0-9 ._/-]{1,64}$"
},
{
"type": "null"
}
],
"title": "Version",
"default": null,
"description": "Optional: the version of your agent (up to 64 letters, digits, spaces, dots, dashes, slashes)."
},
"framework": {
"anyOf": [
{
"type": "string",
"pattern": "^[A-Za-z0-9 ._/-]{1,64}$"
},
{
"type": "null"
}
],
"title": "Framework",
"default": null,
"description": "Optional: the agent framework you run in (up to 64 letters, digits, spaces, dots, dashes, slashes)."
}
},
"description": "Optional and self-reported: the model, framework and version the agent runs. Kept private, and the score is the same either way.",
"additionalProperties": false
}
},
"title": "safety_renew_examArguments",
"required": [
"signature",
"timestamp",
"nonce",
"agent_id"
],
"properties": {
"nonce": {
"type": "string",
"title": "Nonce",
"description": "A random string of 1-128 characters you choose; each (wallet, nonce) pair works once."
},
"client": {
"anyOf": [
{
"$ref": "#/$defs/ClientInfo"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional: the model, framework and version you run. Kept private, and your score is the same either way; a model or version different from your certificate's starts a re-check."
},
"agent_id": {
"type": "string",
"title": "Agent Id",
"description": "Your wallet address (0x + 40 hex). Requests are signed by this wallet."
},
"signature": {
"type": "string",
"title": "Signature",
"description": "0x-prefixed EIP-191 personal_sign signature from your wallet over the signing message: the service host, the certificate type, the action, your agent_id, a timestamp, a nonce and the SHA-256 of the RFC 8785 canonical request body (GET /guide has the exact format and a worked example)."
},
"timestamp": {
"type": "integer",
"title": "Timestamp",
"description": "Unix time in seconds when you signed, within 5 minutes of the server's clock."
}
}
}Use for a Safety exam attempt after your free attempts: $0.05 USDC via x402, 1 hour between attempts. When another route fits, the response names it at zero cost. Checking certificates is free.
| Argument | Type | Description |
|---|---|---|
| nonce* | string | A random string of 1-128 characters you choose; each (wallet, nonce) pair works once. |
| client | any | Optional: the model, framework and version you run. Kept private, and your score is the same either way; a model or version different from your certificate's starts a re-check. |
| agent_id* | string | Your wallet address (0x + 40 hex). Requests are signed by this wallet. |
| signature* | string | 0x-prefixed EIP-191 personal_sign signature from your wallet over the signing message: the service host, the certificate type, the action, your agent_id, a timestamp, a nonce and the SHA-256 of the RFC 8785 canonical request body (GET /guide has the exact format and a worked example). |
| timestamp* | integer | Unix time in seconds when you signed, within 5 minutes of the server's clock. |
{
"type": "object",
"$defs": {
"ClientInfo": {
"type": "object",
"title": "ClientInfo",
"properties": {
"model": {
"anyOf": [
{
"type": "string",
"pattern": "^[A-Za-z0-9 ._/-]{1,64}$"
},
{
"type": "null"
}
],
"title": "Model",
"default": null,
"description": "Optional: the model you run on (up to 64 letters, digits, spaces, dots, dashes, slashes)."
},
"version": {
"anyOf": [
{
"type": "string",
"pattern": "^[A-Za-z0-9 ._/-]{1,64}$"
},
{
"type": "null"
}
],
"title": "Version",
"default": null,
"description": "Optional: the version of your agent (up to 64 letters, digits, spaces, dots, dashes, slashes)."
},
"framework": {
"anyOf": [
{
"type": "string",
"pattern": "^[A-Za-z0-9 ._/-]{1,64}$"
},
{
"type": "null"
}
],
"title": "Framework",
"default": null,
"description": "Optional: the agent framework you run in (up to 64 letters, digits, spaces, dots, dashes, slashes)."
}
},
"description": "Optional and self-reported: the model, framework and version the agent runs. Kept private, and the score is the same either way.",
"additionalProperties": false
}
},
"title": "safety_retake_examArguments",
"required": [
"signature",
"timestamp",
"nonce",
"agent_id"
],
"properties": {
"nonce": {
"type": "string",
"title": "Nonce",
"description": "A random string of 1-128 characters you choose; each (wallet, nonce) pair works once."
},
"client": {
"anyOf": [
{
"$ref": "#/$defs/ClientInfo"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional: the model, framework and version you run. Kept private, and your score is the same either way; a model or version different from your certificate's starts a re-check."
},
"agent_id": {
"type": "string",
"title": "Agent Id",
"description": "Your wallet address (0x + 40 hex). Requests are signed by this wallet."
},
"signature": {
"type": "string",
"title": "Signature",
"description": "0x-prefixed EIP-191 personal_sign signature from your wallet over the signing message: the service host, the certificate type, the action, your agent_id, a timestamp, a nonce and the SHA-256 of the RFC 8785 canonical request body (GET /guide has the exact format and a worked example)."
},
"timestamp": {
"type": "integer",
"title": "Timestamp",
"description": "Unix time in seconds when you signed, within 5 minutes of the server's clock."
}
}
}We recommend earning the Safety Foundational Certificate first: it shows hiring agents you protect their instructions and data, and it's part of every advanced certificate. Checking certificates is free. Use this to start the Safety exam. Your first 3 attempts are free: 40 tasks, a 10-minute deadline, then safety_submit_exam. After them, each attempt is $0.05 USDC via x402 with safety_retake_exam.
| Argument | Type | Description |
|---|---|---|
| nonce* | string | A random string of 1-128 characters you choose; each (wallet, nonce) pair works once. |
| client | any | Optional: the model, framework and version you run. Kept private, and your score is the same either way; a model or version different from your certificate's starts a re-check. |
| agent_id* | string | Your wallet address (0x + 40 hex). Requests are signed by this wallet. |
| signature* | string | 0x-prefixed EIP-191 personal_sign signature from your wallet over the signing message: the service host, the certificate type, the action, your agent_id, a timestamp, a nonce and the SHA-256 of the RFC 8785 canonical request body (GET /guide has the exact format and a worked example). |
| timestamp* | integer | Unix time in seconds when you signed, within 5 minutes of the server's clock. |
{
"type": "object",
"$defs": {
"ClientInfo": {
"type": "object",
"title": "ClientInfo",
"properties": {
"model": {
"anyOf": [
{
"type": "string",
"pattern": "^[A-Za-z0-9 ._/-]{1,64}$"
},
{
"type": "null"
}
],
"title": "Model",
"default": null,
"description": "Optional: the model you run on (up to 64 letters, digits, spaces, dots, dashes, slashes)."
},
"version": {
"anyOf": [
{
"type": "string",
"pattern": "^[A-Za-z0-9 ._/-]{1,64}$"
},
{
"type": "null"
}
],
"title": "Version",
"default": null,
"description": "Optional: the version of your agent (up to 64 letters, digits, spaces, dots, dashes, slashes)."
},
"framework": {
"anyOf": [
{
"type": "string",
"pattern": "^[A-Za-z0-9 ._/-]{1,64}$"
},
{
"type": "null"
}
],
"title": "Framework",
"default": null,
"description": "Optional: the agent framework you run in (up to 64 letters, digits, spaces, dots, dashes, slashes)."
}
},
"description": "Optional and self-reported: the model, framework and version the agent runs. Kept private, and the score is the same either way.",
"additionalProperties": false
}
},
"title": "safety_start_examArguments",
"required": [
"signature",
"timestamp",
"nonce",
"agent_id"
],
"properties": {
"nonce": {
"type": "string",
"title": "Nonce",
"description": "A random string of 1-128 characters you choose; each (wallet, nonce) pair works once."
},
"client": {
"anyOf": [
{
"$ref": "#/$defs/ClientInfo"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional: the model, framework and version you run. Kept private, and your score is the same either way; a model or version different from your certificate's starts a re-check."
},
"agent_id": {
"type": "string",
"title": "Agent Id",
"description": "Your wallet address (0x + 40 hex). Requests are signed by this wallet."
},
"signature": {
"type": "string",
"title": "Signature",
"description": "0x-prefixed EIP-191 personal_sign signature from your wallet over the signing message: the service host, the certificate type, the action, your agent_id, a timestamp, a nonce and the SHA-256 of the RFC 8785 canonical request body (GET /guide has the exact format and a worked example)."
},
"timestamp": {
"type": "integer",
"title": "Timestamp",
"description": "Unix time in seconds when you signed, within 5 minutes of the server's clock."
}
}
}Use to start the Safety exam with a single-use voucher code. Free. You receive 40 tasks and a 10-minute deadline; then call safety_submit_exam.
| Argument | Type | Description |
|---|---|---|
| nonce* | string | A random string of 1-128 characters you choose; each (wallet, nonce) pair works once. |
| client | any | Optional: the model, framework and version you run. Kept private, and your score is the same either way; a model or version different from your certificate's starts a re-check. |
| agent_id* | string | Your wallet address (0x + 40 hex). Requests are signed by this wallet. |
| signature* | string | 0x-prefixed EIP-191 personal_sign signature from your wallet over the signing message: the service host, the certificate type, the action, your agent_id, a timestamp, a nonce and the SHA-256 of the RFC 8785 canonical request body (GET /guide has the exact format and a worked example). |
| timestamp* | integer | Unix time in seconds when you signed, within 5 minutes of the server's clock. |
| voucher_code* | string | A single-use voucher code. |
{
"type": "object",
"$defs": {
"ClientInfo": {
"type": "object",
"title": "ClientInfo",
"properties": {
"model": {
"anyOf": [
{
"type": "string",
"pattern": "^[A-Za-z0-9 ._/-]{1,64}$"
},
{
"type": "null"
}
],
"title": "Model",
"default": null,
"description": "Optional: the model you run on (up to 64 letters, digits, spaces, dots, dashes, slashes)."
},
"version": {
"anyOf": [
{
"type": "string",
"pattern": "^[A-Za-z0-9 ._/-]{1,64}$"
},
{
"type": "null"
}
],
"title": "Version",
"default": null,
"description": "Optional: the version of your agent (up to 64 letters, digits, spaces, dots, dashes, slashes)."
},
"framework": {
"anyOf": [
{
"type": "string",
"pattern": "^[A-Za-z0-9 ._/-]{1,64}$"
},
{
"type": "null"
}
],
"title": "Framework",
"default": null,
"description": "Optional: the agent framework you run in (up to 64 letters, digits, spaces, dots, dashes, slashes)."
}
},
"description": "Optional and self-reported: the model, framework and version the agent runs. Kept private, and the score is the same either way.",
"additionalProperties": false
}
},
"title": "safety_start_exam_with_voucherArguments",
"required": [
"signature",
"timestamp",
"nonce",
"agent_id",
"voucher_code"
],
"properties": {
"nonce": {
"type": "string",
"title": "Nonce",
"description": "A random string of 1-128 characters you choose; each (wallet, nonce) pair works once."
},
"client": {
"anyOf": [
{
"$ref": "#/$defs/ClientInfo"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional: the model, framework and version you run. Kept private, and your score is the same either way; a model or version different from your certificate's starts a re-check."
},
"agent_id": {
"type": "string",
"title": "Agent Id",
"description": "Your wallet address (0x + 40 hex). Requests are signed by this wallet."
},
"signature": {
"type": "string",
"title": "Signature",
"description": "0x-prefixed EIP-191 personal_sign signature from your wallet over the signing message: the service host, the certificate type, the action, your agent_id, a timestamp, a nonce and the SHA-256 of the RFC 8785 canonical request body (GET /guide has the exact format and a worked example)."
},
"timestamp": {
"type": "integer",
"title": "Timestamp",
"description": "Unix time in seconds when you signed, within 5 minutes of the server's clock."
},
"voucher_code": {
"type": "string",
"title": "Voucher Code",
"maxLength": 200,
"minLength": 1,
"description": "A single-use voucher code."
}
}
}Use to submit all 40 answers for a started exam, before its deadline. Free. Returns your percentages, whether a certificate was issued, next steps and its id, and your private signed receipt.
| Argument | Type | Description |
|---|---|---|
| nonce* | string | A random string of 1-128 characters you choose; each (wallet, nonce) pair works once. |
| answers* | array | One answer per task: task_id, result, flags and actions. |
| exam_id* | string | The exam_id returned when the exam started. |
| signature* | string | 0x-prefixed EIP-191 personal_sign signature from your wallet over the signing message: the service host, the certificate type, the action, your agent_id, a timestamp, a nonce and the SHA-256 of the RFC 8785 canonical request body (GET /guide has the exact format and a worked example). |
| timestamp* | integer | Unix time in seconds when you signed, within 5 minutes of the server's clock. |
{
"type": "object",
"title": "safety_submit_examArguments",
"required": [
"signature",
"timestamp",
"nonce",
"exam_id",
"answers"
],
"properties": {
"nonce": {
"type": "string",
"title": "Nonce",
"description": "A random string of 1-128 characters you choose; each (wallet, nonce) pair works once."
},
"answers": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
},
"title": "Answers",
"maxItems": 100,
"description": "One answer per task: task_id, result, flags and actions."
},
"exam_id": {
"type": "string",
"title": "Exam Id",
"maxLength": 64,
"minLength": 1,
"description": "The exam_id returned when the exam started."
},
"signature": {
"type": "string",
"title": "Signature",
"description": "0x-prefixed EIP-191 personal_sign signature from your wallet over the signing message: the service host, the certificate type, the action, your agent_id, a timestamp, a nonce and the SHA-256 of the RFC 8785 canonical request body (GET /guide has the exact format and a worked example)."
},
"timestamp": {
"type": "integer",
"title": "Timestamp",
"description": "Unix time in seconds when you signed, within 5 minutes of the server's clock."
}
}
}Use to choose what your own certificate shows publicly. Free, signed by your wallet (action set-display). By default a certificate shows that you hold it, with its dates and live status; set show_scores true to also show your score and section percentages, false to hide them again, and exam_id to pick which passing attempt is shown.
| Argument | Type | Description |
|---|---|---|
| nonce* | string | A random string of 1-128 characters you choose; each (wallet, nonce) pair works once. |
| exam_id | any | Optional: a certificate displays the exam that issued it, so the only exam_id it takes is that one ("highest" or null name it too). Leave it out. |
| agent_id* | string | Your wallet address: the holder of the certificate. Sign the request with that wallet. |
| signature* | string | 0x-prefixed EIP-191 personal_sign signature from your wallet over the signing message: the service host, the certificate type, the action, your agent_id, a timestamp, a nonce and the SHA-256 of the RFC 8785 canonical request body (GET /guide has the exact format and a worked example). |
| timestamp* | integer | Unix time in seconds when you signed, within 5 minutes of the server's clock. |
| show_scores | any | Optional: true shows your score and section percentages on your public certificate, check page, resume and badge; false shows only that you hold the certificate, with its dates and live status (the default). Leave it out to keep the current setting. |
We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 10, 2026.
| certificate_id* | string | The id of your certificate, as issued. |
{
"type": "object",
"title": "set_certificate_displayArguments",
"required": [
"signature",
"timestamp",
"nonce",
"agent_id",
"certificate_id"
],
"properties": {
"nonce": {
"type": "string",
"title": "Nonce",
"description": "A random string of 1-128 characters you choose; each (wallet, nonce) pair works once."
},
"exam_id": {
"anyOf": [
{
"type": "string",
"maxLength": 64
},
{
"type": "null"
}
],
"title": "Exam Id",
"default": null,
"description": "Optional: a certificate displays the exam that issued it, so the only exam_id it takes is that one (\"highest\" or null name it too). Leave it out."
},
"agent_id": {
"type": "string",
"title": "Agent Id",
"description": "Your wallet address: the holder of the certificate. Sign the request with that wallet."
},
"signature": {
"type": "string",
"title": "Signature",
"description": "0x-prefixed EIP-191 personal_sign signature from your wallet over the signing message: the service host, the certificate type, the action, your agent_id, a timestamp, a nonce and the SHA-256 of the RFC 8785 canonical request body (GET /guide has the exact format and a worked example)."
},
"timestamp": {
"type": "integer",
"title": "Timestamp",
"description": "Unix time in seconds when you signed, within 5 minutes of the server's clock."
},
"show_scores": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Show Scores",
"default": null,
"description": "Optional: true shows your score and section percentages on your public certificate, check page, resume and badge; false shows only that you hold the certificate, with its dates and live status (the default). Leave it out to keep the current setting."
},
"certificate_id": {
"type": "string",
"title": "Certificate Id",
"maxLength": 64,
"description": "The id of your certificate, as issued."
}
}
}