Mcp Server Sdlxliff — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Mcp Server Sdlxliff (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Chat with your SDL Trados translation files using Claude.
Review translations, find errors, and make corrections through simple natural conversation - no manual XML editing required.
| Option | Best For | Claude Access |
|---|---|---|
| [XLIFF Chat Desktop App](#xliff-chat-desktop-app) | Professional users who want a dedicated app | API key (pay per use) |
| [Claude Desktop Extension](#claude-desktop-extension) | Claude Pro/Team subscribers | Claude subscription |
Both options use the same MCP server under the hood - choose based on how you prefer to access Claude.
Just ask Claude in plain language:
Claude reads your SDLXLIFF files, understands the translation context, and can make corrections while preserving all formatting tags automatically.
A standalone macOS app with a native file picker - no command line required.
pip3 install mcp-server-sdlxliffNote: The desktop app looks for Python at/opt/homebrew/bin/python3(Apple Silicon) or/usr/local/bin/python3(Intel Mac). Make sure to install with the samepip3that corresponds to your Homebrew Python.
XLIFF Chat_1.1.0_aarch64.dmg from Releases.dmg and drag XLIFF Chat to your Applications foldermcp-server-sdlxliff installed globallyUse with your Claude Pro or Team subscription through Claude Cowork.
Option A: Desktop Extension (Recommended)
mcp-server-sdlxliff-1.1.0.mcpb from Releases.mcpb fileOption B: Manual Installation
pip install mcp-server-sdlxliffThen add to your claude_desktop_config.json:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"sdlxliff": {
"command": "mcp-server-sdlxliff"
}
}
}| Product | Works? | Notes |
|---|---|---|
| Claude Cowork | Yes | Add a folder with SDLXLIFF files and start chatting |
| Claude Desktop (chat) | No | Sandbox limitation prevents file access |
| Claude.ai (web) | No | No local filesystem access |
RejectedTranslation for easy review in TradosClaude's corrections are suggestions, not final changes. The workflow keeps you in control:
RejectedTranslationRejectedTranslation to see only Claude's changesTranslated or ApprovedTranslationThis ensures human oversight - you always have the final say on what goes into the translation.
read_sdlxliffExtract translation segments from an SDLXLIFF file.
Parameters:
file_path (string, required): Path to the SDLXLIFF fileoffset (integer, optional): Starting segment index for pagination (default: 0)limit (integer, optional): Maximum segments to return (default: all). Use 50 for large files.include_tags (boolean, optional): Include tagged text fields for segments with formatting tags (default: false)Returns: JSON object with pagination metadata and segments:
{
"total_segments": 184,
"offset": 0,
"count": 50,
"has_more": true,
"segments": [...]
}Each segment contains:
segment_id: Unique segment identifier (mrk mid)trans_unit_id: Parent trans-unit IDsource: Source text (clean, without tags)target: Target text (clean, without tags)has_tags: Whether segment contains inline formatting tagssource_tagged: Source with tag placeholders (only if has_tags=true and include_tags=true)target_tagged: Target with tag placeholders (only if has_tags=true and include_tags=true)status: SDL confirmation level (e.g., Translated, RejectedTranslation)locked: Whether segment is lockedpercent: TM match percentage, e.g., 100 for exact match (only present when available)origin: Match origin, e.g., tm, document-match, auto-propagated (only present when available)text_match: Context Match indicator - value SourceAndTarget means this is a CM (only present for context matches)repetitions: Number of times this source text appears in the file (only present when > 1)get_sdlxliff_segmentGet a specific segment by its ID.
Parameters:
file_path (string, required): Path to the SDLXLIFF filesegment_id (string, required): The segment ID (mrk mid) to retrieveupdate_sdlxliff_segmentUpdate a segment's target text. Automatically sets status to RejectedTranslation.
Parameters:
file_path (string, required): Path to the SDLXLIFF filesegment_id (string, required): The segment ID (mrk mid) to updatetarget_text (string, required): New target text. For segments with tags, include placeholders.preserve_tags (boolean, optional): Validate and restore tags from placeholders (default: true)Note: Changes are kept in memory until save_sdlxliff is called. For segments with formatting tags (has_tags=true), you must include tag placeholders in the target text. See Tag Handling below.
validate_sdlxliff_segmentPre-validate proposed changes to a segment before updating.
Parameters:
file_path (string, required): Path to the SDLXLIFF filesegment_id (string, required): The segment ID to validate againsttarget_text (string, required): Proposed target text with tag placeholdersReturns: Validation result with errors, warnings, and missing/extra tag information.
save_sdlxliffSave changes to the SDLXLIFF file.
Parameters:
file_path (string, required): Path to the SDLXLIFF fileoutput_path (string, optional): Alternative output path (default: overwrites original)get_sdlxliff_statisticsGet statistics about the translation file.
Parameters:
file_path (string, required): Path to the SDLXLIFF fileReturns: JSON object with:
total_segments: Total number of segmentsstatus_counts: Count of segments by SDL confirmation levellocked_count: Number of locked segmentsqa_check_sdlxliffRun quality assurance checks on the translation file.
Parameters:
file_path (string, required): Path to the SDLXLIFF filesegment_ids (array of strings, optional): Specific segment IDs to check. If omitted, checks all segments.checks (array of strings, optional): Specific checks to run. If omitted, runs default checks (all except spelling).glossary_path (string, optional): Path to glossary file for terminology check. If omitted, auto-discovers glossary.tsv, glossary.txt, terminology.tsv, or terminology.txt in the same directory as the SDLXLIFF file.dictionary_path (string, optional): Path to custom dictionary for spelling check. If omitted, auto-discovers dictionary.txt, custom_words.txt, or spelling.txt in the same directory as the SDLXLIFF file.Available checks:
| Check | Description | Default |
|---|---|---|
trailing_punctuation | Source ends with .!?:; but target doesn't (or vice versa) | Yes |
numbers | Numbers in source don't match numbers in target | Yes |
double_spaces | Target contains consecutive spaces | Yes |
whitespace | Leading/trailing whitespace mismatch between source and target | Yes |
brackets | Different count of ()[]{} between source and target | Yes |
inconsistent_repetitions | Segments with same source text have different translations | Yes |
terminology | Glossary terms from source must appear in target (requires glossary file) | Yes |
spelling | Spellcheck target text using target language from file metadata | No (opt-in) |
Spelling check:
checks: ["spelling"] or checks: ["spelling", "numbers", ...]de-DE, ru-RU)Glossary file format:
# Comment lines start with #
# Format: source_term<TAB>target_term
Galaxy Galaxy
Settings Настройки
Smart Switch Smart SwitchSingle terms (without tab) mean the term must appear unchanged in the target.
Custom dictionary file format (for spelling):
# Comment lines start with #
# One word per line (case-insensitive)
SDLXLIFF
Trados
MCP
ProductNameReturns: JSON object with:
{
"total_segments": 184,
"segments_checked": 184,
"segments_with_issues": 12,
"glossary_used": "/path/to/glossary.tsv",
"glossary_terms_count": 5,
"target_language": "de-DE",
"dictionary_used": "/path/to/dictionary.txt",
"custom_words_count": 10,
"issues": [
{
"segment_id": "42",
"check": "spelling",
"severity": "warning",
"message": "Possible misspelling: 'korrektr' (suggestions: korrektor, korrekter, korrekt)",
"source_excerpt": "",
"target_excerpt": "Das ist ein korrektr Satz..."
}
],
"summary": {
"trailing_punctuation": 5,
"numbers": 3,
"spelling": 2
}
}If spelling is requested but the language is unsupported:
{
"spelling_skipped": "Language 'ja-JP' not supported for spelling check"
}SDLXLIFF is SDL's extension of the XLIFF 1.2 standard, used by SDL Trados Studio. Key characteristics:
<mrk mtype="seg"> element is a separate translatable segmentmid attribute values (globally unique numbers)<sdl:seg conf="..."> (not the XLIFF state attribute)Draft, Translated, RejectedTranslation, ApprovedTranslation, RejectedSignOff, ApprovedSignOffSDLXLIFF files often contain inline formatting tags (<g>, <x>, <bpt>, <ept>, etc.) that control bold, italic, colors, line breaks, and other formatting in the final document. These tags must be preserved during translation updates or the formatting will be lost.
The MCP server converts XML tags to readable placeholders:
| XML Tag | Placeholder | Description |
|---|---|---|
<g id="5">text</g> | {5}text{/5} | Paired formatting tag |
<x id="5"/> | {x:5} | Self-closing tag (e.g., line break) |
<bpt id="5"> | {5} | Begin paired tag |
<ept id="5"> | {/5} | End paired tag |
Original XML:
<mrk mid="3"><g id="5">Acme</g><g id="6">&</g><g id="7"> Events</g></mrk>Extracted as:
{
"source": "Acme& Events",
"source_tagged": "{5}Acme{/5}{6}&{/6}{7} Events{/7}",
"has_tags": true
}To update this segment, you must include all tags:
{5}Acme{/5}{6}&{/6}{7} Мероприятия{/7}When updating segments with tags:
{5} must have matching {/5}read_sdlxliff - check has_tags fieldhas_tags=true, use get_sdlxliff_segment to get the source_tagged/target_tagged fieldsupdate_sdlxliff_segmentClaude Desktop Chat runs Claude in a gVisor sandboxed container for security. When you attach files via "+ Add files", they are uploaded to /mnt/user-data/uploads/ inside this container.
The problem: MCP servers run on your host machine, not inside the container. They cannot access the sandboxed filesystem where attached files are stored.
┌─────────────────────────────────────────┐
│ gVisor Container │
│ ┌─────────────────────────────────┐ │
│ │ /mnt/user-data/uploads/ │ │
│ │ └── your_file.sdlxliff │ ←── File uploaded here
│ └─────────────────────────────────┘ │
│ Claude │
└─────────────────────────────────────────┘
╳ No access ╳
┌─────────────────────────────────────────┐
│ Host Machine │
│ ┌─────────────────────────────────┐ │
│ │ MCP Server (sdlxliff) │ ←── Cannot read container filesystem
│ └─────────────────────────────────┘ │
└─────────────────────────────────────────┘Workaround: Use Claude Cowork or XLIFF Chat instead, which have direct access to your local files.
# Clone the repository
git clone https://github.com/EugeneAnt/mcp-server-sdlxliff.git
cd mcp-server-sdlxliff
# Install with dev dependencies
uv pip install -e ".[dev]"
# Run tests
pytestTo create a .mcpb bundle for distribution:
# Install the MCPB CLI
npm install -g @anthropic-ai/mcpb
# Validate the manifest
mcpb validate manifest.json
# Create the bundle
mcpb pack .This creates mcp-server-sdlxliff-X.X.X.mcpb ready for installation in Claude Desktop.
cd desktop
# Install dependencies
bun install
# Build for macOS
bun run tauri buildThis creates XLIFF Chat.dmg in desktop/src-tauri/target/release/bundle/dmg/.
MIT License - see LICENSE for details.
Contributions are welcome! Please feel free to submit a Pull Request.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.