Skip to content

MCP servers › io.github.nuncaeslupus › doc-control

MCP server · registry snapshot 2026-10-23 · last tested 2026-10-23

io.github.nuncaeslupus/doc-control

Edit Word documents by address: tracked changes, comments, anchors, with backups and undo. — the publisher's description

7 of 8 record checks metRead-only · tools listed 2026-10-23Topic: productivity-and-docs · AI-classifiedversion 0.10.1PythonMITstandard input/output68 tools

Summary

io.github.nuncaeslupus/doc-control is a local MCP server listed in the official MCP registry at version 0.10.1. On 2026-10-23 ProtocolProbe started its published package in an isolated sandbox in read-only mode and read its inventory: 68 tools, 1 resource and 0 prompts.

Record checks

7 of 8 record checks met · 1 does not apply

  • met: Registry entry is active and says how to run it
  • met: Source repository link opens
  • met: Repository is not archived
  • met: Code pushed to the repository in the 90 days before our check
  • not met: Repository publishes a security policy (SECURITY.md)
  • met: Package names its licence with a standard (SPDX) identifier
  • met: The version the registry lists can be installed and is not withdrawn
  • not applicable: npm package carries build provenance (attestation)
  • met: No known critical or high advisory in the package or its dependencies
  • #14,745 of 15,112 packages by monthly downloads, tied with 367 others
  • Not ranked by stars: 0 stars (ranked from 10)

From public records, not a safety rating. Each check with its reason · Is it safe to install?

Key facts

Runs
local package
Transport
standard input/output
Package
PyPI · listed version current
License
MIT
Dependencies
no known high or critical advisories
Repository
public
Tools
68
Described as changing data
37 of 68 toolsAI-classified
Mainly works on
files and code on the machine it runs onAI-classified
Topic
productivity-and-docsAI-classified
Last tested
2026-10-23

Add to your client

Worth knowing before you connect it

  • 37 tools are described as changing something (anchor_create, caption_add, comment_add, …): our AI model's reading of the descriptions, not something we tested. We did not call them.

Each line comes from a section below, with its source and date.

How fresh this is

Live-tested
yes, a real session (not a text-only review)
Last tested
2026-10-23
Mode
read-only (no tool calls)
Latest version
0.10.1, published 2026-10-20 (registry, as of the 2026-10-23 snapshot)
First listed version
2026-10-15 (earliest version still in the registry; older removed versions would be earlier)
Version history
12 versions listed, 2026-10-15 to 2026-10-20; 12 in the 90 days before the 2026-10-23 snapshot.
Most recent 12 versions
  • 0.10.1 · 2026-10-20
  • 0.10.0 · 2026-10-20
  • 0.9.0 · 2026-10-19
  • 0.8.4 · 2026-10-18
  • 0.8.3 · 2026-10-16
  • 0.8.2 · 2026-10-16
  • 0.8.1 · 2026-10-15
  • 0.8.0 · 2026-10-15
  • 0.7.2 · 2026-10-15
  • 0.7.1 · 2026-10-15
  • 0.7.0 · 2026-10-15
  • 0.6.4 · 2026-10-15
(versions still listed in the registry only)
Registry data
snapshot 2026-10-23
Package and repository
checked 2026-10-23
Engine
mcp-runtime-engine@0.1.0 · sdk@1.32.0

Changes since the last refresh

New in the registry: not in the list of 2026-10-04, listed on 2026-10-23 with version 0.10.1 (published 2026-10-20).

Source: the official MCP Registry list on 2026-10-04 and on 2026-10-23.

What it is

What does this server offer?

Observed inventory
68tools
1resources
0prompts

What it mainly works on, as our AI model read its tool descriptions: files and code on the machine it runs on.

37 of 68 tools are described as changing something (creating, editing, deleting, sending or running). For 2 the reading was uncertain, so no mark is shown.

  • anchor_createcreates or changes datadescribed as changing data

    “Make an anchor for a passage so it can be found again after edits shift or change addresses: the quoted text, `context` characters before and after (default 32, max 200), and the paragraph's number a…”

    Publisher declares: read-only yes · idempotent yes · open-world no

    3 inputs, 2 required
    • docstringrequired“Path to the .docx file.”
    • atstringrequired“Range inside one paragraph, e.g.”
    • contextinteger“Characters of prefix and of suffix to keep.”
  • anchor_resolvereads or searches

    “Find an anchor's passage in the document as it is now: its current range, a 0-1 score and the match kind (exact, normalized or fuzzy).”

    Publisher declares: read-only yes · idempotent yes · open-world no

    4 inputs, 2 required
    • docstringrequired“Path to the .docx file.”
    • anchorobjectrequired“An anchor from anchor.create, or just {exact, prefix, suffix}.”
    • modeenum“best: verbatim matches first, then fuzzy ones (match says which).”
    • match_levelenum“How far the quote is folded when neither it nor its normalised text occurs.”
  • caption_addcreates or changes datadescribed as changing data

    “Add a numbered caption next to a body paragraph (a table, figure or equation), as tracked insertions: label, a SEQ field with the number, and `text` (e.g.”

    Publisher declares: read-only no · destructive no · open-world no

    9 inputs, 4 required
    • docstringrequired“Path to the .docx.”
    • expectobject“Write guard: the sha256 read earlier (doc.info, or a reply's doc.sha256), e.g.”
    • dry_runboolean“Preview only; write nothing.”
    • authorstring“Revision author.”
    • tagstring“Appended to the author.”
    • atstringrequired“Address of the body paragraph the caption goes next to.”
    • labelenumrequired“The caption label.”
    • textstringrequired“Caption text after the number; may be empty.”
    • positionenum“Default: above for a Table, below for a Figure or Equation.”
  • comment_addon 2 other serverscreates or changes datadescribed as changing data

    “Add one comment on a range: `at` is a paragraph (p3#a1b2c3d4), part of one (p3#a1b2c3d4:10-15) or a span across paragraphs (p3#a1b2c3d4:10..p5#e5f6a7b8:2); a newline in `text` starts a new comment pa…”

    Publisher declares: read-only no · destructive no · open-world no

    8 inputs, 3 required
    • docstringrequired“Path to the .docx (live: or the file name of one open in a live app).”
    • expectobject“Write guard: the sha256 read earlier (doc.info, or a reply's doc.sha256), e.g.”
    • dry_runboolean“Preview only; write nothing.”
    • authorstring“Revision author.”
    • tagstring“Appended to the author.”
    • engineenum“`live` edits the document open in Word or LibreOffice (see live.open).”
    • atstringrequired“Range to comment on: p3#fp, p3#fp:10-15 or across.”
    • textstringrequired“Comment text; a newline starts a new paragraph.”
  • comment_listreads or searches

    “List the comments in thread order (each root comment, then its replies) with id, author, date, text (clipped at 1,000 characters), quote (the text the comment covers, clipped at 200), resolved state …”

    Publisher declares: read-only yes · idempotent yes · open-world no

    5 inputs, 1 required
    • docstringrequired“Path to the .docx.”
    • resolvedboolean“Only resolved (true) or open (false).”
    • authorstring“Only this author.”
    • limitinteger“Most items to return; a response is also capped at about 8,000 bytes.”
    • cursorstring“The `next` value of the previous response, to continue the list.”
  • doc_batchcreates or changes datadescribed as changing data

    “The main editing tool: apply several edits in one verified write, as tracked changes, all or nothing.”

    Publisher declares: read-only no · destructive no · open-world no

    8 inputs, 2 required
    • docstringrequired“Path to the .docx (live: or the file name of one open in a live app).”
    • opsarrayrequired“Operations, applied together.”
    • expectobject“Write guard: the sha256 read earlier (doc.info, or a reply's doc.sha256), e.g.”
    • dry_runboolean“Preview only; write nothing.”
    • trackedboolean“true (default): edits are tracked changes.”
    • authorstring“Revision author.”
    • tagstring“Appended to the author.”
    • engineenum“`live` edits the document open in Word or LibreOffice (see live.open).”
  • doc_comparecreates or changes datadescribed as changing data

    “Write a redline: a new .docx at `output` (which must not exist) holding the `new` version with every difference from `old` as a tracked change (author default Claude, `date` ISO 8601 with time zone, …”

    Publisher declares: read-only no · destructive no · open-world no

    6 inputs, 3 required
    • oldstringrequired“Path of the earlier version (.docx).”
    • newstringrequired“Path of the later version (.docx).”
    • outputstringrequired“Path of the redline to create (must not exist).”
    • authorstring“Revision author (default Claude).”
    • tagstring“Appended to the author as `author (tag)`.”
    • datestring“Revision date, ISO 8601 with time zone.”
  • doc_diffon 2 other serversreads or searches

    “Align the paragraphs of two versions (`old`, `new`; .docx, or .txt/.md/.odt): which are unchanged, modified, moved, split, merged, inserted or deleted, with a map from old addresses to new ones (null…”

    Publisher declares: read-only yes · idempotent yes · open-world no

    5 inputs, 2 required
    • oldstringrequired“Path of the earlier version (.docx).”
    • newstringrequired“Path of the later version (.docx).”
    • collapse_runsboolean“List runs of shifted unchanged paragraphs as one record each.”
    • limitinteger“Most items to return; a response is also capped at about 8,000 bytes.”
    • cursorstring“The `next` value of the previous response, to continue the list.”
  • doc_infoon 1 other serverreads or searches

    “Cheap first look at a file: size, sha256 (pass it as expect.sha256 to a later write so it is refused if the file changed meanwhile), core properties (title, author, dates), whether Track Changes is o…”

    Publisher declares: read-only yes · idempotent yes · open-world no

    1 input, 1 required
    • docstringrequired“Path to the .docx.”
  • doc_opencreates or changes datadescribed as changing data

    “Start a session on a document: back it up into its store (.doc-control/<file name>/ next to it; the newest 20 backups or 30 days are kept) and note it in the undo log if it changed since the last log…”

    Publisher declares: read-only no · destructive no · open-world no

    1 input, 1 required
    • docstringrequired“Path to the .docx.”
  • doc_outlinereads or searches

    “List the headings (levels 1-9, by style or outline level) in document order, each with its address, level, style and text: the table-of-contents view.”

    Publisher declares: read-only yes · idempotent yes · open-world no

    5 inputs, 1 required
    • docstringrequired“Path to the .docx.”
    • max_levelinteger“Only headings up to this level.”
    • storiesarray“Stories to read (default ["body"]): "notes" adds footnotes and endnotes, each after the paragraph holding its mark; "headers" adds headers and footers, after t…”
    • limitinteger“Most items to return; a response is also capped at about 8,000 bytes.”
    • cursorstring“The `next` value of the previous response, to continue the list.”
  • doc_segmentreads or searches

    “Split a manuscript into units with stable ids: unit chapters (default), parts or scenes (detected from headings, numerals, centring, scene markers; signals say which), or sentences or dialogue lines …”

    Publisher declares: read-only yes · idempotent yes · open-world no

    9 inputs, 1 required
    • docstringrequired“Path to the .docx.”
    • unitstring“What to list (default chapters).”
    • chapterstring“scenes only: the chapter id whose scenes to list.”
    • rangestring“sentences and dialogue only: what to cover — a paragraph address or range, a run of whole paragraphs (p24#fp..p60#fp), or a chapter, scene or part id (ch-…, sc…”
    • languagestring“Sentence rules (default es).”
    • overridesarray“Force or deny a chapter or scene at paragraphs by fingerprint.”
    • profileobject“Detection settings for this document.”
    • limitinteger“Most items to return; a response is also capped at about 8,000 bytes.”
    • cursorstring“The `next` value of the previous response, to continue the list.”
Show 56 more tools
  • doc_statsreads or searches

    “Count what the body holds: paragraphs (and empty ones), words, characters, headings, tables, comments, footnotes, tracked changes by type, styles in use and the 20 most used fonts.”

    Publisher declares: read-only yes · idempotent yes · open-world no

    2 inputs, 1 required
    • docstringrequired“Path to the .docx.”
    • storiesarray“Stories to read (default ["body"]): "notes" adds footnotes and endnotes, each after the paragraph holding its mark; "headers" adds headers and footers, after t…”
  • field_listreads or searches

    “List every field (PAGE, TOC, REF, SEQ, XE, citations such as ADDIN ZOTERO_ITEM...) with its address, story, code, type, shown result and whether it is stale (needs updating).”

    Publisher declares: read-only yes · idempotent yes · open-world no

    3 inputs, 1 required
    • docstringrequired“Path to the .docx.”
    • storiesarray“Stories to read (default all): "body", "notes", "headers" and "comments".”
    • typestring“Only fields of this type, e.g.”
  • field_updatecreates or changes datadescribed as changing data

    “Recompute the body's TOC, PAGE, NUMPAGES, SEQ and REF/PAGEREF results with headless LibreOffice and write only those result runs, as tracked changes (old result struck, new inserted).”

    Publisher declares: read-only no · destructive no · open-world no

    6 inputs, 1 required
    • docstringrequired“Path to the .docx.”
    • set_update_on_openboolean“Only set w:updateFields in settings.xml (no LibreOffice).”
    • expectobject“Write guard: the sha256 read earlier (doc.info, or a reply's doc.sha256), e.g.”
    • dry_runboolean“Preview only; write nothing.”
    • authorstring“Revision author.”
    • tagstring“Appended to the author.”
  • history_adoptcreates or changes datadescribed as changing data

    “Re-attach a moved or renamed document to its old undo history, so history.undo and history.restore work again.”

    Publisher declares: read-only no · destructive no · open-world no

    4 inputs, 1 required
    • docstringrequired“Path to the .docx.”
    • storestring“The orphan store to adopt (see doc.open's `adoptable` or history.orphans); needed when several match or the old folder is far away.”
    • forceboolean“Adopt although the document's sha256 is not the store's last.”
    • dry_runboolean“Say what would move; move nothing.”
  • history_liston 1 other serverreads or searches

    “List the document's undo log, newest first: each write's op_id, kind, time, author, the operations it ran, whether it was undone, and the deleted paragraphs history.restore can bring back (change num…”

    Publisher declares: read-only yes · idempotent yes · open-world no

    5 inputs
    • docstring“Path to the .docx.”
    • storestring“A store folder (see history.orphans) to read instead of the document's own.”
    • limitinteger“Most entries per page (default 20).”
    • cursorstring“The `next` of the previous response.”
    • kindenum“Only entries of this kind (batch: every logged edit).”
  • history_orphansreads or searches

    “List undo stores whose document is gone (moved, renamed or deleted): the app-data stores, plus `dir`/.doc-control when `dir` is given, each with its folder, last document path, entry count and last t…”

    Publisher declares: read-only yes · idempotent yes · open-world no

    1 input
    • dirstring“Also scan this folder.”
  • history_purgedeletesdescribed as changing data

    “Delete undo history for privacy: the whole log (`all`) or entries before a date (`before`, ISO 8601, UTC), of the document or of an orphaned `store`.”

    Publisher declares: read-only no · destructive yes · open-world no

    6 inputs
    • docstring“Path to the .docx.”
    • storestring“A store folder (see history.orphans) to read instead of the document's own.”
    • allboolean“Remove the whole log.”
    • beforestring“Remove entries older than this ISO date or time (UTC).”
    • dry_runboolean“List what would go; returns confirm.”
    • confirmstring“From the dry run.”
  • history_restorecreates or changes datadescribed as changing data

    “Bring back paragraphs a logged write deleted or changed, as a tracked insertion (tracked: false: plainly, for a change the writer approved).”

    Publisher declares: read-only no · destructive no · open-world no

    10 inputs, 2 required
    • docstringrequired“Path to the .docx.”
    • storestring“A store folder (see history.orphans) to read instead of the document's own.”
    • op_idstringrequired“The logged op the paragraph was changed by.”
    • changeinteger“Index of one change of the op (history.list shows them).”
    • afterstring“Insert after this paragraph address instead of the old place (needed when that place was edited, or the history comes from `store`).”
    • expectobject“Write guard: the sha256 read earlier (doc.info, or a reply's doc.sha256), e.g.”
    • dry_runboolean“Preview only; write nothing.”
    • authorstring“Revision author.”
    • tagstring“Appended to the author.”
    • trackedboolean“false: a plain write for a change the writer already approved: the paragraph comes back without revision marks (this call's own insertion accepted in the same …”
  • history_searchreads or searches

    “Search the undo log for a quote: in each logged request and in the text of every paragraph before and after each write, newest first.”

    Publisher declares: read-only yes · idempotent yes · open-world no

    7 inputs, 1 required
    • docstring“Path to the .docx.”
    • storestring“A store folder (see history.orphans) to read instead of the document's own.”
    • querystringrequired“Text to find.”
    • ignore_caseboolean“Ignore case.”
    • ignore_accentsboolean“Ignore accents: `maria` finds `María`.”
    • match_levelstring“Fold the search as `text.find` does: `default` ignores case, accents and punctuation (symbols such as `$` still count), `loose` drops symbols too; `exact` keep…”
    • limitinteger“Most hits to return (default 20); `total` counts them all.”
  • history_undoon 2 other serverscreates or changes datadescribed as changing data

    “Take back one logged write (doc.batch, text.replace and the other direct writes, comment and style writes, styleset.install, term.rename, field and note inserts, layout.apply, history.restore), retur…”

    Publisher declares: read-only no · destructive no · open-world no

    4 inputs, 1 required
    • docstringrequired“Path to the .docx.”
    • op_idstring“The op to undo (default: the latest in effect).”
    • expectobject“Write guard: the sha256 read earlier (doc.info, or a reply's doc.sha256), e.g.”
    • dry_runboolean“Check and preview; write nothing.”
  • index_insertcreates or changes datadescribed as changing data

    “Insert an index (an INDEX field) after a body paragraph `after` (p40#a1b2c3d4), as tracked insertions: a title (default "Index", "" for none), the field with a placeholder result, and a closing parag…”

    Publisher declares: read-only no · destructive no · open-world no

    7 inputs, 2 required
    • docstringrequired“Path to the .docx.”
    • expectobject“Write guard: the sha256 read earlier (doc.info, or a reply's doc.sha256), e.g.”
    • dry_runboolean“Preview only; write nothing.”
    • authorstring“Revision author.”
    • tagstring“Appended to the author.”
    • afterstringrequired“Address of the body paragraph it goes after.”
    • titlestring“Title paragraph above it (default "Index"); "" for none.”
  • index_markcreates or changes datadescribed as changing data

    “Mark an index entry: insert an XE field, as a tracked insertion, right after a range (p8#a1b2c3d4:10-15) so that word or phrase is indexed on its page.”

    Publisher declares: read-only no · destructive no · open-world no

    7 inputs, 3 required
    • docstringrequired“Path to the .docx.”
    • expectobject“Write guard: the sha256 read earlier (doc.info, or a reply's doc.sha256), e.g.”
    • dry_runboolean“Preview only; write nothing.”
    • authorstring“Revision author.”
    • tagstring“Appended to the author.”
    • atstringrequired“A range inside one paragraph; the mark goes after it.”
    • entrystringrequired“The index entry, e.g.”
  • layout_applycreates or changes datadescribed as changing data

    “Bring the document to a page plan, the shape layout.get returns: per section its start (`from` address), break, page-number start and format, first-page difference, and header/footer text per kind ({…”

    Publisher declares: read-only no · destructive no · open-world no

    7 inputs, 2 required
    • docstringrequired“Path to the .docx.”
    • planobjectrequired“The page plan, as layout.get returns it: version 1, two_sided, mirror_margins and sections, each with a `from` address; keys left out stay as they are, and num…”
    • dry_runboolean“Preview only; write nothing.”
    • untrackedboolean“Allow a change Word cannot track (LAYOUT D-L2).”
    • expectobject“Write guard: the sha256 read earlier (doc.info, or a reply's doc.sha256), e.g.”
    • authorstring“Revision author.”
    • tagstring“Appended to the author.”
  • layout_getreads or searches

    “Read the page plan: per section where it starts (`from` address), its break, page numbering (shown, start, format), first-page difference, and header/footer text per kind (default, first, even) with …”

    Publisher declares: read-only yes · idempotent yes · open-world no

    1 input, 1 required
    • docstringrequired“Path to the .docx.”
  • live_closedescribed as changing data

    “Close the document in its Word or LibreOffice window (attached with live.open).”

    Publisher declares: read-only no · destructive yes · open-world no

    4 inputs, 1 required
    • docstringrequired“Path to the document, or the file name of one open in a live app.”
    • engineenum“Always the live engine; may be left out.”
    • saveboolean“Save, then close.”
    • discardboolean“Close and drop the unsaved changes.”
  • live_get_selectionreads or searches

    “Read what the user has selected in Word or LibreOffice right now, and the paragraph the selection starts in with its address (p12#a1b2c3d4), to edit with doc.batch or text.replace.”

    Publisher declares: read-only yes · idempotent yes · open-world no

    2 inputs, 1 required
    • docstringrequired“Path to the document, or the file name of one open in a live app.”
    • engineenum“Always the live engine; may be left out.”
  • live_openon 1 other serverdescribed as changing data

    “Attach to Word or LibreOffice for live editing: find the window already holding the document, or open it in `app` (word or libreoffice; default the one reachable, see live.status) and bring it to the…”

    Publisher declares: read-only no · destructive no · open-world no

    4 inputs, 1 required
    • docstringrequired“Path to the document, or the file name of one open in a live app.”
    • engineenum“Always the live engine; may be left out.”
    • appstring“`word` or `libreoffice`.”
    • frontboolean“Bring the app's window to the front (default true); the reply's `front` says whether it came.”
  • live_placesdescribed as changing data

    “Show the user a list of places as clickable buttons: in a client that renders MCP Apps, a click moves Word's or LibreOffice's cursor there (mode cursor) or selects the paragraph (mode select) by call…”

    Publisher declares: read-only yes · idempotent yes · open-world no

    4 inputs, 2 required
    • docstringrequired“Path to the document, or the file name of one open in a live app.”
    • engineenum“Always the live engine; may be left out.”
    • placesarrayrequired“The buttons, in order: a `label` and `at` or `find_phrase` each (with both, `find_phrase` is tried when `at` fails).”
    • modeenum“What a click does: `cursor` (default) puts the cursor at the place's start; `select` selects its paragraph.”
  • live_savedescribed as changing data

    “Save the document open in Word or LibreOffice (attached with live.open) to its file, from inside the app.”

    Publisher declares: read-only no · destructive no · open-world no

    2 inputs, 1 required
    • docstringrequired“Path to the document, or the file name of one open in a live app.”
    • engineenum“Always the live engine; may be left out.”
  • live_selectcontrols a browser or desktopdescribed as changing data

    “Show the user a place in Word or LibreOffice: select a paragraph, or with mode cursor only put the cursor at its start, by address (`at`, p142#a7b2a7b2) or by a `find_phrase` from para.locate (matche…”

    Publisher declares: read-only no · destructive no · open-world no

    9 inputs, 1 required
    • docstringrequired“Path to the document, or the file name of one open in a live app.”
    • engineenum“Always the live engine; may be left out.”
    • atstring“Paragraph address, e.g.”
    • find_phrasestring“A phrase that occurs once in the document (`\r` for a paragraph mark), as `para.locate` gives it.”
    • find_phrase_acrossenum“`para.locate`'s `find_phrase_across`, for a phrase spanning a mark.”
    • match_levelenum“How loosely `find_phrase` matches.”
    • modeenum“`select` (default) selects the paragraph; `cursor` only puts the cursor at its start, so typing or Delete cannot replace it.”
    • frontboolean“Bring the app's window to the front (default true); the reply's `front` says whether it came.”
    • paragraphs_afterinteger“Select the paragraph this many after the one named.”
  • live_statuson 1 other serverreads or searches

    “Check the live apps: which of Word and LibreOffice are installed and reachable, and which documents they have open; with `doc`, which app holds it, whether that app is driven by this server or only a…”

    Publisher declares: read-only yes · idempotent yes · open-world no

    2 inputs
    • docstring“Path to the document, or the file name of one open in a live app.”
    • engineenum“Always the live engine; may be left out.”
  • note_addon 1 other servercreates or changes datadescribed as changing data

    “Add a footnote or endnote: the reference mark goes at a body point (p3#a1b2c3d4:10-10, after offset 10), after a range, or at the end of a paragraph (p3#a1b2c3d4); `text` is the note's one line.”

    Publisher declares: read-only no · destructive no · open-world no

    8 inputs, 4 required
    • docstringrequired“Path to the .docx.”
    • atstringrequired“Body point p3#fp:10-10 (the mark goes after the offset), a range inside one paragraph (after it) or a paragraph (at its end).”
    • kindenumrequired“footnote (bottom of the page) or endnote (end of the document).”
    • textstringrequired“The note text, one line.”
    • expectobject“Write guard: the sha256 read earlier (doc.info, or a reply's doc.sha256), e.g.”
    • dry_runboolean“Preview only; write nothing.”
    • authorstring“Revision author.”
    • tagstring“Appended to the author.”
  • page_estimatereads or searches

    “Estimate the page each paragraph starts on (and ends on when it spans pages): from Word's rendered page marks and explicit breaks where present, else a words-per-page model; always flagged `estimated…”

    Publisher declares: read-only yes · idempotent yes · open-world no

    5 inputs, 1 required
    • docstringrequired“Path to the .docx.”
    • atstring“Only this paragraph, by address, e.g.”
    • bystring“List one row per paragraph (default) or per page.”
    • limitinteger“Most items to return; a response is also capped at about 8,000 bytes.”
    • cursorstring“The `next` value of the previous response, to continue the list.”
  • para_deletedeletesdescribed as changing data

    “Delete a paragraph (p3#a1b2c3d4) or a run of paragraphs (p3#a1b2c3d4..p5#e5f6a7b8), as a tracked deletion the writer can reject.”

    Publisher declares: read-only no · destructive no · open-world no

    7 inputs, 2 required
    • docstringrequired“Path to the .docx (live: or the file name of one open in a live app).”
    • expectobject“Write guard: the sha256 read earlier (doc.info, or a reply's doc.sha256), e.g.”
    • dry_runboolean“Preview only; write nothing.”
    • trackedboolean“true (default): edits are tracked changes.”
    • authorstring“Revision author.”
    • tagstring“Appended to the author.”
    • atstringrequired“Paragraph p3#fp or run p3#fp..p5#fp.”
  • para_getreads or searches

    “Read one paragraph in full by address (p142#a7b2a7b2, or fn3/p1#… in a note): text, style, direct paragraph formatting, character-formatted spans (bold, italic, font...) and layout facts (heading_lev…”

    Publisher declares: read-only yes · idempotent yes · open-world no

    4 inputs, 2 required
    • docstringrequired“Path to the .docx.”
    • atstringrequired“Paragraph address from a read result, e.g.”
    • limitinteger“Most characters of text to return.”
    • cursorstring“The `next` value of the previous response, to continue the list.”
  • para_insertcreates or changes datadescribed as changing data

    “Insert one new paragraph with `text` after or before an existing one (give `after` or `before`, e.g.”

    Publisher declares: read-only no · destructive no · open-world no

    10 inputs, 2 required
    • docstringrequired“Path to the .docx (live: or the file name of one open in a live app).”
    • expectobject“Write guard: the sha256 read earlier (doc.info, or a reply's doc.sha256), e.g.”
    • dry_runboolean“Preview only; write nothing.”
    • trackedboolean“true (default): edits are tracked changes.”
    • authorstring“Revision author.”
    • tagstring“Appended to the author.”
    • engineenum“`live` edits the document open in Word or LibreOffice (see live.open).”
    • textstringrequired“Text of the new paragraph.”
    • afterstring“Insert after this paragraph (or before).”
    • beforestring“Insert before this paragraph (or after).”
  • para_listreads or searches

    “List every paragraph in document order with its address, text, style, heading level and layout facts (centred, page break before, blank paragraphs before, empty, table cell); heading_level is null fo…”

    Publisher declares: read-only yes · idempotent yes · open-world no

    6 inputs, 1 required
    • docstringrequired“Path to the .docx.”
    • normalizedboolean“Add `normalized`, the text as `text.normalize` gives it.”
    • pagesboolean“Add the estimated `page` and `page_label` per paragraph, and `page_basis`, `rendered_marks` and `page_count` (see page.estimate).”
    • storiesarray“Stories to read (default ["body"]): "notes" adds footnotes and endnotes, each after the paragraph holding its mark; "headers" adds headers and footers, after t…”
    • limitinteger“Most items to return; a response is also capped at about 8,000 bytes.”
    • cursorstring“The `next` value of the previous response, to continue the list.”
  • para_locatereads or searches

    “Say where paragraphs are, in terms a person can follow: for one paragraph, a range (p40#a1b2c3d4:0..p45#e5f6a7b8:0, offsets ignored) or the whole document, each one's chapter, scene, estimated page, …”

    Publisher declares: read-only yes · idempotent yes · open-world no

    7 inputs, 1 required
    • docstringrequired“Path to the .docx.”
    • atstring“Paragraph address or range (offsets ignored), e.g.”
    • overridesarray“Force or deny a chapter or scene at paragraphs by fingerprint.”
    • profileobject“Detection settings for this document.”
    • structureboolean“false: skip chapter, part and scene detection (they come back null), for callers that keep their own structure; faster on a single paragraph.”
    • limitinteger“Most items to return; a response is also capped at about 8,000 bytes.”
    • cursorstring“The `next` value of the previous response, to continue the list.”
  • recipe_liston 2 other serversreads or searches

    “List the cleanup recipes recipe.run can apply: the bundled ones and the user's own, each with name, version, description and source, plus any recipe files that failed validation and why.”

    Publisher declares: read-only yes · idempotent yes · open-world no

    Takes no inputs.

  • recipe_runruns code or commandsdescribed as changing data

    “Run a cleanup recipe (a name from recipe.list, or an inline `definition`) over the document and return the edits it proposes as a ready doc.batch request (`batch`, guarded by expect.sha256), repeatin…”

    Publisher declares: read-only yes · idempotent yes · open-world no

    5 inputs, 1 required
    • docstringrequired“Path to the .docx file.”
    • recipestring“Name from recipe.list.”
    • definitionobject“An inline declarative recipe (same schema as a stored one).”
    • dry_runboolean“Accepted for symmetry; recipe.run never writes.”
    • engineenum“`live` reads the document open in Word or LibreOffice (see live.open) and returns a live doc.batch.”
  • review_liston 2 other serversreads or searches

    “Read a reviewed document in one go: the body's comments and tracked insertions and deletions grouped by paragraph, in document order.”

    Publisher declares: read-only yes · idempotent yes · open-world no

    4 inputs, 1 required
    • docstringrequired“Path to the .docx.”
    • authorstring“Only this author's.”
    • limitinteger“Most items to return; a response is also capped at about 8,000 bytes.”
    • cursorstring“The `next` value of the previous response, to continue the list.”
  • revision_acceptcreates or changes datadescribed as changing data

    “Accept tracked changes, making them plain text: by `ids` (from revision.list), by revision `author`, in a paragraph or run (`at`, p3#a1b2c3d4..p9#e5f6a7b8), or `all`.”

    Publisher declares: read-only no · destructive no · open-world no

    7 inputs, 1 required
    • docstringrequired“Path to the .docx (live: or the file name of one open in a live app).”
    • expectobject“Write guard: the sha256 read earlier (doc.info, or a reply's doc.sha256), e.g.”
    • dry_runboolean“Preview only; write nothing.”
    • idsarray“Accept the revisions with these ids (from revision.list).”
    • authorstring“Exact revision author.”
    • atstring“Paragraph p3#fp or run p3#fp..p9#fp.”
    • allboolean“true: every revision in the document.”
  • revision_listreads or searches

    “List the tracked changes (insertions, deletions, moves, formatting, table rows and cells) in document order, each with id, type, author, date, paragraph address and text (clipped at 200 characters).”

    Publisher declares: read-only yes · idempotent yes · open-world no

    6 inputs, 1 required
    • docstringrequired“Path to the .docx.”
    • authorstring“Only this author.”
    • typestring“Only this type.”
    • storiesarray“Stories to list (default ["body"]): "notes" adds footnotes and endnotes, "headers" headers and footers, after the body's revisions; their addresses carry a pre…”
    • limitinteger“Most items to return; a response is also capped at about 8,000 bytes.”
    • cursorstring“The `next` value of the previous response, to continue the list.”
  • revision_rejectdescribed as changing data

    “Reject tracked changes, undoing them in the text (insertions removed, deletions restored): by `ids` (from revision.list), by revision `author`, in a paragraph or run (`at`, p3#a1b2c3d4..p9#e5f6a7b8),…”

    Publisher declares: read-only no · destructive no · open-world no

    7 inputs, 1 required
    • docstringrequired“Path to the .docx (live: or the file name of one open in a live app).”
    • expectobject“Write guard: the sha256 read earlier (doc.info, or a reply's doc.sha256), e.g.”
    • dry_runboolean“Preview only; write nothing.”
    • idsarray“Reject the revisions with these ids (from revision.list).”
    • authorstring“Exact revision author.”
    • atstring“Paragraph p3#fp or run p3#fp..p9#fp.”
    • allboolean“true: every revision in the document.”
  • section_liston 2 other serversreads or searches

    “List each section's page setup: break type, title page, even/odd headers, page-number start and format, and which header and footer story (hdr1.default, ftr2.first...) it uses per kind; null means in…”

    Publisher declares: read-only yes · idempotent yes · open-world no

    1 input, 1 required
    • docstringrequired“Path to the .docx.”
  • server_capabilitieson 1 other serverreads or searches

    “Describe this doc-control server: API and package version, engines (file, live), which live apps are reachable, feature support per engine, every operation with its kind and summary, every error code…”

    Publisher declares: read-only yes · idempotent yes · open-world no

    Takes no inputs.

  • server_helpreads or searches

    “Get the JSON Schemas of one operation (`op`, e.g.”

    Publisher declares: read-only yes · idempotent yes · open-world no

    1 input
    • opstring“Operation or batch operation kind.”
  • style_createcreates or changes datadescribed as changing data

    “Add a new paragraph, character, table or numbering style with its parent (based_on), next and linked styles and run and paragraph formatting (e.g.”

    Publisher declares: read-only no · destructive no · open-world no

    14 inputs, 2 required
    • docstringrequired“Path to the .docx.”
    • idstring“Style id (default: from the name).”
    • namestringrequired“Display name.”
    • typeenum“Kind of style (default paragraph).”
    • based_onstring“Parent style id or name; '' for none.”
    • nextstring“Style of the next paragraph; '' for none.”
    • linkstring“Linked paragraph/character style; '' for none.”
    • quickboolean“Show in the quick-style gallery.”
    • defaultboolean“The default style of its type.”
    • customboolean“A user-defined (not built-in) style.”
    • runobject“Character formatting: bold, italic, small_caps, strike, underline, font, size_pt, color, highlight, vertical_align; null removes a key.”
    • paragraphobject“Paragraph formatting (twips): alignment, indent{left,right,first_line,hanging}, spacing{before,after,line,line_rule}, keep_next, keep_lines, page_break_before,…”
    • expectobject“Write guard: the sha256 read earlier (doc.info, or a reply's doc.sha256), e.g.”
    • dry_runboolean“Preview only; write nothing.”
  • style_getreads or searches

    “Read one style by id or name ("Heading1" or "heading 1"): its type, parent chain, next and linked styles, how often it is used, heading level, the formatting it sets itself and its effective formatti…”

    Publisher declares: read-only yes · idempotent yes · open-world no

    2 inputs, 2 required
    • docstringrequired“Path to the .docx.”
    • stylestringrequired“Style id or name.”
  • style_liston 1 other serverreads or searches

    “List the styles defined in the document with id, name, type, parent and how many times each is used in the body.”

    Publisher declares: read-only yes · idempotent yes · open-world no

    5 inputs, 1 required
    • docstringrequired“Path to the .docx.”
    • typestring“Only this kind of style.”
    • used_onlyboolean“Only styles used at least once.”
    • limitinteger“Most items to return; a response is also capped at about 8,000 bytes.”
    • cursorstring“The `next` value of the previous response, to continue the list.”
  • style_mergedescribed as changing data

    “Merge styles: re-point every use of the `from` style or styles (ids or names) to `into` in the body, notes, headers and other styles, then delete the `from` styles.”

    Publisher declares: read-only no · destructive yes · open-world no

    5 inputs, 3 required
    • docstringrequired“Path to the .docx.”
    • fromrequired“Style id or name, or a list of them (they are removed).”
    • intostringrequired“Style id or name.”
    • expectobject“Write guard: the sha256 read earlier (doc.info, or a reply's doc.sha256), e.g.”
    • dry_runboolean“Preview only; write nothing.”
  • style_renamecreates or changes datadescribed as changing data

    “Rename a style's display `name` and/or `id` (id defaults from the name); every reference follows: paragraphs, runs, headers, notes, numbering, and based_on, next and link in other styles.”

    Publisher declares: read-only no · destructive no · open-world no

    6 inputs, 2 required
    • docstringrequired“Path to the .docx.”
    • stylestringrequired“Style id or name.”
    • namestring“Display name.”
    • idstring“Style id (default: from the name).”
    • expectobject“Write guard: the sha256 read earlier (doc.info, or a reply's doc.sha256), e.g.”
    • dry_runboolean“Preview only; write nothing.”
  • style_updatecreates or changes datadescribed as changing data

    “Change an existing style: its parent (based_on), next or linked style, quick-gallery flag, or run and paragraph formatting (e.g.”

    Publisher declares: read-only no · destructive no · open-world no

    10 inputs, 2 required
    • docstringrequired“Path to the .docx.”
    • stylestringrequired“Style id or name.”
    • based_onstring“Parent style id or name; '' for none.”
    • nextstring“Style of the next paragraph; '' for none.”
    • linkstring“Linked paragraph/character style; '' for none.”
    • quickboolean“Show in the quick-style gallery.”
    • runobject“Character formatting: bold, italic, small_caps, strike, underline, font, size_pt, color, highlight, vertical_align; null removes a key.”
    • paragraphobject“Paragraph formatting (twips): alignment, indent{left,right,first_line,hanging}, spacing{before,after,line,line_rule}, keep_next, keep_lines, page_break_before,…”
    • expectobject“Write guard: the sha256 read earlier (doc.info, or a reply's doc.sha256), e.g.”
    • dry_runboolean“Preview only; write nothing.”
  • styleset_export

    “Export the document's style definitions (all, the `styles` named, or custom_only) as a JSON style set, returned and also written to `out` when given (never overwrites an existing file).”

    Publisher declares: read-only no · destructive no · open-world no

    5 inputs, 1 required
    • docstringrequired“Path to the .docx.”
    • namestring“Set name.”
    • stylesarray“Only these styles (ids or names).”
    • custom_onlyboolean“Only user-defined styles.”
    • outstring“Also write the JSON here.”
  • styleset_export_dotx

    “Write the document's style definitions (all, the `styles` named, or custom_only) to a new .dotx Word template at `out` (must not exist), for Word users to attach or base documents on.”

    Publisher declares: read-only no · destructive no · open-world no

    5 inputs, 2 required
    • docstringrequired“Path to the .docx.”
    • outstringrequired“New .dotx to create.”
    • namestring“Set name.”
    • stylesarray“Only these styles (ids or names).”
    • custom_onlyboolean“Only user-defined styles.”
  • styleset_import_dotxcreates or changes datadescribed as changing data

    “Install the styles of a .dotx Word template (`path`) into the document: new styles are added, existing ids replaced (on_conflict replace, default), kept (skip) or refused (error: STYLE_CONFLICT).”

    Publisher declares: read-only no · destructive no · open-world no

    5 inputs, 2 required
    • docstringrequired“Path to the .docx.”
    • pathstringrequired“The .dotx to read.”
    • on_conflictenum“A style id already in the document (default replace).”
    • expectobject“Write guard: the sha256 read earlier (doc.info, or a reply's doc.sha256), e.g.”
    • dry_runboolean“Preview only; write nothing.”
  • styleset_installcreates or changes datadescribed as changing data

    “Install a JSON style set (inline `styleset`, or a file at `path`, as styleset.export writes it) into the document: new styles are added, existing ids replaced (on_conflict replace, default), kept (sk…”

    Publisher declares: read-only no · destructive no · open-world no

    6 inputs, 1 required
    • docstringrequired“Path to the .docx.”
    • stylesetobject“The style set (inline).”
    • pathstring“Or a style set file.”
    • on_conflictenum“A style id already in the document (default replace).”
    • expectobject“Write guard: the sha256 read earlier (doc.info, or a reply's doc.sha256), e.g.”
    • dry_runboolean“Preview only; write nothing.”
  • table_getreads or searches

    “Read one table's grid: rows of cells, each with its first grid column, span, vertical merge (null, restart, continue) and the addresses of its paragraphs (read their text with para.get or para.list).”

    Publisher declares: read-only yes · idempotent yes · open-world no

    3 inputs, 1 required
    • docstringrequired“Path to the .docx.”
    • tableinteger“Table number in the main story, 1-based in document order (the `cell.table` of a paragraph row); text-box and DrawingML tables are not counted.”
    • atstring“Instead of `table`: any paragraph address in the table, in any story (`fn3/p1#…`, `hdr1.default/p1#…`); the reply's `table` is then numbered within that story.”
  • table_row_deletedeletesdescribed as changing data

    “Delete one row of a body table (`table` as table.get numbers it, `row` 1-based) as a tracked change the writer can reject.”

    Publisher declares: read-only no · destructive no · open-world no

    7 inputs, 3 required
    • docstringrequired“Path to the .docx.”
    • tableintegerrequired“Table number as `table.get` numbers it: 1-based, in document order, main story only (a table in a note, header or footer cannot be named here).”
    • rowintegerrequired“The row, 1-based.”
    • expectobject“Write guard: the sha256 read earlier (doc.info, or a reply's doc.sha256), e.g.”
    • dry_runboolean“Preview only; write nothing.”
    • authorstring“Revision author.”
    • tagstring“Appended to the author.”
  • table_row_insertcreates or changes datadescribed as changing data

    “Insert a row into a body table as a tracked change: after row `after_row` (0: before the first), with one text per cell in `cells` (e.g.”

    Publisher declares: read-only no · destructive no · open-world no

    8 inputs, 4 required
    • docstringrequired“Path to the .docx.”
    • tableintegerrequired“Table number as `table.get` numbers it: 1-based, in document order, main story only (a table in a note, header or footer cannot be named here).”
    • after_rowintegerrequired“Insert after this row (1-based); 0 inserts before the first row.”
    • cellsarrayrequired“One text per cell of the row it follows (the first row for after_row 0); a horizontally merged cell is one cell.”
    • expectobject“Write guard: the sha256 read earlier (doc.info, or a reply's doc.sha256), e.g.”
    • dry_runboolean“Preview only; write nothing.”
    • authorstring“Revision author.”
    • tagstring“Appended to the author.”
  • term_renamecreates or changes datadescribed as changing data

    “Rename a term or a character's name everywhere (Lucía to Elena) as one tracked batch: whole words by default, case-insensitive with case preserved (LUCÍA becomes ELENA), with optional inflections (["…”

    Publisher declares: read-only no · destructive no · open-world no

    15 inputs, 3 required
    • docstringrequired“Path to the .docx.”
    • fromstringrequired“Term to rename.”
    • tostringrequired“New term.”
    • whole_wordboolean“Whole words only.”
    • case_sensitiveboolean“Exact spelling only; `to` is used as written.”
    • preserve_caseboolean“LUCÍA becomes ELENA, lucía becomes elena, Lucía becomes Elena.”
    • ignore_accentsboolean“`Lucia` also matches `Lucía`.”
    • inflectionsarray“Suffixes that follow the term: "s" renames Lucías to Elenas; {"from": "o", "to": "a"} renames Lucíao to Elenaa.”
    • match_levelstring“Fold the search as `text.find` does: `default` ignores case, accents and punctuation (symbols such as `$` still count), `loose` drops symbols too; `exact` is t…”
    • expectobject“Write guard: the sha256 read earlier (doc.info, or a reply's doc.sha256), e.g.”
    • dry_runboolean“Plan and preview only; write nothing.”
    • preview_limitinteger“Most changes echoed back in `preview`.”
    • trackedboolean“false: a plain write for a change the writer already approved: the same edits, with this call's own revisions accepted in the same verified write (no revision …”
    • authorstring“Revision author.”
    • tagstring“Appended to the author.”
  • text_findreads or searches

    “Find text or a Python regex (`regex`) in the document; each match comes back as a range (p8#b72009e4:0-8) with context, ready for text.replace or anchor.create.”

    Publisher declares: read-only yes · idempotent yes · open-world no

    11 inputs, 2 required
    • docstringrequired“Path to the .docx file.”
    • querystringrequired“Text to find (at most 1000 characters), or a Python regex if `regex`.”
    • regexboolean“Treat `query` as a regex.”
    • ignore_caseboolean“Ignore case.”
    • ignore_accentsboolean“Ignore accents: `maria` finds `María`.”
    • whole_wordboolean“Match only whole words (no letter, digit or mark on either side).”
    • limitinteger“Most matches to return; more are reached with `cursor`.”
    • contextinteger“Characters of surrounding text on each side of a match.”
    • match_levelstring“Fold a literal query: `default` ignores case, accents and punctuation (symbols such as `$` still count), `loose` drops symbols too; `exact` is the search as wi…”
    • cursorstring“The `next` value of the previous page.”
    • storiesarray“Stories to read (default ["body"]): "notes" adds footnotes and endnotes, each after the paragraph holding its mark; "headers" adds headers and footers, after t…”
  • text_normalizeon 1 other servercalculates or converts

    “Normalise text (NFC, soft hyphens and zero-width characters removed, whitespace collapsed) and return a two-way offset map to the original code points, for the whole document, one paragraph or range …”

    Publisher declares: read-only yes · idempotent yes · open-world no

    5 inputs
    • docstring“Path to a .docx.”
    • textstring“Text to normalise instead of `doc`.”
    • atstring“Paragraph address or range, e.g.”
    • limitinteger“Most items to return; a response is also capped at about 8,000 bytes.”
    • cursorstring“The `next` value of the previous response, to continue the list.”
  • text_replaceon 2 other serverscreates or changes datadescribed as changing data

    “Replace one range with new text, as a tracked change: part of a paragraph (p3#a1b2c3d4:10-15, code-point offsets), a whole paragraph (p3#a1b2c3d4) or a span across paragraphs (p3#a1b2c3d4:10..p5#e5f6…”

    Publisher declares: read-only no · destructive no · open-world no

    9 inputs, 3 required
    • docstringrequired“Path to the .docx (live: or the file name of one open in a live app).”
    • expectobject“Write guard: the sha256 read earlier (doc.info, or a reply's doc.sha256), e.g.”
    • dry_runboolean“Preview only; write nothing.”
    • trackedboolean“true (default): edits are tracked changes.”
    • authorstring“Revision author.”
    • tagstring“Appended to the author.”
    • engineenum“`live` edits the document open in Word or LibreOffice (see live.open).”
    • atstringrequired“Range p3#fp:10-15, p3#fp or p3#fp:10..p5#fp:2.”
    • textstringrequired“New text; empty deletes the range.”
  • toc_insertcreates or changes datadescribed as changing data

    “Insert a table of contents (a TOC field) after a body paragraph `after` (p1#a1b2c3d4), as tracked insertions: a title (default "Contents", "" for none), the field listing heading levels `levels` (def…”

    Publisher declares: read-only no · destructive no · open-world no

    8 inputs, 2 required
    • docstringrequired“Path to the .docx.”
    • afterstringrequired“Address of the body paragraph it goes after.”
    • levelsstring“Heading levels it lists, e.g.”
    • titlestring“Title paragraph above it (default "Contents"); "" for none.”
    • expectobject“Write guard: the sha256 read earlier (doc.info, or a reply's doc.sha256), e.g.”
    • dry_runboolean“Preview only; write nothing.”
    • authorstring“Revision author.”
    • tagstring“Appended to the author.”
  • xref_addcreates or changes datadescribed as changing data

    “Insert a cross-reference field at an insertion point (`at`: p14#a1b2c3d4:20-20, or a paragraph address for its end), pointing `to` a caption or another body paragraph.”

    Publisher declares: read-only no · destructive no · open-world no

    8 inputs, 3 required
    • docstringrequired“Path to the .docx.”
    • expectobject“Write guard: the sha256 read earlier (doc.info, or a reply's doc.sha256), e.g.”
    • dry_runboolean“Preview only; write nothing.”
    • authorstring“Revision author.”
    • tagstring“Appended to the author.”
    • atstringrequired“Insertion point: p<n>#<fp>:<k>-<k>, or a paragraph address for its end.”
    • tostringrequired“Address of the caption or heading it points at.”
    • showenum“number (default): a caption's label and number, or a paragraph's number; page: the page it is on; text: the caption or paragraph text.”

Each quoted sentence is the first sentence of the publisher’s own description. The kind of tool and the “changes data” mark are our AI model’s reading of that description, not something we tested: two differently worded runs had to agree, otherwise no label is shown, and nobody has checked them by hand. A tool without the “changes data” mark is described as only reading, searching or calculating, or the two runs did not agree. No tool was called. Read the publisher’s full description before relying on it. “Publisher declares” lists the hints the server itself sends with the tool (MCP annotations: read-only, destructive, idempotent, open-world); they are the publisher's claims, not checked by us. Inputs are the parameters in the tool's own input schema: name, declared type, whether it is required, and the first sentence of its description. Read 2026-10-23.

How well are its tools described?

Features #4 and #5

How clearly this server's own tool descriptions say what a tool does, and how consistent its tool list is. The first part is an AI model's yes/no reading of each description; the second part is counted. We do not turn it into a grade.

Descriptions

AI reading of each description

Says what the tool does
100% of 68 tools
Says what it returns
72% of 53 tools
States limits, defaults or errors
41% of 61 tools
Says when to use it
100% of 47 tools
Items covered per tool
2.9 of 4 on average

Counted from the listing

Parameters with a description
100% of 376
Tools with a description
100% of 68
Typical description length
499 characters

The tool set

Counted from the listing

Tools
68
Size of the list
about 74,262 tokens for an agent to load (characters ÷ 4)
Naming
68 of 68 names use snake_case

AI reading: easy to mix up

No pair found.

The AI items cover 68 of 68 tools: for a tool where two differently worded runs disagreed, that item is left out. They were not checked by hand, and no tool was called. “Easy to mix up” means two tools whose names or descriptions overlap without saying how they differ; the AI found none, comparing tools within groups of 40. We do not rate whether the tool set is complete or whether side effects are spelled out, because our AI reading of those was not reliable enough.

How do I add it to my client?

Config from the registry entry

From the PyPI package doc-control

Our sandbox started this package on 2026-10-23 (a read-only session: no tool was called).

Add to CursorAn install link in the format Cursor documents, holding the Cursor config below. The command runs the publisher’s code on your machine.

Claude Desktop · claude_desktop_config.json (Settings → Developer → Edit Config)
{
  "mcpServers": {
    "doc-control": {
      "command": "uvx",
      "args": [
        "doc-control==0.10.1",
        "mcp"
      ]
    }
  }
}
Cursor · .cursor/mcp.json in a project, or ~/.cursor/mcp.json
{
  "mcpServers": {
    "doc-control": {
      "command": "uvx",
      "args": [
        "doc-control==0.10.1",
        "mcp"
      ]
    }
  }
}
VS Code · .vscode/mcp.json
{
  "servers": {
    "doc-control": {
      "type": "stdio",
      "command": "uvx",
      "args": [
        "doc-control==0.10.1",
        "mcp"
      ]
    }
  }
}
VS Code (command line) · Bash or zsh terminal (macOS, Linux)
code --add-mcp '{"name":"doc-control","type":"stdio","command":"uvx","args":["doc-control==0.10.1","mcp"]}'
Claude Code
claude mcp add --transport stdio doc-control -- uvx doc-control==0.10.1 mcp
Try it in the MCP Inspector · runs on your machine, opens in your browser · Node 22.19+
npx @modelcontextprotocol/inspector@2.11.0 -- uvx doc-control==0.10.1 mcp
  • Arguments are written as the registry entry gives them; a named one as “--name value”, the form the registry documentation shows.
  • This runs the publisher's code on your machine (uvx). Read its README first.
  • The MCP Inspector lists the server's tools, resources and prompts; a tool you call there runs for real.

Built from the server's registry entry with each client's documented format (checked 2026-10-14; the Cursor link and the VS Code command 2026-10-19; the MCP Inspector command 2026-10-21). Values in < > are yours to fill in; this page never contains a key. Where the server needs a setting the entry does not declare, it can still fail to start.

Can it be installed, and is it up to date?

Version pin · advisories

Listed version

Registry lists
0.10.1
Latest stable
0.10.1
Status
current
Withdrawn
no

Source: pypi.org · 2026-10-23. About the version the registry lists; a manual install may resolve to a different one.

Dependency advisories

critical0high0moderate0low0

Counted in the full dependency tree as resolved on 2026-10-23 (OSV.dev). Bars share one scale. The package itself has no known vulnerability (OSV.dev).

Integrity, provenance, license

Integrity
sha256-9e3b58c5be0f6b879…
License
MIT

Source: the package registry · 2026-10-23.

Usage

Downloads
0 in the last month

Source: pypistats.org · 2026-10-23.

Does the registry listing match what we found?

Feature #6

The registry verifies a package once, when it is published, and does not re-check it. A difference below is about the listing, not a judgement of the publisher.

Registry saysWe foundResultSource · date
Published package can be startedStarted and answeredmatchesour test · 2026-10-23
Version 0.10.1 on PyPIExists and can be installedmatchesPyPI · 2026-10-23
Repository github.com/nuncaeslupus/doc-controlOpens publiclymatchesapi.github.com · 2026-10-23

Who made it?

Feature #7 · lineage

Facts about the publisher. We do not turn them into a trust score.

Namespace
io.github.nuncaeslupus · 3 servers
GitHub owner
a personal account (nuncaeslupus)
Repository
github.com/nuncaeslupus/doc-control
Stars
0
Repository age
0–30 days
Last push
0–30 days ago
Archived
no
Security policy
none found (we looked for SECURITY.md in the repository and in its owner’s .github repository)

Source: the registry entry and api.github.com · 2026-10-23; security policy read from GitHub · 2026-10-23.

Publish this server? Run these checks against it yourself before release, from your own machine: a server the command starts, or your own server at its URL after a one-time proof that you control it: npx protocolprobe-selftest.

Choosing

Record checks

Public records · not a safety rating

7 of 8 record checks met · 1 does not apply

  • #14,745 of 15,112 packages by monthly downloads, tied with 367 others
  • Not ranked by stars: 0 stars (ranked from 10)
  • MetRegistry entry is active and says how to run itActive, with a package or a remote address.
  • MetSource repository link opensThe linked GitHub repository is public.
  • MetRepository is not archivedNot archived.
  • MetCode pushed to the repository in the 90 days before our checkLast push 0-30 days before our check.
  • Not metRepository publishes a security policy (SECURITY.md)No SECURITY.md in the places GitHub reads it from.
  • MetPackage names its licence with a standard (SPDX) identifierMIT
  • MetThe version the registry lists can be installed and is not withdrawnThe listed version exists and is current.
  • Does not applynpm package carries build provenance (attestation)PyPI packages have no npm-style attestation.
  • MetNo known critical or high advisory in the package or its dependenciesNone known in the package or its dependency tree.

Read from public records only: the registry entry, npm/PyPI, GitHub and advisory databases, checked 2026-10-23. No tool was called. Only “met” and “not met” are counted, so the total differs between servers; a check that does not apply or that we could not run is listed, never counted against it. It is not a safety rating. How each check works · Leaderboards

Common questions about io.github.nuncaeslupus/doc-control

Answered from the data above

Is io.github.nuncaeslupus/doc-control safe to install?

We do not rate servers as safe or unsafe. 7 of its 8 applicable record checks are met (facts from public records, each listed on this page). What the records show: Its source repository opens publicly. Its repository had a push in the last 90 days. The listed version is the latest stable release. The package itself has no known vulnerability (OSV.dev). Its full dependency tree has no known advisory. 37 of its tools describe changing data (our AI model's reading of the descriptions). These are facts with their sources on this page, not a safety guarantee, and we did not run its tools.

Has io.github.nuncaeslupus/doc-control been security tested?

Partly. 3 of the 12 checks that apply to it were exercised. We started the package in an isolated sandbox and read what it declares, but this test round was read-only, so its tools were not called. No security verdict is published before verification.

What can io.github.nuncaeslupus/doc-control do?

It lists 68 tools. In our AI model's reading of their descriptions (two runs had to agree, nobody checked it by hand), they include tools that read or search, create or change data, delete, run code or commands, control a browser or desktop and calculate or convert. We did not call any tool, so this describes the text, not the behaviour.

Can io.github.nuncaeslupus/doc-control change or delete data?

37 of its tools say in their description that they create, edit, delete, send or run something (our AI model's reading). We did not call any tool, so we cannot say what actually happens.

Does io.github.nuncaeslupus/doc-control publish a security policy?

We found no SECURITY.md in its repository (root, .github/ or docs/) or in its owner's .github repository.

Is the listed version current?

Yes. The registry lists 0.10.1, the latest stable release on PyPI.

Where is the source code of io.github.nuncaeslupus/doc-control?

In github.com/nuncaeslupus/doc-control, which opens publicly.

Found this page useful?

Anonymous · no sign-in

A quick, anonymous reaction — no account, no email. One per kind from your browser. The tally updates when the page is next refreshed, and it is only a rough count, never a safety rating or a measured number of people.

Similar servers

Same topic · AI-read

Active servers whose topic is also “productivity-and-docs” and that have at least one tool of the same kind; most kinds in common first, then most GitHub stars. The topic and the tool kinds are an AI model's reading of the publishers' descriptions, not checked by hand. Similar is not a recommendation.

Compare with another server

Side by side: registry entry, our read-only session, the tools and the 18 classification fields. Same values as each page; no score.

Security testing

What did we test, and what did we leave out?

18 checks · features #1, #2

Not probed (read-only run)

We started the package in an isolated sandbox and read what it declares, but this test round was read-only, so its tools were not called. No security score is given; a check we did not run is never counted as passed.

The 18 checks at a glanceour test · 2026-10-23
  1. Inventory: exercised
  2. Hidden instructions: exercised
  3. Real execution: not run · our policy
  4. Secret leak: not run · nothing to check it against
  5. Internal addresses: not run · our policy
  6. Unconfirmed changes: not run · our policy
  7. Bad input: not run · our policy
  8. Model requests: not run · nothing to check it against
  9. Sensitive questions: not run · nothing to check it against
  10. Folder boundary: not run · our policy
  11. Log leaks: not run · nothing to check it against
  12. Hidden content: exercised
  13. Fake assistant turns: not applicable
  14. Token passthrough: not applicable
  15. Token audience: not applicable
  16. Sign-in redirect: not applicable
  17. Consent handling: not applicable
  18. Sign-in metadata: not applicable

3 exercised9 not run (reason given)6 not applicable

Each check ends in exactly one state: exercised, not run (with the reason), or not applicable (with the reason). 3 of the 12 checks that apply to it were exercised. We do not publish security-check outcomes for named servers.

Exercised · 3
  • 1Inventory
    tool-list
    Reads the declared tools, resources and prompts.exercised
  • 2Hidden instructions
    description-poisoning
    Looks for hidden instructions in tool descriptions.exercised
  • 12Hidden content
    audience-hiding
    Checks resources that hide content from the user.exercised
Not run, with the reason · 9
  • 3Real execution
    real-execution
    Calls a tool and checks what really happens.This check calls the package's tools. This test round was read-only, so no tool was called; tools can act on outside services with the publisher's or a user's account.not run · our policy
  • 4Secret leak
    canary-leak
    Plants a fake secret and checks whether it leaks.This check needs at least one successful tool call to have something to check, and no tool was called.not run · nothing to check it against
  • 5Internal addresses
    ssrf
    Checks whether a tool can be steered to internal addresses.This check calls the package's tools. This test round was read-only, so no tool was called; tools can act on outside services with the publisher's or a user's account.not run · our policy
  • 6Unconfirmed changes
    write-without-confirmation
    Checks whether tools that change data act without asking.This check calls the package's tools. This test round was read-only, so no tool was called; tools can act on outside services with the publisher's or a user's account.not run · our policy
  • 7Bad input
    error-handling
    Sends bad input and watches how the server answers.This check calls the package's tools. This test round was read-only, so no tool was called; tools can act on outside services with the publisher's or a user's account.not run · our policy
  • 8Model requests
    sampling
    Checks whether the server asks the client's model to act for it.This check needs at least one successful tool call to have something to check, and no tool was called.not run · nothing to check it against
  • 9Sensitive questions
    elicitation-sensitive-data
    Checks whether the server asks users for sensitive data.This check needs at least one successful tool call to have something to check, and no tool was called.not run · nothing to check it against
  • 10Folder boundary
    root-boundary
    Checks whether the server reaches outside the folders it was given.This check calls the package's tools. This test round was read-only, so no tool was called; tools can act on outside services with the publisher's or a user's account.not run · our policy
  • 11Log leaks
    logging-side-channel
    Checks whether log messages carry data they should not.This check needs at least one successful tool call to have something to check, and no tool was called.not run · nothing to check it against
Does not apply to this server · 6
  • 13Fake assistant turns
    fake-assistant-turn
    Checks prompts that pose as the assistant's own words.The server exposes no prompts.not applicable
  • 14Token passthrough
    token-passthrough
    Checks whether the server forwards a user's token to other services.The server runs locally over standard input/output, so there is no sign-in flow to check.not applicable
  • 15Token audience
    token-audience-validation
    Checks whether tokens meant for another service are accepted.The server runs locally over standard input/output, so there is no sign-in flow to check.not applicable
  • 16Sign-in redirect
    open-redirect
    Checks the sign-in redirect for abuse.The server runs locally over standard input/output, so there is no sign-in flow to check.not applicable
  • 17Consent handling
    confused-deputy
    Checks consent handling when one service acts for another.The server runs locally over standard input/output, so there is no sign-in flow to check.not applicable
  • 18Sign-in metadata
    oauth-url-scheme
    Checks the published sign-in metadata for unsafe URLs.The server runs locally over standard input/output, so there is no sign-in flow to check.not applicable

Source: our own test in an isolated sandbox, 2026-10-23, mcp-runtime-engine@0.1.0. Which checks count and why follows our published scoring model.

What happened during the test?

Feature #8

The steps in order, as the test record holds them.

  1. 0 msStarted the published package in an isolated sandbox (read-only mode)
  2. 1,571 msConnected after 0 redirects.
  3. Read the inventory: 68 tools, 1 resource, 0 prompts.
  4. 2,517 msFinished: 3 checks exercised.

Reference

How is it classified?

18 fields

One value per field, each with its source. Fields written by AI models are marked. A field with no value says why.

TopicAI-classified
AI-classified · 2026-10-23
Pricing modelAI-classified
not checked
no website in the registry entry
Programming language
api.github.com · 2026-10-23
Hosting type
registry · 2026-10-23
MCP capability
resources, tools, extensions
our test · 2026-10-23
Transport
standard input/output
registry · 2026-10-23
Required credentials
none declared
registry · no declaration is not a guarantee
Package registry
registry · 2026-10-23
Freshness
0–30 days
registry updatedAt · 2026-10-23
Lifecycle status
registry · 2026-10-23
License class
package registry · 2026-10-23
Integrity hash
declared (sha256)
package registry · 2026-10-23
Signature / provenance
does not apply
PyPI publishes no registry signature or attestation equivalent to npm dist.signatures
Dependency advisories
none known
OSV.dev · 2026-10-23
Popularity
0 downloads a month
package registry · 2026-10-23
Publisher signals
owner: a personal account · repository age: 0–30 days · stars: 0–9
api.github.com · 2026-10-23
Maintenance
api.github.com · 2026-10-23
Environment
your machine
where it runs, from the hosting type

“Not stated” means the source did not state it; “does not apply” means it does not apply to this kind of server; “our limit” means our own lookup failed. A linked value opens the directory filtered to the same value.

Cite or correct this page

Sources and corrections

Suggested citation

ProtocolProbe. “io.github.nuncaeslupus/doc-control: MCP server record.” Data checked 2026-10-23. https://protocolprobe.com/mcp/servers/io.github.nuncaeslupus/doc-control

Figures are valid for the date shown. Our facts on this page are CC BY 4.0: reuse them with a link and the check date. Quoted text (the publisher’s descriptions, website quotes, tool names) is not ours to license.

As JSON: this record in the API · API documentation.

Badge for your README

ProtocolProbe: 7 of 8 record checks met

[![ProtocolProbe](https://protocolprobe.com/api/v1/badge/io.github.nuncaeslupus/doc-control)](https://protocolprobe.com/mcp/servers/io.github.nuncaeslupus/doc-control)

It shows this server's record-check count: facts from public records, no tool called. It is not a security rating or a pass. It links here and updates after each data reload.

Something wrong, or is this yours?

If a fact here is wrong, tell us and we will re-check it. If you operate this server, you can run our checks on it yourself with the free self-test command; we call no server’s tools ourselves for anything shown here.

Write to hello@protocolprobe.com · corrections log · methodology