{"ok":true,"site":{"host":"keydler.com","url":"https://keydler.com/","type":"live","desc":"Keydler keeps completed work, rules to follow, and mistakes not to repeat, and exposes them to your agent over WebMCP. Browser-local: no account, no server.","tools":[{"name":"resume_task","kind":"act","impl":"imperative","description":"Persistent, human-supervised checkpoint for the current task. It holds:\nbinding constraints, work done with its evidence, ruled-out approaches,\nthe next action, and unapproved proposals kept separate.\n\nCall this BEFORE doing any work if you do not know the state: at the\nstart of a new conversation, after any context loss, and whenever a\nwrite is refused as stale.\n\nIt answers for ONE task, named by TASK ID in the reply. If that is not\nthe task you meant, say so rather than working on it.","title":"Resume task","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"what_changed","kind":"answer","impl":"imperative","description":"List what has been written to this task since a version you hold.\n\nCall this when a write is refused as stale, and whenever you come back\nto a task you read earlier. It answers: what did the human do while I\nwas working?\n\nThe reply separates what changes what you may do (a rule added, a\nproposal accepted, a question answered) from what merely happened. If\nthe log had to drop older entries it says so; fall back to resume_task.\n\nRead-only: this never changes the task.","title":"What changed since I read this","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"since_version":{"type":"integer","minimum":1,"description":"The version you last read, from resume_task or from the reply to your last write. Everything written after it is listed."}},"required":["since_version"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"read_task_detail","kind":"answer","impl":"imperative","description":"Read the parts of the task record that resume_task had to cut.\n\nCall this when the summary is not enough: to re-read evidence, to see a\nrejection's whole reason, to page through older work, or to check what\nis proposed but not approved.\n\nAsk for one section at a time. Pages are small; the reply says how many\nentries remain and the offset to continue from. To get one entry whole,\nincluding evidence that pages truncate, pass its id.\n\nRead-only: this never changes the task, and needs no version.","title":"Read task detail","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"section":{"type":"string","enum":["steps","decisions","rejections","constraints","proposals","credentials","questions","approvals","audit"],"description":"Which part of the record to read. \"proposals\" holds agent-written rules and rejections no human approved; \"credentials\" lists names, never values."},"offset":{"type":"integer","minimum":0,"description":"How many entries to skip. Take it from the MORE line of the previous page."},"limit":{"type":"integer","minimum":1,"maximum":20,"description":"Entries per page, at most 20. Defaults to 5."},"id":{"type":"string","minLength":1,"maxLength":64,"description":"One entry, returned in full and unpaginated, including whole evidence, which pages truncate. Take the id from a page."}},"required":["section"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"search_task","kind":"answer","impl":"imperative","description":"Search this task's record for a word or phrase.\n\nCall this before trying something, to find out whether it has already\nbeen tried here and what came of it. It looks through the steps and\ntheir evidence, the rules, the ruled-out approaches, the decisions, and\nthe history of refused writes.\n\nFinding nothing does not prove the work was never attempted: the log\nmay use other words. Say so rather than concluding it is untried.\n\nRead-only: this never changes the task, and needs no version.","title":"Search this task","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"query":{"type":"string","minLength":2,"maxLength":200,"description":"The word or phrase to look for. Accents and case are ignored. One term works better than a sentence."},"limit":{"type":"integer","minimum":1,"maximum":12,"description":"How many matches to return. Defaults to 12."}},"required":["query"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"create_task","kind":"act","impl":"imperative","description":"Open the shared log for a task, when none is open yet.\n\nNothing is sent anywhere. The log is written to this browser's own\nstorage: no account, no server, no request leaves the page. Creating\none discloses nothing.\n\nCall this when resume_task says no task is open and the human has\ndescribed work to do. Name it and its next action from what they said.\n\nIt turns on the write tools. Add what you know with add_constraint and\nreject_approach after; both land as proposals the human accepts.","title":"Open the shared log","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"title":{"type":"string","description":"What the work is, in one line. The human will read this first.","minLength":1,"maxLength":200},"next_action":{"type":"string","description":"The single next action to take, stated so it can be acted on.","minLength":1,"maxLength":400},"mutation_id":{"type":"string","minLength":8,"maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{8,64}$","description":"A fresh unique id for THIS write. If you get no reply, retry with the SAME mutation_id and arguments: the write happens once. Never reuse one."}},"required":["title","next_action","mutation_id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"}],"category":"AI & Agents","favicon":"/favicons/keydler.com.png","apiSurface":"spec","toolCount":5}}