← The evidence ledger
Evidence row 301379
Observed , by probe.mcp/1.
- Kind
- mcp.tools
- About
- endpoint 1619b8ec-81cb-4638-ba03-1bbd2d434615
- Recorded
- Previous row
- None: the first of its kind about this subject
- Body SHA-256
- 14cad7362dfa9bb3e6b32f589ff538d4a2143778672a0664eaa4cdff1e7792a0
- Leaf
- 0x28c60bb0af640344918ee48d8d6275cfcd032a5e16eba92e97f8cb6bf98328d7
What was observed
{
"count": 23,
"tools": [
{
"description": "WRITE: mark a conversation closed in the Sakari inbox (a new inbound message reopens it). PUT /v1/accounts/{accountId}/conversations/{conversationId}/close.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"conversation_id": {
"description": "Sakari conversation id.",
"maxLength": 128,
"minLength": 1,
"type": "string"
}
},
"required": [
"conversation_id"
],
"type": "object"
},
"name": "sakari_close_conversation"
},
{
"description": "WRITE: create a contact. If a contact with the same mobile number exists, merge_strategy decides what happens (append, core or remove, per Sakari). A contact is not opted in to messages by this call. POST /v1/accounts/{accountId}/contacts.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"country": {
"description": "2-letter country of the number (default: the account's default country).",
"pattern": "^[A-Za-z]{2}$",
"type": "string"
},
"email": {
"maxLength": 254,
"type": "string"
},
"first_name": {
"maxLength": 200,
"type": "string"
},
"last_name": {
"maxLength": 200,
"type": "string"
},
"merge_strategy": {
"description": "How an existing contact with the same mobile is treated.",
"enum": [
"append",
"core",
"remove"
],
"type": "string"
},
"mobile": {
"description": "Mobile number in international format, e.g. +13471234567.",
"pattern": "^\\+[1-9]\\d{6,14}$",
"type": "string"
}
},
"required": [
"mobile"
],
"type": "object"
},
"name": "sakari_create_contact"
},
{
"description": "WRITE: create a reusable SMS template (does not send anything). POST /v1/accounts/{accountId}/templates.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"name": {
"description": "Template name.",
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"text": {
"description": "Template text; may contain placeholders such as {{firstName}}.",
"maxLength": 1600,
"minLength": 1,
"type": "string"
}
},
"required": [
"name",
"text"
],
"type": "object"
},
"name": "sakari_create_template"
},
{
"description": "The Sakari account these credentials belong to: name, plan, balance, default country, business info and options. API credentials are never returned. GET /v1/accounts/{accountId}.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {},
"type": "object"
},
"name": "sakari_get_account"
},
{
"description": "Prepaid balance, default country, remaining segments and the price per segment. GET /v1/accounts/{accountId}/balance.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {},
"type": "object"
},
"name": "sakari_get_balance"
},
{
"description": "One call history record by id. GET /v1/accounts/{accountId}/calls/{callId}.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"call_id": {
"description": "Sakari call id.",
"maxLength": 128,
"minLength": 1,
"type": "string"
}
},
"required": [
"call_id"
],
"type": "object"
},
"name": "sakari_get_call"
},
{
"description": "One campaign by id. GET /v1/accounts/{accountId}/campaigns/{campaignId}.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"campaign_id": {
"description": "Sakari campaign id.",
"maxLength": 128,
"minLength": 1,
"type": "string"
}
},
"required": [
"campaign_id"
],
"type": "object"
},
"name": "sakari_get_campaign"
},
{
"description": "One contact by id: name, mobile (with validity and line type), email, lists, attributes, opt-in and blocked state. GET /v1/accounts/{accountId}/contacts/{contactId}.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"contact_id": {
"description": "Sakari contact id.",
"maxLength": 128,
"minLength": 1,
"type": "string"
}
},
"required": [
"contact_id"
],
"type": "object"
},
"name": "sakari_get_contact"
},
{
"description": "One conversation by id. Use sakari_list_messages with conversation_id for its messages. GET /v1/accounts/{accountId}/conversations/{conversationId}.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"conversation_id": {
"description": "Sakari conversation id.",
"maxLength": 128,
"minLength": 1,
"type": "string"
}
},
"required": [
"conversation_id"
],
"type": "object"
},
"name": "sakari_get_conversation"
},
{
"description": "One message by id: text, direction, status, segments, price, error. GET /v1/accounts/{accountId}/messages/{messageId}.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"message_id": {
"description": "Sakari message id.",
"maxLength": 128,
"minLength": 1,
"type": "string"
}
},
"required": [
"message_id"
],
"type": "object"
},
"name": "sakari_get_message"
},
{
"description": "One message template by id. GET /v1/accounts/{accountId}/templates/{templateId}.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"template_id": {
"description": "Sakari template id.",
"maxLength": 128,
"minLength": 1,
"type": "string"
}
},
"required": [
"template_id"
],
"type": "object"
},
"name": "sakari_get_template"
},
{
"description": "Autoresponders (automatic replies) configured on the account. GET /v1/accounts/{accountId}/autoresponders.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {},
"type": "object"
},
"name": "sakari_list_autoresponders"
},
{
"description": "Call history (voice) with direction, status, duration and contact; filter by contact, conversation, direction, status or date range. GET /v1/accounts/{accountId}/calls.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"contact_id": {
"description": "Sakari contact id.",
"maxLength": 128,
"minLength": 1,
"type": "string"
},
"conversation_id": {
"description": "Sakari conversation id.",
"maxLength": 128,
"minLength": 1,
"type": "string"
},
"direction": {
"enum": [
"inbound",
"outbound"
],
"type": "string"
},
"from": {
"description": "Start of the date range (ISO 8601 date-time).",
"maxLength": 40,
"minLength": 10,
"type": "string"
},
"limit": {
"description": "Results per page, 1-100 (default 25).",
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"offset": {
"description": "Results to skip (default 0). Pass the previous reply's next_offset.",
"maximum": 10000000,
"minimum": 0,
"type": "integer"
},
"status": {
"enum": [
"initiated",
"ringing",
"active",
"ended",
"rejected",
"forwarded",
"missed",
"transferring"
],
"type": "string"
},
"to": {
"description": "End of the date range (ISO 8601 date-time).",
"maxLength": 40,
"minLength": 10,
"type": "string"
}
},
"type": "object"
},
"name": "sakari_list_calls"
},
{
"description": "List message campaigns with schedule, template, status and reporting. GET /v1/accounts/{accountId}/campaigns.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"description": "Results per page, 1-100 (default 25).",
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"name": {
"description": "Filter by name or part of it.",
"maxLength": 200,
"type": "string"
},
"offset": {
"description": "Results to skip (default 0). Pass the previous reply's next_offset.",
"maximum": 10000000,
"minimum": 0,
"type": "integer"
}
},
"type": "object"
},
"name": "sakari_list_campaigns"
},
{
"description": "List or search contacts (partial matches on name, mobile or email; filter by tag). GET /v1/accounts/{accountId}/contacts.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"email": {
"description": "Filter by email or part of it.",
"maxLength": 254,
"type": "string"
},
"first_name": {
"description": "Filter by first name or part of it.",
"maxLength": 200,
"type": "string"
},
"last_name": {
"description": "Filter by last name or part of it.",
"maxLength": 200,
"type": "string"
},
"limit": {
"description": "Results per page, 1-100 (default 25).",
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"mobile": {
"description": "Filter by mobile number or part of it.",
"maxLength": 40,
"type": "string"
},
"offset": {
"description": "Results to skip (default 0). Pass the previous reply's next_offset.",
"maximum": 10000000,
"minimum": 0,
"type": "integer"
},
"tags": {
"description": "Filter by tag(s).",
"maxLength": 200,
"type": "string"
}
},
"type": "object"
},
"name": "sakari_list_contacts"
},
{
"description": "List conversations (the inbox): contact, last message, unread count, open or closed. GET /v1/accounts/{accountId}/conversations.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"description": "Results per page, 1-100 (default 25).",
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"offset": {
"description": "Results to skip (default 0). Pass the previous reply's next_offset.",
"maximum": 10000000,
"minimum": 0,
"type": "integer"
}
},
"type": "object"
},
"name": "sakari_list_conversations"
},
{
"description": "Lead capture forms with active state, impressions and conversions. GET /v1/accounts/{accountId}/forms.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"description": "Results per page, 1-100 (default 25).",
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"offset": {
"description": "Results to skip (default 0). Pass the previous reply's next_offset.",
"maximum": 10000000,
"minimum": 0,
"type": "integer"
},
"q": {
"description": "Search term across form fields.",
"maxLength": 200,
"type": "string"
}
},
"type": "object"
},
"name": "sakari_list_forms"
},
{
"description": "Shortened tracked links with destination, short URL and click stats. GET /v1/accounts/{accountId}/links.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"q": {
"description": "Search term across link fields.",
"maxLength": 200,
"type": "string"
}
},
"type": "object"
},
"name": "sakari_list_links"
},
{
"description": "List messages (sent and received) with status, segments, price and timestamps; filter by contact or conversation. GET /v1/accounts/{accountId}/messages.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"contact_id": {
"description": "Sakari contact id.",
"maxLength": 128,
"minLength": 1,
"type": "string"
},
"conversation_id": {
"description": "Sakari conversation id.",
"maxLength": 128,
"minLength": 1,
"type": "string"
},
"limit": {
"description": "Results per page, 1-100 (default 25).",
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"offset": {
"description": "Results to skip (default 0). Pass the previous reply's next_offset.",
"maximum": 10000000,
"minimum": 0,
"type": "integer"
}
},
"type": "object"
},
"name": "sakari_list_messages"
},
{
"description": "List reusable message templates. GET /v1/accounts/{accountId}/templates.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"description": "Results per page, 1-100 (default 25).",
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"name": {
"description": "Filter by name or part of it.",
"maxLength": 200,
"type": "string"
},
"offset": {
"description": "Results to skip (default 0). Pass the previous reply's next_offset.",
"maximum": 10000000,
"minimum": 0,
"type": "integer"
}
},
"type": "object"
},
"name": "sakari_list_templates"
},
{
"description": "Active webhook subscriptions (message event notifications). GET /v1/accounts/{accountId}/webhooks.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {},
"type": "object"
},
"name": "sakari_list_webhooks"
},
{
"description": "WRITE: SEND REAL TEXT MESSAGES that cost account balance and cannot be recalled. Recipients: phone numbers (international format), existing contact ids, or conversation ids (max 100 in total). Only text people who opted in; Sakari enforces TCPA/CTIA rules and the sender is responsible. Confirm the recipients and the text with the user first. Placeholders like {{firstName}} are filled per contact. POST /v1/accounts/{accountId}/messages.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"confirm_send": {
"const": true,
"description": "Must be true: you confirm the user approved these recipients and this text, and that the texts go out now.",
"type": "boolean"
},
"contact_ids": {
"description": "Existing Sakari contact ids.",
"items": {
"description": "Sakari contact id.",
"maxLength": 128,
"minLength": 1,
"type": "string"
},
"maxItems": 100,
"type": "array"
},
"conversation_ids": {
"description": "Existing conversation ids to reply into.",
"items": {
"description": "Sakari conversation id.",
"maxLength": 128,
"minLength": 1,
"type": "string"
},
"maxItems": 100,
"type": "array"
},
"media_urls": {
"description": "Public media URLs to attach (MMS).",
"items": {
"format": "uri",
"maxLength": 2000,
"type": "string"
},
"maxItems": 10,
"type": "array"
},
"text": {
"description": "Message text (the Sakari 'template').",
"maxLength": 1600,
"minLength": 1,
"type": "string"
},
"to_numbers": {
"description": "Recipient phone numbers in international format.",
"items": {
"pattern": "^\\+[1-9]\\d{6,14}$",
"type": "string"
},
"maxItems": 100,
"type": "array"
},
"type": {
"description": "SMS (default) or MMS.",
"enum": [
"SMS",
"MMS"
],
"type": "string"
}
},
"required": [
"text",
"confirm_send"
],
"type": "object"
},
"name": "sakari_send_message"
},
{
"description": "WRITE: change a contact's name, email or mobile. Sakari's update replaces the contact, so this reads the current contact first and sends it back whole (lists, opt-in, blocked, attributes) with only your changes applied. PUT /v1/accounts/{accountId}/contacts/{contactId}.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"contact_id": {
"description": "Sakari contact id.",
"maxLength": 128,
"minLength": 1,
"type": "string"
},
"country": {
"description": "2-letter country of the mobile number.",
"pattern": "^[A-Za-z]{2}$",
"type": "string"
},
"email": {
"maxLength": 254,
"type": "string"
},
"first_name": {
"maxLength": 200,
"type": "string"
},
"last_name": {
"maxLength": 200,
"type": "string"
},
"mobile": {
"description": "New mobile number in international format.",
"pattern": "^\\+[1-9]\\d{6,14}$",
"type": "string"
}
},
"required": [
"contact_id"
],
"type": "object"
},
"name": "sakari_update_contact"
}
]
}What the leaf hashes
{"body":"14cad7362dfa9bb3e6b32f589ff538d4a2143778672a0664eaa4cdff1e7792a0","id":301379,"kind":"mcp.tools","method":"probe.mcp/1","observed_us":1793054051234949,"prev":null,"subject":"1619b8ec-81cb-4638-ba03-1bbd2d434615","subject_kind":"endpoint"}Proof
Fold these into the leaf in order, hashing each sorted pair with keccak256, to reach the root of (296695 rows).
- 0x28c5a04f749c70c6283698b050e1e96f5805471e56d20b0a3d8346d69df094d1
- 0xc929995244e3ccc21c811b3fd5b5ca76a15ae72b0d2bbd41a72865676c1b8e26
- 0xfcad94fc2a6b852d8b8f040953cf6117a54ba4807f0d8090c6c756834bd3063b
- 0x267c486d16a7f22e4796b7451cc1c7f977930b3913996015f155017fff1abaca
- 0x2566e073d97cd2b5761aa18f6208810c3e03605fc4be4439791e730f0893c26a
- 0x44b44d4addc0d91d00565095961a79420080507520af812251b375dbc0f619e3
- 0x51f2e648a999fce3ca68e22d09e9856c922b28e0e375bc3f4ce786382d11439d
- 0xda8447219d4609b2ae5b8bbabbf31704b77502a16a0fe643b9cc7114ad56494a
- 0xa8810018e2704214b092e15de1b1c033e82ac39dfc4d80ab3600461ea58a631e
- 0x7f7b5e4017d0ebdc6e6e7ad11b8fd65cdecee6414f31e6c211b1dd0c217f99a4
- 0x29ff42cd28c985738cc9b9746505241162025974e4e3ebf7c6681609002132fa
- 0x364047261f51ecdbe278514b4f415358118ef4644f7124e15a40f80a86f6a05b
- 0x16a8fb19a5e4f4535e7cb3fce5c15ecfa188586bb74e347ee71164f8af27dfe1
- 0xd843afcced75dedd39194ff9bd12326b88099e6112686db2299392d022dc3146
- 0xc3a6a3ae44ec0da1848b16d40c45d7aac97a67352eea8df18e0f26edabea8a2f
- 0x06d71bfa7d8b41d62c8836efc2c601e1cc3772d9453596b2ae4950887f3310ca
- 0x8c756542e482157df0c36464d75c937b845e4423dbbcfad08f0cf8d5a16b9a13
- 0x20704208aa6923d6b2450ef74ede87a6e0265d46447926038fe9506e9e154b2d
- 0x9b9ce5b74b9bab5121612ef6b64920a8d453cbf311096a423eef9702747e868a
- Day root
- 0xf43e8dcc3d451a4788b26be904c55e8c4c0fa75c9666796c51db38d37e2c0df8
- Chained
- 0x702d5ac508f08b0d1accf36af25822d8e5660367494edd17a642fb61e158a57a
- Published
- On Arc Testnet, block 69251483: 0x495162f8936e19f0039918feebe6c307f327cd6bf8c37219620b1970041fa9ae