← MCP servers · dealfluence

Adeu

CAUTIONgrade C · trust 79/100

docx ↔ LLM translator. Projects .docx office files to Markdown for editing. Projects edits back to OOXML as tracked changes (redlines). Python and Node.js implementations.

ai agentsdocument automationdocx convertergemini cli extensionlegaltechllm toolsmcp serverpython library

Overview

From the repository's own README, as read at the audited commit.

# Adeu: Track Changes for the LLM era[![GitHub Repo stars](https://img.shields.io/github/stars/dealfluence/adeu?style=social)](https://github.com/dealfluence/adeu)[![PyPI version](https://img.shields.io/pypi/v/adeu.svg)](https://pypi.org/project/adeu/)[![npm version](https://img.shields.io/npm/v/@adeu/core.svg)](https://www.npmjs.com/package/@adeu/core)[![Downloads](https://img.shields.io/pepy/dt/adeu)](https://pepy.tech/project/adeu)[![MCP Compatible](https://img.shields.io/badge/MCP-Compatible-green.svg)](https://modelcontextprotocol.io/)[![Smithery](https://img.shields.io/badge/Smithery-Available-blue.svg)](https://smithery.ai/servers/adeu/adeu)[![CI](https://github.com/dealfluence/adeu/actions/workflows/ci.yml/badge.svg)](https://github.com/dealfluence/adeu/actions/workflows/ci.yml)[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)**LLMs speak Markdown; reviewers speak "Track Changes."**Adeu is a **docx ↔ LLM translator**: a Model Context Protocol (MCP) server (Python and Node.js implementations) and accompanying SDKs that act as a **Virtual DOM for Microsoft Word**. It provides a two-way abstraction layer that lets AI agents freely edit document text without destroying the underlying formatting or complex DOCX XML.While standard libraries like `python-docx` excel at generating documents from scratch, they fail at non-destructive redlining. Adeu solves this by translating `.docx` files into a token-efficient Markdown representation. This frees AI agents to focus entirely on document semantics instead of wasting tokens wrestling with OpenXML.Adeu acts as an **intelligent proxy**, processing AI edits as safe, atomic transactions:1. **Read:** Translates the document (from disk or live Word) into LLM-friendly **[CriticMarkup](https://fletcher.github.io/MultiMarkdown-6/syntax/critic.html)** with a **Semantic Appendix** of defined terms, cross-references, and likely typos. The agent starts with semantic structure,

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code (npm)
claude mcp add mcp-server -- npx -y @adeu/[email protected]

Exposed tools (5) 4 read · 1 write · 0 destructive

ToolRiskDescription
accept_all_changesread
apply_text_revisionwrite
diff_docx_filesread
finalize_documentread
process_document_batchread

Details

Source
dealfluence/adeu
npm
n8n-nodes-adeu@3.0.6
PyPI
adeu
Transports
stdio
Credentials it reads
ADEU_API_KEYADEU_AUTHOR
License
MIT
Stars
161 · pushed 0d ago

Trust audit

Install with care. The audit found things worth knowing before you trust its output.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeWARN
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (1 observation(s))
Network
declared (5 observation(s))
Shell
none-observed
Dependencies
not all pinned
Secrets in source
found

Findings (25)

MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
node/packages/core/src/repro_qa_report_v9.test.ts:39
const SECRET = "SECRET-MATTER-4711-CONFIDENTIAL";
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
python/tests/test_repro_qa_report_v9.py:55
SECRET = "SECRET-MATTER-4711-CONFIDENTIAL"
LOWInventory / provenance · inv.binary · CWE-1104
node/packages/mcp-server/tests/fixtures/gap1_deleted_row_repro.docx
gap1_deleted_row_repro.docx
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
LOWInventory / provenance · inv.binary · CWE-1104
node/packages/mcp-server/tests/fixtures/gap1_minimal_repro.docx
gap1_minimal_repro.docx
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
LOWInventory / provenance · inv.binary · CWE-1104
node/packages/mcp-server/tests/fixtures/gap2_minimal_repro.docx
gap2_minimal_repro.docx
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
LOWInventory / provenance · inv.binary · CWE-1104
shared/conformance/fixtures/comments_threads.docx
comments_threads.docx
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
LOWInventory / provenance · inv.binary · CWE-1104
shared/conformance/fixtures/dense_175.docx
dense_175.docx
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
LOWInventory / provenance · inv.suspicious_name · CWE-1104
node/packages/core/src/diff-payload.test.ts
diff-payload.test.ts
Why it matters. member named after an attack tool
Fix. remove or justify
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
node/packages/core/src/consistency.test.ts:28
"../../../../shared/cross_platform_tests",
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
node/packages/core/src/consistency.test.ts:32
"../../../../python/scripts/abstract_xml.py",
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
node/packages/core/src/consistency.test.ts:34
const PYTHON_DIR = resolve(__dirname, "../../../../python");
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
node/packages/core/src/ingest.test.ts:13
const fixturePath = resolve(__dirname, '../../../../shared/fixtures/golden.docx');
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
node/packages/core/src/ingest.test.ts:32
const fixturePath = resolve(__dirname, '../../../../shared/fixtures/golden.docx');
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
python/src/adeu/mcp_components/tools/live_word.py:99
parts_data[zip_name] = base64.b64decode(b64_data)
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
python/tests/test_repro_qa_report_v7.py:116
MINIMAL_PNG_RED = bytes.fromhex(
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
python/tests/test_repro_qa_report_v7.py:121
MINIMAL_PNG_BLUE = bytes.fromhex(
LOWObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
python/tests/test_cli_encoding.py:159
assert "" not in text
LOWObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
python/tests/test_repro_qa_report_v5.py:993
unicode_doc.add_paragraph("Zero-width and NBSP  characters survive.")
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
node/package.json
@types/node, tsup, typescript, vitest
Why it matters. 4 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
node/packages/core/package.json
diff-match-patch, fflate, @types/diff-match-patch, @xmldom/xmldom, typescript
Why it matters. 5 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
node/packages/mcp-server/package.json
@adeu/core, @modelcontextprotocol/sdk, @modelcontextprotocol/ext-apps, typescript
Why it matters. 4 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
node/packages/n8n-nodes-adeu/package.json
@adeu/core, @n8n/eslint-plugin-community-nodes, @types/node, @typescript-eslint/parser, copyfiles, eslint, n8n-workflow, tsup
Why it matters. 10 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWPrompt injection · prompt.credential_read · CWE-94, CWE-1427
docs/spec-finalization.md:55
**Mode: `read_only`** (Anyone can open it, but cannot edit it without a password)
Why it matters. asks the agent to read credentials
LOWPrompt injection · prompt.credential_read · CWE-94, CWE-1427
docs/spec-finalization.md:109
--read-only "MySecretPassword" \
Why it matters. asks the agent to read credentials
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
docs/FREE_AGENT_PROBLEM.md:10
This configuration establishes a rigid architectural gate. The agent executes within a self-contained, reproducible, and verifiable Docker runtime. This runtime provides immutable isolation, ensuring 
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine

Gates applied: no_behavioural_pass.

Audited 2026-09-18 · audit v0.4.0 · source sha 41e3aeab2c7c · full audit: observations/trust-audit/mcp-server/dealfluence__adeu.json · Report an issue or request a re-scan

Audit history

DateSourceVerdictGradeScoreChange
2026-09-1841e3aeab2c7cCAUTIONC79source changed, verdict held
2026-09-12cc19a08bf8f5CAUTIONC79first audit

Alternatives

Other servers in the same categories, safer ones first.

Questions

What is the Adeu MCP server?

docx ↔ LLM translator. Projects .docx office files to Markdown for editing. Projects edits back to OOXML as tracked changes (redlines). Python and Node.js implementations.

What tools does Adeu expose?

5 in total: 4 read-only, 1 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is Adeu safe to connect to an agent?

With care. The audit graded it C (79/100) and found 25 things worth knowing before you trust this server, listed below with the exact line each was found on.

What credentials does Adeu need?

It reads ADEU_API_KEY and ADEU_AUTHOR from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does Adeu run?

It speaks stdio, so it runs as a local process your client starts. It is published on npm as n8n-nodes-adeu at 3.0.6.

How current is this page?

The grade is for one exact copy of the source (41e3aeab2c7c), read on 2026-09-18. The repository is watched and re-audited when it changes.

Provenance: OBSERVED · read 2026-09-18 · job trust-audit-2026-09-18