Announcing CIMD support for MCP Client registration
Learn more

DeepL MCP vs DeepL API for AI Agents

TL;DR

  • DeepL ships two official Model Context Protocol (MCP) servers: a hosted OAuth 2.1 server with up to 28 plan-gated tools, and a local stdio server that needs an API key.
  • The hosted MCP authenticates a DeepL user on a Free or seat-based plan; the API authenticates a subscription key billed per character.
  • Use the hosted MCP for user-facing assistants. Use the API when you need translation memories, Voice, usage controls, or files like IDML and JSON.
  • Multi-tenant agents hold N OAuth grants on MCP, or one shared key or N customer keys on the API. Neither path stores, rotates, or revokes them for you.
  • Scalekit's DeepL MCP connector vaults and refreshes each user's tokens, logs every tool call, and scopes tools per agent role through Virtual MCP servers.

Two MCP servers, one API, and a billing question

Your agent needs to translate a support reply, localize release notes, or clean up copy before it ships. DeepL now gives you three official ways to wire that up: a hosted DeepL MCP server, a local open-source MCP server, and the DeepL API. Tool count is the smaller difference. The hosted server signs in a DeepL user. The API bills a subscription key. That split decides who owns the credential, who pays, and what your agent can reach. Here's how to pick.

What DeepL MCP and DeepL API actually are

DeepL gives agents three official entry points. Two speak MCP; one is plain REST.

DeepL's hosted MCP server

DeepL hosts this server at a single Streamable HTTP endpoint and announced its availability in Claude, ChatGPT, and Microsoft Copilot on September 22, 2026. Auth is OAuth 2.1: the user signs in with a DeepL account, and clients register through Dynamic Client Registration (DCR) or Client ID Metadata Documents (CIMD), so there's no client ID or secret to provision. It serves DeepL Free and seat-based plans (Individual, Team, Business, and DeepL for Enterprise), and DeepL's docs carry no beta label.

The server exposes up to 28 tools and shows each user only what their plan and team permissions allow.

DeepL's local MCP server

The open-source server (MIT license, published to npm as deepl-mcp-server) runs over stdio and exits at startup if DEEPL_API_KEY isn't set. The current release, 1.3.10, registers 13 tools: text and document translation, rephrasing, language lists, writing styles and tones, and read-only lookups for glossaries, style rules, and custom instructions. Its translate-document tool reads and writes files on the machine running the server.

That design fits one developer with one key in an IDE. It doesn't fit a backend serving hundreds of users. DeepL positions it for API-key users; the hosted server is for DeepL account holders.

The DeepL API

The REST API is versioned by path (/v2 for most endpoints, /v3 for glossaries, style rules, languages, and translation memories) and published as an OpenAPI spec. Every request authenticates with an Authorization: DeepL-Auth-Key header. There's no OAuth option, and legacy query-parameter auth is deprecated. API Free keys end in :fx and call a separate host from paid plans.

API plans are a separate subscription from seat-based plans and bill per character. DeepL no longer sells API Free or API Pro; new subscriptions start on API Developer, API Growth, or Enterprise API.

Comparing them where it matters for agents

The comparison below pits the hosted server against the API, because that's the fork a production agent hits. The local server shares the API's key model, so treat it as a thin MCP wrapper over the API.

What your agent can actually do

The hosted server covers translation, writing, documents, and customization management. The API owns everything operational.

Capability
Hosted DeepL MCP
DeepL API
Translate text with formality and context
Yes; formality, context, and custom instructions need a seat-based plan
Yes (/v2/translate)
Several target languages in one call
Yes, up to 10
No, one target_lang per request
Rephrase and correct with DeepL Write
Yes, if the plan includes Write
Yes (/v2/write/rephrase, /v2/write/correct); not on API Free
Document and image translation
Yes, out-of-band upload, up to 10 targets per upload
Yes, async upload, status, and download; images in beta
IDML, XML, JSON, DITA, and MIF files
No
Yes
Apply glossaries
Yes, on seat-based plans
Yes, up to 5 per request (glossary_ids)
Create and edit glossaries and style rules
Yes, 20 tools on seat-based plans, gated by team permissions
Yes (/v3/glossaries, /v3/style_rules)
Translation memories
No
Yes, TMX import and export, translation_memory_id
HTML and XML tag handling, model selection
Not documented
Yes (tag_handling, model_type)
Usage, quota, and per-key limits
No
Yes (/v2/usage, key limits, reporting tags)
Real-time speech translation
No
Yes, Voice API over WebSocket
Key and usage administration
No
Yes, Admin API

Where the MCP surface stops

Two gaps show up first. Translation memories are API-only: an agent that must reuse approved segments from a translation management system (TMS) imports a TMX file once and passes translation_memory_id on each request. Voice is API-only too: live interpretation streams audio over a WebSocket that no MCP tool fronts.

File formats are the third gap. JSON string catalogs, InDesign's IDML, and DITA topics are API formats; the hosted server stops at Office files, PDF, HTML, text, XLIFF, SRT, and images. An agent that localizes a product's string catalog belongs on the API.

What the hosted MCP makes easier

The hosted server does work the API leaves to you. It fans one translation out to as many as 10 target languages in a single call. Its document flow moves file bytes out of band, so document content never enters the model's context window. It enforces customer governance server-side: when an admin assigns a style profile, DeepL applies that profile's glossaries and style rules over whatever the agent requested, and the response says so.

It also prunes itself. Tools the user's plan can't use never appear, so a DeepL Free user's agent never reaches for a glossary tool.

The auth path each one puts you on

The two paths don't just use different token formats. They authenticate different principals.

Hosted MCP: a DeepL user signs in

DeepL documents one way in: an OAuth 2.1 flow where a DeepL user signs in and approves consent. There's no API key option. Clients register through DCR or CIMD, and a client DeepL doesn't recognize gets an extra confirmation step on the consent screen. If the customer runs SSO for DeepL, the sign-in goes through their identity provider.

The resulting token carries that user's plan and team permissions, which is why two users can see different tool lists from the same server. Admins keep a kill switch: they can turn off AI connector access for the whole organization, and a revoked token stops working immediately.

DeepL API: a key scoped to endpoints, not people

The API authenticates a subscription. Since June 2026, a key can be scoped to specific operations (translate:text, write:improve, glossaries:read, translation_memories:write, and others), and calls outside its scopes return 403. A key can also carry its own monthly character limit and returns 456 once it's exhausted. Voice endpoints have no scope yet, so they need an unrestricted key.

What a key can't express is who's asking. DeepL sees the subscription, not which of your users or agent runs made the call. Deactivating a leaked key is immediate and permanent, so rotation means minting a new key and redeploying it everywhere.

What this means for a multi-tenant agent

Take a support platform with 200 customer organizations and 3,000 support reps using a DeepL-powered reply assistant. On the hosted MCP, that's 3,000 OAuth grants, each tied to one rep's own DeepL account and each refreshed and revoked on its own. On the API, you choose between one platform key that you pay for and attribute per tenant with the X-DeepL-Reporting-Tag header, or 200 customer-owned keys you store and route, including :fx keys that need the Free host. Minting a key per tenant on your own subscription hits DeepL's 25-active-key ceiling fast.

The structural point that holds on both paths

Both paths require per-user credential isolation in a multi-tenant B2B agent. MCP's OAuth flow gives you a token per user. The API gives you a key per tenant, or a shared key you have to partition yourself. In neither case does the path itself solve storage, rotation, or revocation. Those are infrastructure problems regardless of which path you choose.

Recommended reading: OAuth vs API keys for AI agents

What you own in production

DeepL runs the hosted server's infrastructure. Everything that touches credentials and tenants is still yours.

On the hosted MCP path

DeepL owns the server, the tool schemas, and the document relay. You own the token lifecycle per user: storage, refresh, and handling revocation when a user or admin cuts access. You also own plan variance. A DeepL Free session caps a translation at 5,000 characters and a rephrase or correct call at 2,000, while seat-based plans allow 128,000, so the agent must chunk by plan. Direct document uploads need network egress from your agent's sandbox to DeepL's MCP domain; without it, the user gets an upload link instead.

On the API path

You own everything above the HTTP call: request construction under the 128 KiB body limit, retries (back off on 429, 529, and 5xx; stop on 456 and 400), logging the X-Trace-ID header DeepL support asks for, async document polling, and host selection by plan. You also own the tool schemas. Every endpoint your agent calls needs an LLM-ready definition that you write, test, and maintain.

Writing the schema is the hard part. Not the API call.

Schema drift and versioning

The API is versioned by path and specified in OpenAPI, so a pinned client keeps working until you choose to migrate. MCP tools carry no version pin; they change when DeepL updates the server. The churn is visible in DeepL's own docs: the page for the local server still lists 8 tools, while its source ships 13.

Read tool schemas at runtime instead of hardcoding them. For deterministic pipelines, the versioned API is the more predictable dependency.

When to use MCP, when to use the API

Both lists assume a production agent, not a demo.

Use the hosted DeepL MCP when

  • Your agent is an assistant with a user present: a support rep's copilot translating replies, or a developer polishing UI strings in Claude Code or Cursor, where consent is one click.
  • Your customers already pay for DeepL seats and want DeepL's governance: the admin kill switch, SSO sign-in, and style profiles enforced server-side.
  • Translation spend should stay on each customer's DeepL contract instead of your API bill.
  • Documents must never enter the model's context; the out-of-band upload flow is built for exactly that.
  • You orchestrate DeepL next to other MCP tools and want DeepL to maintain the tool descriptions.

Use the DeepL API when

  • The agent works for your platform, not a person: nightly release-note localization or CMS sync, where no single user should own the credential.
  • You need translation memories, HTML or XML tag handling, IDML or JSON files, or real-time Voice.
  • You need hard cost controls: per-key character limits, 456 as a stop, reporting tags per tenant, and the Admin API for key lifecycle.
  • You're building a deterministic pipeline and need a versioned contract you can pin.
  • You batch at volume: many texts per request, up to 128 KiB per call.

Templates to start from

Three Scalekit agent templates take a DeepL step naturally. The release notes agent turns merged GitHub pull requests into release notes in Notion; a translate step localizes each release. The support triage agent classifies Zendesk tickets, and the ticket automation agent drafts Zendesk replies from Notion articles. A correct-and-translate step makes both multilingual.

The credential problem that exists on both paths

Whichever path you pick, credentials multiply with your customer count.

What DeepL gives you

DeepL's controls are real. The hosted server gives each user their own OAuth grant, honors token revocation immediately, and lets customer admins shut off AI connector access. The API gives you scoped keys, per-key character limits, reporting tags, and an Admin API that creates, limits, and deactivates keys programmatically.

None of it manages the credentials on your side of the boundary.

What you still have to build

In the 200-organization example, the MCP path leaves you with 3,000 OAuth tokens to encrypt at rest, refresh before expiry, and invalidate when a rep leaves or an admin flips the kill switch. The bring-your-own-key path leaves you with 200 customer keys to store, route to the right host, and replace when a customer rotates one.

The token type differs. The infrastructure required does not.

Where Scalekit fits

Scalekit's DeepL MCP connector handles the OAuth flow, token storage, and refresh, and a custom API-key connector puts customer keys in the same vault, so the MCP vs API decision doesn't change your auth infrastructure.

Recommended reading: Why a token vault is critical for AI agent workflows

How to connect a DeepL agent through Scalekit

Scalekit's DeepL MCP connector routes your agent's tool calls to DeepL's hosted server. Each user connects their DeepL account once. Scalekit vaults the tokens with AES-256, refreshes them, and resolves the right one at request time, so credentials never touch the agent runtime or the LLM context. The examples below use Python and LangChain.

Before you start

You need Scalekit API credentials (SCALEKIT_ENVIRONMENT_URL, SCALEKIT_CLIENT_ID, SCALEKIT_CLIENT_SECRET) from the dashboard under Developers > API Credentials, a DeepL MCP connection under AgentKit > Connections, and an OPENAI_API_KEY for the LangChain examples. The connection_name in code must match the connection name configured in the dashboard exactly; a mismatch is the most common integration error. End users need a DeepL Free or seat-based account.

pip install scalekit-sdk-python python-dotenv langchain-openai

Step 1: Connect the user's DeepL account

get_or_create_connected_account returns the user's DeepL connection. If it isn't ACTIVE, send the user through get_authorization_link to sign in to DeepL once.

import os from dotenv import load_dotenv from scalekit import ScalekitClient load_dotenv() scalekit_client = ScalekitClient( env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"), client_id=os.getenv("SCALEKIT_CLIENT_ID"), client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"), ) actions = scalekit_client.actions # Must match the connection name in AgentKit > Connections exactly CONNECTION_NAME = "deeplmcp" identifier = "user_123" # your app's stable ID for this end user account = actions.get_or_create_connected_account( connection_name=CONNECTION_NAME, identifier=identifier, ) if account.connected_account.status != "ACTIVE": link = actions.get_authorization_link( connection_name=CONNECTION_NAME, identifier=identifier, ) print("Connect DeepL:", link.link) input("Press Enter after signing in to DeepL...") account = actions.get_or_create_connected_account( connection_name=CONNECTION_NAME, identifier=identifier, ) if account.connected_account.status != "ACTIVE": raise RuntimeError(f"DeepL is {account.connected_account.status}, not ACTIVE")

In production, replace the input() pause with a redirect and a status check. The authorization guide covers that flow.

Step 2: Retrieve the tools this user is authorized to call

This step doesn't load a flat connector catalog. list_scoped_tools returns the tools this user's connected account is authorized to call. Use it to confirm tool names and input schemas before you hardcode anything.

scoped, _ = scalekit_client.tools.list_scoped_tools( identifier=identifier, filter={"connection_names": [CONNECTION_NAME]}, page_size=100, ) print([scoped_tool.tool.definition["name"] for scoped_tool in scoped.tools])

Step 3: Translate one reply directly

execute_tool resolves the user's DeepL token server-side and returns a wrapper. The tool output lives in result.data, so log it once before you parse fields.

result = actions.execute_tool( tool_name="deeplmcp_translate_text", tool_input={ "text": "Your refund has been processed. Expect it within 3 to 5 business days.", "targetLang": "DE", "formality": "more", # formality and context need a seat-based DeepL plan "context": "Customer support reply about a refund", }, connection_name=CONNECTION_NAME, identifier=identifier, ) print(result.data)

Step 4: Run the LangChain agent loop

actions.langchain.get_tools returns native LangChain StructuredTool objects, scoped to this user. The tool_names filter keeps the agent's surface to the three tools this job needs.

from langchain_openai import ChatOpenAI from langchain_core.messages import HumanMessage, ToolMessage tools = actions.langchain.get_tools( identifier=identifier, connection_names=[CONNECTION_NAME], tool_names=[ "deeplmcp_correct_text", "deeplmcp_translate_text", "deeplmcp_get_target_languages", ], page_size=100, ) tool_map = {t.name: t for t in tools} llm = ChatOpenAI(model="gpt-4o").bind_tools(tools) messages = [ HumanMessage( "Fix the typos in this reply, then translate it into German and French: " "'Thanks for you patience. Your refund has been proccessed.'" ) ] while True: response = llm.invoke(messages) messages.append(response) if not response.tool_calls: print(response.content) break for tc in response.tool_calls: result = tool_map[tc["name"]].invoke(tc["args"]) messages.append(ToolMessage(content=str(result), tool_call_id=tc["id"]))

Translate documents without routing bytes through the model

Document tools use DeepL's out-of-band flow, so file bytes never enter the context window:

  1. deeplmcp_upload_document, called with uploadMode set to agent_http and a filename, returns a sessionId, an uploadUrl, and an uploadPageUrl.
  2. Your code, not the model, sends the raw bytes to uploadUrl with an HTTP PUT and Content-Type: application/octet-stream.
  3. Poll deeplmcp_get_document_status until it reports done or error.
  4. deeplmcp_download_document returns a short-lived, single-use downloadUrl. Fetch it without an Authorization header.

In the default inline_ui mode, the MCP client collects the file instead, or the user opens uploadPageUrl in a browser.

Reach the DeepL API through the same vault

Scalekit has no prebuilt DeepL API connector today, so the API path runs through a custom connector with API_KEY auth. Set proxy_url to the DeepL API host for your plan, or template it with a per-account field if customers bring Free :fx keys. Use auth_field_mutations to add the DeepL-Auth-Key prefix DeepL expects. Each customer's key is collected through the authorization link and stored on their connected account, so your agent code never holds it. Calls go through the Tool Proxy with actions.request.

# A custom API_KEY connector for the DeepL REST API. # The connection name must match your dashboard exactly. API_CONNECTION = "deepl-api" tenant_id = "tenant_acme" # one connected account per customer's DeepL key resp = actions.request( connection_name=API_CONNECTION, identifier=tenant_id, path="/v2/translate", # relative to the connector's proxy_url method="POST", body={ "text": ["Your refund has been processed."], "source_lang": "EN", "target_lang": "DE", }, headers={"X-DeepL-Reporting-Tag": "support-assistant"}, # labels usage in DeepL reporting ) resp.raise_for_status() print(resp.json())

Virtual MCP servers for multi-tool, multi-tenant DeepL agents

Direct tool calling works when your code owns the agent loop. When the agent runs in an MCP-native host, Virtual MCP servers give you one server definition, per-user credential isolation, and least-privilege tool access, with no MCP server to deploy, host, or maintain.

Why a raw connection is the wrong unit

A support localization agent needs DeepL and Zendesk. Scalekit's Zendesk connector documents 137 tools and the DeepL MCP connector 8. Hand the agent both and it chooses among 145 tools; at roughly 200 tokens per definition, that's about 29,000 tokens before it does any work. The job needs five: read the ticket, read its comments, correct the draft, translate it, and post the reply.

Surface reduction is the lever. Model upgrades help. They are not the lever. The Zendesk side of that tradeoff is covered in How Tool Calling Auth Changes When You Move from Single-Tenant to Multi-Tenant.

Define the server once per agent role

The mapping declares which connections and which tools the endpoint exposes. You create it once, not once per user, and reuse the static mcp_server_url for everyone.

from scalekit.actions.models.mcp_config import McpConfigConnectionToolMapping vmcp = scalekit_client.actions.mcp.create_config( name="support-localization-agent", connection_tool_mappings=[ McpConfigConnectionToolMapping( connection_name="deeplmcp", # must match your dashboard connection name tools=["deeplmcp_correct_text", "deeplmcp_translate_text"], ), McpConfigConnectionToolMapping( connection_name="zendesk", # must match your dashboard connection name tools=[ "zendesk_ticket_get", "zendesk_ticket_comments_list", "zendesk_ticket_reply", ], ), ], ) config_id = vmcp.config.id mcp_server_url = vmcp.config.mcp_server_url

If the pipeline also runs through a TMS, map Lokalise, Smartling MCP, or LILT MCP tools onto the same server, next to DeepL.

Mint a session token per user, per run

Before each run, confirm the user's connections are active, then mint a short-lived session token bound to that user. The default lifetime is about an hour. There's no refresh endpoint, so you call create_session_token again when you need a new token.

from datetime import timedelta accounts = scalekit_client.actions.mcp.list_mcp_connected_accounts( config_id=config_id, identifier=identifier, include_auth_link=True, ) for connected in accounts.connected_accounts: if connected.connected_account_status != "ACTIVE": print(f"{connected.connection_name} needs auth: {connected.authentication_link}") token = scalekit_client.actions.mcp.create_session_token( mcp_config_id=config_id, identifier=identifier, expiry=timedelta(minutes=30), ).token

The endpoint is static; the identity is per user. One definition serves every tenant, and no user's DeepL or Zendesk credentials ever reach another user's session.

Recommended reading: Access control for multi-tenant AI agents

Connect LangChain over MCP

langchain-mcp-adapters connects to the Virtual MCP server with the session token as bearer auth. The agent sees the five mapped tools and nothing else.

pip install "langchain-mcp-adapters>=0.3,<1"
import asyncio from langchain_mcp_adapters.client import MultiServerMCPClient from langchain_openai import ChatOpenAI from langchain_core.messages import HumanMessage, ToolMessage async def run(mcp_server_url: str, token: str) -> None: client = MultiServerMCPClient( { "scalekit": { "transport": "streamable_http", "url": mcp_server_url, "headers": {"Authorization": f"Bearer {token}"}, } } ) tools = await client.get_tools() tool_map = {t.name: t for t in tools} llm = ChatOpenAI(model="gpt-4o").bind_tools(tools) messages = [ HumanMessage( "Read ticket 4821 and its comments, then reply to the customer in their " "language with this answer, corrected: 'Your refund was proccessed today.'" ) ] while True: response = await llm.ainvoke(messages) messages.append(response) if not response.tool_calls: print(response.content) break for tc in response.tool_calls: result = await tool_map[tc["name"]].ainvoke(tc["args"]) messages.append(ToolMessage(content=str(result), tool_call_id=tc["id"])) asyncio.run(run(mcp_server_url, token))

The same URL and token work with the other MCP-native hosts Scalekit documents, including CrewAI, Mastra, and Claude Managed Agents. The LangChain guide covers both integration styles side by side.

Observability for downstream DeepL tool calls

When a translated reply lands on the wrong ticket, "the agent called DeepL" isn't an answer.

What Scalekit records

Every execute_tool call resolves against a connected account. The dashboard's AgentKit > Connected Accounts view shows each account's status, token refresh history, and tool execution logs, which gives you per-user, per-connector evidence of which tool ran, when, and under whose authorization. The DeepL connector page describes a 90-day audit trail. Each execute_tool result also carries an execution_id; log it next to your agent-run ID so every DeepL call in your logs traces back to one tool execution.

Agent Webhooks push connected account lifecycle events, auth events, and token activity to your systems. A failed DeepL token refresh can trigger re-authorization before the next tool call errors out.

Why DeepL's own logs aren't enough

DeepL's records are keyed to DeepL's objects: a seat, an API key, a reporting tag, an X-Trace-ID. Your audit questions are keyed to yours: which end user, which tenant, which agent run. On the MCP path, usage lands in each customer's DeepL account, where your platform can't see it. On a shared API key, DeepL can attribute characters to a tag but can't tell you which user's session triggered them.

The execution log has to live on your side of the boundary.

Recommended reading: Audit trails for agent auth in B2B SaaS

Which one to build against

If your agent acts for a person who already works in DeepL, such as a support rep drafting replies or a developer polishing UI strings, build against the hosted MCP. The consent flow is DeepL's, the governance is the customer's, and the spend stays on their contract.

If your agent acts for your platform, or needs translation memories, Voice, tag handling, or file formats beyond Office and PDF, build against the API with keys you control.

Most production localization products end up with both: the assistant on MCP, the pipeline on the API. Either way, credentials multiply with your customer count, and that's the part that needs production-grade infrastructure.

Build your DeepL agent with Scalekit

Building a DeepL agent and want a second set of eyes on the auth design? Talk to us for immediate help. Start from the DeepL MCP connector docs, browse the DeepL MCP connector page, explore all agent connectors, or compare pricing.

No items found.
Agent
Auth Quickstart
On this page
Share this article
Agent
Auth Quickstart

Acquire enterprise customers with
‍zero upfront cost.

Every feature unlocked. No hidden fees.