Word
NUGET · WORDMCP.MCPSERVER · SCANNED SEP 20
Microsoft Word automation for AI assistants. Requires Word for Windows.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security88
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- Install-script risk not yet assessed.Unverified
- No production dependencies, so there is no dependency health to assess. View diagnostics → Pass
Provenance & Transparency35
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- License check failed: no license is declared. See how to fix → Fail
- Actively maintained (last published 26 days ago).Pass
- Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability64
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 3855 tokens (~257/item across 15 items; 15 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management90
- Stability observed for 27 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage67
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 0% of tool parameters carry a description.Fail
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 15 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 16 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
How do I install the Word MCP server?
Word runs locally as a NuGet package, launched with dnx WordMcp.McpServer@0.1.0 --yes. Ready-made configuration for Claude, Cursor, VS Code, Codex and 3 more is on this page, copied from each client's own documentation.
nuget · WordMcp.McpServer
claude mcp add trsdn-mcp-server-word -- dnx WordMcp.McpServer@0.1.0 --yes
{
"mcpServers": {
"trsdn-mcp-server-word": {
"command": "dnx",
"args": [
"WordMcp.McpServer@0.1.0",
"--yes"
]
}
}
} {
"servers": {
"trsdn-mcp-server-word": {
"command": "dnx",
"args": [
"WordMcp.McpServer@0.1.0",
"--yes"
]
}
}
} codex mcp add trsdn-mcp-server-word -- dnx WordMcp.McpServer@0.1.0 --yes
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"trsdn-mcp-server-word": {
"type": "local",
"command": [
"dnx",
"WordMcp.McpServer@0.1.0",
"--yes"
],
"enabled": true
}
}
} mcp_servers:
trsdn-mcp-server-word:
command: "dnx"
args: ["WordMcp.McpServer@0.1.0", "--yes"] {
"McpServers": {
"trsdn-mcp-server-word": {
"Transport": "stdio",
"Command": "dnx",
"Arguments": [
"WordMcp.McpServer@0.1.0",
"--yes"
]
}
}
} {
"mcpServers": {
"trsdn-mcp-server-word": {
"command": "dnx",
"args": [
"WordMcp.McpServer@0.1.0",
"--yes"
]
}
}
} Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 20 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 87 to 90. That category is still filling its 30-day observation window: 26 days of observed history at the previous scan, 27 at this one. The score rises as the window fills, whether or not the server changes.
- 18 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 80 to 83. That category is still filling its 30-day observation window: 24 days of observed history at the previous scan, 25 at this one. The score rises as the window fills, whether or not the server changes.
- 15 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 70 to 73. That category is still filling its 30-day observation window: 21 days of observed history at the previous scan, 22 at this one. The score rises as the window fills, whether or not the server changes.
- 13 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 63 to 67. That category is still filling its 30-day observation window: 19 days of observed history at the previous scan, 20 at this one. The score rises as the window fills, whether or not the server changes.
- 11 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 57 to 60. That category is still filling its 30-day observation window: 17 days of observed history at the previous scan, 18 at this one. The score rises as the window fills, whether or not the server changes.
- 9 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 50 to 53. That category is still filling its 30-day observation window: 15 days of observed history at the previous scan, 16 at this one. The score rises as the window fills, whether or not the server changes.
- 7 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 43 to 47. That category is still filling its 30-day observation window: 13 days of observed history at the previous scan, 14 at this one. The score rises as the window fills, whether or not the server changes.
- 5 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 37 to 40. That category is still filling its 30-day observation window: 11 days of observed history at the previous scan, 12 at this one. The score rises as the window fills, whether or not the server changes.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 20 Sept 2026 · Analysed nuget/WordMcp.McpServer@0.1.0
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | nuget |
| Reason | Package not fetched |
Background: How many MCP packages publish verified provenance →
Dependencies 0 packages
| Packages resolved | 0 |
|---|---|
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
bookmark Bookmark Operations ~254
Bookmark operations on an open document. bookmark(list, session_id) returns every bookmark with its name, paragraph index and a preview of the bookmarked text. bookmark(add, session_id, name="Intro", paragraph_index=2) bookmarks a paragraph; pass end_paragraph_index to span several paragraphs, or anchor_text to bookmark just a phrase inside the paragraph. bookmark(get-text, session_id, name="Intro") returns the full bookmarked text, which is the reliable way to re-read a passage after edits have shifted every index. bookmark(delete, session_id, name="Intro") removes the bookmark; the text stays. Bookmark names must start with a letter and may only contain letters, digits and underscores - Word rejects spaces and punctuation with an unhelpful error, so they are checked before the call reaches Word. Bookmarks survive edits elsewhere in the document, which makes them the stable way to refer to a passage across several calls.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | – |
| anchor_text | string|null | – | – |
| end_paragraph_index | integer|null | – | – |
| max_text_length | integer | – | – |
| name | string|null | – | – |
| paragraph_index | integer|null | – | – |
| session_id | string | yes | – |
No output schema declared.
No examples provided.
comment Comment Operations ~216
Comment operations on an open document, the basis for review workflows. comment(list, session_id) returns every comment with its author, date, text and the document text it refers to. comment(add, session_id, paragraph_index=3, text='Please shorten this') attaches a comment to a whole paragraph; pass anchor_text to attach it to a phrase inside that paragraph instead. comment(resolve, session_id, index=1) marks a comment as done; pass resolved=false to reopen it. comment(delete, session_id, index=1) removes a comment. Comment indexes are 1-based and shift after every delete, so when removing several comments work from the highest index downwards. Paragraph indexes come from paragraph(list).
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | – |
| anchor_text | string|null | – | – |
| index | integer|null | – | – |
| paragraph_index | integer|null | – | – |
| resolved | boolean | – | – |
| session_id | string | yes | – |
| text | string|null | – | – |
| unresolved_only | boolean | – | – |
No output schema declared.
No examples provided.
document Document Operations ~208
Document-level operations. document(get-info, session_id) returns word/page/paragraph/table counts. document(get-properties|set-properties, session_id, title=..., author=...) reads or writes metadata. document(export-pdf, session_id, output_path='C:\\...\\report.pdf') writes a PDF without changing the document. document(save-as, session_id, output_path='C:\\...\\copy.rtf') saves a copy; the format follows the extension (.docx, .docm, .doc, .pdf, .rtf, .txt, .html) and the open document is saved as part of the operation.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | – |
| author | string|null | – | – |
| comments | string|null | – | – |
| company | string|null | – | – |
| keywords | string|null | – | – |
| output_path | string|null | – | – |
| session_id | string | yes | – |
| subject | string|null | – | – |
| title | string|null | – | – |
No output schema declared.
No examples provided.
field Field Operations ~241
Field operations on an open document. field(insert-toc, session_id, lower_heading_level=3) inserts a table of contents at the top and fills it immediately. It stays EMPTY unless paragraphs use heading styles, so apply 'Heading 1'/'Heading 2' via paragraph(add, style=...) first; the result reports entry_count. field(insert-page-number, session_id, position='footer', alignment='center', include_total_pages=true) adds page numbers to every section. field(update-toc, session_id) refreshes the table of contents after content changed. field(update-all, session_id) refreshes every field including headers and footers. field(list, session_id) returns type, code and current result of each field.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | – |
| alignment | string | – | – |
| include_page_numbers | boolean | – | – |
| include_total_pages | boolean | – | – |
| lower_heading_level | integer | – | – |
| paragraph_index | integer|null | – | – |
| position | string | – | – |
| session_id | string | yes | – |
| upper_heading_level | integer | – | – |
| use_hyperlinks | boolean | – | – |
No output schema declared.
No examples provided.
file File Operations ~179
File and session management — the FIRST tool of every workflow. WORKFLOW: file(open, path='C:\\...\\report.docx') -> use session_id with document/text/paragraph/table tools -> file(close, save=true). NEW FILES: file(create, path='C:\\...\\new.docx') creates the file AND starts a session. REUSE: call file(list) first — if the document is already open, reuse its session_id. The file must be CLOSED in the Word desktop app; COM requires exclusive access. show=true makes Word visible. timeout_seconds: max time per operation (default 300).
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | – |
| path | string|null | – | – |
| save | boolean | – | – |
| session_id | string|null | – | – |
| show | boolean | – | – |
| timeout_seconds | integer | – | – |
No output schema declared.
No examples provided.
header-footer Header and Footer Operations ~204
Header and footer operations on an open document. Headers belong to a SECTION, not to the document, so use section(list) first when a document has more than one. header-footer(set, session_id, kind='footer', text='Confidential') writes the same text to every section; pass section_index to target one. type='first-page' or 'even-pages' switches the matching section option on automatically, because Word otherwise stores the text without ever showing it. Writing to a section whose header is inherited from the previous one breaks that link. header-footer(get, session_id, kind='header') reads the text back. For page numbers use field(insert-page-number) instead, which inserts live fields.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | – |
| alignment | string|null | – | – |
| kind | string | – | – |
| section_index | integer|null | – | – |
| session_id | string | yes | – |
| text | string|null | – | – |
| type | string | – | – |
No output schema declared.
No examples provided.
image Image Operations ~281
Inline image operations on an open document. image(list, session_id) returns index, size and alt text of every image. image(insert, session_id, image_path='C:/pics/chart.png', width=300, caption='Figure 1') appends an image; pass paragraph_index to place it before a specific paragraph. image(resize, session_id, index=1, scale_percent=50) or (index=1, width=200) resizes. image(replace, session_id, index=1, image_path=...) swaps the picture but keeps position and size. image(delete|set-alt-text, session_id, index=1, ...) edits an existing image. Sizes are in points (1 point = 1/72 inch), not pixels. All indexes are 1-based. Only inline images are covered, not floating shapes.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | – |
| alt_text | string|null | – | – |
| caption | string|null | – | – |
| height | number|null | – | – |
| image_path | string|null | – | – |
| index | integer|null | – | – |
| keep_size | boolean | – | – |
| lock_aspect_ratio | boolean | – | – |
| paragraph_index | integer|null | – | – |
| scale_percent | number|null | – | – |
| session_id | string | yes | – |
| width | number|null | – | – |
No output schema declared.
No examples provided.
list List Operations ~289
Bullet and numbered list operations on an open document. list(apply, session_id, start_index=2, end_index=5, list_type='number') turns a range of paragraphs into a numbered list; list_type can be bullet, number or outline-number. list(set-level, session_id, start_index=3, end_index=4, level=2) indents paragraphs to a sub-level; levels run from 1 to 9 and only outline-number lists render a distinct format per level. list(restart, session_id, start_index=6) starts the numbering over at that paragraph, which is how two separate numbered lists are kept apart. list(remove, session_id, start_index=2, end_index=5) strips the list formatting again. list(get, session_id) reports the list formatting of every paragraph, including the bullet or number Word renders. Paragraph indexes are 1-based and shift whenever paragraphs are added or removed, so read them with paragraph(list) right before using them. Omitting end_index applies the action to start_index alone.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | – |
| continue_previous_list | boolean | – | – |
| end_index | integer|null | – | – |
| level | integer|null | – | – |
| list_type | string | – | – |
| listed_only | boolean | – | – |
| session_id | string | yes | – |
| start_index | integer|null | – | – |
No output schema declared.
No examples provided.
paragraph Paragraph Operations ~194
Paragraph operations on an open document. paragraph(list, session_id, skip=0, take=200) returns index, text, style, alignment and outline level. paragraph(add, session_id, text='...', style='Heading 1') appends a paragraph. paragraph(insert, session_id, index=3, text='...') inserts before paragraph 3. paragraph(delete|set-style|set-alignment, session_id, index=3, ...) edits an existing paragraph. Indexes are 1-based and shift after add, insert or delete — re-run list before further edits.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | – |
| alignment | string|null | – | – |
| include_empty | boolean | – | – |
| index | integer|null | – | – |
| session_id | string | yes | – |
| skip | integer | – | – |
| style | string|null | – | – |
| take | integer | – | – |
| text | string|null | – | – |
No output schema declared.
No examples provided.
revision Revision Operations ~217
Tracked change operations on an open document. revision(list, session_id) returns every tracked change with its type, author, date and affected text, plus whether tracking is currently on. revision(accept, session_id) accepts every change; pass index=1 to accept a single one. revision(reject, session_id, index=2) discards a change the same way. revision(set-tracking, session_id, enabled=true) turns change tracking on or off, which is what makes later edits show up as revisions in the first place. Revision indexes are 1-based and shift after every accept or reject, so when handling several changes individually work from the highest index downwards, or just accept or reject them all at once. Accepting or rejecting everything also covers headers and footers, which Word's own AcceptAllRevisions does not.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | – |
| author | string|null | – | – |
| enabled | boolean|null | – | – |
| index | integer|null | – | – |
| session_id | string | yes | – |
No output schema declared.
No examples provided.
screenshot Screenshot Operations ~213
Renders a page of an open document as a PNG image. screenshot(page, session_id) renders page 1; pass page=3 for another page. Use this to check the layout visually - page breaks, table widths, image placement and header positions are far easier to judge from the rendered page than from measurements. The image is written to a file and the path is returned. Pass include_image=true to also get the PNG inline as base64, which is only worth it when the image is actually going to be looked at, since it is large. dpi defaults to 150, which is readable without being wasteful; 96 is enough for a rough layout check and 300 approaches print quality. Rendering goes through a PDF export of the single page, so unsaved changes are included.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | – |
| dpi | integer | – | – |
| include_image | boolean | – | – |
| output_path | string|null | – | – |
| page | integer | – | – |
| session_id | string | yes | – |
No output schema declared.
No examples provided.
section Section Operations ~246
Section operations on an open document. A section owns the page setup and the headers and footers, so changing margins or orientation for part of a document means adding a section first. section(list, session_id) returns index, start type, margins, page size and orientation. section(add, session_id, start_type='next-page', paragraph_index=...) inserts a section break after that paragraph, or at the end when omitted. section(page-setup, session_id, section_index=2, orientation='landscape', top_margin=72) changes one section; without section_index it changes the whole document. ALL MEASUREMENTS ARE IN POINTS: 72 pt = 1 inch = 2.54 cm.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | – |
| bottom_margin | number|null | – | – |
| left_margin | number|null | – | – |
| orientation | string|null | – | – |
| paper_size | string|null | – | – |
| paragraph_index | integer|null | – | – |
| right_margin | number|null | – | – |
| section_index | integer|null | – | – |
| session_id | string | yes | – |
| start_type | string | – | – |
| top_margin | number|null | – | – |
No output schema declared.
No examples provided.
style Style Operations ~364
Style operations on an open document. Styles keep formatting consistent without touching every piece of text. style(list, session_id) returns only the styles the document actually uses; pass in_use_only=false for the complete list, which is over 370 entries on a localized Word. style(create, session_id, name='Callout', style_type='paragraph', base_style='Normal') adds a custom style. style(modify, session_id, name='Callout', font_name='Calibri', font_size=11, bold=true, color='#C00000', alignment='center', space_after=12) changes formatting; omitted properties stay as they are. style(delete, session_id, name='Callout') removes a custom style; built-in styles cannot be deleted. LOCALIZED NAMES: Word reports styles under localized names, so a German Word calls 'Heading 1' 'Ueberschrift 1'. Built-in styles are addressable by their English name; list returns both, and english_name is the one to send back. Sizes and spacing are in points (72 pt = 1 inch).
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | – |
| alignment | string|null | – | – |
| base_style | string|null | – | – |
| bold | boolean|null | – | – |
| color | string|null | – | – |
| font_name | string|null | – | – |
| font_size | number|null | – | – |
| in_use_only | boolean | – | – |
| italic | boolean|null | – | – |
| line_spacing | number|null | – | – |
| name | string|null | – | – |
| session_id | string | yes | – |
| space_after | number|null | – | – |
| space_before | number|null | – | – |
| style_type | string|null | – | – |
| underline | boolean|null | – | – |
No output schema declared.
No examples provided.
table Table Operations ~226
Table operations on an open document. table(list, session_id) returns index, size and style of every table. table(create, session_id, rows=3, columns=4, style='Table Grid') appends a table. table(read, session_id, index=1) returns all cell values as rows. table(set-cell, session_id, index=1, row=1, column=2, text='Total') writes one cell. table(add-row, session_id, index=1, values=['a','b']) appends a filled row. table(delete-row|set-style, session_id, index=1, ...) edits an existing table. All indexes are 1-based.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | – |
| column | integer|null | – | – |
| columns | integer|null | – | – |
| index | integer|null | – | – |
| row | integer|null | – | – |
| rows | integer|null | – | – |
| session_id | string | yes | – |
| style | string|null | – | – |
| text | string | – | – |
| values | array|null | – | – |
No output schema declared.
No examples provided.
text Text Operations ~287
Text operations on an open document. text(get, session_id) returns the full text; add start/end to read a character range. text(append, session_id, text='...') appends a paragraph at the end. text(find, session_id, text='term') returns match positions and context. text(replace, session_id, text='old', replace_text='new') replaces occurrences. text(format, session_id, start=0, end=20, bold=true, color='#0078D4') formats a character range. Positions are Word character offsets as reported by get and find.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | – |
| bold | boolean|null | – | – |
| color | string|null | – | – |
| end | integer|null | – | – |
| font_name | string|null | – | – |
| font_size | number|null | – | – |
| italic | boolean|null | – | – |
| match_case | boolean | – | – |
| match_whole_word | boolean | – | – |
| max_length | integer | – | – |
| max_results | integer | – | – |
| new_paragraph | boolean | – | – |
| replace_all | boolean | – | – |
| replace_text | string|null | – | – |
| search_text | string|null | – | – |
| session_id | string | yes | – |
| start | integer|null | – | – |
| text | string|null | – | – |
| underline | boolean|null | – | – |
No output schema declared.
No examples provided.
What is the Word MCP server?
Word is an MCP server listed in the public MCP registry as io.github.trsdn/mcp-server-word. Microsoft Word automation for AI assistants. Requires Word for Windows. This page covers its NuGet package (WordMcp.McpServer).
Is the Word MCP server safe to use?
Word scores 73 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 20 September 2026. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the Word MCP server expose?
Word exposes 15 tools: paragraph, document, bookmark, style, table, and 10 more. Their descriptions and schemas cost roughly 3,619 tokens of context every time the server is loaded.
Is the Word MCP server still maintained?
Word is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.