Repository navigation
Releases
MathType for Word and PowerPoint 1.4.3
Validation catches equations that MathType did not translate, rendering into a document that already holds MathType
numbers works, and the workflow drops a duplicate validation pass.
Install or upgrade
codex plugin marketplace upgrade mathtype-for-word
codex plugin add mathtype-for-word@mathtype-for-wordclaude plugin marketplace update mathtype-for-word
claude plugin update mathtype-for-word@mathtype-for-wordAdded
- Word validation reads the MTEF data of every saved
Equation.DSMT4object. Toggle TeX keeps a TeX command it
cannot translate as red literal text and draws a symbol it cannot map as a diamond (U+FFFD), and before this
both passed every structural check. An equation of the manifest with either now fails validation with its id,
its TeX, and the untranslated command (for red text) or the number of diamonds. Objects are matched to the manifest through the TeX MathType stores in them,
which it trims and keeps in the ANSI code page for non-ASCII text. Other MathType objects only warn, unless a
render leaves more of them than its input held. Render validates before it publishes, so such an output is no
longer written. Reported in #8. references/troubleshooting.mdlists the commands that MathType 7.11.1.462 leaves untranslated (\bm,
\widetilde,\lvert,\mathbfit,\widebar,\middle,\mathtt,\pmb,\coloneqq,\phantom,
\boxed,aligned,gathered,split, ...) or draws as a diamond (\Longrightarrow,\iff,\lceil,
\lfloor,\hookrightarrow,\mathbb{1}, ...), with replacements checked on the same version in display and
inline equations. TeX that starts with a vertical bar creates no object at all. It also notes that Word's PDF
export drops an accent written around a bold command (\tilde{\boldsymbol{M}}); the skill now puts the accent
inside (\boldsymbol{\tilde{M}}).- The render result reports
existing_number_fieldsandexisting_references, the counts the input held, and
validate_mathtype_word_documentaccepts them.
Fixed
- Adding equations to a document that already held MathType numbered equations or references failed unless
partial_manifestwas set: validation expected exactly the manifest's numbers and references and counted the existing ones against it,
so nothing was published. Validation now expects the existing counts plus the manifest's. A batched render
takes the counts from its first chunk and passes them to its last chunk. Found while reproducing #10. - The eval fixtures used
\widetilde, which renders as red text; they use\tildenow. get_mathtype_render_statusof a completed job now includes the validation report (counts, numbers, errors,
warnings), so a background render's warnings reach the agent.
Changed
- The skill no longer calls
validate_mathtype_word_documentorvalidate_mathtype_powerpoint_presentation
after a successful render. Both renders already validate the saved file against the whole manifest before
they publish it and return that report, so the extra call only started Office again (about 7 s for a
9-object document, 9 s for 122 objects;tests/TEST-REPORT.md). The probe (about 5 s) runs once per task.
Upgrade notes
- A render job started by an earlier version restarts from the beginning instead of resuming (job state schema 3).
Assets
| File | SHA-256 |
|---|---|
mathtype-for-word-plugin.zip |
e34d3fe54cd86dd27e1cba82eb6e7931d26097f9052010bb597532cba536835f |
mathtype-for-word.skill |
4e1490adc31bf2256c6375799e1dfee4d64135fd4c7e434d9481f4e4cf063164 |
Full history: CHANGELOG.md. Test evidence: tests/TEST-REPORT.md.
MathType for Word and PowerPoint 1.4.2
Codex and Claude Code install the plugin from this repository's marketplace, and the repository has a security
policy.
Install
codex plugin marketplace add felimet/mathtype-for-word
codex plugin add mathtype-for-word@mathtype-for-wordclaude plugin marketplace add felimet/mathtype-for-word
claude plugin install mathtype-for-word@mathtype-for-wordAdded
.agents/plugins/marketplace.json(Codex) and.claude-plugin/marketplace.json(Claude Code) list the
repository root as themathtype-for-wordplugin.codex plugin marketplace add felimet/mathtype-for-wordor
claude plugin marketplace add felimet/mathtype-for-wordfollowed by the client's install command installs it,
and the clients' update commands upgrade it. Before, the skill and the server had to be registered by hand, and
every upgrade meant doing that again.SECURITY.mdpoints reporters to GitHub private vulnerability reporting.- Dependabot proposes updates for the SHA-pinned GitHub Actions every week.
Removed
requirements.txt, which listed no packages. The server uses only the Python standard library; the READMEs now
say so.
Upgrade notes
- Use the plugin or the hand registration, not both. Before installing the plugin, remove a hand-registered
server (claude mcp remove mathtype-for-word -s user, or the[mcp_servers.mathtype-for-word]entry in
%USERPROFILE%\.codex\config.toml) and the copiedmathtype-for-wordskill folder. In Codex a registered
server of the same name takes precedence over the plugin's server; Claude Code would load two servers and two
skills. - Claude Code names the plugin's tools
mcp__plugin_mathtype-for-word_mathtype-for-word__*instead of
mcp__mathtype-for-word__*. Update permission rules or instructions that name the old tools. - Codex caches an installed plugin by version. To upgrade, run
codex plugin marketplace upgrade mathtype-for-wordand thencodex plugin add mathtype-for-word@mathtype-for-wordagain.
Assets
| File | SHA-256 |
|---|---|
mathtype-for-word-plugin.zip |
524be53173434e77cd866771e0b06f9f639345f0cae92d0e649240d29e58961c |
mathtype-for-word.skill |
1681b126c32b2a955fca1ea6c886badb2cb33da7f7bb980c5ec72a408015e765 |
Full history: CHANGELOG.md. Test evidence: tests/TEST-REPORT.md.
MathType for Word and PowerPoint 1.4.1
The plugin's MCP server starts under Codex, and the server negotiates the MCP protocol version instead of
echoing whatever the client asks for.
Fixed
- Codex could not start the plugin's MCP server. Its manifest pointed at
.mcp.json, whose launcher finds the
plugin throughCLAUDE_PLUGIN_ROOT, which Codex neither sets nor forwards, so Python looked for
scripts\mcp_server.pyin the folder where the Codex session started..codex-mcp.jsonused
${PLUGIN_ROOT}, which Codex does not expand. The manifest now points at.codex-mcp.json, which runs
python scripts/mcp_server.pywith"cwd": "."; Codex resolves that against the installed plugin folder.
Claude Code still uses.mcp.jsonunchanged. - Under Codex,
probe_mathtype_wordandprobe_mathtype_powerpointreportedwindows: falseand Office not
ready, because Codex starts MCP servers without theOSenvironment variable. The bridge now uses$IsWindows. - Codex ends tool calls after 300 s by default, shorter than one Word session of a render can take. The plugin
setstool_timeout_secto 1200, above the watchdog of one session at the defaultbatch_size(440 s plus 1 s
per equation already in the document), so in documents of up to about 750 equations a hung session ends with
the server's own timeout and Office cleanup report. A foreground render runs all its sessions in one tool call
and can still outlast 1200 s; the skill and the tool description now say to passbackground: truewhenever
equations plus references exceedbatch_size. - Codex forwarded none of the
MATHTYPE_*settings to the server. The plugin now forwards
MATHTYPE_WORD_POWERSHELL,MATHTYPE_OFFICE_TIMEOUT_SECONDS, its 1.3.0 nameMATHTYPE_WORD_TIMEOUT_SECONDS, and
MATHTYPE_BRIDGE_LOCK_WAIT_SECONDS. - The server now leaves the folder it was started in. Under Codex that is the plugin's install folder, which
Windows cannot rename or delete while a process (the server, a bridge or a background render job) works in it. - Codex dropped the fourth
defaultPromptand warned on every load; the manifest now lists three. initializeechoed any requested protocol version, including ones the server does not implement. It now
answers with the requested version when it is2025-11-25,2025-06-18,2025-03-26or2024-11-05, and
with2025-11-25otherwise, so the client can decide whether to continue.- A JSON-RPC batch (an array of requests), which
2025-03-26servers must accept, was answered with an internal
error. Each request in it is now answered in one array; an empty batch is an invalid request. - A call to an unknown tool returned internal error
-32603; it now returns-32602(invalid params), as the
tools specification asks. Bad arguments torender_mathtype_word_documentandget_mathtype_render_status
also returned-32603; they now return a tool result withisError: true, which the model can act on. - A message consisting of JSON
nullstopped the server as if its input had ended. A negativeContent-Length
made the server wait for the end of its input. - A request without an
id(a notification) forping,tools/listortools/callran and was answered with
id: null. Notifications now get no reply and run nothing. scripts/package_plugin.pynamed the archive's top folder after the checkout folder, packaged.claude(local
agent settings and worktrees), and did not require.codex-mcp.json.
Changed
- Every tool refuses a relative path in
input_path,document_path,presentation_path,output_path,
manifest_path,validation_manifest_path,candidates_pathormarks_path, before PowerShell or Office is
involved. A relative path was resolved against whatever folder the client started the server in (Claude Code:
usually the project; Codex: the plugin's install folder), and the server now works in the temp folder.
Upgrade notes
- Agents must pass absolute paths. The skill already tells the agent to resolve relative paths against the
user's working directory. - A Codex server registered by hand with
codex mcp addkeeps Codex's 300 s tool limit. Add
tool_timeout_sec = 1200to[mcp_servers.mathtype-for-word]in%USERPROFILE%\.codex\config.toml, as the
README shows. Such an entry also takes precedence over the plugin's server of the same name. - Codex caches an installed plugin by version; reinstall or update the plugin to get 1.4.1.
Assets
| File | SHA-256 |
|---|---|
mathtype-for-word-plugin.zip |
be0bb0a3a46f6fd21c89ce7785e8cf5099843c3b60558778f6cccc218b553cd8 |
mathtype-for-word.skill |
9d93290a5d18f815dad2364e0181ebb84e54281cc8ce80d8da7594b773fd0d80 |
Full history: CHANGELOG.md. Test evidence: tests/TEST-REPORT.md.
MathType for Word and PowerPoint 1.4.0
Large Word documents render in resumable batches, optionally as background jobs. New tools turn plain-text
drafts into markers. A timeout no longer ends Word or PowerPoint windows the user opened, PowerPoint work no
longer quits the user's PowerPoint, and a missing PowerShell 7 is installed for the user.
Added
- Batched rendering.
render_mathtype_word_documenttakesbatch_size(default 40;0renders everything in
one Word session) andresume(default true). A manifest with more equations plus references thanbatch_size
renders in chunks, each in a fresh Word session, so no single session has to survive the few hundred
conversions after which Word failed with RPC errors0x800706BA/0x800706BE. A chunk whose Word session
breaks down is retried split in half; a second timeout in a row stops the job. A reference can target an
equation numbered in an earlier session of the same job. - Resume: calling render again with the same input, output and manifest continues after the last checkpoint,
provided the input DOCX and the manifest are unchanged; a corrected manifest or document starts over. The same
runner is available without MCP aspython scripts/mathtype_batch.py renderandstatus. backgroundparameter (default false) onrender_mathtype_word_document: the job runs detached and the call
returns at once.get_mathtype_render_statustool (output_path,cleanupdefault false). It reportsqueued,running,
completed,failed,interruptedornone, equations and references done and total, chunks, retries, the
last log lines and the final result.cleanup: truedeletes the state, log and checkpoints of a finished job.scan_mathtype_candidatestool (bridge actionscan). It opens a draft DOCX read-only and writes a candidates
JSON: every paragraph with plain-text math signals, its Word paragraph number (table cells included), its exact
text, and the signals with offsets: Greek letters, operators, Unicode and Word sub/superscripts, TeX-like text,
function calls, typed references such asEq. (2),式(2)or(2)式, and Word built-in equations.mark_mathtype_documenttool (bridge actionmark). It replaces exact text spans in given paragraphs with
{{MATH:id}}or{{EQREF:id}}markers and saves a new DOCX. It locates every span before changing anything,
rejects overlapping spans and spans that cover paragraph marks, note references, objects, breaks, fields or
Word equations, refuses anoutput_pathequal to the source, and saves only when each marker occurs exactly
once.partial_manifestparameter (default false) onrender_mathtype_word_documentand
validate_mathtype_word_document: markers outside the manifest become warnings, and number and reference
counts become lower bounds.- Optional manifest field
exact_line_spacing("at_least"by default, or"keep"). - Automatic PowerShell 7 installation. When no PowerShell 7 exists, the first tool call that needs it installs
PowerShell 7.6.6 (LTS) for the current user from the official ZIP on GitHub, into
%USERPROFILE%\.mathtype-for-word\PowerShell\<version>, in the background. The archive must match the
SHA-256 pinned inscripts/ensure-pwsh.ps1, andpwsh.exemust carry a valid Microsoft signature. No administrator rights, prompt, PATH or
registry change. While it runs, tool calls report it as installing and where; the call after it
finishes returns only anoticetelling the user what was installed. Without MCP,
powershell.exe -NoLogo -NoProfile -NonInteractive -ExecutionPolicy Bypass -File scripts/ensure-pwsh.ps1does the same
and prints thepwsh.exepath to use, andpython scripts/mathtype_batch.py renderinstalls it when
needed.
Changed
- The MCP server no longer needs PowerShell 7 to start. The plugin's launch command runs inline under Windows
PowerShell 5.1 (powershell.exe) rather than as a script file underpwsh.exe, so an execution policy that
allows only signed scripts does not stop it, and the documented manual registrations start
python <REPO_ROOT>\scripts\mcp_server.pydirectly. The bridge still runs only in PowerShell 7
and now declares#Requires -Version 7.0; apwsh.exeon PATH that is PowerShell 6 is not used. - Every Word render goes through the job runner, small manifests included. The manifest is checked without
Office before Word starts (bridge actioncheck-manifest). Job state, logs and checkpoints are kept under
%APPDATA%\MathTypeForWordAgent\jobsuntil a status call withcleanup: true. - Each Word session's watchdog limit grows with its size: 120 s, plus 8 s per equation or reference in the
session, plus 1 s per equation rendered so far, and never less thanMATHTYPE_OFFICE_TIMEOUT_SECONDS
(default 240 s). In 1.3.0 that setting was the limit for the whole render. - Only one Word render job runs at a time; a second one fails with
Another MathType render job is running (pid …, output …). While a job is active,
render_mathtype_powerpoint_presentationandconfigure_mathtype_word_defaultsare refused. The bridge
actionsrender,render-pptxandconfigure-defaultshold a per-session lock and wait up to 30 s for it
(MATHTYPE_BRIDGE_LOCK_WAIT_SECONDS). - Word validation warns about MathType objects clipped by exact line spacing or an exact row height, and about
table rows whose height cannot be inspected. It fails when hidden bookmarks of an unfinished batched render
remain. scan_mathtype_candidatesandmark_mathtype_documentare annotated as destructive, becauseoverwritecan
replace an existing file.- Bridge log lines start with a timestamp.
Fixed
- On a timeout, the watchdog terminated every Word or PowerPoint process that started during the run,
including windows the user opened meanwhile. It now ends only processes the bridge logged as its own that
show no Word or PowerPoint main window or slide show. - PowerPoint probe, render and validation quit PowerPoint afterwards, closing presentations the user had open.
The bridge now attaches to a running PowerPoint, refuses a presentation that is already open, closes only its
own presentation, and quits only an instance it launched. - Hidden Word could block on MathType's equation-number or reference dialog, because
configure_mathtype_word_defaultsand the watchdog wrote the warning preferences asREG_DWORD, which
MathType ignores. They are written asREG_SZ. Every render also suppresses the slow field-update dialog
while it runs. - The user's MathType warning preferences are journaled before a render changes them. After a timeout or a
killed run, the MCP server or the nextrender,render-pptxorconfigure-defaultscall restores them and
ends hidden Office that the killed run launched, unless it now shows a document window or a slide show. - Manifests that left out
references, an equation'snumbered, or a slide equation'sheight_pointsfailed
under PowerShell StrictMode. These fields now take their documented defaults. - A render could hang until the watchdog timeout when a marker sat in a table cell. Markers are now counted in
the document text and located with one case-sensitive Find. - An equation taller than its paragraph's exact line spacing, or placed in a table row with an exact height,
was clipped without a warning. With the defaultexact_line_spacing: "at_least", such a paragraph switches to
at-least spacing of the same value outside the line grid, and every exact row that receives an equation
switches to an at-least row of the same height. The rows are repaired through the cell, so tables with
vertically merged cells are covered. - Results containing CJK paths broke callers that decode with an ANSI code page such as cp950. The bridge, the
job runner and the MCP server now emit ASCII-escaped JSON, and the bridge writes its log as UTF-8. - PowerPoint rendering failed with Word's misleading "Clipboard is empty" when another program held the
clipboard open. The transfer is retried twice, 500 ms apart; a persistent failure reports
The Windows clipboard is held open by …, naming the holder, or the last program that wrote to the clipboard
when the holder cannot be identified. - The plugin ZIP and the
.skillpackage indist/are rebuilt from these sources. The 1.3.0 packages
predated the last 1.3.0 changes.
Upgrade notes
- The MCP server lists 11 tools instead of 8:
scan_mathtype_candidates,mark_mathtype_documentand
get_mathtype_render_statusare new. - To get automatic PowerShell 7 installation in a manually registered server, register it again with
python "<REPO_ROOT>\scripts\mcp_server.py"as the README shows. A registration that runs
pwsh.exe ... scripts\run-mcp.ps1keeps working wherever PowerShell 7 is installed. - A failed
render_mathtype_word_documentno longer returns the bridge result unchanged.errorreads
Chunk N failed: …, the bridge result is underbridge_result, andjob,resumeandtimeoutsdescribe how
to continue. Problems found before Word starts read<ExceptionType>: <message>. - Timeout results report
bridge_office_pids,isolated_office_processes_terminated,
office_pids_with_user_windowsandnew_office_pids_left_running;isolated_word_pidand
isolated_word_process_terminatedare gone. For Word renders they appear in the result'stimeoutslist. - Some manifests that 1.3.0 accepted are rejected before Word starts: an equation
idor a referencetarget
given as a number instead of a string, and ids that differ only by case. Markers must match the document text
exactly, including case. - By default a render now changes exact line spacing that is lower than a new equation, and every exact-height
table row that receives one. The result li...