← WebMCP Directory

Tool tree

vistect.vercel.app

Productivity & BusinessTools verified
Website
Vistect — independent visual authorship for blind creators. A WebMCP-native accessible document studio.
Explore capabilities
    create_documentAction

    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.

    View tool JSON
    {
      "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.",
      "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"
        ]
      }
    }
    update_intent_contractAction

    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.

    View tool JSON
    {
      "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.",
      "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"
        ]
      }
    }
    get_document_overviewAnswer

    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.

    View tool JSON
    {
      "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.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    }
    get_document_structureAnswer

    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.

    View tool JSON
    {
      "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.",
      "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"
          }
        }
      }
    }
    add_text_sectionAction

    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.

    View tool JSON
    {
      "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.",
      "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"
        ]
      }
    }
    inspect_pageAnswer

    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.

    View tool JSON
    {
      "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.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "pageId": {
            "description": "Defaults to the last page in the document.",
            "type": "string",
            "minLength": 1
          }
        }
      }
    }