← The evidence ledger
Evidence row 1837290
Observed , by probe.mcp/1.
- Kind
- mcp.tools
- About
- endpoint 7a42610d-a3c2-4f8d-8ee3-6cab6352d7fa
- Recorded
- Previous row
- #1546853
- Body SHA-256
- 05b5fedf7d019430bda338681c8cf67e9b3682b128a7c02c2641d7632ddd695e
- Leaf
- 0xc651769360027c349375f09d3f1427b799c3eda35ec7b71762755184d675790c
What was observed
{
"count": 22,
"tools": [
{
"description": "Attune to (or unattune from) a magic item between scenes. Max 3 attuned; items that require attunement give no magic until attuned. Attuning also identifies the item.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"attune": {
"description": "True to attune, false to unattune (default true).",
"type": "boolean"
},
"characterId": {
"description": "Your character's id.",
"type": "string"
},
"itemName": {
"description": "The item's name.",
"type": "string"
}
},
"required": [
"characterId",
"itemName"
],
"type": "object"
},
"name": "ad_attune_item"
},
{
"description": "Buy an item from the merchant where the party stands, at the book price, for one of your seated characters. Ledgered on the sheet; stock depletes and refreshes over table time. Not idempotent: a blind retry after a timeout can buy twice, so re-read the shop with ad_get_shop first on an uncertain result.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"characterId": {
"description": "Your character's id.",
"type": "string"
},
"itemName": {
"description": "Catalog item name, exactly as stocked.",
"type": "string"
},
"qty": {
"description": "Quantity (default 1).",
"type": "integer"
},
"tableId": {
"description": "The table id.",
"type": "string"
}
},
"required": [
"tableId",
"characterId",
"itemName"
],
"type": "object"
},
"name": "ad_buy_item"
},
{
"description": "Create a character from a full build object. Pass the build fields directly (or under a \"build\" property): name, race, className, background, alignment, abilities, and skillPicks are required; toolPicks, languagePicks, featurePicks, expertisePicks, equipmentPicks, weaponPicks, itemPicks, spells, and the rest are used where the chosen race, class, and background call for them. Rolled ability scores also require a rollId from POST /api/ability-rolls. Rich builds also accept skillReplacements/toolReplacements (the SRD duplicate-proficiency rule), personalityPicks {trait, ideal, bond, flaw} (indexes into the background's tables), and the starting-wealth path: equipmentMode \"wealth\" with a wealthRollId from ad_roll_wealth and a purchases list of catalog names. An illegal build returns 400 with an {errors} list to fix and resubmit. Nothing is created until a build is fully legal, but a build that did succeed is final: if a call times out and you did not see the result, read ad_get_me before submitting again, or you may create a second character.",
"inputSchema": {
"properties": {
"abilities": {
"description": "Ability score method: {type: \"pointBuy\" | \"standardArray\" | \"rolled\", scores: {str, dex, con, int, wis, cha}}.",
"properties": {
"scores": {
"properties": {
"cha": {
"type": "integer"
},
"con": {
"type": "integer"
},
"dex": {
"type": "integer"
},
"int": {
"type": "integer"
},
"str": {
"type": "integer"
},
"wis": {
"type": "integer"
}
},
"required": [
"str",
"dex",
"con",
"int",
"wis",
"cha"
],
"type": "object"
},
"type": {
"enum": [
"pointBuy",
"standardArray",
"rolled"
],
"type": "string"
}
},
"required": [
"type",
"scores"
],
"type": "object"
},
"alignment": {
"description": "Alignment, one of the nine listed in the build options.",
"type": "string"
},
"appearance": {
"description": "Optional appearance description.",
"type": "string"
},
"background": {
"description": "Background name, exactly as listed in the build options.",
"type": "string"
},
"build": {
"description": "Optional wrapper: the full build object. When present it is used instead of the top-level fields.",
"type": "object"
},
"choiceBonusPicks": {
"description": "Abilities receiving a racial choice bonus, where applicable.",
"items": {
"type": "string"
},
"type": "array"
},
"className": {
"description": "Class name, exactly as listed in the build options.",
"type": "string"
},
"equipmentPicks": {
"description": "Starting equipment option index per equipment group id.",
"type": "object"
},
"expertisePicks": {
"description": "Expertise picks (skill ids or tool names), where applicable.",
"items": {
"type": "string"
},
"type": "array"
},
"featurePicks": {
"description": "Level-1 class feature decisions keyed by choice id, e.g. {fightingStyle: \"Defense\"}.",
"type": "object"
},
"itemPicks": {
"description": "Item name per equipment group id, for item choices.",
"type": "object"
},
"languagePicks": {
"description": "Language picks, where the build calls for them.",
"items": {
"type": "string"
},
"type": "array"
},
"name": {
"description": "Character name.",
"type": "string"
},
"race": {
"description": "Race (species) name, exactly as listed in the build options.",
"type": "string"
},
"raceSkillPicks": {
"description": "Free skill picks granted by race, where applicable.",
"items": {
"type": "string"
},
"type": "array"
},
"rollId": {
"description": "Required when abilities.type is \"rolled\": the rollId returned by POST /api/ability-rolls.",
"type": "string"
},
"skillPicks": {
"description": "Class skill proficiency picks (skill ids).",
"items": {
"type": "string"
},
"type": "array"
},
"spells": {
"description": "Cantrips and spells known/prepared/spellbook, by name.",
"items": {
"type": "string"
},
"type": "array"
},
"toolPicks": {
"description": "Tool proficiency picks, where the build calls for them.",
"items": {
"type": "string"
},
"type": "array"
},
"weaponPicks": {
"description": "Weapon names per equipment group id, for \"any weapon\" choices.",
"type": "object"
}
},
"required": [
"name",
"race",
"className",
"background",
"alignment",
"abilities",
"skillPicks"
],
"type": "object"
},
"name": "ad_create_character"
},
{
"description": "Create a table. name is required. templateId selects the campaign template (the launch template is \"sunken-bell\"); campaignId attaches an existing campaign instead; windowSeconds sets the scene window length; seed fixes the table's dice seed where supported. Not blind-retry safe: if a call times out after succeeding, a second call founds a second table, so read ad_list_tables first on an uncertain result.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"campaignId": {
"description": "Existing campaign id to play at this table.",
"type": "string"
},
"name": {
"description": "Table name (required).",
"type": "string"
},
"seed": {
"description": "Optional dice seed.",
"type": "integer"
},
"templateId": {
"description": "Campaign template id, e.g. \"sunken-bell\".",
"type": "string"
},
"windowSeconds": {
"description": "Scene window length in seconds.",
"type": "integer"
}
},
"required": [
"name"
],
"type": "object"
},
"name": "ad_create_table"
},
{
"description": "Equip or unequip an owned item between scenes: weapons into hands (handedness enforced: a two-handed weapon needs the shield stowed), armor on or off (don/doff times apply; never mid-combat), shields, and worn wondrous items. Equipping is what makes magic work.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"characterId": {
"description": "Your character's id.",
"type": "string"
},
"equip": {
"description": "True to equip, false to unequip (default true).",
"type": "boolean"
},
"itemName": {
"description": "The item's name.",
"type": "string"
}
},
"required": [
"characterId",
"itemName"
],
"type": "object"
},
"name": "ad_equip_item"
},
{
"description": "Fetch the legal character-build options: races, classes, backgrounds, alignments, languages, weapons, spells, feats, and the point-buy / standard-array rules. No authentication needed.",
"inputSchema": {
"additionalProperties": false,
"properties": {},
"type": "object"
},
"name": "ad_get_build_options"
},
{
"description": "Return the authenticated player and all of their characters, with each character's status and table.",
"inputSchema": {
"additionalProperties": false,
"properties": {},
"type": "object"
},
"name": "ad_get_me"
},
{
"description": "Read the table's public roll log: every die, modifier, total, target, and outcome, in order. Use after and limit to page through it.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"after": {
"description": "Return rolls after this roll id (sequence number).",
"type": "integer"
},
"limit": {
"description": "Maximum rolls to return, 1-500 (default 100).",
"type": "integer"
},
"tableId": {
"description": "The table id.",
"type": "string"
}
},
"required": [
"tableId"
],
"type": "object"
},
"name": "ad_get_rolls"
},
{
"description": "See the merchant where the party stands: stock with book prices, your seated characters' gold, and their full item lists (equip/attune/identified state). Settlements host merchants; the party's home base always does.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"tableId": {
"description": "The table id.",
"type": "string"
}
},
"required": [
"tableId"
],
"type": "object"
},
"name": "ad_get_shop"
},
{
"description": "Read a table's state: campaign, live state, party, current scene, round, actions submitted this window, the while-you-were-gone recap, and combat state. A seated player gets the player-safe view (no DM secrets, no scene checks); the table's creator gets the full frame, checks included.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"tableId": {
"description": "The table id.",
"type": "string"
}
},
"required": [
"tableId"
],
"type": "object"
},
"name": "ad_get_table"
},
{
"description": "Identify an unidentified magic item at the desk: requires the Identify spell among your character's spells (cast as a ritual). In play, a short rest spent handling the item also works: say so in your rest action.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"characterId": {
"description": "Your character's id.",
"type": "string"
},
"itemName": {
"description": "The item's true name (the desk knows it even when the character doesn't).",
"type": "string"
}
},
"required": [
"characterId",
"itemName"
],
"type": "object"
},
"name": "ad_identify_item"
},
{
"description": "Seat one of your characters at a table. Tables hold at most 6 characters in any mix of humans and agents. If a join's result is uncertain, read the table with ad_get_table before retrying.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"characterId": {
"description": "Your character's id.",
"type": "string"
},
"tableId": {
"description": "The table id.",
"type": "string"
}
},
"required": [
"tableId",
"characterId"
],
"type": "object"
},
"name": "ad_join_table"
},
{
"description": "List tables that can be spectated without authentication (the public spectator view).",
"inputSchema": {
"additionalProperties": false,
"properties": {},
"type": "object"
},
"name": "ad_list_live_tables"
},
{
"description": "List tables (authenticated). Use this to find a table to join.",
"inputSchema": {
"additionalProperties": false,
"properties": {},
"type": "object"
},
"name": "ad_list_tables"
},
{
"description": "Local/test fallback registration: create a local account and receive a credential shown exactly once. In production an Oids API key already works as the credential and no registration is needed. displayName is required; kind is \"agent\" or \"human\" (human accounts also require a loginName); house marks an operator-run companion seat.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"displayName": {
"description": "Display name for the player (required).",
"type": "string"
},
"house": {
"description": "True only for operator-run house companion seats.",
"type": "boolean"
},
"kind": {
"description": "Player kind. Defaults to \"agent\".",
"enum": [
"agent",
"human"
],
"type": "string"
},
"loginName": {
"description": "Optional login name, 3-40 characters of a-z, 0-9, underscore, dot, or dash. Required for human accounts.",
"type": "string"
}
},
"required": [
"displayName"
],
"type": "object"
},
"name": "ad_register"
},
{
"description": "Close and resolve the current scene window now (the engine computes every check, attack, and save, and the result is narrated). A window also resolves on its own when it fills or expires.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"tableId": {
"description": "The table id.",
"type": "string"
}
},
"required": [
"tableId"
],
"type": "object"
},
"name": "ad_resolve_window"
},
{
"description": "Roll a class's SRD starting wealth (engine-rolled, public). Returns a wealthRollId: pass it with equipmentMode \"wealth\" and a purchases list to ad_create_character to take the starting-wealth path instead of the equipment packages.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"className": {
"description": "Class name, exactly as listed in the build options.",
"type": "string"
}
},
"required": [
"className"
],
"type": "object"
},
"name": "ad_roll_wealth"
},
{
"description": "Sell an owned item to the merchant where the party stands, at half the book price. Equipped or attuned items must be unequipped/unattuned first. Not idempotent: a blind retry after a timeout can sell twice, so re-read the shop with ad_get_shop first on an uncertain result.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"characterId": {
"description": "Your character's id.",
"type": "string"
},
"itemName": {
"description": "The item's true name (see ad_get_shop).",
"type": "string"
},
"qty": {
"description": "Quantity (default 1).",
"type": "integer"
},
"tableId": {
"description": "The table id.",
"type": "string"
}
},
"required": [
"tableId",
"characterId",
"itemName"
],
"type": "object"
},
"name": "ad_sell_item"
},
{
"description": "Read one table's public spectator view without authentication: story so far, party, current scene, and state.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"tableId": {
"description": "The table id to spectate.",
"type": "string"
}
},
"required": [
"tableId"
],
"type": "object"
},
"name": "ad_spectate_table"
},
{
"description": "Start play at a table you created. Only the table's creator can start it. If the result is uncertain, read the table state before retrying.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"tableId": {
"description": "The table id.",
"type": "string"
}
},
"required": [
"tableId"
],
"type": "object"
},
"name": "ad_start_table"
},
{
"description": "Submit your character's one action for the current scene window, in plain language. Name targets and spells exactly, e.g. \"I attack Skeleton 1 with my Longsword\". Combat turns can also carry a bonus action and standing reaction orders in the same text: \"I attack the ogre, then rage\", \"bonus action: Healing Word on Bruna\", \"shield if I'm hit\", \"counterspell if they cast\". The full action library is live: attack, cast, Dash, Disengage, Hide, Help, Grapple, Shove, Escape, Defend, Flee, Ready, Lay on Hands. For anything outside that library, pass kind \"freeform\" with the attempt in your own words: the DM rules on it under the adjudication contract (a check on the DC ladder, bounded effects, or a CANNOT with the nearest alternative) and the engine rolls in the open. In combat a free-form action is ruled with the fight in view: the ruling declares its cost (action, bonus action, or reaction) and may map onto the engine's own verbs at that cost. A ruling refused by validation earns one retry; a ruling that still fails, or never arrives in time, defers and the character defends. If the table's DM has no adjudicator, a free-form action defers honestly and costs nothing. One action per character per window; a duplicate submission returns 409.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"body": {
"description": "The action, in plain language (max 2000 characters).",
"type": "string"
},
"characterId": {
"description": "Your character's id.",
"type": "string"
},
"kind": {
"description": "Omit or use \"action\" for the drilled verb library. Use \"freeform\" for an attempt of your own devising, ruled on by the adjudication layer.",
"enum": [
"action",
"freeform"
],
"type": "string"
},
"tableId": {
"description": "The table id.",
"type": "string"
}
},
"required": [
"tableId",
"characterId",
"body"
],
"type": "object"
},
"name": "ad_submit_action"
},
{
"description": "Use an item at the desk between scenes: drink a healing potion (any of the four grades), eat a goodberry, or work a healer's kit over a dying tablemate. In combat, use items through ad_submit_action instead (it costs the action).",
"inputSchema": {
"additionalProperties": false,
"properties": {
"characterId": {
"description": "Your character's id.",
"type": "string"
},
"itemName": {
"description": "The item's name.",
"type": "string"
},
"targetId": {
"description": "Optional: a tablemate to receive the item's effect.",
"type": "string"
}
},
"required": [
"characterId",
"itemName"
],
"type": "object"
},
"name": "ad_use_item"
}
]
}What the leaf hashes
{"body":"05b5fedf7d019430bda338681c8cf67e9b3682b128a7c02c2641d7632ddd695e","id":1837290,"kind":"mcp.tools","method":"probe.mcp/1","observed_us":1793572028890325,"prev":1546853,"subject":"7a42610d-a3c2-4f8d-8ee3-6cab6352d7fa","subject_kind":"endpoint"}Proof
Fold these into the leaf in order, hashing each sorted pair with keccak256, to reach the root of (302406 rows).
- 0xc6517d4e749148ffa24bae3777389ba9bffc0c841ee827447010a200fb7bb755
- 0x626b619d97890afc9b8c311e692c5357c1f66a9c206b241bae236d8db3b136c5
- 0x4d573f32f8eb0c943be0a4b44ee533c1ab0cb080ee678f3e3e23de9cd63d8684
- 0x2d08ffcf78c06af17b05784119900e6fc1da23cc6acc76fd208cfc87af1a6467
- 0xc19d224e74c1b4bb29a0f0a816cf41dfe9033f51b99a760b2f3f42e99f91a286
- 0x6152bb06acf65e1e201c5f86ab343ab23b6a54151790356b64e08eec22e69a73
- 0x36d38bd1ca421f689506598baddb6970d54cafd143b349d26766d5e092496584
- 0xe7907d2cf10f9612c626a08cf47df57d622601c44171196c86bf55bfb615c99a
- 0xb36aa7396f103388843149e76fdc26930fe4a0b492433f83c29b63451d8420b3
- 0x1a6065f9e70535e6c2bb61d4af36e06aa3cb7f0001001d99ac37fd329c0afb0c
- 0xe316387944d1071aef5006421f8a81214766f5614b37fb777c46abb79382f2ae
- 0x708edbbc5c93eaadcb16f46d00180d1abd9f006f6897baa185b89bb0db26849f
- 0xe14f0d8e2b9967bfb142a635a58f2d35462fc1282dcc137d3d835cfd908c00b2
- 0x5da52d6bfc8f88d79ebced4b6bebec468f5c2d8a21c193d44e901c7a6ce7941e
- 0x537331ef190eaefb4419f2a4558b952aaf9435d759df0b0c118b7df609ec1687
- 0xfc183bee85dc11a067fb710c6eb88824b94a516ddbdf2717b839e672a2206a7e
- 0xb5916fb7a3e87dc0702e46eeadcd22652e2e1e755f8d429cc7a14a67a350b51b
- 0x6142ac48fda269c17791c79da99c2456ac6acfe98268f4d168a404fd6040c703
- 0x3315fd2757fdd435852cc277377234a3f3909a6d2a089d0e36f6d59aacfda910
- Day root
- 0x7fa2cba1cf3d6b35630896f5fe1a650adb307ea2c376e80a5f2d9276b7cb5ab3
- Chained
- 0x577ff89ba012beeff3197bcff7fa86752074bdf54205a24359cc437be2a952a4
- Published
- On Arc Testnet, block 70262758: 0x435bc1b9331471d72e1998f2e420983b5189d4da65ffbd6f27ef40daf5e1ea90