A side-by-side look at the KitchenSink4Word and KitchenSink4XL MCP servers: transport, auth, tools, quality signals, and the config to install either one in Claude, Cursor, Windsurf or VS Code.
Verdict: choose KitchenSink4Word for workplace & productivity work as a local process; choose KitchenSink4XL for workplace & productivity as a local process. You can also run both side by side in one mcpServers block.
create_document, copy_document, manage_backups.get_server_info, create_workbook, copy_workbook.Rows where the two servers differ are marked.
| Spec | ||
|---|---|---|
| Category | Workplace & Productivity | Workplace & Productivity |
| Quality signal | 60/100 · Good | 57/100 · Good |
| Install command | Confirmed | Confirmed |
| Transport | Local subprocess (stdio) | Local subprocess (stdio) |
| Auth | Not declared | Not declared |
| Pricing | Not declared | Not declared |
| Required env vars | None listed | None listed |
| Verified owner | Community listing | Community listing |
| GitHub stars | 9 | 1 |
| Directory activity | 2 views 0 installs 0 upvotes | 2 views 0 installs 0 upvotes |
| Tools | 29 | 40 |
| Full listing | View KitchenSink4Word | View KitchenSink4XL |
create_documentCreate a new blank .docx file, optionally setting the title core
property. Refuses to overwrite an existing file (use copy_document with
overwrite=True for that). Parent directories are created automatically.
Populate the document afterward with insert_paragraphs, create_table,
define_style (academic pack), and other tools.
Template-driven builds live in the assembly pack.copy_documentCopy a document byte-for-byte, e.g. to a new DTG-stamped filename
before editing (manage_backups action='snapshot' names such a copy for
you; this tool takes an explicit dest_path). Refuses an existing
dest_path unless overwrite=True; an overwritten destination's previous
content rotates into its .ks4w-backups prev slot first, so the
overwrite is undoable via manage_backups restore.
Split/merge and multi-document work live in the assembly pack.manage_backupsManage the automatic backups under the hidden .ks4w-backups/ folder next
to each mutated document: two stable slots per document, prev (state
before the most recent mutation) and anchor (session start).
action='list': slot files with sizes and mtimes, legacy *.bak-* files,
and orphaned slot folders whose source document is gone; give file_path
for one document or directory for a folder. action='restore': overwrite
file_path with a backup; source is 'prev', 'anchor', or a legacy *.bak-*
path. The current content rotates into prev FIRST, so a restore is
itself undoable; the payload is validated before the atomic replace, and
documents open in Word are refused. action='purge': delete backups;
scope: 'legacy', 'orphans', or 'slots'. dry_run defaults to TRUE (report
only); dry_run=False deletes. Exact paths and sizes are reported either
way. action='snapshot': save a DTG-stamped permanent copy of file_path,
YYYYMMDD_HHMM_<name>.docx (an existing leading DTG is replaced, not
stacked), optional short label suffix, optional dest_dir. Snapshots are
permanent keepers: the slots rotate on every mutation, snapshots are
never auto-pruned and no purge scope touches them. Never overwrites
(collisions get a numeric suffix); the source document is not modified.get_document_infoRead a one-call document overview: paragraph/table/footnote/comment/
revision counts, sections, and package parts. Documents open in Word are
read live (same key names; live adds 'words' from Word's own
ComputeStatistics counter plus track_revisions, and omits the part
list). Read-only.diagnose_documentProduce a one-call structural health report, read-only: content-type
coverage, dangling relationships and orphan parts, field balance per
story part, footnote/endnote integrity, references to undefined styles
and numbering, content-control and bookmark sanity, duplicate revision
ids, missing image targets, broken cross-references, and a per-part size
profile. Never fails on a weird-but-openable document; every check
degrades to a reported problem, and healthy=false only for problems
that render broken or lose content in Word. The deep companion to
validate(checks=['core']). No live mode BY DESIGN: this reads the saved
package's XML, stale while Word holds unsaved changes. Close the
document first, or use com_validate_opens_clean (com-live pack) /
live get_document_info.
The full validate check battery lives in the academic pack.get_textRead body paragraphs as [{index, text, style, ...}] with effective
styles. start/end slice by paragraph index (0-based, end EXCLUSIVE);
contains filters. include_textboxes=True appends text-box content as
labeled extras, body indices untouched; textbox=true (or {"index": n})
returns ONLY text-box content, with the box_index set_textbox_text
(media-forms pack) takes; file-mode only. Open documents read live,
same shape.
Equations read via list_elements type='equations'. Read-only.
Orientation: get_document_view.find_textFind text in paragraphs and table cells; returns locations plus
context. include_textboxes=True also searches text-box content as
labeled matches; file-mode only. Pass formatting={...} (bold, font,
size_pt, color, ...) to search by EFFECTIVE formatting: resolved
through run, style chain, and defaults; query=None returns every
formatted stretch; scope 'body' or 'all'; file-mode, no regex. Plain
queries search open documents live (same shape, 500-match cap).
Read-only. To read a known range, use get_text.get_outlineList every heading with its paragraph index and level. Detects
Heading styles AND w:outlineLvl overrides (direct or style-inherited);
detected_via names which. detect_formatted=True adds a heuristic scan
for direct-formatted headings (short bold, italic or centered;
numbered captions excluded): CANDIDATES with an INFERRED level and a
confidence. Detecting nothing returns a note plus flat structure
counts. The indices feed the location object's paragraph and outline
selectors. Read-only. TOC building: academic pack.list_elementsEnumerate any collection in one call. type: tables |
images | charts | equations | bookmarks | sources | sections |
section_blocks | footnotes | endnotes | fields | reference_fields |
form_fields | content_controls | template_placeholders | index_entries |
lists | toc. Returns {type, count, items}; the ids or indices
returned are the handles the matching set_/delete_/manage_ tools
take (list then act). Highlights per type: tables reports
dimensions and the table_index other table tools take; images reports
display size and the media target; charts reports series; equations
reads math content; bookmarks excludes internal TOC bookmarks; fields
covers complex and simple fields with cached results;
reference_fields inventories Zotero, EndNote, and Mendeley fields and
flags broken pairs; form_fields and content_controls cover legacy fields
and SDTs; template_placeholders lists {{name}} and MERGEFIELD keys for
fill_template and mail_merge (assembly pack); lists groups list
paragraphs by numbering instance; toc returns TOC-family fields with
cached entries (refresh via com_refresh_fields, com-live pack, then
re-read). filter={"range": {start, end},
"name": "substring"} applies where meaningful; inapplicable filters
refuse loudly. Read-only, file mode; close documents open in Word
first.
Tools for these elements live in packs; enable_tools lists
them. To locate a string, find_text.get_workflowsRecommended tool sequences for common multi-step tasks, with a one-line
why per step. Call with no task to list the available tasks
('process-feedback', 'prepare-submission', 'format-citations',
'build-from-template', 'heavy-editing', 'live-editing', 'comment-partner',
'migrate-from-v1', 'bulk-edit');
call with task='<name>' for that task's step-by-step sequence and notes.
Pure guidance: reads nothing, changes nothing.get_server_infoReport this server's build and environment: version, the active tool
surface (tool count, approximate token bill, per-pack state), the packs
enable_tools can load, what decided the startup surface and whether it
is locked, whether the Word application tier can run here, whether path
sandboxing is on, the host OS and Python, and the update-check state.
Needs no document, opens no file, starts no Word. Paste-safe: no path,
document name, or user name, so a bug report can carry it as it stands.insert_paragraphsInsert paragraphs (items {text, style?, formatting?, heading_level?,
paragraph_format?}) at a location object (omitted = document end).
heading_level 1-9 makes it a heading (1 = outline 0).
paragraph_format takes set_paragraph_format keys; it and
inherit_format/copy_format_from (clone neighbor formatting minus
outline level) are file mode only. track records insertions by author.
Auto-backup; atomic save. Open documents edit live; a stale
text-selector target refuses: save in Word, retry. Batches:
apply_edits.get_server_infoReport the KitchenSink4XL server build: version, the active tool
surface (enabled tool count and approximate token bill), the optional
packs, the host platform and Python, and config, which carries the
install settings a user otherwise cannot confirm arrived: whether path
sandboxing is on with how many roots (a count, never the paths), and
whether saves deep-verify through Excel. A read-only orient call that
needs no workbook and touches no file; use it to confirm the server is
up and see which packs are loaded.create_workbookCreate a new .xlsx workbook at path with the given sheet names (default a
single 'Sheet1'). Sheet names must be unique, at most 31 characters, and
may not start or end with an apostrophe (Excel refuses to open such a
file); the parent directory must already exist. An existing file at path
is left untouched unless overwrite is true, in which case it is FIRST
rotated into its .ks4xl-backups prev slot and then replaced (restore
source='prev' brings it back). Returns the file path and the sheets
created.copy_workbookCopy a workbook file byte-for-byte from src to dst, so nothing in the
original is re-serialized or degraded (charts, shapes, macros, and queries
all carry over intact). An existing dst is left untouched unless overwrite
is true, in which case dst is FIRST rotated into its .ks4xl-backups prev
slot and then replaced (restore source='prev' brings it back). Returns
the destination path. Use this to branch a working copy before a risky
batch of edits.get_workbook_metadataRead a workbook's structure without opening it for edit: every sheet with
its visibility state, TRUE used range (value-bearing bounds, not the often
wrong stored dimension), dimensions, and merged-cell count, plus defined
names, tables, the active sheet, and a round-trip hazard summary (whether
an openpyxl edit would drop fragile parts). The orient-before-editing
call. Read-only; works while the file is open in Excel.diagnose_workbookThe round-trip hazard scan surfaced as a health readout: which fragile
parts the workbook holds (slicers, shapes, embedded objects, Power Query,
VBA, and the rest), whether a file-based openpyxl edit would drop any of
them, the routing recommendation for a surgical versus a structural edit,
and a light integrity summary (sheet counts, formula-cell count, keep_vba).
This is how you check a workbook is safe to edit before mutating it.
What to do with the verdict: hazards never block reads; a would-lose
verdict means every mutating tool will refuse unless you route through
Excel (com pack) or pass allow_loss:true (an explicit, backed-up
acceptance of the loss). A clean verdict means file-based edits are
round-trip safe. Content with no part of its own is covered too: the scan
reads each worksheet's extLst, so x14 conditional formats (data bars, icon
sets), sparkline groups and slicer lists come back as a would-lose verdict
like any other drop-risk hazard. Limit: the extLst walk looks at the
worksheet's top level, and an extension openpyxl drops from anywhere else
is caught at save time by openpyxl's own load warning rather than
here. Read-only.manage_worksheetManage the worksheet lifecycle. action is one of: add (new_name, optional
index), delete (sheet), rename (sheet, new_name), copy (sheet, optional
new_name), reorder (sheet, index as 0-based target), hide (sheet, state
'hidden' or 'very_hidden'), unhide (sheet). The workbook always keeps at
least one VISIBLE sheet, so deleting or hiding the last visible one
refuses.
Consequence worth knowing: delete does NOT rewrite references, so formulas
and defined names that pointed at the deleted sheet break to #REF! when
Excel opens the file (Excel's own behavior); rename likewise does not
rewrite cross-sheet formula text. Audit references first when in doubt. A
hazardous workbook refuses unless allow_loss is true. Auto-backup:
prev/anchor slots in .ks4xl-backups (backup=false skips rotation); atomic
verified save, restored on failed verify. Refuses while open in Excel.read_rangeRead a cell or range addressed by a location object (cell, range, r1c1,
name, table, used_range, region, search, or a grid-view anchor; sheet
picks the sheet when the location does not, default active). values controls the honest calc story:
'cached' returns the last calculated values, 'formula' the formula
strings, 'both' pairs each value with a label (cached, absent, formula,
value). A formula cell with no cached value is labelled 'absent', never
passed off as blank. Read-only; page large ranges with query_range.set_cellWrite a single cell addressed by a location object. A string beginning
with '=' is ALWAYS stored as a formula (there is no literal escape),
normalized so modern functions do not land as #NAME? and flagged to
recalculate on open; anything else is a literal. A hazardous workbook
refuses unless allow_loss is true. Auto-backup: prev/anchor slots in
.ks4xl-backups (backup=false skips rotation); atomic verified save,
restored on failed verify. Refuses while open in Excel.write_rangeWrite a 2D block of values and formulas anchored at the location's
top-left cell. data is a list of row lists and must be RECTANGULAR:
ragged rows refuse (pad short rows with null, which clears those
cells); content outside the block is never touched. Formula strings
('=...') are normalized and flag recalculation. Grid limits and the
200,000-cell write ceiling apply. A hazardous workbook refuses unless
allow_loss is true. Auto-backup to .ks4xl-backups; atomic verified
save. Refuses while open in Excel.clear_rangeClear a cell or range: what='contents' removes values and formulas,
'formats' resets styles to default, 'all' does both. Neither removes
merges, conditional formats, validations, comments, or hyperlinks; those
have their own manage tools. Addressed by a location object. A hazardous
workbook refuses unless allow_loss is true. Auto-backup: prev/anchor slots
in .ks4xl-backups (backup=false skips rotation); atomic verified save,
restored on failed verify. Refuses while open in Excel.copy_rangeCopy a source rectangle to a destination anchor (location objects, may
name different sheets). what is 'all', 'values', 'formulas', or 'formats'.
The destination is overwritten; the source is buffered first, so an
overlapping paste is safe. Relative refs in copied formulas shift by the
paste offset like an Excel copy unless adjust_formulas is false; absolute
($) anchors stay put. A hazardous workbook refuses unless allow_loss is
true. Auto-backup to .ks4xl-backups; atomic verified save. Refuses while
open in Excel.move_rangeMove a rectangle to a new anchor on the same sheet, rewriting every
formula, name, conditional format, validation, table ref, and merge that
pointed into the source so references follow the cells (Excel move
semantics). A cross-sheet destination refuses (copy_range then clear_range
instead); cells at the destination are overwritten. A hazardous workbook
refuses unless allow_loss is true. Auto-backup to .ks4xl-backups; atomic
verified save. Refuses while open in Excel.Paste either block (or both) into your client config, e.g. claude_desktop_config.json or ~/.cursor/mcp.json. We only show a config when the install command is confirmed.
{
"mcpServers": {
"kitchensink4word-2": {
"command": "uvx",
"args": [
"kitchensink4word"
]
}
}
}
{
"mcpServers": {
"kitchensink4xl": {
"command": "uvx",
"args": [
"kitchensink4xl"
]
}
}
}