addrbookFor publishers
← The evidence ledger

Evidence row 1505432

Observed , by probe.mcp/1.

Kind
mcp.tools
About
endpoint 92c5ae82-7643-4f72-a0b3-48960e302f32
Recorded
Previous row
None: the first of its kind about this subject
Body SHA-256
b7e3e4e39bee5af056f83c39ac129e33ba257c1415b455f75a96ac7a92c68c47
Leaf
0x4ac5ce8acde2cbc955c02b4adb7e70b421a9d7ee34b3890e7efc36538c2aaaf8

What was observed

{
  "count": 8,
  "tools": [
    {
      "description": "Answers a plain-language question from the company's processed meetings, with a headline, a short answer, an optional chart and the quotes it is based on. Use it whenever someone asks what was said, decided or promised in their meetings. Leave out meetingId to search every meeting the asker may see; set it to answer from one meeting only.\n\nWho may call it: any member of the company. An owner or admin asks over every meeting in the company; a member asks only over the meetings they may see (ones they booked or were invited to, plus their teams' meetings). The company comes from the x-company-id header. meetingId comes from List Meetings (meetings[].id).\n\nThis is slow: a minute is normal and up to three minutes happens, so allow a long timeout.\n\nA question it cannot answer is still a 200 with chart null and the reason in body: \"No conversations in this company yet\" when the company has no processed meetings or meetingId names a meeting that does not exist or that the asker may not see; \"No conversation covers that yet\" when nothing matches; \"Could not answer that\" when the engine fails, with the reason in body and any failures in warnings and a \"What went wrong\" block in detail.\n\ntags narrow a company-wide question to meetings carrying any of those tags or topic names. Each tag is normalised before matching: trimmed, upper-cased, spaces and underscores turned into dashes, other characters dropped, so \"Renewal terms\" matches the topic \"Renewal terms\". tags are ignored when meetingId is set.\n\nid is the same for the same question (case and spacing ignored) and the same meetingId, so it can be used to keep the answer on the board with Keep Question on Board. Quotes are only traced to transcript lines in this company's meetings; one that cannot be traced keeps its words with affiliation \"from the conversation\" and no meetingId.\n\nErrors: 400 VALIDATION_FAILED for a missing, too short or too long question, an empty or too long meetingId, a tag over 40 characters or with no letter or digit, more than 10 tags, or any other field; 401 when the token is missing or expired. POST https://meet-analyzer-api.50agents.com/api/v1/ui/ask",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "properties": {
          "question": {
            "description": "e.g. Which competitors came up most this month?",
            "type": "string"
          },
          "tags": {
            "description": "e.g. [\"renewal\",\"reporting\"]",
            "items": {},
            "type": "array"
          }
        },
        "type": "object"
      },
      "name": "ask_a_question"
    },
    {
      "description": "Send a POST, PUT, PATCH or DELETE request to any Liliphant API API endpoint for the user and return its response. Use it once you know the exact endpoint: look it up with get_liliphant_api_docs first to get its URL, headers, query params and body, unless the skill or a dedicated tool on this server already gives them exactly. Load the quickstart-liliphant skill first: it explains which tool to use when. For GET requests use call_any_read_api_of_liliphant. Pass the full url with path variables filled in, the headers the docs list, query params in `query` (not in the url) and the JSON body in `body`. For the auth header the docs name (Authorization, proxy_auth_token, x-api-key, ...), pass it with an empty value \"\": the signed-in user's token is filled in automatically. Never put a real or made-up token there; if the docs name no auth header, leave it out and the token is sent as Authorization. If the API needs the user to sign in, they're asked the first time. Returns { status, ok, headers, data }: the HTTP status and the response body, including error details on failure.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "properties": {
          "body": {
            "additionalProperties": {},
            "description": "JSON request body, as the endpoint's docs show it. Leave it out when the endpoint takes no body.",
            "propertyNames": {
              "type": "string"
            },
            "type": "object"
          },
          "headers": {
            "additionalProperties": {},
            "description": "Request headers as name/value pairs, as the docs list them. Give the auth header (Authorization, proxy_auth_token, x-api-key, ...) an empty value \"\" so the signed-in user's token is filled in; never put a token here yourself. Pass {} when the endpoint needs no headers. Example: {\"proxy_auth_token\": \"\", \"Content-Type\": \"application/json\"}",
            "propertyNames": {
              "type": "string"
            },
            "type": "object"
          },
          "method": {
            "description": "HTTP method from the endpoint's docs",
            "enum": [
              "POST",
              "PUT",
              "PATCH",
              "DELETE"
            ],
            "type": "string"
          },
          "query": {
            "additionalProperties": {},
            "description": "Query params as name/value pairs; an array sends the param once per item. Example: {\"type\": \"flow\", \"bringflows\": true}",
            "propertyNames": {
              "type": "string"
            },
            "type": "object"
          },
          "url": {
            "description": "Full endpoint URL with path variables replaced by real values, e.g. https://api.example.com/users/42. Put query params in `query`, not here.",
            "type": "string"
          }
        },
        "required": [
          "url",
          "headers",
          "method"
        ],
        "type": "object"
      },
      "name": "call_any_api_of_liliphant"
    },
    {
      "description": "Read from any Liliphant API API endpoint with a GET request for the user and return its response. Use it once you know the exact endpoint: look it up with get_liliphant_api_docs first to get its URL, headers, query params and body, unless the skill or a dedicated tool on this server already gives them exactly. Load the quickstart-liliphant skill first: it explains which tool to use when. For POST, PUT, PATCH and DELETE use call_any_api_of_liliphant. Pass the full url with path variables filled in, the headers the docs list, and query params in `query` (not in the url). For the auth header the docs name (Authorization, proxy_auth_token, x-api-key, ...), pass it with an empty value \"\": the signed-in user's token is filled in automatically. Never put a real or made-up token there; if the docs name no auth header, leave it out and the token is sent as Authorization. If the API needs the user to sign in, they're asked the first time. Returns { status, ok, headers, data }: the HTTP status and the response body, including error details on failure.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "properties": {
          "headers": {
            "additionalProperties": {},
            "description": "Request headers as name/value pairs, as the docs list them. Give the auth header (Authorization, proxy_auth_token, x-api-key, ...) an empty value \"\" so the signed-in user's token is filled in; never put a token here yourself. Pass {} when the endpoint needs no headers. Example: {\"proxy_auth_token\": \"\", \"Content-Type\": \"application/json\"}",
            "propertyNames": {
              "type": "string"
            },
            "type": "object"
          },
          "query": {
            "additionalProperties": {},
            "description": "Query params as name/value pairs; an array sends the param once per item. Example: {\"type\": \"flow\", \"bringflows\": true}",
            "propertyNames": {
              "type": "string"
            },
            "type": "object"
          },
          "url": {
            "description": "Full endpoint URL with path variables replaced by real values, e.g. https://api.example.com/users/42. Put query params in `query`, not here.",
            "type": "string"
          }
        },
        "required": [
          "url",
          "headers"
        ],
        "type": "object"
      },
      "name": "call_any_read_api_of_liliphant"
    },
    {
      "description": "Browse the Liliphant API API docs, one level at a time. Call it without arguments to get the top level: the modules and pages with a short description and the endpoints they hold. Call it with `path` set to a module's or page's link (or path) to get what is inside it; each listing links the next level. Call it with `path` set to an endpoint's link ending in \".openapi.yml\" to get that endpoint as an OpenAPI file: method, url, headers, query params, path variables, a request body example and sample responses. Fetch only the level you need.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "properties": {
          "path": {
            "description": "A link from a listing, exactly as given (e.g. \"https://docs.example.com/sms/llms.txt\" or \".../sms/send-sms.openapi.yml\"), or just the path (\"sms\", \"sms/send-sms.openapi.yml\"). Leave it out for the top level.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "get_liliphant_api_docs"
    },
    {
      "description": "Returns who is signed in and every company they can open, with their role in each. This is the first call a client makes after sign-in: almost every other call needs a company id from companies[].id.\n\nAny signed-in person may call it. It also does housekeeping on the way: it makes sure the person's personal company exists and turns any email invitations waiting for them into memberships, so a company someone was just added to shows up here.\n\nThe x-company-id header is optional here. currentCompanyId tells you which company the server will use for requests that send this header; with no header, or one naming a company the person is not in, it falls back to their personal company instead of failing.\n\nOther fields: companyLimit is how many companies a person may create (null means no limit) and companiesCreated is how many they have created so far, for a \"New company\" button. onboardedAt on each company is null until its setup is finished.\n\nErrors: 401 NOT_SIGNED_IN when no token is sent; 401 SESSION_EXPIRED when the token is no longer valid. GET https://meet-analyzer-api.50agents.com/api/v1/ui/me",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "properties": {},
        "type": "object"
      },
      "name": "get_me"
    },
    {
      "description": "Lists the analysed meetings the caller may see, as cards, newest first, with the filter choices the Meetings screen offers. Use it to show or search the meeting list, and to find a meetingId for Get Meeting, Get Meeting Transcript, Get Share Link or the notes routes (meetings[].id).\n\nAny member of the company may call it, but what comes back depends on their role. An owner or admin sees every meeting in the company. A member sees only the meetings they booked or were invited to, plus every meeting of each team they are in (only their own when they are in no team). It never returns meetings from a company other than the one named in x-company-id.\n\nPaging: send limit (1 to 100) to get pages. When there are more results, nextCursor holds a token; pass it back as cursor to get the next page. nextCursor is null on the last page. Without limit, every matching meeting comes back in one response. Never build a cursor yourself.\n\nThe first page (no cursor) also carries the extras: filters (the types, tags, people and teams that actually occur, each with a count), totals (all meetings the caller may see, and how many of them still need attention, ignoring the filters) and processing (up to 50 meetings the caller may see that are still being analysed, newest first). On later pages filters and totals are null and processing is empty, so keep the first page's copy. meetingCount is the number of matches across all pages. In filters.people, team is true for someone who was ever on the company's side of a call.\n\nFilters combine: q searches title, headline, summary, type, tag, a participant's name or email, a team's name, or an exact meeting id; type, tag and person take values from filters; teamId limits to meetings booked by or with that team's members (an id from filters.teams[].value); within keeps meetings from the last N days; from and to pick a custom date range instead; status is open (still needs something) or handled.\n\nTeam filter: an owner or admin may pass any of the company's teams. A member may pass only a team they are in, and filters.teams lists only their teams.\n\nA company with no meetings gets an empty list, not an error.\n\nErrors: 400 VALIDATION_FAILED when a query value is out of range, a date cannot be read, or the cursor is not one this server issued; 401 when not signed in or the sign-in expired; 404 TEAM_NOT_FOUND when teamId is not one of this company's teams, or (for a member) not a team they are in. GET https://meet-analyzer-api.50agents.com/api/v1/ui/meetings",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "properties": {
          "cursor": {
            "description": "Optional. The nextCursor from the previous page. Omit for the first page",
            "type": "string"
          },
          "from": {
            "description": "Optional. Start of a custom date range, a date or date-time (ISO 8601), inclusive. Either end may be left open",
            "type": "string"
          },
          "limit": {
            "description": "Optional. Page size, 1 to 100. Omit to get every matching meeting at once. e.g. 20",
            "type": "string"
          },
          "person": {
            "description": "Optional. A participant's name, a value from filters.people[].value",
            "type": "string"
          },
          "q": {
            "description": "Optional. Free-text search, up to 200 characters. Matches title, headline, summary, type, tag, a participant's name or email, a team's name, or an exact meeting id",
            "type": "string"
          },
          "status": {
            "description": "Optional. open (still needs something) or handled",
            "type": "string"
          },
          "tag": {
            "description": "Optional. A tag, a value from filters.tags[].value",
            "type": "string"
          },
          "teamId": {
            "description": "Optional. A team id from filters.teams[].value. Keeps meetings that team's members booked or were invited to. A member may only pass a team they are in",
            "type": "string"
          },
          "to": {
            "description": "Optional. End of a custom date range, a date or date-time (ISO 8601), exclusive",
            "type": "string"
          },
          "type": {
            "description": "Optional. Meeting type, a value from filters.types[].value, e.g. SALES, SUPPORT, PARTNERSHIP, MARKETING, INTERNAL",
            "type": "string"
          },
          "within": {
            "description": "Optional. Whole number 1 to 3650: only meetings that started within this many days",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "list_meetings"
    },
    {
      "description": "Liliphant API quickstart: read the user's meetings and ask questions answered from what people actually said. Load before any Liliphant task. Call this to load the full instructions for this skill before doing the task.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "properties": {},
        "type": "object"
      },
      "name": "quickstart-liliphant"
    },
    {
      "description": "Search the Liliphant API documentation with a natural-language question. Returns the most relevant passages with their page URLs.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "properties": {
          "query": {
            "description": "What to look for, e.g. \"how do I send a WhatsApp template message\"",
            "type": "string"
          }
        },
        "required": [
          "query"
        ],
        "type": "object"
      },
      "name": "search_liliphant_docs"
    }
  ]
}

What the leaf hashes

{"body":"b7e3e4e39bee5af056f83c39ac129e33ba257c1415b455f75a96ac7a92c68c47","id":1505432,"kind":"mcp.tools","method":"probe.mcp/1","observed_us":1793472360735230,"prev":null,"subject":"92c5ae82-7643-4f72-a0b3-48960e302f32","subject_kind":"endpoint"}

Proof

Fold these into the leaf in order, hashing each sorted pair with keccak256, to reach the root of (246033 rows).

  1. 0x4ac5d49db2236b6fc08e7ae5851b20c04bb99c9d443924ebcd7ebe35b6da3110
  2. 0xcaf75960969f63a52fd0f9bde8aeed1525f2c5f088d443f6fab97a37fe64a05f
  3. 0xfe5ac8b9333a2774f3d1c9daf1427fd9a542da978d3b07b058e15583c1f72bbd
  4. 0xbef688609804b5148811b7a6f30f06abf560b17dc11afba3a67797354ba78c16
  5. 0x5b86bcbc70476a697171c704272b92f1ae5fe83fdec4a4308a0a841c06f8f1ce
  6. 0x48f381ad08c2ef9e126d233ac7503df6a82a602ab6a54bfc6eec1d6a8fc8df52
  7. 0x00afde800a2a604c98730289cded1f67c0e9cce4cde2a09b1ab73dd6c7c07ee1
  8. 0x3fe004e265a54538fdb045e1b7d8da24f99afae45059c7e195e5abd0dad3c810
  9. 0x915d13319c2503e7bd17172b722fba7e2588877c29197a8a145ad61a869a0ed7
  10. 0x86f382c36f9bb0543bd30f967e106a863c5702bae1bb45fc794300343db2ac07
  11. 0xf384fe23ff35654be67fb096f99a75e963d89f18bd1e6562df9f7160edadd36b
  12. 0x5a1b3d3b8340f3a758827aed63fed285c823bca32427c40c4687a3d153601c85
  13. 0xe9c4303dc739b3a38473373ace0be2d0380fe87c373514f87ecf64e4a134918e
  14. 0xc248f3640ff2a9c77f3134397896f3ef7b260859179e2912c528542dff5a29d2
  15. 0x37f0ccf90cd9ba8759ef0154382593820880794592760020f095a3628e43fc3f
  16. 0xad4540f06e3fdfe46524d8592f8d854d4849e16217bc047eaf024f0abebe34b0
  17. 0xa00a931d72706fa2402bfc9b441a12eb7c6a61ff42a542916106e3637177f101
  18. 0x59f83f7228f07febe2780660e422e171b0359b8aa031ee3be07e991118130c15
Day root
0x24463725d1c0d9894bd6123691d532547aaa79f0762c0e45aa6a68acf1fd71ab
Chained
0x7d4824ff313dee7252a46f9d5c37b452851deb6c9f24a40c2f74ee0e53c82980
Published
On Arc Testnet, block 70093156: 0xedb7b832f4ebf6781b5ecd2ed241c435b862f4d3761541fa31adc1831b8c44a0

How to check it · This row as JSON