
Research
/Security News
Malicious Chrome and Firefox Extensions Steal Crypto Traders’ Session and Wallet Data
Malicious Chrome and Firefox extensions target Axiom Trade and Padre users, stealing session tokens and wallet data.
@usejunior/docx-mcp
Advanced tools
MCP server for reading, editing, and comparing Word (.docx) and OpenDocument (.odt) files with tracked changes. For Claude, Gemini CLI, Cursor, and any MCP client. Apache-2.0 licensed.
Install via the canonical package: npx -y @usejunior/safe-docx — see setup guide
Local MCP server for surgical editing of existing Microsoft Word .docx files with coding agents. The same tool surface also services OpenDocument .odt files — including compare_documents redlines (two files, or a live session against its original) written as native ODF tracked changes with inline (run-level) granularity.
Safe Docx is built for brownfield paperwork workflows: apply accepted AI edits to real Word documents while preserving formatting and review semantics.
Mission: enable coding agents to do paperwork too. This package focuses on deterministic brownfield edits to existing Word documents rather than from-scratch generation.
For end-user installation, use the canonical wrapper package: npx -y @usejunior/safe-docx.
npx -y @usejunior/safe-docx
Add to your MCP client:
npx["-y", "@usejunior/safe-docx"]stdioreplace_text, insert_paragraph, format_layout)save)compare_documents)extract_revisions)read_file, grep, has_tracked_changes, get_session_statusreplace_text, insert_paragraph, format_layout, accept_changesbatch_editcompare_documents, extract_revisions, saveadd_comment, get_comments, delete_comment, get_footnotes, add_footnote, update_footnote, delete_footnoteclear_session, path-policy + archive guardrailsread_file(format="json")Each paragraph node in the JSON output may expose a top-level heading object:
heading?: {
text: string;
source: 'word_style' | 'run_in_header' | 'title_with_period' | 'title_with_colon' | 'title_caps_centered' | 'title_bare';
level: number | null;
}
Use node.heading != null as the canonical heading check.
source: 'word_style' wins whenever paragraph_style_id matches /^Heading([1-6])$/ exactly, and only then. Inherited styles like HeadingPara1 do not count.run_in_header, title_with_period, title_with_colon, title_caps_centered, title_bare) always emit level: null.heading key entirely.list_metadata.header_style remains the per-detector explanation layer, not the canonical "is heading" predicate. See skills/docx-editing/SKILL.md for the full precedence rule and the Google Docs asymmetry: the GDocs path only emits heading for built-in heading styles and does not run the Word heuristics.
.docx classesAdd to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\\Claude\\claude_desktop_config.json (Windows):
{
"mcpServers": {
"safe-docx": {
"command": "npx",
"args": ["-y", "@usejunior/safe-docx"]
}
}
}
claude mcp add safe-docx -- npx -y @usejunior/safe-docx
Install from the extension gallery, or add manually:
{
"mcpServers": {
"safe-docx": {
"command": "npx",
"args": ["-y", "@usejunior/safe-docx"]
}
}
}
Add to cline_mcp_settings.json:
{
"mcpServers": {
"safe-docx": {
"command": "npx",
"args": ["-y", "@usejunior/safe-docx"]
}
}
}
Safe Docx in this package is local runtime only:
More detail:
docs/safe-docx/trust-checklist.mddocs/safe-docx/mcp-docs-checklist.mdRuntime safety guardrails:
HOME and system temp roots.docx archive guardrails reject suspicious archives:
SAFE_DOCX_MAX_ARCHIVE_ENTRIES (default 2000)SAFE_DOCX_MAX_UNCOMPRESSED_BYTES (default 209715200)SAFE_DOCX_MAX_ENTRY_UNCOMPRESSED_BYTES (default 52428800)SAFE_DOCX_MAX_COMPRESSION_RATIO (default 200)Build-time tooling for advanced rendering is optional and not required by default npx runtime usage.
No native binaries and no .NET prerequisite for supported runtime usage. Safe Docx operates on Uint8Array / Buffer inputs via jszip + @xmldom/xmldom:
If you need direct library imports in app code, use @usejunior/docx-core.
read_file returns paragraphs with id fields like _bk_a3f29c10b8e4. These identifiers are deterministic and stable, not session-scoped.
| Field | Role | Editable anchor? | Stability |
|---|---|---|---|
id (_bk_<12hex>) | Canonical edit anchor — only thing edit tools accept | ✅ | Byte-identical across reopens, machines, and processes for identical stored DOCX/OOXML bytes. Intrinsic branch (Word 2010+ w14:paraId) is robust to text edits; fallback branch changes when paragraph or neighbor text changes. |
content_fingerprint (opt-in) | Portable normalized-text hash for citation/reconciliation systems | ❌ — read-only metadata | Same normalized text → same hash on any machine. Changes when normalized text changes. Not unique per paragraph — two paragraphs with identical normalized text fingerprint identically. |
Consumers MAY persist _bk_* identifiers in indexes, citation databases, and other external stores keyed off the same source document.
For citation systems that want a portable hash whose canonicalization is documented and recomputable independent of safe-docx internals, pass include_fingerprint: true to read_file with format: "json":
{
"id": "_bk_a3f29c10b8e4",
"content_fingerprint": "sha256:nfkc:5d2e8f1a4c5b7d2e8f1a4c5b7d2e8f1a",
"clean_text": "The Company shall indemnify the Customer."
}
The fingerprint is computed as "sha256:nfkc:" + sha256( stripCfInvisibles(NFKC(visibleText)).replace(/\s+/g, " ").trim() ), truncated to 32 hex chars. Case is preserved; curly quotes and dashes are NOT folded to ASCII. Cf-category invisibles (soft hyphen, ZWJ/ZWNJ, LRM/RLM, bidi controls, variation selectors, BOM) are stripped so byte-level round-trip noise does not change the hash. The flag has no effect on format: "toon" or format: "simple", and is silently ignored for Google Docs sessions.
content_fingerprint is a content hash, not a paragraph key. Paragraphs with identical normalized visible text produce identical fingerprints by design; use _bk_* IDs whenever you need per-paragraph identity. Edit tools (replace_text, insert_paragraph, batch_edit, etc.) accept ONLY _bk_* IDs as anchors — content_fingerprint is never an edit anchor. The sha256:nfkc: prefix is intentional version reservation; future algorithm bumps will emit a different prefix (e.g. sha256:nfkc-strip:), so consumers should store and compare the full prefixed string.
packages/docx-mcp/src/tool_catalog.tspackages/docx-mcp/docs/tool-reference.generated.mdpackages/docx-mcp/src/testing/SAFE_DOCX_OPENSPEC_TRACEABILITY.mdpackages/docx-mcp/assumptions.mdpackages/docx-mcp/conformance/README.mddocs/safe-docx/sprint-3-conformance.mdCommands:
npm run conformance:smoke -w @usejunior/docx-mcp
npm run conformance:run -w @usejunior/docx-mcp
Optional OpenAgreements fixture root:
SAFE_DOCX_CONFORMANCE_OPEN_AGREEMENTS_ROOT=/path/to/open-agreements npm run conformance:run -w @usejunior/docx-mcp
This package is for editing existing .docx files. For from-scratch generation, use packages such as docx.
That is a core objective. The edit tools are built for surgical mutation while preserving run/paragraph formatting semantics.
Yes. read_file supports toon output specifically for compact, agent-friendly reads of existing documents.
No for supported runtime paths. The default MCP runtime is TypeScript/Node-based.
Yes. Use add_comment, get_comments, and delete_comment.
Yes. Use get_footnotes, add_footnote, update_footnote, and delete_footnote.
Yes. Use save with tracked variants or compare_documents for standalone original/revised comparisons.
Yes for this package. It runs as a local process and does not require a hosted Safe Docx editor endpoint.
Mutual NDA variants, Letter of Intent, and ILPA redline fixtures.
No. It is useful anywhere teams edit DOCX paperwork with agents: legal, procurement, sales ops, finance, and HR.
Use these known-good prompt patterns:
packages/docx-mcp/docs/golden-prompts.mdnpm run build -w @usejunior/docx-mcp
npm run test:run -w @usejunior/docx-mcp
FAQs
MCP server for reading, editing, and comparing Word (.docx) and OpenDocument (.odt) files with tracked changes. For Claude, Gemini CLI, Cursor, and any MCP client. Apache-2.0 licensed.
We found that @usejunior/docx-mcp demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.

Research
/Security News
Malicious Chrome and Firefox extensions target Axiom Trade and Padre users, stealing session tokens and wallet data.

Security News
GPT-6 Astra hits 100% on ExploitBench and finds zero-days autonomously, while independent tests reveal scope violations and monitoring gaps.

Product
Socket can now send alerts and supply chain attack notifications to Microsoft Teams, with filters that route the right updates to each channel.