← The evidence ledger
Evidence row 301502
Observed , by probe.mcp/1.
- Kind
- mcp.tools
- About
- endpoint d4908eb4-d465-4c29-985b-38bcbf9ee52b
- Recorded
- Previous row
- None: the first of its kind about this subject
- Body SHA-256
- 9a848cfaeac836908e314dab0bdf3eb90cf3172881cfe27f0b1287dc91b67027
- Leaf
- 0xa49e01e61d76e49ffb8721ded1cfa0af9ab09ebb03ab85e9de2595999a4830df
What was observed
{
"count": 24,
"tools": [
{
"description": "One contact by Spruce contact id (entity_…): demographics, phones, emails, tags, custom and organization fields, integration links. GET /contacts/{contactId}.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"contact_id": {
"description": "The contact id (e.g. \"entity_0E5QDGJC03000\").",
"maxLength": 200,
"minLength": 1,
"type": "string"
}
},
"required": [
"contact_id"
],
"type": "object"
},
"name": "sprucehealth_get_contact"
},
{
"description": "One conversation by id (t_…). GET /conversations/{conversationId}.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"conversation_id": {
"description": "The conversation id (e.g. \"t_0E5QDJJC03000\").",
"maxLength": 200,
"minLength": 1,
"type": "string"
}
},
"required": [
"conversation_id"
],
"type": "object"
},
"name": "sprucehealth_get_conversation"
},
{
"description": "One conversation item (message, note, call, voicemail…) by id (ti_…). GET /conversationItems/{conversationItemId}.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"conversation_item_id": {
"description": "The conversation item id (e.g. \"ti_0D4QABCC06000\").",
"maxLength": 200,
"minLength": 1,
"type": "string"
}
},
"required": [
"conversation_item_id"
],
"type": "object"
},
"name": "sprucehealth_get_conversation_item"
},
{
"description": "One organization member (teammate, team or the organization) by id. GET /organization/members/{memberId}.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"member_id": {
"description": "The member id (e.g. \"entity_0D4QABCC06000\").",
"maxLength": 200,
"minLength": 1,
"type": "string"
}
},
"required": [
"member_id"
],
"type": "object"
},
"name": "sprucehealth_get_member"
},
{
"description": "Your Spruce organization (id and name). The id is the owner/member id used by other objects. Good first call. GET /organization.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {},
"type": "object"
},
"name": "sprucehealth_get_organization"
},
{
"description": "One phone line by id (pd_…). GET /phonelines/{phonelineId}.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"phone_line_id": {
"description": "The phone line id (e.g. \"pd_26RRC7PQ6JG00\").",
"maxLength": 200,
"minLength": 1,
"type": "string"
}
},
"required": [
"phone_line_id"
],
"type": "object"
},
"name": "sprucehealth_get_phone_line"
},
{
"description": "The full transcription text and its summary (if any) for a transcription id (the transcriptionId on a call/voicemail attachment). Status pending/completed/failed/noSpeech. GET /transcriptions/{transcriptionId}.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"transcription_id": {
"description": "The transcription id (from a conversation item's audio attachment).",
"maxLength": 200,
"minLength": 1,
"type": "string"
}
},
"required": [
"transcription_id"
],
"type": "object"
},
"name": "sprucehealth_get_transcription"
},
{
"description": "The conversations (secure, SMS/phone, email, fax…) associated with one contact. GET /contacts/{contactId}/conversations.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"contact_id": {
"description": "The contact id (e.g. \"entity_0E5QDGJC03000\").",
"maxLength": 200,
"minLength": 1,
"type": "string"
}
},
"required": [
"contact_id"
],
"type": "object"
},
"name": "sprucehealth_list_contact_conversations"
},
{
"description": "The organization-wide contact fields shown on every contact. Paged; totalCount included. GET /contacts/fields.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page_size": {
"description": "Results per page (1-500). Keep it small (e.g. 25-50) for long records: an oversized page is cut, but the Paging part with the cursor always stays whole.",
"maximum": 500,
"minimum": 1,
"type": "integer"
},
"pagination_token": {
"description": "The paginationToken from the previous page's reply (when hasMore is true).",
"maxLength": 4096,
"minLength": 1,
"type": "string"
}
},
"type": "object"
},
"name": "sprucehealth_list_contact_fields"
},
{
"description": "Links between a contact and external systems (Elation, Hint, athena, custom): type, external id, url. GET /contacts/{contactId}/integrationlinks.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"contact_id": {
"description": "The contact id (e.g. \"entity_0E5QDGJC03000\").",
"maxLength": 200,
"minLength": 1,
"type": "string"
}
},
"required": [
"contact_id"
],
"type": "object"
},
"name": "sprucehealth_list_contact_integration_links"
},
{
"description": "All contact tags of the organization. Paged with hasMore/paginationToken; totalCount included. GET /contacts/tags.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page_size": {
"description": "Results per page (1-500). Keep it small (e.g. 25-50) for long records: an oversized page is cut, but the Paging part with the cursor always stays whole.",
"maximum": 500,
"minimum": 1,
"type": "integer"
},
"pagination_token": {
"description": "The paginationToken from the previous page's reply (when hasMore is true).",
"maxLength": 4096,
"minLength": 1,
"type": "string"
}
},
"type": "object"
},
"name": "sprucehealth_list_contact_tags"
},
{
"description": "Contacts of the organization (patients, professionals, clinics): name, date of birth, phones, emails, tags, custom fields, integration links. Paged with hasMore/paginationToken; totalCount included. Use sprucehealth_search_contacts to find someone. GET /contacts.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page_size": {
"description": "Results per page (1-500). Keep it small (e.g. 25-50) for long records: an oversized page is cut, but the Paging part with the cursor always stays whole.",
"maximum": 500,
"minimum": 1,
"type": "integer"
},
"pagination_token": {
"description": "The paginationToken from the previous page's reply (when hasMore is true).",
"maxLength": 4096,
"minLength": 1,
"type": "string"
}
},
"type": "object"
},
"name": "sprucehealth_list_contacts"
},
{
"description": "The items (messages, internal notes, calls, voicemails, faxes, attachments with short-lived signed URLs) in one conversation. Order newest_first (default) or oldest_first; start_from = only items created after that time. Paged with hasMore/paginationToken; totalCount is a best-effort count. GET /conversations/{conversationId}/items.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"conversation_id": {
"description": "The conversation id (e.g. \"t_0E5QDJJC03000\").",
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"order": {
"description": "Order of the items (default newest_first).",
"enum": [
"newest_first",
"oldest_first"
],
"type": "string"
},
"page_size": {
"description": "Results per page (1-200). Keep it small (e.g. 25-50) for long records: an oversized page is cut, but the Paging part with the cursor always stays whole.",
"maximum": 200,
"minimum": 1,
"type": "integer"
},
"pagination_token": {
"description": "The paginationToken from the previous page's reply (when hasMore is true).",
"maxLength": 4096,
"minLength": 1,
"type": "string"
},
"start_from": {
"description": "Only items created after this RFC 3339 date-time (with zone).",
"type": "string"
}
},
"required": [
"conversation_id"
],
"type": "object"
},
"name": "sprucehealth_list_conversation_items"
},
{
"description": "Messages scheduled to be sent later in one conversation (read only; nothing is sent or cancelled). GET /conversations/{conversationId}/scheduledmessages.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"conversation_id": {
"description": "The conversation id (e.g. \"t_0E5QDJJC03000\").",
"maxLength": 200,
"minLength": 1,
"type": "string"
}
},
"required": [
"conversation_id"
],
"type": "object"
},
"name": "sprucehealth_list_conversation_scheduled_messages"
},
{
"description": "All conversation tags of the organization. Paged; totalCount included. GET /conversations/tags.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page_size": {
"description": "Results per page (1-500). Keep it small (e.g. 25-50) for long records: an oversized page is cut, but the Paging part with the cursor always stays whole.",
"maximum": 500,
"minimum": 1,
"type": "integer"
},
"pagination_token": {
"description": "The paginationToken from the previous page's reply (when hasMore is true).",
"maxLength": 4096,
"minLength": 1,
"type": "string"
}
},
"type": "object"
},
"name": "sprucehealth_list_conversation_tags"
},
{
"description": "Conversations of the organization (title, type, tags, archived, assignee, participants, last message time), ordered by creation or last message. With start_from, only conversations whose ordering time is at or after it (useful for 'what changed since…'). Eventually consistent. Paged; give start_from OR pagination_token, not both. GET /conversations.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"order_by": {
"description": "Order by creation time or last message time (default last_message).",
"enum": [
"created",
"last_message"
],
"type": "string"
},
"page_size": {
"description": "Results per page (1-200). Keep it small (e.g. 25-50) for long records: an oversized page is cut, but the Paging part with the cursor always stays whole.",
"maximum": 200,
"minimum": 1,
"type": "integer"
},
"pagination_token": {
"description": "The paginationToken from the previous page's reply (when hasMore is true).",
"maxLength": 4096,
"minLength": 1,
"type": "string"
},
"start_from": {
"description": "Only conversations whose ordering time is at or after this RFC 3339 date-time (with zone).",
"type": "string"
}
},
"type": "object"
},
"name": "sprucehealth_list_conversations"
},
{
"description": "The organization's own channels: Spruce phone and fax numbers, email addresses and Spruce Links, with their owner and members. GET /internalendpoints.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {},
"type": "object"
},
"name": "sprucehealth_list_internal_endpoints"
},
{
"description": "All members of the organization: teammates (name, email, admin, suspended), teams and the organization itself. Paged with hasMore/paginationToken; totalCount included. GET /organization/members.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page_size": {
"description": "Results per page (2-500). Keep it small (e.g. 25-50) for long records: an oversized page is cut, but the Paging part with the cursor always stays whole.",
"maximum": 500,
"minimum": 2,
"type": "integer"
},
"pagination_token": {
"description": "The paginationToken from the previous page's reply (when hasMore is true).",
"maxLength": 4096,
"minLength": 1,
"type": "string"
}
},
"type": "object"
},
"name": "sprucehealth_list_members"
},
{
"description": "All phone lines of the organization (id, name); totalCount included. GET /phonelines.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {},
"type": "object"
},
"name": "sprucehealth_list_phone_lines"
},
{
"description": "Who has read one conversation item and when they first read it (oldest first). GET /conversationItems/{conversationItemId}/readReceipts.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"conversation_item_id": {
"description": "The conversation item id (e.g. \"ti_0D4QABCC06000\").",
"maxLength": 200,
"minLength": 1,
"type": "string"
}
},
"required": [
"conversation_item_id"
],
"type": "object"
},
"name": "sprucehealth_list_read_receipts"
},
{
"description": "Saved message templates (private and organization-wide): title, text, internal/shared flags. Paged with hasMore/paginationToken. GET /savedmessages.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page_size": {
"description": "Results per page (1-500). Keep it small (e.g. 25-50) for long records: an oversized page is cut, but the Paging part with the cursor always stays whole.",
"maximum": 500,
"minimum": 1,
"type": "integer"
},
"pagination_token": {
"description": "The paginationToken from the previous page's reply (when hasMore is true).",
"maxLength": 4096,
"minLength": 1,
"type": "string"
}
},
"type": "object"
},
"name": "sprucehealth_list_saved_messages"
},
{
"description": "All messages scheduled to be sent from the organization (read only). Paged with hasMore/paginationToken; totalCount included. GET /scheduledmessages.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"pagination_token": {
"description": "The paginationToken from the previous page's reply (when hasMore is true).",
"maxLength": 4096,
"minLength": 1,
"type": "string"
}
},
"type": "object"
},
"name": "sprucehealth_list_scheduled_messages"
},
{
"description": "The members of one team (team ids come from sprucehealth_list_members, type 'team'). Paged. GET /teams/{teamId}/members.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page_size": {
"description": "Results per page (1-500). Keep it small (e.g. 25-50) for long records: an oversized page is cut, but the Paging part with the cursor always stays whole.",
"maximum": 500,
"minimum": 1,
"type": "integer"
},
"pagination_token": {
"description": "The paginationToken from the previous page's reply (when hasMore is true).",
"maxLength": 4096,
"minLength": 1,
"type": "string"
},
"team_id": {
"description": "The team id (e.g. \"entity_0D4QABCC06000\").",
"maxLength": 200,
"minLength": 1,
"type": "string"
}
},
"required": [
"team_id"
],
"type": "object"
},
"name": "sprucehealth_list_team_members"
},
{
"description": "Find contacts by free text and/or filters (category, tags, name, phone, email, invite state, created time). Filters combine with AND; values inside one filter match ANY (tags can use all/none). Paged; totalCount with totalCountRelation (eq = exact, gte = lower bound). A read: POST /contacts/search changes nothing.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"categories": {
"description": "Contact categories to include.",
"items": {
"enum": [
"patient",
"professional",
"clinic",
"unknown"
],
"type": "string"
},
"maxItems": 4,
"type": "array"
},
"created_from": {
"description": "Only contacts added at or after this time (RFC 3339 with zone).",
"type": "string"
},
"created_to": {
"description": "Only contacts added at or before this time (RFC 3339 with zone).",
"type": "string"
},
"email_addresses": {
"description": "Email addresses.",
"items": {
"format": "email",
"maxLength": 320,
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"type": "string"
},
"maxItems": 20,
"type": "array"
},
"family_name": {
"description": "Family (last) name.",
"maxLength": 200,
"type": "string"
},
"free_text": {
"description": "Free-text query (name, phone, email…).",
"maxLength": 500,
"type": "string"
},
"given_name": {
"description": "Given (first) name.",
"maxLength": 200,
"type": "string"
},
"invite_states": {
"description": "Spruce account/invite state.",
"items": {
"enum": [
"has_account",
"invited",
"not_invited"
],
"type": "string"
},
"maxItems": 3,
"type": "array"
},
"page_size": {
"description": "Results per page (1-500). Keep it small (e.g. 25-50) for long records: an oversized page is cut, but the Paging part with the cursor always stays whole.",
"maximum": 500,
"minimum": 1,
"type": "integer"
},
"pagination_token": {
"description": "The paginationToken from the previous page's reply (when hasMore is true).",
"maxLength": 4096,
"minLength": 1,
"type": "string"
},
"phone_numbers": {
"description": "Phone numbers, e.g. 2065551234 or +12065551234.",
"items": {
"maxLength": 40,
"minLength": 1,
"type": "string"
},
"maxItems": 20,
"type": "array"
},
"tags": {
"description": "Contact tag text values (the `value` of a tag from sprucehealth_list_contact_tags).",
"items": {
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"maxItems": 50,
"type": "array"
},
"tags_match": {
"description": "How the tags combine: any (default), all, or none (exclude).",
"enum": [
"any",
"all",
"none"
],
"type": "string"
}
},
"type": "object"
},
"name": "sprucehealth_search_contacts"
}
]
}What the leaf hashes
{"body":"9a848cfaeac836908e314dab0bdf3eb90cf3172881cfe27f0b1287dc91b67027","id":301502,"kind":"mcp.tools","method":"probe.mcp/1","observed_us":1793054119140804,"prev":null,"subject":"d4908eb4-d465-4c29-985b-38bcbf9ee52b","subject_kind":"endpoint"}Proof
Fold these into the leaf in order, hashing each sorted pair with keccak256, to reach the root of (296695 rows).
- 0xa49d4b4f0d3b7cc618fa8aa844617f15dd88e788879de40456d042ce6427e4f5
- 0x16bab4c9abcfe4e349c8d0ad66e8ff657783e84bb9e9132bb02a08cbddfd527a
- 0x4534c7662aed5ae7427db404cd60848b38a8162a2cd3242a93b3475a5ce8a3b8
- 0xc8e6fce9f835d23930cc77ae9437df86fe91971626888907b0aa2152781985f8
- 0x079554627ef049571d98254d9fd5ddf3d6bb069b2a665fc735167654b645f703
- 0xea8853b937b6e95c535946305fbbdf921bb4b9840427aa64e93aa3778494d798
- 0x8b5ddb0ad55794cb2cc6a367f90dcb038cfbc384a23c0db646bff59cf2c8c66c
- 0xe49e2d0ed142794e41252c9c2ae9faecb6a7d846aaf89f7fc1462a5bc05ca899
- 0xbcef88b1730010a11c8820c2e7e4ec1441c62ab07c0fc752b294fd2666c9d9a9
- 0xcfc41667c7e4033b09b3eb60ac1b4f7735f1d813168ca8ee332b26dbabe469c4
- 0x63bb18928b05af339d3db18a674ec04120f1a31736f638d4e101d735122f8380
- 0x21725c62783071369e87d9e0abedb3d8cc37bdab8d0d58308c28aeb7cfd2bc8c
- 0xc34c13c58ba9c342ea1b833ac1882a4aea22777c4fd1092b2f83d3bac6b9f845
- 0x428106f4ae4ec142f17aebf6fa50935242f8d3f1c211cf95d6351d03d11da2b7
- 0x62a900133713919f4eed33d8336876b7a6d538233b8a4f3ed03b29aa44f5bad0
- 0x1ac20d30773e1f4f2f811540e9a99b5cca9177c9e2e029acc0d80cf3f1d11f0f
- 0xd21942ae3214eff88e08ab04884fd4b11958b51af9a0741b7668e2d07a2c56c9
- 0x9a9024edb5069d88a324facb310a5ce8e495214bbaa968f077bede437390194f
- 0x9b9ce5b74b9bab5121612ef6b64920a8d453cbf311096a423eef9702747e868a
- Day root
- 0xf43e8dcc3d451a4788b26be904c55e8c4c0fa75c9666796c51db38d37e2c0df8
- Chained
- 0x702d5ac508f08b0d1accf36af25822d8e5660367494edd17a642fb61e158a57a
- Published
- On Arc Testnet, block 69251483: 0x495162f8936e19f0039918feebe6c307f327cd6bf8c37219620b1970041fa9ae