A side-by-side look at the KitchenSink4Word and Google Workspace MCP 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 Google Workspace MCP 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.start_google_auth, search_gmail_messages, get_gmail_message_content.Rows where the two servers differ are marked.
| Spec | ||
|---|---|---|
| Category | Workplace & Productivity | Workplace & Productivity |
| Quality signal | 60/100 · Good | 67/100 · Great |
| Install command | Confirmed | Confirmed |
| Transport | Local subprocess (stdio) | Local subprocess (stdio) |
| Auth | Not declared | OAuth 2.0 |
| Pricing | Not declared | Free |
| Required env vars | None listed | None listed |
| Verified owner | Community listing | Community listing |
| GitHub stars | 9 | 3,376 |
| Directory activity | 2 views 0 installs 0 upvotes | 2 views 0 installs 0 upvotes |
| Tools | 29 | 123 |
| Full listing | View KitchenSink4Word | View Google Workspace MCP |
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.start_google_authManually initiate Google OAuth authentication flow.
NOTE: This is a legacy OAuth 2.0 tool and is disabled when OAuth 2.1 is enabled.
The authentication system automatically handles credential checks and prompts for
authentication when needed. Only use this tool if:
1. You need to re-authenticate with different credentials
2. You want to proactively authenticate before using other tools
3. The automatic authentication flow failed and you need to retry
In most cases, simply try calling the Google Workspace tool you need - it will
automatically handle authentication if required.search_gmail_messagesSearches messages in a user's Gmail account based on a query.
Returns both Message IDs and Thread IDs for each found message, along with Gmail web interface links for manual verification.
Supports pagination via page_token parameter.get_gmail_message_contentRetrieves the full content (subject, sender, recipients, body) of a specific Gmail message.
Bodies are returned inline and truncated at 20,000 characters. Set full=True to
get the complete, untruncated message instead: it is exported to disk and the
response carries a short-lived download URL (HTTP transport) or file path (stdio
transport) rather than the body, so large messages never stream through the model
context. Stateless deployments have no file storage, so there full=True returns the
untruncated body inline.get_gmail_messages_content_batchRetrieves the content of multiple Gmail messages in a single batch request.
Supports up to 25 messages per batch to prevent SSL connection exhaustion.get_gmail_attachment_contentDownloads an email attachment and saves it to local disk.
In stdio mode, returns the local file path for direct access.
In HTTP mode, returns a temporary download URL (valid for 1 hour).
May re-fetch message metadata to resolve filename and MIME type.send_gmail_messageSends an email using the user's Gmail account. Supports new emails, replies, and
forwards, with optional attachments. Supports Gmail's "Send As" feature to send
from configured alias addresses.
To forward an existing message, pass forward_message_id. The original subject,
body (quoted with a "Forwarded message" header), and attachments are carried over.
In forward mode, body (if any) is prepended as a note and subject is optional.
Threading, reply, and signature options do not apply when forwarding.
THIS TOOL SENDS IMMEDIATELY AND CANNOT SCHEDULE. Gmail's REST API exposes no
send-time parameter; Schedule send is a web-UI feature with no API equivalent,
so no argument to this tool can defer delivery. Never tell a user a message
was scheduled. For "prepare now, deliver later", create a draft with
draft_gmail_message. An external scheduler must retain the message data to
create and send a new message via send_gmail_message at the chosen time, or
call users.drafts.send with the draft ID returned by draft_gmail_message.
Alternatively, let the user schedule that draft in the Gmail UI.draft_gmail_messageCreates a draft email in the user's Gmail account. Supports both new drafts and reply drafts with optional attachments.
Supports Gmail's "Send As" feature to draft from configured alias addresses.
SCHEDULED SEND IS NOT AVAILABLE. Gmail's REST API exposes no send-time
parameter; the Schedule send feature is web-UI only, and a message cannot be
placed in the Scheduled folder through the API. Do not claim a message was
scheduled. To deliver at a chosen time, create a draft with
draft_gmail_message. An external scheduler must retain the message data to
create and send a new message via send_gmail_message then, or call
users.drafts.send with the draft ID returned by draft_gmail_message.
Alternatively, let the user schedule the draft in the Gmail UI.get_gmail_thread_contentRetrieves the complete content of a Gmail conversation thread, including all messages.
Optionally also returns structured ownership analysis so a caller can
determine who sent the last message and who owes whom a response without
re-parsing the formatted string or making a second tool call.get_gmail_threads_content_batchRetrieves the content of multiple Gmail threads in a single batch request.
Supports up to 25 threads per batch to prevent SSL connection exhaustion.list_gmail_labelsLists labels in the user's Gmail account.manage_gmail_labelManages Gmail labels: create, update, or delete labels.list_gmail_filtersLists all Gmail filters configured in the user's mailbox.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": {
"taylorwilsdon-google-workspace-mcp": {
"command": "uvx",
"args": [
"workspace-mcp"
]
}
}
}