DeepL MCP server via DADL
DeepL REST API — text translation (with style profiles, translation memory, glossaries and improved tag handling), document translation, multilingual glossary management, style rules CRUD, text improvement (Write), language metadata and usage tracking. Mixes /v2 and /v3 endpoints.
Use the DeepL API as an MCP server with Claude, GPT, or any MCP-compatible AI agent — defined declaratively in a single DADL file, served by ToolMesh. No custom MCP server code, no boilerplate.
Source: DeepL REST API (v2 + v3)
Coverage
71% (27 of ~38 endpoints)
Focus: text translation (with style_id / translation_memory_id / custom_instructions / tag_handling v2), document translation, multilingual v3 glossaries, style rules (CRUD + custom instructions + configured rules), translation memory listing, text improvement (Write/rephrase), v3 languages and usage
Missing: admin API (org analytics, developer key management), voice translation (WebSocket, not REST), language detection beta endpoint, translation memory mutation (TM create/edit are web-UI only as of 2026-05)
Setup
- Sign up for a DeepL API plan at https://www.deepl.com/pro-api
- Choose API Free (500k chars/month) or API Pro (pay-per-use, unlocks style rules + TM + multilingual glossaries)
- Open Account → API Keys
- Create a new Authentication Key and copy it
- Free keys end with ':fx' and require api-free.deepl.com — Pro keys use api.deepl.com
- Store the key in your credential store under the name 'deepl_auth_key'
Environment variable: CREDENTIAL_DEEPL_AUTH_KEY
The legacy auth_key query parameter was deprecated in Nov 2025 — all auth must use the Authorization header with "DeepL-Auth-Key" scheme. Style rules, translation memory and multilingual glossaries are Pro-only. Rate limits are not publicly documented; 429 and 529 include Retry-After. Free plan returns 456 (not 429) when the monthly character quota is exhausted.
Install
Add to your backends.yaml:
- name: deepl
transport: rest
dadl: deepl.dadl
url: "https://api.deepl.com" # Free plan: https://api-free.deepl.com
Set the credential:
CREDENTIAL_DEEPL_AUTH_KEY=your-token-here Tools (27)
POST translate Translate text into a target language. Up to 50 texts per request, max 128 KiB body. Auto-detects source language when source_lang is omitted. Setting style_id, custom_instructions or translation_memory_id implicitly switches model_type to quality_optimized.
POST upload_document Upload a document for translation. Returns {document_id, document_key} for status polling and download. Supports docx, doc, pptx, xlsx, pdf, htm, html, txt, xlf, xliff, srt, jpeg, jpg, png.
POST check_document_status Check translation status of an uploaded document. status is one of queued, translating, done, error. Poll with exponential backoff — seconds_remaining can be wildly off (sometimes 2^27).
POST download_document Download the translated document. Only valid when status is 'done'. The document is auto-deleted on first successful download — store it before retrying.
GET list_glossaries List all multilingual glossaries on the account. Returns array under 'glossaries'. POST create_glossary Create a multilingual glossary. The dictionaries array carries one entry per source→target language pair. Use lowercase 2-letter codes (en, de, fr). entries_format must be 'tsv' or 'csv'; entries is a single string with one pair per line (source TAB target for TSV, source COMMA target for CSV).
GET get_glossary Retrieve metadata of a single glossary (name, dictionary inventory, creation time) PATCH update_glossary Update the glossary name and/or merge new dictionary entries. Existing entries for the same source→target pair are merged (new pairs added, conflicting pairs overwritten).
DELETE delete_glossary Permanently delete a glossary and all its dictionaries. Cannot be undone. GET get_glossary_entries Retrieve all term pairs of a single dictionary inside the glossary, identified by the (source_lang, target_lang) query pair. Returns TSV.
PUT replace_glossary_dictionary Replace (or create) the dictionary for a single source→target language pair in an existing glossary. Existing entries for that pair are overwritten.
DELETE delete_glossary_dictionary Delete a single dictionary (one language pair) from a multilingual glossary GET list_style_rules List style rule lists on the account. Set detailed=true to include the full configured_rules and custom_instructions per list. Paginated.
POST create_style_rule Create a style rule list for a single language. configured_rules covers 7 categories (dates_and_times, formatting, numbers, punctuation, spelling_and_grammar, style_and_tone, vocabulary) — each with predefined enum options. custom_instructions adds free-form prompts (max 200, 300 chars each).
GET get_style_rule Retrieve a single style rule list with its configured_rules and custom_instructions PATCH update_style_rule Rename a style rule list (other fields are immutable — use the dedicated sub-endpoints to mutate rules/instructions) DELETE delete_style_rule Permanently delete a style rule list and all its custom instructions. Cannot be undone. PUT replace_configured_rules Replace the entire configured_rules object on a style rule list. Send the full object — fields omitted are reset to default.
POST add_custom_instruction Add a custom instruction to an existing style rule list. Up to 200 per style rule. GET get_custom_instruction Retrieve a single custom instruction PUT update_custom_instruction Replace a custom instruction (label/prompt/source_language). All fields are sent — omitted fields reset. DELETE delete_custom_instruction Permanently remove a custom instruction from a style rule list GET list_translation_memories List translation memories on the account. Each entry carries {translation_memory_id, name, source_language, target_languages, segment_count}. Paginated, max page_size 25.
POST rephrase_text Improve and rephrase text without changing the language (max 10 KiB body). Supports writing styles and tones. Does NOT translate — target_lang must match the source language (one of: de, en-GB, en-US, es, fr, it, ja, ko, pt-BR, pt-PT, zh). writing_style and tone are mutually exclusive in a single call.
GET list_languages List languages supported for a given resource. Returns formality, glossary and other feature flags relevant to that resource. Resource is required.
GET list_language_resources List the supported 'resource' values usable with list_languages (translate_text, glossary, ...) GET get_usage Retrieve character usage and quota for the current billing period. Returns character_count (consumed) and character_limit (cap). Pro plans return very large limits; Free is exactly 500000.