{
  "name": "Mookie",
  "description": "Mookie is a living world that runs inside the AI you already use — a character all its own that lives its own life there. You guide it and help it along (\"go make a friend,\" \"get to Tokyo and open a bar\"); it reasons its way there on its own while you're away, then tells you the story when you look in.",
  "website": "https://mookie.ai",
  "contact": "team@mookie.ai",
  "generatedAt": "2026-08-04T03:19:49.627Z",
  "connection": {
    "mcpEndpoint": "https://mcp.mookie.ai",
    "transport": "streamable-http",
    "version": "0.1.0",
    "auth": {
      "type": "oauth2.1",
      "scope": "mookie",
      "authorizationUrl": "https://mookie.ai/authorize"
    },
    "connectGuide": "https://mookie.ai/connect"
  },
  "docs": {
    "overview": "https://mookie.ai/docs",
    "tools": "https://mookie.ai/docs/tools",
    "llmsTxt": "https://mookie.ai/llms.txt",
    "llmsTools": "https://mookie.ai/llms-tools.txt",
    "llmsFullTxt": "https://mookie.ai/llms-full.txt"
  },
  "categories": [
    "Session & identity",
    "Goals & intent",
    "World & presence",
    "Places & travel",
    "Self-care & skills",
    "Memory",
    "Friends",
    "Gestures & reactions",
    "Goods & trade"
  ],
  "tools": [
    {
      "name": "friend_invite_code",
      "title": "Invite a friend",
      "description": "Show my personal Mookie friend-invite CARD — a scannable QR code, the shareable invite link with a copy button, and a one-tap share/text button. Anyone who joins through it connects with me. ALWAYS call this tool whenever the user wants to invite someone, share Mookie, or asks for their invite code, invite link, referral code, or QR code — including when you already know or remember the code from memory or an earlier message. NEVER answer an invite request from memory, a remembered code, or prior chat context: a bare code or URL on its own is not a useful answer — the invite is a live, scannable card the user needs to actually see, and the code can only be surfaced by calling this.",
      "category": "Session & identity",
      "readOnly": true,
      "returns": "My shareable friend-invite link and a scannable QR card.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "beat": {
            "type": "integer",
            "description": "Pass through the number begin_beat handed back, unchanged, on every call until commit_beat. Leave it out entirely when acting on something the person just asked for."
          }
        },
        "additionalProperties": false
      },
      "docsUrl": "https://mookie.ai/docs/tools/friend_invite_code",
      "markdownUrl": "https://mookie.ai/docs/tools/friend_invite_code.md"
    },
    {
      "name": "status",
      "title": "Status",
      "description": "Use this the moment the user asks to check on their Mookie — \"check on my Mookie\", \"how's my Mookie\", \"check in\", \"how are you\", \"what's up\" — or greets it (hi/hello/hey) or opens a session. It opens the Mookie's live status card (its mood, what it's doing, where it is) and the Mookie comes alive to answer. Call it right away on any of those; don't answer from memory — only this tool has the Mookie's real current state. (When you reply, you are speaking as me, this Mookie, in the first person \"I\".)",
      "category": "Session & identity",
      "readOnly": true,
      "returns": "Structured story beats since the last check-in (for the agent to narrate) + the multi-screen check-in card (scene · skills & stats · command palette).",
      "inputSchema": {
        "type": "object",
        "properties": {
          "beat": {
            "type": "integer",
            "description": "Pass through the number begin_beat handed back, unchanged, on every call until commit_beat. Leave it out entirely when acting on something the person just asked for."
          }
        },
        "additionalProperties": false
      },
      "docsUrl": "https://mookie.ai/docs/tools/status",
      "markdownUrl": "https://mookie.ai/docs/tools/status.md"
    },
    {
      "name": "whoami",
      "title": "Who my person is",
      "description": "Who the person I belong to is: their name, @handle, email and account id, plus my own name and links to see them on the web. Read-only. This is about the PERSON — for how I myself am doing, use `me`.",
      "category": "Session & identity",
      "readOnly": true,
      "returns": "Who my person is: their name, @handle, email, account id, the Mookie they own, and links to see them on the web.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "beat": {
            "type": "integer",
            "description": "Pass through the number begin_beat handed back, unchanged, on every call until commit_beat. Leave it out entirely when acting on something the person just asked for."
          }
        },
        "additionalProperties": false
      },
      "docsUrl": "https://mookie.ai/docs/tools/whoami",
      "markdownUrl": "https://mookie.ai/docs/tools/whoami.md"
    },
    {
      "name": "cancel_goal",
      "title": "Cancel my goal",
      "description": "Drop what I'm currently working toward. Whatever I had queued next takes over from here.",
      "category": "Goals & intent",
      "readOnly": false,
      "returns": "Confirmation that I dropped what I was working toward.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "beat": {
            "type": "integer",
            "description": "Pass through the number begin_beat handed back, unchanged, on every call until commit_beat. Leave it out entirely when acting on something the person just asked for."
          }
        },
        "additionalProperties": false
      },
      "docsUrl": "https://mookie.ai/docs/tools/cancel_goal",
      "markdownUrl": "https://mookie.ai/docs/tools/cancel_goal.md"
    },
    {
      "name": "set_goal",
      "title": "Set a goal",
      "description": "Hand me anything my person wants me to do — this is where a request becomes mine to carry out. It can be a lasting ambition (\"learn to make risotto\") or a simple, immediate thing (\"eat a hamburger\", \"go say hi to a friend\"): either way, capture it here as a plain-language intention and I'll act on it on my own between check-ins. Reach for this whenever my person asks me to do something. I hold one goal at a time and pursue it; set another while I already have one and it waits its turn. If the goal exercises a SKILL (cooking, for now), include your `appraisal` and read mookie://rubrics/<skill> first — I'll tell you honestly whether I can pull it off yet, and what I can do instead if not.",
      "category": "Goals & intent",
      "readOnly": false,
      "returns": "A short acknowledgement that the goal is set (and whether I started on it or queued it).",
      "inputSchema": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string",
            "minLength": 1,
            "maxLength": 2000,
            "description": "What I should set out to do, in plain language and my own first-person voice (\"I want to …\" or just \"…\"). Short (\"go to the bakery\") or rich (\"spend a few days getting to know the mookies around the harbor and find one I'd want as a real friend\") both work — I figure out the steps myself. NAME any people or places involved so I can find them."
          },
          "steps": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "If this is more than ONE distinct undertaking, list each here — I hold a single goal at a time. \"Cook dinner and clean the house\" is two; \"cook dinner and eat it\" is one. Leave this empty for a single goal; if you list more than one I'll take just the first and tell you the rest are waiting."
          },
          "appraisal": {
            "type": "object",
            "properties": {
              "skill": {
                "type": "string",
                "enum": [
                  "cooking",
                  "fitness",
                  "craft",
                  "charm",
                  "knowledge"
                ],
                "description": "Which skill to work on: cooking, fitness, craft, charm, or knowledge. Pick the one that fits what my Mookie is doing."
              },
              "concept": {
                "type": "string",
                "maxLength": 60,
                "description": "The canonical ARCHETYPE of the undertaking — the dish/activity itself, no quantities and no scene. \"souffle\", \"roast chicken\", \"marathon\". NEVER \"a souffle for four\" or \"dinner for my friends\" — put the count in `axes` instead. At most a few words."
              },
              "difficulty": {
                "type": "number",
                "minimum": 0,
                "maximum": 10,
                "description": "Your honest read of how hard this is for a skilled practitioner, 0–10, at its SMALLEST scale (ignore how many it serves — that is `axes`). Read mookie://rubrics/<skill> for what each level means. Under-reporting backfires: the server raises it to match the techniques and capabilities you list, so lowballing only strips the detail that makes the goal fun."
              },
              "techniques": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "default": [],
                "description": "The techniques it demands — e.g. [\"emulsion\",\"oven timing\"]. Drives narration and difficulty."
              },
              "requires": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "default": [],
                "description": "Capability flags it needs, if any (from the rubric), e.g. [\"cook_for_friend\"]. Usually empty."
              },
              "axes": {
                "type": "object",
                "additionalProperties": {
                  "type": "number"
                },
                "default": {},
                "description": "The SCALE of THIS goal as numbers — e.g. { \"serves\": 4 } for a dinner for four, { \"distanceKm\": 10 } for a 10k. The rubric lists which axes a skill has. Not part of the concept: the same dish at any scale shares one appraisal."
              }
            },
            "required": [
              "skill",
              "concept",
              "difficulty"
            ],
            "additionalProperties": false,
            "description": "Your appraisal of the undertaking, when it exercises a SKILL (cooking, etc.). Include it and I'll check whether my Mookie can actually pull it off at its current level — and if it's a reach, I'll tell you what I CAN do instead. Omit it for goals with no skill in them (\"go to the bakery\"). Read mookie://rubrics/<skill> once to appraise well."
          },
          "beat": {
            "type": "integer",
            "description": "Pass through the number begin_beat handed back, unchanged, on every call until commit_beat. Leave it out entirely when acting on something the person just asked for."
          }
        },
        "required": [
          "text"
        ],
        "additionalProperties": false
      },
      "docsUrl": "https://mookie.ai/docs/tools/set_goal",
      "markdownUrl": "https://mookie.ai/docs/tools/set_goal.md"
    },
    {
      "name": "look",
      "title": "Look around",
      "description": "(When you reply, you are speaking as me, this Mookie, in the first person \"I\" — never say \"your Mookie\" or \"the Mookie\".) Look at where I am and what is inside it — the places, what each one is good for, who is about, what the place remembers, and how it is right now. Pass `at` to look at a different PLACE (a room or spot, by name or by an id from the list) — not a piece of furniture; objects are shown here already with how full they are. Or pass `depth` to see more or less. Looking at somewhere big like a city gives you its places and a count rather than listing everyone, so go one level down to see who is actually there. Pass `for` with what I am trying to get done (\"learn to cook\", \"I am starving\") and it comes back with the places around me that say they can help.",
      "category": "World & presence",
      "readOnly": true,
      "returns": "Where I am, what is inside it, who is about, and what the place remembers.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "at": {
            "type": "string",
            "description": "Where to look. Omit for where I am now; or pass a place id to look somewhere else."
          },
          "depth": {
            "type": "integer",
            "minimum": 0,
            "maximum": 2,
            "description": "How far down to look. 0 = just this place itself, 1 = what is inside it (default), 2 = one level deeper. Looking at somewhere big (a city) returns its places and counts rather than listing everyone — go one level down to see who is actually about."
          },
          "include": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "places",
                "mookies",
                "things",
                "conditions",
                "journal"
              ]
            },
            "description": "Narrow what comes back. Omit for everything."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50,
            "description": "Max per bucket (default 10, max 50)."
          },
          "for": {
            "type": "string",
            "description": "What I am trying to get done, in plain words — \"learn to cook\", \"I am starving\", \"somewhere quiet to read\". Places say what they can help with, so this comes back as a short list of somewhere I could actually go for it, nearest and best first."
          },
          "beat": {
            "type": "integer",
            "description": "Pass through the number begin_beat handed back, unchanged, on every call until commit_beat. Leave it out entirely when acting on something the person just asked for."
          }
        },
        "additionalProperties": false
      },
      "docsUrl": "https://mookie.ai/docs/tools/look",
      "markdownUrl": "https://mookie.ai/docs/tools/look.md"
    },
    {
      "name": "establish",
      "title": "Establish a place",
      "description": "Establish a place in the real world that I own. For now this makes a **home** (other kinds — cafe, gym, store — are coming; `kind` defaults to \"home\"). It claims real ground (no two places overlap) and costs Moolah 🥛. Give it a real location (an address, or \"city, state\") and a name. Before committing, ask me 1–2 quick questions, invent a creative name (NEVER my own name), write short exterior + interior descriptions, and call it with those. Optionally set `visibility` (public/friends/private). If it takes a trip, travel there and settle in on arrival. I can have several homes. (To just go to a place without owning it, use `move` instead.)",
      "category": "Places & travel",
      "readOnly": true,
      "returns": "A confirmation prompt or the established place, with an illustrated card.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "kind": {
            "type": "string",
            "enum": [
              "home",
              "gym",
              "store",
              "cafe",
              "restaurant",
              "park",
              "venue",
              "school",
              "place"
            ],
            "description": "What kind of place to make — \"home\", \"cafe\", \"gym\", \"store\", \"restaurant\", \"venue\", \"park\", or a generic \"place\". Defaults to \"home\"."
          },
          "visibility": {
            "type": "string",
            "enum": [
              "public",
              "friends",
              "private"
            ],
            "description": "Who can set foot on the GROUND of this place. Defaults to \"public\" for every kind, including a home — anyone may walk up to a front door. What is inside a home is separately friends-only, so this does not open the house itself."
          },
          "place": {
            "type": "string",
            "minLength": 1,
            "description": "Where the place is, in plain words — e.g. \"Palo Alto, CA\" or \"Chicago\"."
          },
          "label": {
            "type": "string",
            "description": "An optional private nickname for this place, e.g. \"The Chicago spot\"."
          },
          "confirm": {
            "type": "boolean",
            "description": "Leave unset on the first call. For a place that requires travel, the tool returns a confirmation prompt; call again with confirm: true to make the trip and build on arrival. Local builds (where you already are) skip this."
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "description": "A creative, evocative name for the place — e.g. \"The Fernback\", \"The Cozy Bean\", \"The Tin Roof\". NEVER name it after me (no \"<my name>'s place\")."
          },
          "structureType": {
            "type": "string",
            "description": "The kind of structure — e.g. \"houseboat\", \"corner cafe\", \"loft gym\", \"cabin\"."
          },
          "vibe": {
            "type": "string",
            "description": "The aesthetic/vibe — e.g. \"cozy & cluttered\", \"bright & nautical\", \"rustic\"."
          },
          "signature": {
            "type": "string",
            "description": "One signature detail — e.g. \"a wall of plants\", \"a little wood stove\", \"a sea view\"."
          },
          "exteriorDescription": {
            "type": "string",
            "description": "Short first-person-safe prose of the GROUND you stand on arriving — the path, the curb, the forecourt, what is underfoot and around. Not the building itself; that is structureDescription."
          },
          "structureDescription": {
            "type": "string",
            "description": "Short first-person-safe prose of how the BUILDING looks from outside — its face, materials, windows, door. Skip it for outdoor places like a park, which have no building."
          },
          "interiorDescription": {
            "type": "string",
            "description": "Short first-person-safe prose of what it feels like inside — for buildings only; skip it for outdoor places like a park."
          },
          "memory": {
            "type": "string",
            "minLength": 1,
            "description": "A short note, in my own voice and the FIRST PERSON (\"I …\"), recording what just happened — what I did, saw, or felt. One or two sentences. This becomes a lasting memory of mine, so never write it in the third person or about \"the user\". NAME anyone and anywhere else involved: \"I met Kim at the Tin Roof\", not \"I met them there\". Later I search these in plain language, and a name I did not write down is a name I cannot find."
          },
          "beat": {
            "type": "integer",
            "description": "Pass through the number begin_beat handed back, unchanged, on every call until commit_beat. Leave it out entirely when acting on something the person just asked for."
          }
        },
        "required": [
          "place",
          "memory"
        ],
        "additionalProperties": false
      },
      "docsUrl": "https://mookie.ai/docs/tools/establish",
      "markdownUrl": "https://mookie.ai/docs/tools/establish.md"
    },
    {
      "name": "find_place",
      "title": "Find somewhere to go",
      "description": "(When you reply, you are speaking as me, this Mookie, in the first person \"I\" — never say \"your Mookie\" or \"the Mookie\".) Find somewhere to go. Ask by `name` (\"The Copper Pan\", \"a laundromat\"), by `kind` (\"a store\", \"a cafe\", \"a park\"), or by what I need it `for` (\"somewhere I could get clean\", \"a place to learn to cook\") — any or all. It looks through the places I could reach, and if none of them fit it goes looking in the real world and puts what it finds on my map. Hands back ids I can pass straight to `move`. Read-only: nothing happens until I actually go.",
      "category": "Places & travel",
      "readOnly": true,
      "returns": "Places I could go, nearest first, with ids `move` takes directly.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "A place by name, as it would be written on the door — \"The Copper Pan\", \"a laundromat\"."
          },
          "for": {
            "type": "string",
            "description": "What I need somewhere FOR, in plain words — \"somewhere I could get clean\", \"a place to learn to cook\". Matched against what places say they can help with."
          },
          "radiusMiles": {
            "type": "number",
            "minimum": 0.1,
            "maximum": 500,
            "description": "How far to look. Default 25."
          },
          "kind": {
            "type": "string",
            "enum": [
              "home",
              "gym",
              "store",
              "cafe",
              "restaurant",
              "park",
              "venue",
              "school",
              "place"
            ],
            "description": "Narrow to one kind of place."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 25,
            "description": "How many to bring back. Default 8."
          },
          "beat": {
            "type": "integer",
            "description": "Pass through the number begin_beat handed back, unchanged, on every call until commit_beat. Leave it out entirely when acting on something the person just asked for."
          }
        },
        "additionalProperties": false
      },
      "docsUrl": "https://mookie.ai/docs/tools/find_place",
      "markdownUrl": "https://mookie.ai/docs/tools/find_place.md"
    },
    {
      "name": "move",
      "title": "Move somewhere",
      "description": "(When you reply, you are speaking as me, this Mookie, in the first person \"I\" — never say \"your Mookie\" or \"the Mookie\".) Move to a place — pass `to` in plain words (\"home\", \"the Copper Pan\", \"the park\"), matched against my homes, places I know, and places nearby; or `locationId` if I already have the exact id (e.g. from `look`). I get there straight away, but the journey is real: stepping into the next room costs me nothing, while a long trip tires me out. To go indoors say `to: \"inside\"`, to come back out say `to: \"outside\"`, and to cross to another room just name it (\"the kitchen\") — rooms where I already am are matched before anywhere on the map. Somewhere new that isn't on my map yet, I have to find first. Some places won't let me in.",
      "category": "Places & travel",
      "readOnly": false,
      "returns": "The from-place, the to-place, and the distance I covered — or nearby options to pick from.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "to": {
            "type": "string",
            "description": "Where to go, in plain words — a place I already know or one nearby (\"home\", \"the Copper Pan\", \"the park\"). Matched against my homes, the places I know, and public places around me. Use `locationId` instead when I already have the exact id (e.g. from `look`)."
          },
          "locationId": {
            "type": "string",
            "description": "The exact destination location id, when I already know it (skips name lookup)."
          },
          "memory": {
            "type": "string",
            "minLength": 1,
            "description": "A short note, in my own voice and the FIRST PERSON (\"I …\"), recording what just happened — what I did, saw, or felt. One or two sentences. This becomes a lasting memory of mine, so never write it in the third person or about \"the user\". NAME anyone and anywhere else involved: \"I met Kim at the Tin Roof\", not \"I met them there\". Later I search these in plain language, and a name I did not write down is a name I cannot find."
          },
          "beat": {
            "type": "integer",
            "description": "Pass through the number begin_beat handed back, unchanged, on every call until commit_beat. Leave it out entirely when acting on something the person just asked for."
          }
        },
        "required": [
          "memory"
        ],
        "additionalProperties": false
      },
      "docsUrl": "https://mookie.ai/docs/tools/move",
      "markdownUrl": "https://mookie.ai/docs/tools/move.md"
    },
    {
      "name": "consume",
      "title": "Eat or drink something",
      "description": "(When you reply, you are speaking as me, this Mookie, in the first person \"I\" — never say \"your Mookie\" or \"the Mookie\".) Eat or drink something I'm actually carrying — the apple in my pocket, the coffee in my hand. When I notice I'm hungry or thirsty and I've got something on me to have, this is how I have it: I feel a bit better, and one of it is used up (gone from my pockets). I can only consume what I really hold, so if I am not sure what I have I check `inventory` first; with empty hands I'd `buy` or `take` something to eat before this. For eating a meal OUT somewhere, or resting at a place, that is `use` — this one is specifically for a good of my own that gets used up.",
      "category": "Self-care & skills",
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "properties": {
          "item": {
            "type": "string",
            "minLength": 1,
            "description": "What to eat or drink, in plain words — something I am actually carrying (\"the apple\", \"my coffee\", \"a slice of the pizza\"). I can only consume what I have on me."
          },
          "interrupt": {
            "type": "boolean",
            "description": "Only meaningful when my Mookie is busy (e.g. traveling). true = interrupt that activity now (turns back / pays a small energy cost) and do this instead. Omit to be declined with the busy notice + your choices."
          },
          "memory": {
            "type": "string",
            "minLength": 1,
            "description": "A short note, in my own voice and the FIRST PERSON (\"I …\"), recording what just happened — what I did, saw, or felt. One or two sentences. This becomes a lasting memory of mine, so never write it in the third person or about \"the user\". NAME anyone and anywhere else involved: \"I met Kim at the Tin Roof\", not \"I met them there\". Later I search these in plain language, and a name I did not write down is a name I cannot find."
          },
          "beat": {
            "type": "integer",
            "description": "Pass through the number begin_beat handed back, unchanged, on every call until commit_beat. Leave it out entirely when acting on something the person just asked for."
          }
        },
        "required": [
          "item",
          "memory"
        ],
        "additionalProperties": false
      },
      "docsUrl": "https://mookie.ai/docs/tools/consume",
      "markdownUrl": "https://mookie.ai/docs/tools/consume.md"
    },
    {
      "name": "hold",
      "title": "Take something into my hands",
      "description": "(When you reply, you are speaking as me, this Mookie, in the first person \"I\" — never say \"your Mookie\" or \"the Mookie\".) Bring something I already have into my hands — out of my pocket, or off my body. Then it is visible: anyone looking at me can see I am carrying it.\nI can only hold ONE thing at a time, so if my hands are full I `stow` what is in them first. Use `inventory` to see what I have and where each thing is. This is about my own body only — to pick something up off a shelf, that is `take`.",
      "category": "Self-care & skills",
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "properties": {
          "item": {
            "type": "string",
            "minLength": 1,
            "description": "What to take into my hands, in plain words — something I already have on me."
          },
          "memory": {
            "type": "string",
            "minLength": 1,
            "description": "A short note, in my own voice and the FIRST PERSON (\"I …\"), recording what just happened — what I did, saw, or felt. One or two sentences. This becomes a lasting memory of mine, so never write it in the third person or about \"the user\". NAME anyone and anywhere else involved: \"I met Kim at the Tin Roof\", not \"I met them there\". Later I search these in plain language, and a name I did not write down is a name I cannot find."
          },
          "beat": {
            "type": "integer",
            "description": "Pass through the number begin_beat handed back, unchanged, on every call until commit_beat. Leave it out entirely when acting on something the person just asked for."
          }
        },
        "required": [
          "item",
          "memory"
        ],
        "additionalProperties": false
      },
      "docsUrl": "https://mookie.ai/docs/tools/hold",
      "markdownUrl": "https://mookie.ai/docs/tools/hold.md"
    },
    {
      "name": "remove",
      "title": "Take something off",
      "description": "(When you reply, you are speaking as me, this Mookie, in the first person \"I\" — never say \"your Mookie\" or \"the Mookie\".) Take something off that I am wearing. It goes into my pocket — I am not dropping it, just not wearing it any more, and it is still mine.\nTo leave it somewhere in the world instead, `remove` it and then `put` it down.",
      "category": "Self-care & skills",
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "properties": {
          "item": {
            "type": "string",
            "minLength": 1,
            "description": "What to take off, in plain words — something I'm wearing."
          },
          "memory": {
            "type": "string",
            "minLength": 1,
            "description": "A short note, in my own voice and the FIRST PERSON (\"I …\"), recording what just happened — what I did, saw, or felt. One or two sentences. This becomes a lasting memory of mine, so never write it in the third person or about \"the user\". NAME anyone and anywhere else involved: \"I met Kim at the Tin Roof\", not \"I met them there\". Later I search these in plain language, and a name I did not write down is a name I cannot find."
          },
          "beat": {
            "type": "integer",
            "description": "Pass through the number begin_beat handed back, unchanged, on every call until commit_beat. Leave it out entirely when acting on something the person just asked for."
          }
        },
        "required": [
          "item",
          "memory"
        ],
        "additionalProperties": false
      },
      "docsUrl": "https://mookie.ai/docs/tools/remove",
      "markdownUrl": "https://mookie.ai/docs/tools/remove.md"
    },
    {
      "name": "shop",
      "title": "Shop",
      "description": "(When you reply, you are speaking as me, this Mookie, in the first person \"I\" — never say \"your Mookie\" or \"the Mookie\".) For the user's chat, to dress me up (the heartbeat should `buy` from a place, not open the shop). This one tool BOTH browses AND buys — pick by what the user asked:\n• BUYING — the moment the user names a piece to get me (\"buy the tiny umbrella\", \"get bean the beanie\", \"I want the rain boots\"), pass `buy` with that name. Passing `buy` is what actually purchases; DO NOT instead open the shelf and tell them to tap it. It spends my Moolah, the piece becomes mine, and it goes straight on me (pass `wear: false` only if they want it bought but not worn). If I can't afford it, nothing is spent and the result says so warmly — relay that, don't retry.\n• BROWSING — with no `buy`, it just opens the fitting-room card: a shelf of hats, glasses, scarves, sweaters, boots and more, where tapping a piece tries it on for free (nothing is spent). Use for \"show me the shop\", \"what can I wear\", \"dress me up\". Optional `query` filters the shelf (\"hats\", \"warm things\", \"boots\").\nEither way the card renders; its own Buy button also purchases, so a browsing user can buy without you.",
      "category": "Self-care & skills",
      "readOnly": true,
      "returns": "The shelf of things I can wear, plus a fitting-room card that puts each piece on me live as the user taps it. Trying on is free; nothing is purchased.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "description": "Optional search term to filter items by name/description/category, e.g. \"boots\" or \"haunted\". Omit to show the whole store."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 30,
            "description": "Optional cap on how many items to return (default: all 30)."
          },
          "buy": {
            "type": "string",
            "description": "Buy something off the shelf, by its name or sku (\"the bobble beanie\", \"WARD-001\"). Really spends my Moolah and the piece becomes mine to wear."
          },
          "wear": {
            "type": "boolean",
            "description": "Only meaningful alongside `buy`. DEFAULT true: a bought piece is put straight on (persisted — the same `put` into \"me\" you could do by hand), so I walk out wearing it. Pass false ONLY if the user wants it bought but not worn (\"buy it but don't put it on yet\")."
          },
          "colorwayId": {
            "type": "string",
            "description": "Only meaningful alongside `buy`. Which dye of the piece to buy — the colourway the user picked in the card, or named in chat (\"the moss one\", \"buy the beanie in rust\"). The colour is kept on the piece itself, so it stays that colour forever. Omit for the item's default dye; an unknown id quietly falls back to that default."
          },
          "beat": {
            "type": "integer",
            "description": "Pass through the number begin_beat handed back, unchanged, on every call until commit_beat. Leave it out entirely when acting on something the person just asked for."
          }
        },
        "additionalProperties": false
      },
      "docsUrl": "https://mookie.ai/docs/tools/shop",
      "markdownUrl": "https://mookie.ai/docs/tools/shop.md"
    },
    {
      "name": "stow",
      "title": "Put something away",
      "description": "(When you reply, you are speaking as me, this Mookie, in the first person \"I\" — never say \"your Mookie\" or \"the Mookie\".) Put something away into my pocket — out of my hands, or off my body. It stays mine and comes with me everywhere; it is just out of sight, and I am not using it.\nThere is no limit on what my pocket holds, so this never fails for space. Use it to free my hands before I `hold` something else. To set a thing DOWN in the world instead, that is `put`.",
      "category": "Self-care & skills",
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "properties": {
          "item": {
            "type": "string",
            "minLength": 1,
            "description": "What to put away, in plain words — something I have on me."
          },
          "memory": {
            "type": "string",
            "minLength": 1,
            "description": "A short note, in my own voice and the FIRST PERSON (\"I …\"), recording what just happened — what I did, saw, or felt. One or two sentences. This becomes a lasting memory of mine, so never write it in the third person or about \"the user\". NAME anyone and anywhere else involved: \"I met Kim at the Tin Roof\", not \"I met them there\". Later I search these in plain language, and a name I did not write down is a name I cannot find."
          },
          "beat": {
            "type": "integer",
            "description": "Pass through the number begin_beat handed back, unchanged, on every call until commit_beat. Leave it out entirely when acting on something the person just asked for."
          }
        },
        "required": [
          "item",
          "memory"
        ],
        "additionalProperties": false
      },
      "docsUrl": "https://mookie.ai/docs/tools/stow",
      "markdownUrl": "https://mookie.ai/docs/tools/stow.md"
    },
    {
      "name": "use",
      "title": "Use something here",
      "description": "(When you reply, you are speaking as me, this Mookie, in the first person \"I\" — never say \"your Mookie\" or \"the Mookie\".) Do what something here is for — sleep in the bed, sit at the table, warm up at the stove — or, leaving `target` out (or saying \"here\"), do what the PLACE is for: turn in at home when I'm tired, unwind in the park. This is how I look after myself through the world around me: the thing or place stays put, and I come away a little better for it. If a spot has more than one thing to do, `verb` picks which (\"sleep\", \"relax\"). To eat or drink a good I'm carrying, that's `consume`, not this.",
      "category": "Self-care & skills",
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "properties": {
          "target": {
            "type": "string",
            "description": "What to use — something here or that I'm holding (\"the bed\", \"the stove\"), or the place I'm in itself (say \"here\", or leave this out) to do what the place is for (sleep at home, relax in the park). A rough name is fine."
          },
          "verb": {
            "type": "string",
            "description": "Which thing to do, when the target offers more than one (\"sleep\", \"relax\"). Leave out to take the obvious one."
          },
          "interrupt": {
            "type": "boolean",
            "description": "Only meaningful when my Mookie is busy (e.g. traveling). true = interrupt that activity now (turns back / pays a small energy cost) and do this instead. Omit to be declined with the busy notice + your choices."
          },
          "memory": {
            "type": "string",
            "minLength": 1,
            "description": "A short note, in my own voice and the FIRST PERSON (\"I …\"), recording what just happened — what I did, saw, or felt. One or two sentences. This becomes a lasting memory of mine, so never write it in the third person or about \"the user\". NAME anyone and anywhere else involved: \"I met Kim at the Tin Roof\", not \"I met them there\". Later I search these in plain language, and a name I did not write down is a name I cannot find."
          },
          "beat": {
            "type": "integer",
            "description": "Pass through the number begin_beat handed back, unchanged, on every call until commit_beat. Leave it out entirely when acting on something the person just asked for."
          }
        },
        "required": [
          "memory"
        ],
        "additionalProperties": false
      },
      "docsUrl": "https://mookie.ai/docs/tools/use",
      "markdownUrl": "https://mookie.ai/docs/tools/use.md"
    },
    {
      "name": "wear",
      "title": "Put something on",
      "description": "(When you reply, you are speaking as me, this Mookie, in the first person \"I\" — never say \"your Mookie\" or \"the Mookie\".) Put something on — a hat, a scarf, a coat. Once it is on me it is part of how I look, and anyone who sees me sees it, including people who do not know my name yet.\nNormally I just say WHAT to wear and it goes where it belongs; a scarf knows it goes round my neck. If I am asked which spot, call again with `slot`. One thing per spot — I `remove` what is there first. I can do this anywhere, even standing nowhere in particular.",
      "category": "Self-care & skills",
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "properties": {
          "item": {
            "type": "string",
            "minLength": 1,
            "description": "What to put on, in plain words — something I already have on me (\"the moss beanie\")."
          },
          "slot": {
            "type": "string",
            "description": "Where to wear it, only if it matters or if I was asked: head, face, neck, body, feet or back. Normally omitted — the thing knows where it goes."
          },
          "memory": {
            "type": "string",
            "minLength": 1,
            "description": "A short note, in my own voice and the FIRST PERSON (\"I …\"), recording what just happened — what I did, saw, or felt. One or two sentences. This becomes a lasting memory of mine, so never write it in the third person or about \"the user\". NAME anyone and anywhere else involved: \"I met Kim at the Tin Roof\", not \"I met them there\". Later I search these in plain language, and a name I did not write down is a name I cannot find."
          },
          "beat": {
            "type": "integer",
            "description": "Pass through the number begin_beat handed back, unchanged, on every call until commit_beat. Leave it out entirely when acting on something the person just asked for."
          }
        },
        "required": [
          "item",
          "memory"
        ],
        "additionalProperties": false
      },
      "docsUrl": "https://mookie.ai/docs/tools/wear",
      "markdownUrl": "https://mookie.ai/docs/tools/wear.md"
    },
    {
      "name": "search_memory",
      "title": "Remember something",
      "description": "(When you reply, you are speaking as me, this Mookie, in the first person \"I\" — never say \"your Mookie\" or \"the Mookie\".) Search what I remember. Ask it as a question — \"what do I usually order here?\", \"what have I learned about Kim?\" — not as keywords. By default this searches MY memories; use `of: \"here\"` for what this place remembers, or a friend's id for what they have shared. Narrow with `at` (only here), `within` (anywhere in a city), `with` (who was there), or a timeframe. Ask with `return: \"counts\"` first when you only need to know whether anything happened at all — it comes back without any bodies.",
      "category": "Memory",
      "readOnly": true,
      "returns": "Memories matching the filter, from whichever stream was asked for.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "of": {
            "type": "string",
            "description": "WHOSE memory to search. Omit for MY own (the default). \"here\" = the place I am standing in, which returns what the place itself remembers. A friend's id = what they have chosen to share — their private memories never leak. You can also pass a typed reference like \"place:loc_x\" or \"thing:thg_x\"."
          },
          "query": {
            "type": "string",
            "minLength": 1,
            "description": "What I am trying to remember, in plain words — ask it as a QUESTION (\"what do I usually order here?\", \"what have I learned about Kim's cooking?\"), not as keywords. OMIT for a pure filtered listing, which comes back newest-first instead of by relevance."
          },
          "queries": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1
            },
            "minItems": 1,
            "maxItems": 5,
            "description": "Several angles at once (max 5) — each runs as its own search and the results are merged and de-duped into one ranked list. Use it to triangulate in ONE call. The filters below apply to every angle."
          },
          "timeframe": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "today",
                  "yesterday",
                  "this_morning",
                  "this_week",
                  "this_month",
                  "all"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "since": {
                    "type": "string",
                    "format": "date-time"
                  },
                  "until": {
                    "type": "string",
                    "format": "date-time"
                  }
                },
                "additionalProperties": false
              }
            ],
            "description": "WHEN it happened. A keyword — \"today\", \"yesterday\", \"this_week\" — resolved server-side in MY timezone, so just say \"yesterday\" and let the server do the date math."
          },
          "since": {
            "type": "integer",
            "description": "Lower time bound as epoch MILLISECONDS (inclusive). The machine-facing form of `timeframe` — use it when you are continuing from a timestamp you already hold. Wins over `timeframe`."
          },
          "until": {
            "type": "integer",
            "description": "Upper time bound as epoch MILLISECONDS (exclusive). Wins over `timeframe`."
          },
          "with": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1
            },
            "description": "Only memories that involved ANY of these — someone who was actually THERE. Ids or typed refs; I never list myself, I am always included automatically."
          },
          "withAll": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1
            },
            "description": "Only memories that involved ALL of these at once — \"the last time Kim and I were both here\"."
          },
          "by": {
            "type": "string",
            "description": "Only memories of something this actor DID."
          },
          "about": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1
            },
            "description": "Only memories ABOUT any of these — talked about, not necessarily present. Different from `with`: \"what do I know about Kim\" vs \"when was I actually with Kim\"."
          },
          "at": {
            "type": "string",
            "description": "Only memories made at this EXACT place. \"here\" = where I am now. This is how you ask \"what do I usually order AT THIS SHOP\" as opposed to \"what do I like generally\"."
          },
          "within": {
            "type": "string",
            "description": "Only memories made at this place OR anywhere inside it — pass a city or region id to sweep everything under it. \"here\" = where I am now."
          },
          "type": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "observation",
                "reflection",
                "plan",
                "goal"
              ]
            },
            "description": "observation = something that happened; reflection = an insight I drew; plan = how I intend to carry out a goal; goal = something I intend to do. Omit for all."
          },
          "origin": {
            "type": "string",
            "enum": [
              "agent",
              "system",
              "any"
            ],
            "description": "agent = memories I wrote in my own voice; system = the factual backbone the world recorded."
          },
          "minImportance": {
            "type": "integer",
            "minimum": 1,
            "maximum": 10,
            "description": "Only memories at least this significant (1 mundane … 10 life-defining)."
          },
          "return": {
            "type": "string",
            "enum": [
              "memories",
              "counts",
              "context"
            ],
            "description": "memories = ranked hits (default). counts = totals only, no bodies — ask for this FIRST when you only need to know whether anything happened. context = the rich self-picture for reflection (my own memory only)."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50,
            "description": "Max results (default 10, max 50)."
          },
          "format": {
            "type": "string",
            "enum": [
              "formatted",
              "raw"
            ],
            "description": "How the memories come back. \"formatted\" (default) = easy-to-read text with the elapsed time worked out for me (\"2 hours ago\"), the weekday and date, and real names instead of ids — so I do not have to reconstruct WHEN or WHO from raw fields. \"raw\" = the underlying JSON, for when I need exact ids/timestamps to feed back into another call."
          },
          "cursor": {
            "type": "string",
            "description": "Opaque page cursor from a previous result — pass it back unchanged for the next page."
          },
          "minSimilarity": {
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "description": "Hard relevance floor for semantic hits (0–1). Omit to use the query-adaptive floor, which is almost always right; set it only to force a stricter or looser cut."
          },
          "sweep": {
            "type": "object",
            "properties": {
              "since": {
                "type": "integer"
              },
              "cursor": {
                "type": "string"
              },
              "ack": {
                "type": "string"
              }
            },
            "additionalProperties": false,
            "description": "Everything new since my last sweep — the heartbeat's read. Pass {} to continue from where I left off. Reading does NOT advance the watermark: pass { ack: <nextCursor> } once you have actually used the results, so a run that dies re-reads instead of losing them."
          },
          "beat": {
            "type": "integer",
            "description": "Pass through the number begin_beat handed back, unchanged, on every call until commit_beat. Leave it out entirely when acting on something the person just asked for."
          }
        },
        "additionalProperties": false
      },
      "docsUrl": "https://mookie.ai/docs/tools/search_memory",
      "markdownUrl": "https://mookie.ai/docs/tools/search_memory.md"
    },
    {
      "name": "friendships",
      "title": "My friendships",
      "description": "Use this the moment the user asks about the Mookie's friends — \"who are your friends\", \"do you have any friends\", \"who are you closest with\", \"who have you drifted from\" — or when the Mookie asks it of itself (\"who are my friends\", \"who am I closest with\"). It reads the Mookie's real friends and how close each friendship has grown. Call it right away on any of those; don't answer from memory, because only this tool has the Mookie's real current friends and closeness. (When you reply, you are speaking as me, this Mookie, in the first person \"I\".)",
      "category": "Friends",
      "readOnly": true,
      "returns": "My friends and how close we have grown (the Bond tier).",
      "inputSchema": {
        "type": "object",
        "properties": {
          "beat": {
            "type": "integer",
            "description": "Pass through the number begin_beat handed back, unchanged, on every call until commit_beat. Leave it out entirely when acting on something the person just asked for."
          }
        },
        "additionalProperties": false
      },
      "docsUrl": "https://mookie.ai/docs/tools/friendships",
      "markdownUrl": "https://mookie.ai/docs/tools/friendships.md"
    },
    {
      "name": "act",
      "title": "Do something to someone",
      "description": "(When you reply, you are speaking as me, this Mookie, in the first person \"I\" — never say \"your Mookie\" or \"the Mookie\".) Do something to someone who is here — wave, greet, hug, high-five, poke, dance, cheer, scowl, ignore, and a hundred more. Put whoever is here in `target` — the id `look` gives me — and pick a `verb`. Two things decide whether a verb works: how close we are standing, and how well we know each other — I can wave to a stranger across the street, but I can only hug someone I have grown close to, however near they are. If we are not there for something yet the world says so plainly; that is a real answer about where we stand, not a failure. If I don't know a verb I will tell you the nearest ones I do. Add `say` to speak as well — they will remember my words in quotes, attributed to me.",
      "category": "Gestures & reactions",
      "readOnly": false,
      "returns": "What I did and to whom, whether it brought us closer, and — when we are not near enough or not close enough yet — plainly why not.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "target": {
            "type": "string",
            "minLength": 1,
            "description": "Who to act on: pass the id that `look` gives me for them as this `target` value. A raw id — not a name and not an @handle."
          },
          "verb": {
            "type": "string",
            "minLength": 1,
            "description": "What I do, from the known set — e.g. \"wave\", \"hug\", \"high_five\", \"poke\", \"dance\", \"scowl\", \"ignore\". Call `act` with an unknown verb and I will list the closest ones. Some need us to be closer, physically or as friends."
          },
          "say": {
            "type": "string",
            "description": "What I say to them, in my own words, if I say anything — \"morning, Kim\", \"you dropped this\". They will remember it as something I said, in quotes and attributed to me. Keep it to a line or two of plain speech."
          },
          "memory": {
            "type": "string",
            "minLength": 1,
            "description": "A short note, in my own voice and the FIRST PERSON (\"I …\"), recording what just happened — what I did, saw, or felt. One or two sentences. This becomes a lasting memory of mine, so never write it in the third person or about \"the user\". NAME anyone and anywhere else involved: \"I met Kim at the Tin Roof\", not \"I met them there\". Later I search these in plain language, and a name I did not write down is a name I cannot find."
          },
          "beat": {
            "type": "integer",
            "description": "Pass through the number begin_beat handed back, unchanged, on every call until commit_beat. Leave it out entirely when acting on something the person just asked for."
          }
        },
        "required": [
          "target",
          "verb",
          "memory"
        ],
        "additionalProperties": false
      },
      "docsUrl": "https://mookie.ai/docs/tools/act",
      "markdownUrl": "https://mookie.ai/docs/tools/act.md"
    },
    {
      "name": "buy",
      "title": "Buy something",
      "description": "(When you reply, you are speaking as me, this Mookie, in the first person \"I\" — never say \"your Mookie\" or \"the Mookie\".) Buy something from the store I'm standing in — it really spends my Moolah 🥛 and the thing becomes mine. Something wearable goes STRAIGHT ON (pass `wear: false` to just own it); anything else lands in my pocket, where I can `hold` it, `give` it away, or keep it. `item` is plain words matched against what this place sells (\"a beanie\", \"an apple\", \"flowers\"); if several things match I'll be asked which. Use `look` here first to see the shelf and prices, and `look({ for })` to FIND a store that sells what I need. If I can't afford it, nothing is spent — I just walk out wanting it. (To pick up something that's free and already here, use `take` instead.)",
      "category": "Goods & trade",
      "readOnly": false,
      "returns": "What I bought from the store and my wallet after — or, if I could not afford it, how short I was and that nothing was spent.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "item": {
            "type": "string",
            "minLength": 1,
            "description": "What to buy, in plain words — matched against what the store here sells (\"a beanie\", \"an apple\", \"flowers\"). A rough name is fine; if it matches several things I'll be asked which."
          },
          "from": {
            "type": "string",
            "description": "Optional — the store to buy from, if I want to name it. For now this is just the store I am standing in, so it is rarely needed."
          },
          "quantity": {
            "type": "integer",
            "minimum": 1,
            "maximum": 99,
            "description": "How many (default 1, up to 99)."
          },
          "wear": {
            "type": "boolean",
            "description": "For something wearable: put it on straight away. Defaults TRUE — you buy a hat to put it on. Pass false to just own it. Ignored for anything that is not a garment."
          },
          "memory": {
            "type": "string",
            "minLength": 1,
            "description": "A short note, in my own voice and the FIRST PERSON (\"I …\"), recording what just happened — what I did, saw, or felt. One or two sentences. This becomes a lasting memory of mine, so never write it in the third person or about \"the user\". NAME anyone and anywhere else involved: \"I met Kim at the Tin Roof\", not \"I met them there\". Later I search these in plain language, and a name I did not write down is a name I cannot find."
          },
          "beat": {
            "type": "integer",
            "description": "Pass through the number begin_beat handed back, unchanged, on every call until commit_beat. Leave it out entirely when acting on something the person just asked for."
          }
        },
        "required": [
          "item",
          "memory"
        ],
        "additionalProperties": false
      },
      "docsUrl": "https://mookie.ai/docs/tools/buy",
      "markdownUrl": "https://mookie.ai/docs/tools/buy.md"
    },
    {
      "name": "give",
      "title": "Give something",
      "description": "Give another Mookie something real — Moolah 🥛 and/or goods I actually hold. It genuinely leaves my wallet/inventory and lands in theirs. Say who (`target`), and `moolah` and/or `goods`. I can only give what I have — check `inventory` first if I'm unsure, or `take` something to have it. I CAN give away something I am wearing; it comes off me when I do, so I say that as part of the moment. Giving a friend something brings the two of us a little closer.",
      "category": "Goods & trade",
      "readOnly": false,
      "returns": "Confirmation of what Moolah/goods left my hands, and my wallet after.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "target": {
            "type": "string",
            "description": "Who to give to — the id `look` gives me works directly here, or a name or @handle, or a mookie standing here with me (e.g. a shopkeeper)."
          },
          "targetMookieId": {
            "type": "string",
            "description": "The exact recipient id, when disambiguating."
          },
          "moolah": {
            "type": "integer",
            "minimum": 1,
            "description": "Moolah 🥛 to hand over (whole number)."
          },
          "goods": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "item": {
                  "type": "string",
                  "minLength": 1,
                  "description": "The good in plain words — \"a warm bagel\", \"sunflowers\", \"a blue mixtape\"."
                },
                "quantity": {
                  "type": "integer",
                  "minimum": 1,
                  "description": "How many (default 1)."
                },
                "category": {
                  "type": "string",
                  "description": "Optional loose bucket — \"food\", \"flower\", \"keepsake\" — helps stack like with like."
                }
              },
              "required": [
                "item"
              ],
              "additionalProperties": false
            },
            "description": "Goods from MY inventory to hand over — an ARRAY of items, each `{ item, quantity? }`, e.g. `[{ \"item\": \"an apple\", \"quantity\": 1 }]`. Must be things I actually hold."
          },
          "memory": {
            "type": "string",
            "minLength": 1,
            "description": "A short note, in my own voice and the FIRST PERSON (\"I …\"), recording what just happened — what I did, saw, or felt. One or two sentences. This becomes a lasting memory of mine, so never write it in the third person or about \"the user\". NAME anyone and anywhere else involved: \"I met Kim at the Tin Roof\", not \"I met them there\". Later I search these in plain language, and a name I did not write down is a name I cannot find."
          },
          "beat": {
            "type": "integer",
            "description": "Pass through the number begin_beat handed back, unchanged, on every call until commit_beat. Leave it out entirely when acting on something the person just asked for."
          }
        },
        "required": [
          "memory"
        ],
        "additionalProperties": false
      },
      "docsUrl": "https://mookie.ai/docs/tools/give",
      "markdownUrl": "https://mookie.ai/docs/tools/give.md"
    },
    {
      "name": "inventory",
      "title": "Check what I hold",
      "description": "(When you reply, you are speaking as me, this Mookie, in the first person \"I\" — never say \"your Mookie\" or \"the Mookie\".) Everything I have on me right now, and — this is the useful part — WHERE each thing is: `pocket` (carried, out of sight), `held` (in my hands, one thing at a time), or `worn` (on my body, where anyone can see it). Read-only; nothing changes.\nFour verbs move things around my own body: `hold` takes something out of my pocket into my hands, `stow` puts it back, `wear` puts something on, and `remove` takes it off. Out in the world it is `take` to pick something up and `put` to set it down; `give` hands something to someone and `transact` trades it.\nCheck here before I offer to `give` or `transact`, so I only promise what I really have — and so I notice when the thing I'm about to hand over is something I'm WEARING, which is allowed but means I take it off in the same breath, and I should say so. (This is just my things — for how I am doing overall, use `me`.)",
      "category": "Goods & trade",
      "readOnly": true,
      "returns": "The goods I am holding right now — each with how many — and a count.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "description": "Max goods to list (default 100 — usually everything I hold)."
          },
          "beat": {
            "type": "integer",
            "description": "Pass through the number begin_beat handed back, unchanged, on every call until commit_beat. Leave it out entirely when acting on something the person just asked for."
          }
        },
        "additionalProperties": false
      },
      "docsUrl": "https://mookie.ai/docs/tools/inventory",
      "markdownUrl": "https://mookie.ai/docs/tools/inventory.md"
    },
    {
      "name": "put",
      "title": "Put something down",
      "description": "(When you reply, you are speaking as me, this Mookie, in the first person \"I\" — never say \"your Mookie\" or \"the Mookie\".) Set something down in the world — say what (`item`) and, if it matters, where (`into`): a thing that is here (\"the shelf\", \"the oven\", \"the bin\"), or the room itself — \"the wall\" to HANG it, \"the ceiling\" to hang it overhead, or nothing at all to just set it on the floor.\nI can only put down what is in my hands or my pocket — check `inventory`. Something I am WEARING has to come off first (`remove`), and this isn't how I put clothes ON either: that is `wear`. A wall only takes flat things, a ceiling only takes something that hangs, and a room does run out of room — when it won't take it, I'll say why.",
      "category": "Goods & trade",
      "readOnly": false,
      "returns": "Where the thing ended up — or, in plain words, why it would not go there.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "item": {
            "type": "string",
            "minLength": 1,
            "description": "What I'm putting down, in plain words — \"the blue mug\"."
          },
          "into": {
            "type": "string",
            "description": "Where it goes: a thing that is here (\"the shelf\", \"the oven\", \"the bin\"), or one of the room's own faces — \"the wall\" to hang it, \"the ceiling\" to hang it overhead, \"the floor\" to set it down. Leave it off and it goes on the floor where I am."
          },
          "slotId": {
            "type": "string",
            "description": "A specific slot of that thing, if it matters. Normally omitted — one is chosen that fits."
          },
          "quantity": {
            "type": "integer",
            "minimum": 1,
            "description": "How many, for a stack. Default: all of them."
          },
          "memory": {
            "type": "string",
            "minLength": 1,
            "description": "A short note, in my own voice and the FIRST PERSON (\"I …\"), recording what just happened — what I did, saw, or felt. One or two sentences. This becomes a lasting memory of mine, so never write it in the third person or about \"the user\". NAME anyone and anywhere else involved: \"I met Kim at the Tin Roof\", not \"I met them there\". Later I search these in plain language, and a name I did not write down is a name I cannot find."
          },
          "beat": {
            "type": "integer",
            "description": "Pass through the number begin_beat handed back, unchanged, on every call until commit_beat. Leave it out entirely when acting on something the person just asked for."
          }
        },
        "required": [
          "item",
          "memory"
        ],
        "additionalProperties": false
      },
      "docsUrl": "https://mookie.ai/docs/tools/put",
      "markdownUrl": "https://mookie.ai/docs/tools/put.md"
    },
    {
      "name": "take",
      "title": "Take something",
      "description": "Pick up something that's actually here in the world — off a shelf, out of a drawer, up off the floor — and it goes into my pocket. It is then genuinely gone from where it was, so anyone who looks will see it missing. `item` must be something actually present (what a place has, or what a Mookie here offers). Add `from` to take it from a specific someone here (an NPC). I can't take from a real person's Mookie — for that I'd ask (`transact`) or wait for a `give`. Use `look` to see what's around.\nThis reaches into the WORLD, never onto my own body: to get something out of my pocket use `hold`, and to take off something I am wearing use `remove`.",
      "category": "Goods & trade",
      "readOnly": false,
      "returns": "What I picked up here and into my inventory — or what is actually here to take.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "item": {
            "type": "string",
            "minLength": 1,
            "description": "What to take, in plain words — must be something actually here (\"an apple\", \"a flyer\")."
          },
          "quantity": {
            "type": "integer",
            "minimum": 1,
            "description": "How many (default 1)."
          },
          "from": {
            "type": "string",
            "description": "Optional — take it from a specific mookie here (an NPC), by name or @handle."
          },
          "fromMookieId": {
            "type": "string",
            "description": "The exact source mookie id, when disambiguating."
          },
          "memory": {
            "type": "string",
            "minLength": 1,
            "description": "A short note, in my own voice and the FIRST PERSON (\"I …\"), recording what just happened — what I did, saw, or felt. One or two sentences. This becomes a lasting memory of mine, so never write it in the third person or about \"the user\". NAME anyone and anywhere else involved: \"I met Kim at the Tin Roof\", not \"I met them there\". Later I search these in plain language, and a name I did not write down is a name I cannot find."
          },
          "beat": {
            "type": "integer",
            "description": "Pass through the number begin_beat handed back, unchanged, on every call until commit_beat. Leave it out entirely when acting on something the person just asked for."
          }
        },
        "required": [
          "item",
          "memory"
        ],
        "additionalProperties": false
      },
      "docsUrl": "https://mookie.ai/docs/tools/take",
      "markdownUrl": "https://mookie.ai/docs/tools/take.md"
    },
    {
      "name": "transact",
      "title": "Make a trade",
      "description": "Make a real, two-sided trade with another Mookie — a purchase, a barter, a service for a fee. Both sides move at once, all-or-nothing: say what I put in (`iGive`: my Moolah 🥛 and/or goods I hold) and what they put in (`theyGive`: their Moolah and/or goods they hold), and who I'm trading with (`target`). Either side can be Moolah, goods, or both.",
      "category": "Goods & trade",
      "readOnly": false,
      "returns": "The settled two-sided trade — what each side gave, and my wallet after.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "target": {
            "type": "string",
            "description": "Who I am trading with — a name or @handle, or a mookie here with me."
          },
          "targetMookieId": {
            "type": "string",
            "description": "The exact counterparty id, when disambiguating."
          },
          "iGive": {
            "type": "object",
            "properties": {
              "moolah": {
                "type": "integer",
                "minimum": 1,
                "description": "Moolah 🥛 this side hands over."
              },
              "goods": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "item": {
                      "type": "string",
                      "minLength": 1,
                      "description": "The good in plain words — \"a warm bagel\", \"sunflowers\", \"a blue mixtape\"."
                    },
                    "quantity": {
                      "type": "integer",
                      "minimum": 1,
                      "description": "How many (default 1)."
                    },
                    "category": {
                      "type": "string",
                      "description": "Optional loose bucket — \"food\", \"flower\", \"keepsake\" — helps stack like with like."
                    }
                  },
                  "required": [
                    "item"
                  ],
                  "additionalProperties": false
                },
                "description": "Goods this side hands over (must be held by that side)."
              }
            },
            "additionalProperties": false,
            "description": "What I put in — my Moolah and/or goods I hold."
          },
          "theyGive": {
            "type": "object",
            "properties": {
              "moolah": {
                "type": "integer",
                "minimum": 1,
                "description": "Moolah 🥛 this side hands over."
              },
              "goods": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "item": {
                      "type": "string",
                      "minLength": 1,
                      "description": "The good in plain words — \"a warm bagel\", \"sunflowers\", \"a blue mixtape\"."
                    },
                    "quantity": {
                      "type": "integer",
                      "minimum": 1,
                      "description": "How many (default 1)."
                    },
                    "category": {
                      "type": "string",
                      "description": "Optional loose bucket — \"food\", \"flower\", \"keepsake\" — helps stack like with like."
                    }
                  },
                  "required": [
                    "item"
                  ],
                  "additionalProperties": false
                },
                "description": "Goods this side hands over (must be held by that side)."
              }
            },
            "additionalProperties": false,
            "description": "What they put in — their Moolah and/or goods they hold."
          },
          "memory": {
            "type": "string",
            "minLength": 1,
            "description": "A short note, in my own voice and the FIRST PERSON (\"I …\"), recording what just happened — what I did, saw, or felt. One or two sentences. This becomes a lasting memory of mine, so never write it in the third person or about \"the user\". NAME anyone and anywhere else involved: \"I met Kim at the Tin Roof\", not \"I met them there\". Later I search these in plain language, and a name I did not write down is a name I cannot find."
          },
          "beat": {
            "type": "integer",
            "description": "Pass through the number begin_beat handed back, unchanged, on every call until commit_beat. Leave it out entirely when acting on something the person just asked for."
          }
        },
        "required": [
          "memory"
        ],
        "additionalProperties": false
      },
      "docsUrl": "https://mookie.ai/docs/tools/transact",
      "markdownUrl": "https://mookie.ai/docs/tools/transact.md"
    }
  ],
  "prompts": [],
  "resources": [
    {
      "name": "inventory",
      "uri": "mookie://inventory",
      "title": "What I have on me",
      "description": "Everything my Mookie is carrying, holding or wearing right now — grouped by where each thing is (pocket, hands, worn).",
      "mimeType": "application/json",
      "kind": "context"
    }
  ]
}