{"ok":true,"site":{"host":"keepsake-timeline.vercel.app","url":"https://keepsake-timeline.vercel.app/","type":"live","desc":"An elder tells her stories; an agent turns them into memory cards on a shared timeline through WebMCP; the family reads, edits and asks the next question.","tools":[{"name":"get_timeline","kind":"answer","impl":"imperative","description":"Read the whole timeline: the elder, the people in her life, every memory (id, year, title, story, people, place, tags) and the open questions to ask next time. Call this before adding or editing so you don't duplicate memories.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"search_memories","kind":"answer","impl":"imperative","description":"Find memories by keywords, by a person, and/or by a year range. Returns matching memories with their stories.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"Keywords, e.g. 'dance Walter'."},"person":{"type":"string","description":"Person name or id."},"from":{"type":"integer","description":"Earliest year."},"to":{"type":"integer","description":"Latest year."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"add_memory","kind":"act","impl":"imperative","description":"Add a memory card to the timeline. Write the story in the teller's own voice and words (first person if the elder told it), keep the details they gave, and don't invent facts. Tag it with 2-4 simple words (e.g. 'dance', 'summer', 'car', 'love') so it gets a fitting picture.","inputSchema":{"type":"object","properties":{"title":{"type":"string","description":"Short evocative title, e.g. 'Roadside dance at Wasaga'."},"story":{"type":"string","description":"The story, 1-4 sentences, in the teller's voice."},"year":{"type":"integer"},"month":{"type":"integer","minimum":1,"maximum":12},"people":{"type":"array","items":{"type":"string"},"description":"Names of people in the memory (new names are added to the family)."},"place":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}}},"required":["title","story","year"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"update_memory","kind":"act","impl":"imperative","description":"Edit an existing memory: title, story, year/month, place, tags or people.","inputSchema":{"type":"object","properties":{"memory":{"type":"string","description":"Memory id or title."},"title":{"type":"string"},"story":{"type":"string"},"year":{"type":"integer"},"month":{"type":"integer"},"place":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"people":{"type":"array","items":{"type":"string"}}},"required":["memory"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"remove_memory","kind":"transact","impl":"imperative","description":"Delete a memory card. Only when clearly asked.","annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"memory":{"type":"string"}},"required":["memory"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"add_person","kind":"act","impl":"imperative","description":"Add someone to the family circle (name, relation to the elder, optional birth year).","inputSchema":{"type":"object","properties":{"name":{"type":"string"},"relation":{"type":"string"},"born":{"type":"integer"}},"required":["name","relation"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"link_people","kind":"act","impl":"imperative","description":"Attach people to an existing memory.","inputSchema":{"type":"object","properties":{"memory":{"type":"string"},"people":{"type":"array","items":{"type":"string"}}},"required":["memory","people"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"add_question","kind":"act","impl":"imperative","description":"Queue a question to ask the elder next time, when a story leaves a thread untold (a name, a song, what happened next). These show up on everyone's screen as prompts for the next visit.","inputSchema":{"type":"object","properties":{"question":{"type":"string"},"about":{"type":"string","description":"Memory id or title it relates to."}},"required":["question"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"mark_question_answered","kind":"act","impl":"imperative","description":"Mark a queued question as answered (usually right after adding the memory that answers it).","inputSchema":{"type":"object","properties":{"question":{"type":"string","description":"Question id or a distinctive phrase from it."}},"required":["question"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"focus_memory","kind":"act","impl":"imperative","description":"Scroll the timeline to a memory and light it up, so the person you're talking to sees the card you mean.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"memory":{"type":"string"}},"required":["memory"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"export_book","kind":"transact","impl":"imperative","description":"Return the whole timeline as a Markdown book, grouped by decade, ready to print or share.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"}],"category":"Media & Personal","favicon":"/favicons/keepsake-timeline.vercel.app.ico","apiSurface":"spec","toolCount":11}}