{"ok":true,"site":{"host":"valentinmorali.github.io","url":"https://valentinmorali.github.io/ghostwriter/","type":"live","desc":"A mail client with no AI inside. It teaches your agent, via WebMCP, to read, search and reply to your mail in your own voice.","tools":[{"name":"search_emails","kind":"answer","impl":"imperative","description":"Search the user's mailbox by free text. Matches sender names, subjects and message bodies. Returns matching threads ranked by relevance, with thread_id for use in other tools.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"Free-text search, e.g. 'milan s3 pricing'"},"folder":{"type":"string","enum":["inbox","sent","archive"],"description":"Optional folder filter"}},"required":["query"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/ghostwriter/"},{"name":"read_thread","kind":"act","impl":"imperative","description":"Read the full contents of one email thread by thread_id, and open it on screen so the user can follow along.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"thread_id":{"type":"string"}},"required":["thread_id"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/ghostwriter/"},{"name":"get_open_email","kind":"answer","impl":"imperative","description":"Return the thread the user currently has open on screen, if any. Use this when the user says 'this email' or 'the one I'm looking at'.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/ghostwriter/"},{"name":"resolve_contact","kind":"answer","impl":"imperative","description":"Resolve a person's name to their email address using the people in this mailbox.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"A name fragment, e.g. 'Milan'"}},"required":["name"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/ghostwriter/"},{"name":"get_writing_style","kind":"answer","impl":"imperative","description":"Return the user's email writing style, derived from their sent mail: greeting, sign-off, typical length, plus real sample emails. ALWAYS call this before drafting a reply on the user's behalf, and imitate it closely.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/ghostwriter/"},{"name":"draft_reply","kind":"act","impl":"imperative","description":"Open the compose window with a drafted reply to a thread, written in the user's own style (call get_writing_style first). The user sees and can edit the draft. This does NOT send anything. After calling this, update_draft and send_email become available.","inputSchema":{"type":"object","properties":{"thread_id":{"type":"string","description":"Thread to reply to. Omit for a brand-new email."},"to":{"type":"string","description":"Recipient email, only for a brand-new email."},"subject":{"type":"string","description":"Subject, only for a brand-new email."},"body":{"type":"string","description":"The full drafted email body, in the user's voice."}},"required":["body"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/ghostwriter/"},{"name":"archive_email","kind":"act","impl":"imperative","description":"Move a thread to the archive (or back to the inbox if it is already archived).","inputSchema":{"type":"object","properties":{"thread_id":{"type":"string"}},"required":["thread_id"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/ghostwriter/"}],"category":"AI & Agents","favicon":"/favicons/valentinmorali.github.io.svg","apiSurface":"spec","toolCount":7}}