{"ok":true,"site":{"host":"kumbuka2026.vercel.app","url":"https://kumbuka2026.vercel.app/app","type":"live","desc":"Say what happened, in any language. Kumbuka asks about anything it could not determine, waits for you to confirm it, and stores it as a structured record.","tools":[{"name":"prepare_record","kind":"act","impl":"imperative","description":"Read one sentence in any language describing what happened — it may contain more than one distinct activity (a payment and a separate purchase, for example). Prepares one draft per activity found and shows the first in the page for the user to confirm; the rest are queued and shown one at a time as each is confirmed or discarded. Does not save anything. Returns a draft_id for every draft prepared, and any fields that could not be determined for each — ask the user about those rather than filling them in.","inputSchema":{"type":"object","required":["text"],"properties":{"text":{"type":"string","description":"The sentence exactly as the user said it."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/app","pages":["/app","/app/records","/app/reports","/app/ask"]},{"name":"save_record","kind":"act","impl":"imperative","description":"Save a prepared draft. Saves immediately, but only with a valid confirmation token, which is issued when the user taps Save in the page. Never call this without a token — there is no way to obtain one except from the user.","inputSchema":{"type":"object","required":["draft_id","confirm_token"],"properties":{"draft_id":{"type":"string"},"confirm_token":{"type":"string","description":"Issued by the page when the user taps Save."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/app","pages":["/app","/app/records","/app/reports","/app/ask"]},{"name":"search_records","kind":"answer","impl":"imperative","description":"Search saved records by person, date range or free text. Returns a summary, up to 20 records and the total count. Use this to answer questions about what happened — never answer from memory.","inputSchema":{"type":"object","properties":{"person":{"type":"string"},"date_from":{"type":"string","description":"ISO date, YYYY-MM-DD."},"date_to":{"type":"string","description":"ISO date, YYYY-MM-DD."},"query":{"type":"string","description":"Match against the purpose."},"limit":{"type":"integer","maximum":20,"default":20}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/app","pages":["/app","/app/records","/app/reports","/app/ask"]},{"name":"get_person_history","kind":"answer","impl":"imperative","description":"Everything recorded about one person: total paid to them, total received from them, when they last appeared, and their records.","inputSchema":{"type":"object","required":["name"],"properties":{"name":{"type":"string"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/app","pages":["/app","/app/records","/app/reports","/app/ask"]},{"name":"find_incomplete_records","kind":"answer","impl":"imperative","description":"Find records the user still needs to complete, with the field each one is missing. Use this to hand work back to the user as one question at a time. Do not attempt to fill the gaps yourself.","inputSchema":{"type":"object","properties":{"limit":{"type":"integer","maximum":20,"default":10}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/app","pages":["/app","/app/records","/app/reports","/app/ask"]}],"category":"Productivity & Business","apiSurface":"spec","toolCount":5}}