Announcing CIMD support for MCP Client registration
Learn more

Smartling MCP vs Smartling API for AI Agents

Kuntal Banerjee
Founding Engineer

TL;DR

  • Smartling's hosted MCP server (53 tools through Scalekit) covers jobs, strings, issues, linguistic assets, and instant machine translation. File upload and download, job cancellation, and webhook subscriptions need the REST API.
  • MCP translation is instant MT only: no translation workflow, nothing saved to translation memory.
  • MCP auth is per-user OAuth 2.1. The REST API exchanges account- or project-scoped API tokens for 480-second access tokens inside 12-hour sessions.
  • For multi-tenant B2B agents, neither path stores, refreshes, or revokes credentials for you.
  • Scalekit's Smartling MCP connector handles OAuth, the token vault, and refresh per user, and adds Virtual MCP tool scoping plus per-call execution logs.

The decision in front of Smartling agent builders

Your agent needs to read and act on Smartling. Maybe it triages translation issues before a release, pushes new UI strings into a job, or gives product teams on-brand machine translation inside their workflow. Smartling ships a hosted MCP server and a large REST API. They overlap, but they are not the same object: different capability coverage, different identity models, different failure modes in production. Here is how to pick.

What Smartling MCP and Smartling API actually are

Both paths hit the same Smartling account. What differs is who the agent acts as, and how much of the platform it can reach.

Smartling MCP

Smartling launched its Model Context Protocol (MCP) server on August 19, 2025. It is a remote server built and maintained by Smartling, reachable from any MCP client over Streamable HTTP. Smartling routes MCP translation requests through its MT API, using the MT profile configured under AI Hub, Instant MT, MT API in the Smartling dashboard.

Auth changed recently. As of August 3, 2026, new connections must use an OAuth 2.1 login in the browser; older token-based connections keep working. Smartling's help center also notes that using every tool requires the Account Owner role. Other users can authenticate and call only the tools their permissions allow.

Official reference: the Smartling Help Center article "Smartling MCP Server: Connect Your AI Chat Tools to Smartling".

Smartling API

The REST API spans translation (Files, Jobs, Job Batches, Strings, Context, MT), translation management (Issues, Tags, Reports, Estimates, Attachments, quality checks), and account management (projects, locales, people). GraphQL APIs cover content search and translation memory. Smartling describes the API as a paid resource, priced through your Customer Success Manager.

Auth starts from an API token: a user identifier and user secret scoped to an account or a single project. Your code exchanges them for a bearer access token.

Official reference: the Smartling API reference site and the Help Center "Overview of the API" article.

What your agent can actually do

The MCP surface is strong for job, string, and issue operations. The gaps show up around files, job lifecycle end states, and event subscriptions.

Capability comparison

Capability
Smartling MCP
Smartling API
Machine translation, text and files
Yes, instant MT
Yes (MT API)
MT output saved to translation memory
No
Yes, via workflows
Upload source files to a project
No
Yes (Files API)
Download translated files
No
Yes (Files API)
Create strings, add them to jobs
Yes
Yes
Create, update, authorize jobs
Yes
Yes
Cancel, close, delete jobs; add locales
No
Yes (Jobs API)
Issues: create, comment, resolve
Yes
Yes
Glossaries
Read, export, match
Also edit entries
Translation memory
Search
Query and manage
Visual context
No
Yes (Context API)
Webhook subscriptions
No
Yes
Word count reports, LQA checks
Yes
Yes

Where the MCP surface stops

The biggest gap is files. Smartling's help center is explicit: the MCP server does not upload files into a project with string parsing and translation workflows. Translation through MCP is instant MT or LLM output with no human in the loop, and nothing is written to translation memory. Smartling points file-based project workflows to its separate CLI MCP, a Docker image that wraps smartling-cli and authenticates with API credentials.

The string path is more complete than it looks. An agent can call smartlingmcp_smartling_create_strings, attach them with smartlingmcp_smartling_add_strings_to_job, then smartlingmcp_smartling_authorize_job. That is a real workflow submission. What it cannot do is cancel, close, or delete the job afterwards.

Events are an API concern

If your agent must react when a job completes, the MCP tools only help at creation time: smartlingmcp_smartling_create_job accepts a callback_url. Webhook subscriptions, which cover recurring events across a project, are managed only through the dashboard or the API. Smartling signs webhook deliveries with HMAC-SHA256, may deliver out of order or twice, and disables a subscription after 96 hours without a successful delivery.

The context cost of 53 tools

The 53 Smartling tool descriptions on Scalekit's connector page run to roughly 73,000 characters. At about four characters per token, that is on the order of 18,000 tokens before your agent does any work. Several descriptions also carry instructions such as "Must ask user if not provided" for target_locale, which stall a headless run.

Loading the full server into every context window is an accuracy problem and a cost problem. The fix is not better prompting. It is surface reduction, which the Scalekit section below shows in code. For a broader discussion of why MCP can be significantly more expensive than CLI approaches, that tradeoff is worth understanding before you commit to a tool surface.

The auth path each one puts you on

This is where the two paths diverge most for B2B agents. MCP gives you user identity. The API gives you integration credentials.

MCP: per-user OAuth 2.1

The MCP host opens a browser, the user logs in to Smartling, and authorizes access. The resulting token acts as that user, with that user's roles. The full tool set, including account-level tools such as smartlingmcp_smartling_find_account_issues, needs the Account Owner role; other users get what their permissions allow. What the user can't do, the agent can't do.

The consent step needs a person at a browser once. After that, a background agent can keep acting for that user, as long as someone stores and refreshes the token.

API: a credential exchange with a 12-hour ceiling

The API has no documented third-party OAuth flow. Your code posts the user identifier and secret to /auth-api/v2/authenticate and receives an access token (expiresIn of 480 seconds) plus a refresh token (refreshExpiresIn of 3,660 seconds). Every token pair belongs to one session with a maximum lifespan of 12 hours, no matter how often you refresh.

Near the end of a session, refreshed tokens come back with shrinking lifetimes, then requests fail with 401. Smartling's guidance is to watch refreshExpiresIn shrink and re-authenticate with the identifier and secret. A long-running agent must implement that state machine correctly, per credential.

What this means for multi-tenant agents

An API token represents an integration scoped to an account or project, not an individual end user. The tokens themselves don't expire, so each customer hands you a long-lived secret to vault, and every action through it carries the integration's permissions.

Both paths require per-user credential isolation in a multi-tenant B2B agent. MCP's OAuth flow gives you a token per user. Direct API calls give you a credential per customer or project. In neither case does the path itself solve storage, rotation, or revocation. Those are infrastructure problems regardless of which path you choose. For a deeper look at who holds the token across different agent tool-calling patterns, it is worth reviewing how credential ownership maps to your architecture.

What you own in production

The split is predictable: Smartling owns more of the tool layer on MCP, and you own nearly everything on the API.

On the MCP path

Smartling maintains the tool schemas and maps them onto its APIs. When Smartling adds tools, your agent can pick them up without a code change. The flip side is that MCP tool schemas are not versioned the way REST endpoints are, so descriptions and parameters can shift under you.

You still own token storage, refresh, revocation when a user disconnects, and tenant isolation. You also own tool selection, since exposing all 53 tools to every run is expensive and error-prone.

On the API path

You own everything: endpoint selection, request construction, the credential exchange and 12-hour session logic, 429 MAX_OPERATIONS_LIMIT_EXCEEDED backoff (limits vary by endpoint and count per user, project, or account), 202 ACCEPTED polling for long-running uploads, and webhook signature verification.

That is more surface area and more control. You get the Files API, job lifecycle endpoints, and webhook subscriptions the MCP server does not expose. Every tool schema your agent needs is one your team writes, tests, and maintains.

When to use MCP, when to use the API

Both lists below are specific to Smartling workloads. Many production localization agents end up using both.

Use Smartling MCP when

  • Your agent helps a localization manager or developer in Claude Code, Cursor, or a chat assistant: "which jobs are blocking the French release?"
  • The work is string-level: create strings from a code diff, add them to a job, authorize it, then track issues.
  • You need instant, glossary-aware MT inside a product workflow and don't need the output in translation memory.
  • The agent orchestrates Smartling alongside Slack, GitHub, or a CMS, and you want one tool protocol across all of them.
  • You want actions attributed to real Smartling users with their own roles.

Use the Smartling API when

  • The agent moves files: upload source resource files, poll status, download translated files into a build.
  • The pipeline is event-driven and must react to webhooks for job completion or string publication.
  • You need job end states: cancel, close, delete, or add locales to existing jobs.
  • The agent manages visual context, translation memory entries, or glossary entries.
  • The workload is a high-volume deterministic pipeline where versioned endpoints and explicit rate-limit handling matter more than tool discovery.

The credential problem that exists on both paths

Pick either path and you still hold N credentials for N users or customers. The token type differs. The infrastructure required is the same.

The shared infrastructure problem

On MCP, each user's OAuth token must be encrypted at rest, isolated per tenant, refreshed before expiry, and revoked when the user leaves or disconnects. On the API, each customer's identifier and secret must be vaulted, and your runtime must manage 480-second access tokens and 12-hour sessions without two workers refreshing the same session at once.

Neither Smartling path gives you a token vault, refresh coordination, or a signal when a user's authorization breaks. Your agent learns about it from a 401 in the middle of a job. Understanding how to handle token refresh for AI agents is foundational before building either integration in production.

Where Scalekit fits

Scalekit's Smartling connector handles the OAuth 2.1 flow, token storage, and refresh for the MCP path per user, so credentials never touch the agent runtime. The next section shows the code.

Recommended reading: How to handle token refresh for AI agents and Token vault for AI agent workflows.

Building Smartling agents with Scalekit

The Scalekit Smartling MCP connector routes tool calls to Smartling's own MCP server. Each user signs in to Smartling once; Scalekit stores and refreshes their tokens. The examples below use Python and LangChain.

Set up the connection

Create a Smartling MCP connection in the Scalekit dashboard under AgentKit, Connections. The connection name in your code must match the dashboard name exactly; mismatched connection names are the most common integration error. The examples assume smartlingmcp, plus slack for the multi-tool example.

pip install scalekit-sdk-python python-dotenv langchain-openai "langchain-mcp-adapters>=0.3,<1"
# .env (values from Scalekit dashboard > Developers > API Credentials) SCALEKIT_ENVIRONMENT_URL=<your-environment-url> SCALEKIT_CLIENT_ID=<your-client-id> SCALEKIT_CLIENT_SECRET=<your-client-secret> OPENAI_API_KEY=<your-openai-key>

Connect a user and make the first call

Each end user gets a connected account keyed by your own identifier. If the account is not active, send the user an authorization link; Scalekit completes the OAuth exchange and marks the account ACTIVE. Smartling expects agents to resolve the account UID first, so the first call does exactly that.

# connect_user.py import os from dotenv import load_dotenv from scalekit import ScalekitClient load_dotenv() scalekit_client = ScalekitClient( env_url=os.environ["SCALEKIT_ENVIRONMENT_URL"], client_id=os.environ["SCALEKIT_CLIENT_ID"], client_secret=os.environ["SCALEKIT_CLIENT_SECRET"], ) actions = scalekit_client.actions # Must match the connection name in AgentKit > Connections exactly CONNECTION_NAME = "smartlingmcp" IDENTIFIER = "user_123" # your app's unique ID for this end user def ensure_smartling_connected(identifier: str) -> None: response = actions.get_or_create_connected_account( connection_name=CONNECTION_NAME, identifier=identifier, ) if response.connected_account.status != "ACTIVE": link = actions.get_authorization_link( connection_name=CONNECTION_NAME, identifier=identifier, ) print("Authorize Smartling:", link.link) input("Press Enter after completing the Smartling login...") response = actions.get_or_create_connected_account( connection_name=CONNECTION_NAME, identifier=identifier, ) if response.connected_account.status != "ACTIVE": raise RuntimeError( f"Smartling is {response.connected_account.status}, not ACTIVE" ) ensure_smartling_connected(IDENTIFIER) # First call: resolve which Smartling accounts this user can see result = actions.execute_tool( tool_input={}, tool_name="smartlingmcp_smartling_get_available_accounts_for_current_user", connection_name=CONNECTION_NAME, identifier=IDENTIFIER, ) print(result.execution_id, result.data)

In production, switch the connection's user verification mode from None to a custom verifier, so the person who completes the Smartling login is the user your app intended to connect.

Scope the tool surface before the agent runs

The agent should not load a flat connector catalog. actions.langchain.get_tools calls list_scoped_tools under the hood: it returns only tools bound to this user's connected account, and the tool_names filter narrows those to what this job needs. Six tools instead of 53 keeps selection accurate and context small. Scalekit returns native LangChain StructuredTool objects, so no schema reshaping is needed. For more on how LangChain tool calling works and where it stops, the pattern here extends directly from those fundamentals.

Tool
Purpose
smartlingmcp_smartling_get_available_accounts_for_current_user
Resolve the account UID
smartlingmcp_smartling_list_projects
Find the project by name
smartlingmcp_smartling_list_jobs
Filter jobs by status
smartlingmcp_smartling_get_job
Read job details
smartlingmcp_smartling_find_project_issues
Find open issues
smartlingmcp_smartling_add_issue_comment
Reply on an issue

Run the LangChain agent loop

With the scoped tools bound, execution is a standard tool-calling loop. Every tool invocation runs through Scalekit with this user's Smartling token.

# langchain_agent.py from langchain_openai import ChatOpenAI from langchain_core.messages import HumanMessage, SystemMessage, ToolMessage from connect_user import actions, CONNECTION_NAME, IDENTIFIER # Scope the agent to the handful of Smartling tools this job needs SMARTLING_TOOLS = [ "smartlingmcp_smartling_get_available_accounts_for_current_user", "smartlingmcp_smartling_list_projects", "smartlingmcp_smartling_list_jobs", "smartlingmcp_smartling_get_job", "smartlingmcp_smartling_find_project_issues", "smartlingmcp_smartling_add_issue_comment", ] tools = actions.langchain.get_tools( identifier=IDENTIFIER, connection_names=[CONNECTION_NAME], tool_names=SMARTLING_TOOLS, page_size=100, ) tool_map = {t.name: t for t in tools} llm = ChatOpenAI(model="gpt-4o").bind_tools(tools) messages = [ SystemMessage( "You are a localization ops assistant. Always resolve the Smartling " "account UID first, then work project by project. Never guess UIDs." ), HumanMessage( "In the 'Mobile App' project, list jobs that are IN_PROGRESS and any " "open HIGH severity issues. Summarize what is blocking release." ), ] 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"]))

For a full LangChain walkthrough, see the Scalekit LangChain example in the docs.

Virtual MCP for multi-tool, multi-tenant Smartling agents

Localization agents rarely touch Smartling alone. A release agent reads Smartling issues and posts to Slack; a string-sync agent reads a GitHub diff and creates Smartling strings. A Virtual MCP server gives each agent role one scoped endpoint across several connectors.

Define the server once per agent role

The server declares which connections and which tools the agent can see. You get a static mcp_server_url reused for every user. Omit tools on a mapping only if you truly want every tool from that connection.

# create_vmcp.py from scalekit.actions.models.mcp_config import McpConfigConnectionToolMapping from connect_user import actions # Run once per agent role, not once per user vmcp_response = actions.mcp.create_config( name="localization-release-agent", description="Smartling job and issue triage with Slack notifications", connection_tool_mappings=[ McpConfigConnectionToolMapping( connection_name="smartlingmcp", tools=[ "smartlingmcp_smartling_get_available_accounts_for_current_user", "smartlingmcp_smartling_list_projects", "smartlingmcp_smartling_list_jobs", "smartlingmcp_smartling_find_project_issues", ], ), McpConfigConnectionToolMapping( connection_name="slack", tools=["slack_send_message"], ), ], ) print("SCALEKIT_MCP_CONFIG_ID =", vmcp_response.config.id) print("SCALEKIT_MCP_SERVER_URL =", vmcp_response.config.mcp_server_url)

Mint a per-user session token before each run

The endpoint is static; the identity is not. Before each run, confirm the user's Smartling and Slack accounts are active, then mint a short-lived session token bound to that user. The default expiry is about an hour, and create_session_token is also how you remint. Never share a session token across users.

# run_vmcp_agent.py import asyncio import os from datetime import timedelta from langchain_mcp_adapters.client import MultiServerMCPClient from langchain_openai import ChatOpenAI from langchain_core.messages import HumanMessage, ToolMessage from connect_user import actions config_id = os.environ["SCALEKIT_MCP_CONFIG_ID"] mcp_url = os.environ["SCALEKIT_MCP_SERVER_URL"] identifier = "user_123" # 1. Confirm every connection on this server is active for this user accounts = actions.mcp.list_mcp_connected_accounts( config_id=config_id, identifier=identifier, include_auth_link=True, ) inactive = [ a for a in accounts.connected_accounts if (a.connected_account_status or "").upper() != "ACTIVE" ] if inactive: for a in inactive: print(f"{a.connection_name} needs auth: {a.authentication_link}") raise SystemExit("Authorize the connections above, then rerun.") # 2. Mint a short-lived session token scoped to this user mcp_token = actions.mcp.create_session_token( mcp_config_id=config_id, identifier=identifier, expiry=timedelta(minutes=30), ).token async def run() -> None: client = MultiServerMCPClient( { "scalekit": { "transport": "streamable_http", "url": mcp_url, "headers": {"Authorization": f"Bearer {mcp_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( "Find open HIGH severity issues in the 'Web Checkout' Smartling " "project and post a short summary to the #l10n-release channel." ) ] 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())

The authorization links returned by list_mcp_connected_accounts are short-lived, so surface them to the user immediately rather than storing them.

Why this model fits multi-tenant localization agents

One server definition serves every customer. Each run carries only one user's Smartling and Slack credentials, so an agent working for tenant A cannot reach tenant B's projects. The Smartling surface drops from 53 tools to four, which cuts context overhead and removes destructive tools such as smartlingmcp_smartling_delete_issue_comment from reach entirely.

There is no MCP server for you to deploy, host, or maintain. Configure the connections, map the tools, mint a token per run.

Recommended reading: Virtual MCP servers for scoped, per-user agent access and Access control for multi-tenant AI agents.

Observability for downstream Smartling tool calls

When a localization agent authorizes the wrong job, the first question is who did it, with which credential, and when. Scalekit answers that at the auth and tool-call layer.

Tool call and auth logs

Every execute_tool response carries an execution_id, and the AgentKit Connected Accounts view in the dashboard shows each account's status, token refresh history, and tool execution logs. Each call is tied to the acting user's identifier, not a shared service credential.

For proactive handling, subscribe to the connected_account.status_updated and connected_account.token_refresh_failed webhooks. A user loses Smartling access? Pause the agent, prompt re-authorization, and stop before the job fails halfway. More on this in agent tool observability.

What the REST path needs today

Scalekit's catalog covers Smartling through the MCP connector. Smartling's REST auth is a credential exchange with short-lived tokens and 12-hour sessions, not a static key, so it does not map cleanly onto a static BEARER or API_KEY custom connector. If your agent needs Files API or webhook coverage alongside MCP, talk to the Scalekit team about the right setup.

Which one to build against

If your agent works at the string, job, and issue level, especially for interactive assistants or multi-tool release agents, Smartling MCP is the faster path. You get per-user identity, maintained tool schemas, and instant MT with your glossaries.

If your agent moves resource files through Smartling projects, reacts to webhooks, or needs job cancellation and translation memory writes, use the REST API. The MCP server's instant-MT-only translation and missing Files API are product boundaries, not configuration options.

Most production localization agents run both: MCP for user-facing triage and string submission, the API for file-based pipelines. Either way, the credential problem is the same, and that needs production-grade infrastructure. The common production problems, patterns, and anti-patterns for tool-calling agent auth are worth reviewing before you finalize your architecture.

Get help building your Smartling agent

Building a Smartling agent for many users or customers? Talk to the Scalekit team for immediate help with connection setup, Virtual MCP design, and multi-tenant rollout.

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.