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
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
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.(versions still listed in the registry only)
Most recent 12 versions
0.10.1· 2026-10-200.10.0· 2026-10-200.9.0· 2026-10-190.8.4· 2026-10-180.8.3· 2026-10-160.8.2· 2026-10-160.8.1· 2026-10-150.8.0· 2026-10-150.7.2· 2026-10-150.7.1· 2026-10-150.7.0· 2026-10-150.6.4· 2026-10-15
- 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 inventoryWhat 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.”
“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.”
“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.”
“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.”
“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.”
“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.”
“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.”
“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.”
“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.”
“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.”
“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.”
“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.”
“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.”
“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…”
“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.”
“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
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 #6The 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 says | We found | Result | Source · date |
|---|---|---|---|
| Published package can be started | Started and answered | matches | our test · 2026-10-23 |
| Version 0.10.1 on PyPI | Exists and can be installed | matches | PyPI · 2026-10-23 |
| Repository github.com/nuncaeslupus/doc-control | Opens publicly | matches | api.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 rating7 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 aboveIs 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-inA 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
- io.github.JonathanRReed/apple-tools-mcpApple Tools (Unified)also has tools that calculates or converts, controls a browser or desktop, creates or changes data, deletes, runs code or commands, reads or searchescompare with this one
- com.mcparmory/boxalso has tools that calculates or converts, creates or changes data, deletes, runs code or commands, reads or searchescompare with this one
- io.github.Apomera/alloflow-remediationAlloFlow Document Remediationalso has tools that calculates or converts, creates or changes data, deletes, runs code or commands, reads or searchescompare with this one
- io.github.snowbikemike/tascan-mcpTaScanalso has tools that calculates or converts, creates or changes data, deletes, runs code or commands, reads or searchescompare with this one
- com.granoflow/mcp-serverGranoflowalso has tools that calculates or converts, controls a browser or desktop, creates or changes data, deletes, reads or searchescompare with this one
- io.github.moooonad/mcp-google-sheets-fullalso has tools that calculates or converts, creates or changes data, deletes, runs code or commands, reads or searchescompare with this one
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.
- Inventory: exercised
- Hidden instructions: exercised
- Real execution: not run · our policy
- Secret leak: not run · nothing to check it against
- Internal addresses: not run · our policy
- Unconfirmed changes: not run · our policy
- Bad input: not run · our policy
- Model requests: not run · nothing to check it against
- Sensitive questions: not run · nothing to check it against
- Folder boundary: not run · our policy
- Log leaks: not run · nothing to check it against
- Hidden content: exercised
- Fake assistant turns: not applicable
- Token passthrough: not applicable
- Token audience: not applicable
- Sign-in redirect: not applicable
- Consent handling: not applicable
- 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.
- 1Inventory
tool-listReads the declared tools, resources and prompts.exercised - 2Hidden instructions
description-poisoningLooks for hidden instructions in tool descriptions.exercised - 12Hidden content
audience-hidingChecks resources that hide content from the user.exercised
- 3Real execution
real-executionCalls 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-leakPlants 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
ssrfChecks 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-confirmationChecks 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-handlingSends 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
samplingChecks 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-dataChecks 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-boundaryChecks 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-channelChecks 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
- 13Fake assistant turns
fake-assistant-turnChecks prompts that pose as the assistant's own words.The server exposes no prompts.not applicable - 14Token passthrough
token-passthroughChecks 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-validationChecks 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-redirectChecks 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-deputyChecks 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-schemeChecks 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.
- 0 msStarted the published package in an isolated sandbox (read-only mode)
- 1,571 msConnected after 0 redirects.
- Read the inventory: 68 tools, 1 resource, 0 prompts.
- 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.
“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
[](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