{"ok":true,"site":{"host":"vistect.vercel.app","url":"https://vistect.vercel.app/","type":"live","desc":"Vistect — independent visual authorship for blind creators. A WebMCP-native accessible document studio.","tools":[{"name":"create_document","kind":"act","impl":"imperative","description":"Starts a new report and records the intent contract it will be judged against. Call this once, before anything else. It is the only write tool that does not take expectedDocumentVersion, because there is no prior state to conflict with.","title":"Create a document","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"title":{"type":"string","minLength":1,"description":"The report title, as it should appear on the cover."},"purpose":{"type":"string","minLength":1,"description":"What this document is for, in one or two sentences. Required: every later recommendation is judged against it, and an empty purpose produces generic advice."},"audience":{"default":[],"description":"Who will read it, e.g. [\"funders\", \"local authority partners\"].","type":"array","items":{"type":"string","minLength":1}},"primaryMessage":{"default":"","description":"The one thing a reader should take away. Leave empty if it is not settled yet.","type":"string"},"tone":{"default":[],"description":"e.g. [\"plain\", \"confident\", \"warm\"].","type":"array","items":{"type":"string","minLength":1}},"avoid":{"default":[],"description":"Framings and imagery to stay away from. Pre-seeded with pity, charity and medical framing; add to it rather than replacing it.","type":"array","items":{"type":"string","minLength":1}},"language":{"default":"en","description":"BCP 47 language tag for the document.","type":"string"},"pageTemplates":{"default":["cover","text-led"],"description":"One id per starting page, in order. Available: cover, text-led, text-with-side-image, chart-page.","minItems":1,"type":"array","items":{"type":"string","enum":["cover","text-led","text-with-side-image","chart-page"]}}},"required":["title","purpose"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"update_intent_contract","kind":"act","impl":"imperative","description":"Records or revises what the document is for, who it is for, and what to avoid. Every field you send replaces the current value; fields you omit are left alone. Use this whenever the brief becomes clearer — recommendations are only as good as this contract.","title":"Update the intent contract","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"expectedDocumentVersion":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"The document version this change is written against. Read it from get_document_overview or any read tool. If the document has moved on since then, the write is refused instead of silently overwriting the newer state."},"purpose":{"description":"What the document is for.","type":"string","minLength":1},"audience":{"description":"Replaces the current audience list.","type":"array","items":{"type":"string","minLength":1}},"primaryMessage":{"type":"string","minLength":1},"secondaryMessages":{"type":"array","items":{"type":"string","minLength":1}},"tone":{"type":"array","items":{"type":"string","minLength":1}},"avoid":{"description":"Replaces the current avoid list. Include the existing entries you still want.","type":"array","items":{"type":"string","minLength":1}},"visualStyle":{"description":"e.g. \"documentary photography, no stock\".","type":"string","minLength":1},"requiredVisuals":{"description":"How many of each visual the report needs, e.g. {\"chart\": 2, \"diagram\": 1}.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","minimum":0,"maximum":9007199254740991}},"privacySensitivity":{"description":"\"sensitive\" turns off anything that would send content off-device.","type":"string","enum":["standard","sensitive"]}},"required":["expectedDocumentVersion"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_document_overview","kind":"answer","impl":"imperative","description":"Reads the whole document in one paragraph: title, current version, pages, how complete the intent contract is, and anything blocking export. Call this at the start of a session, and again whenever a write is refused as stale — the version it reports is the expectedDocumentVersion the next write needs.","title":"Get a document overview","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_document_structure","kind":"answer","impl":"imperative","description":"Lists every page with its id, template and reading order, and by default every object on it. Use this to find the ids other tools need. For one page in depth — including region bounds and measured geometry — use inspect_page instead.","title":"Get the document structure","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"includeObjects":{"default":true,"description":"Set false for just the page list, when a full object listing would be noise.","type":"boolean"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"add_text_section","kind":"act","impl":"imperative","description":"Adds a heading, paragraph, list, quote, callout, statistic, caption, source note or footnote to a page region. Position is worked out from the template and what is already in that region — you never supply coordinates. Returns the object id and where it landed in the reading order.","title":"Add a text section","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"expectedDocumentVersion":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"The document version this change is written against. Read it from get_document_overview or any read tool. If the document has moved on since then, the write is refused instead of silently overwriting the newer state."},"pageId":{"description":"Defaults to the last page in the document.","type":"string","minLength":1},"region":{"description":"Which region of the page template to place it in. Defaults to the template's main text region. Call inspect_page to see the regions a page has.","type":"string","enum":["header","flow","figure","sidebar","footer"]},"textRole":{"type":"string","enum":["heading","paragraph","list","quote","callout","statistic","caption","source-note","footnote"],"description":"The semantic role. \"heading\" also needs headingLevel. \"list\" takes items instead of content. Roles carry through to the exported HTML, so choose the one that is true rather than the one that looks right."},"headingLevel":{"description":"Required when textRole is \"heading\". Do not skip levels (§10.2).","anyOf":[{"type":"number","const":1},{"type":"number","const":2},{"type":"number","const":3},{"type":"number","const":4}]},"content":{"description":"Plain text. Markup is not interpreted.","type":"string","minLength":1},"items":{"description":"Use with textRole \"list\".","minItems":1,"type":"array","items":{"type":"string","minLength":1}},"ordered":{"description":"Numbered rather than bulleted list.","type":"boolean"},"purpose":{"description":"Why this section is on the page. Read back in the object explorer.","type":"string","minLength":1},"readingOrderIndex":{"description":"Where in the reading order to insert it. Defaults to the end.","type":"integer","minimum":0,"maximum":9007199254740991}},"required":["expectedDocumentVersion","textRole"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"inspect_page","kind":"answer","impl":"imperative","description":"Describes one page in full: its template and regions, every object with its position and size, the reading order, how much room is left in each region, and what is still missing such as alternative text. Use this before changing a page, and after, to hear what changed.","title":"Inspect a page","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"pageId":{"description":"Defaults to the last page in the document.","type":"string","minLength":1}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"}],"category":"Productivity & Business","apiSurface":"spec","toolCount":6}}