MCP server providing tools for Typst document preparation system, including documentation access, LaTeX to Typst conversion, and syntax validation
Server has 7 tools with basic descriptions and schemas, but significant quality gaps. Tool names follow verb_noun convention (list_, get_, check_if_). Descriptions exist but are verbose (200-400 chars) and include example values that LLMs may reuse literally. Input schemas are present with type declarations, but parameter descriptions are minimal or missing. No output schemas documented. Error handling is minimal, tools return raw error strings without recovery guidance. No tool annotations (readOnlyHint, destructiveHint). Batch tools (get_docs_chapters, latex_snippets_to_typst, check_if_snippets_are_valid_typst_syntax) are good composition patterns, but lack pagination/limit controls. Overall: functional but below production baseline.
Checks if the given typst text is valid typst syntax. Returns "VALID" if it is valid, otherwise returns "INVALID! Error message: {error_message}". The LLM should use this to check if the typst syntax it generated is valid. If not valid, the LLM should try to fix it and check again. This should be used primarily for checking small snippets of typst syntax but it can also be used for larger snippets.
Checks if multiple typst snippets have valid syntax. Takes a list of typst snippets and returns a JSON stringified list of results. The LLM should use this for example to check every single typst snippet it generated.
Gets a chapter by route. The route is the path to the chapter in the typst docs. For example, the route "____reference____layout____colbreak" corresponds to the chapter "reference/layout/colbreak". The route is a string with underscores ("____") instead of slashes (because MCP uses slashes to separate the input parameters). If a chapter has children and its content length is over 1000, this will only return the child routes instead of the full content to avoid overwhelming responses.
Gets multiple chapters by their routes. Takes a list of routes and returns a JSON stringified list of results. Example: Input: ["____reference____layout____colbreak", "____reference____text____text"] Output: JSON stringified list containing the content of both chapters
No output schemas documented. Tools return JSON strings (e.g., get_docs_chapter returns JSON-stringified dict, latex_snippet_to_typst returns raw typst string). LLMs cannot plan downstream calls or extract fields without knowing response structure.
Descriptions include example values (e.g., '____reference____layout____colbreak', '$f\in K ( t^ { H } , \beta ) _ { \delta }$'). LLMs tend to reuse example values literally in real calls, causing failures.
Error handling returns raw error strings without recovery guidance. E.g., 'ERROR: in latex_to_typst. Failed to convert latex to typst. Error message from pandoc: {error_message}' tells LLM nothing about what to do next. Should suggest 'Try simplifying the LaTeX snippet' or 'Ensure pandoc is installed'.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 53 | 2026-07-28+ | v2 |
Converts a latex to typst using pandoc. LLMs are way better at writing latex than typst. So the LLM should write the wanted output in latex and use this tool to convert it to typst. If it was not valid latex, the tool returns "ERROR: in latex_to_typst. Failed to convert latex to typst. Error message from pandoc: {error_message}". This should be used primarily for converting small snippets of latex to typst but it can also be used for larger snippets.
Converts multiple latex snippets to typst. Takes a list of LaTeX snippets and returns a JSON stringified list of results. Example: Input: ["$f\in K ( t^ { H } , \beta ) _ { \delta }$", "\\begin{align} a &= b \\\\ c &= d \\end{align}"] Output: JSON stringified list containing the converted typst for each snippet
Lists all chapters in the typst docs. The LLM should use this in the beginning to get the list of chapters and then decide which chapter to read.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). All tools are read-only, but this is not declared in the schema. Agents cannot infer safety properties.
Batch tools (get_docs_chapters, latex_snippets_to_typst, check_if_snippets_are_valid_typst_syntax) lack pagination/limit controls. No documented max array size. Agents could pass unbounded lists, causing performance issues or context window exhaustion.