xcomet-mcp-server
The xCOMET MCP Server enables AI agents to evaluate machine translation quality using the xCOMET model, providing three core tools:
xcomet_evaluate: Score a source-translation pair on a 0–1 quality scale, detect error spans with severity levels (minor/major/critical), and receive a human-readable summary. Supports optional reference translations, ISO 639-1 language codes, and JSON or Markdown output.xcomet_detect_errors: Focus specifically on identifying and categorizing translation errors, returning total error counts, breakdowns by severity, error positions, and optional correction suggestions with configurable minimum severity filtering.xcomet_batch_evaluate: Evaluate up to 500 translation pairs in a single request, receiving per-pair scores, error counts, critical error flags, an average score, and an overall quality summary with configurable batch size (1–64).
Additional capabilities:
GPU acceleration for faster inference when compatible hardware is available
Persistent model loading (fast ~500ms subsequent calls vs. 25–90s initial load)
Configurable models (XL, XXL, wmt22-comet-da) to balance quality and performance
Seamless integration with other MCP servers (e.g., DeepL) for end-to-end translation workflows
Flexible Python environment support with auto-detection or explicit path configuration
Integrates into translation workflows alongside services like DeepL to evaluate machine translation quality, providing quality scores and detecting error spans with severity levels to determine if results require manual intervention.
xCOMET MCP Server
⚠️ This is an unofficial community project, not affiliated with Unbabel.
Translation quality evaluation MCP Server powered by xCOMET (eXplainable COMET).
🎯 Overview
xCOMET MCP Server provides AI agents with the ability to evaluate machine translation quality. It integrates with the xCOMET model from Unbabel to provide:
Quality Scoring: Scores between 0-1 indicating translation quality
Error Detection: Identifies error spans with severity levels (minor/major/critical)
Batch Processing: Evaluate multiple translation pairs efficiently (optimized single model load)
GPU Support: Optional GPU acceleration for faster inference
graph LR
A[AI Agent] --> B[Node.js MCP Server]
B -- stdio JSON-RPC --> C[Python Worker]
C --> D[xCOMET Model<br/>Persistent in Memory]
D --> C
C --> B
B --> A
style D fill:#9f9Related MCP server: nativ-mcp
🔧 Prerequisites
Python Environment
Python 3.9 - 3.12 recommended (3.13+ is not yet supported by xCOMET dependencies)
xCOMET requires Python with several packages. We recommend using a virtual environment:
# If using uv (recommended - auto-downloads the correct Python version)
uv venv ~/.xcomet-venv --python 3.12
source ~/.xcomet-venv/bin/activate
uv pip install "unbabel-comet>=2.2.7,<3.0"
# Or using standard venv (requires Python 3.9-3.12 already installed)
python3 -m venv ~/.xcomet-venv
source ~/.xcomet-venv/bin/activate # Windows: ~/.xcomet-venv\Scripts\activate
pip install "unbabel-comet>=2.2.7,<3.0"Why Python 3.9-3.12?
unbabel-cometdeclaresnumpy = "^1.20.0", so it resolves numpy 1.x. The last numpy 1.x release, 1.26.4, ships wheels for cp39-cp312 only. On Python 3.13 or later, pip has to build numpy from source.
Note (v0.5.0+): The Python worker now talks to Node.js over stdin/stdout (line-delimited JSON-RPC). FastAPI, uvicorn, and pydantic are no longer required — only
unbabel-cometis.
Note: When using with Claude Desktop or other MCP hosts, set
XCOMET_PYTHON_PATHto point to the venv Python (see Configuration).
Model Download
Important: XCOMET-XL and XCOMET-XXL are gated models on HuggingFace. You must:
Create a HuggingFace account
Visit Unbabel/XCOMET-XL and request access
Authenticate, either via the CLI:
source ~/.xcomet-venv/bin/activate hf auth login(
huggingface-cli loginstill works but prints a deprecation warning since huggingface_hub 0.34;hfis the current command.)Or by setting
HF_TOKENin the MCP host'senvblock, which is the option when the host launches the server in an environment where no CLI login has been performed:"env": { "XCOMET_PYTHON_PATH": "~/.xcomet-venv/bin/python3", "HF_TOKEN": "hf_..." }huggingface_hub reads
HF_TOKENfirst and falls back to the token file written byhf auth login.
Unbabel/wmt22-comet-dadoes not require authentication (but requires reference translations).
After authentication, download the model (~14GB for XL, ~42GB for XXL):
source ~/.xcomet-venv/bin/activate
python -c "from comet import download_model; download_model('Unbabel/XCOMET-XL')"Where the model is stored
Not in the virtualenv. The venv holds the Python packages; the model weights go to the huggingface_hub cache, which is a separate directory shared by every tool on the machine that pulls from the Hub.
~/.xcomet-venv/ ← Python packages only
└── lib/python3.x/site-packages/
├── comet/ unbabel-comet itself
└── torch/ transformers/ ... its dependencies
~/.cache/huggingface/ ← the model weights live here
└── hub/
└── models--Unbabel--XCOMET-XL/
├── blobs/ the actual ~14GB checkpoint
└── snapshots/<revision>/
├── checkpoints/model.ckpt what download_model() returns
└── hparams.yamldownload_model() passes cache_dir=None to snapshot_download(), so
huggingface_hub picks the location: HF_HUB_CACHE, which defaults to
HF_HOME/hub, where HF_HOME defaults to $XDG_CACHE_HOME/huggingface
(~/.cache/huggingface when XDG_CACHE_HOME is unset).
Three consequences worth knowing:
Rebuilding or deleting the venv does not re-download the model.
Several venvs, and other Hub-based tools, share the same copy.
The size of the venv directory does not account for the 14GB. Use
hf cache scanto see what is actually on disk, andhf cache deleteto remove a revision.
To put the checkpoint somewhere else — a larger volume, a shared drive — set
XCOMET_SAVING_DIRECTORY (v0.7.0+) or the standard HF_HOME. Both are read at
download time, so a model already downloaded to the default location is not
moved; it is downloaded again into the new one.
Node.js
Node.js >= 22.0.0 (matches
engines.nodeinpackage.json; CI runs on 22 and 24)npm or yarn
📦 Installation
Note: If you just want to use xCOMET MCP Server, you do not need to clone this repository. Install the Python environment and model (see Prerequisites), then use
npx(see Usage). The section below is for contributors and local development only.
Local Development
For contributors and local development:
# Clone the repository
git clone https://github.com/shuji-bonji/xcomet-mcp-server.git
cd xcomet-mcp-server
# Set up Python virtual environment and install dependencies
uv venv .venv --python 3.12 # or: python3 -m venv .venv
source .venv/bin/activate
pip install -r python/requirements.txt
# Install Node.js dependencies and build
npm install
npm run build🚀 Usage
With Claude Desktop (npx)
Add to your Claude Desktop configuration (claude_desktop_config.json):
{
"mcpServers": {
"xcomet": {
"command": "npx",
"args": ["-y", "xcomet-mcp-server@latest"],
"env": {
"XCOMET_PYTHON_PATH": "~/.xcomet-venv/bin/python3"
}
}
}
}Tip: If you installed Python packages system-wide or use pyenv,
XCOMET_PYTHON_PATHmay be omitted (auto-detection will find it). See Python Path Auto-Detection for details.
With Claude Code
claude mcp add xcomet --env XCOMET_PYTHON_PATH=~/.xcomet-venv/bin/python3 -- npx -y xcomet-mcp-server@latestGlobal Installation
If you prefer installing globally:
npm install -g xcomet-mcp-serverThen configure:
{
"mcpServers": {
"xcomet": {
"command": "xcomet-mcp-server",
"env": {
"XCOMET_PYTHON_PATH": "~/.xcomet-venv/bin/python3"
}
}
}
}Local Development Build
If you cloned and built the repository locally (see Installation):
{
"mcpServers": {
"xcomet": {
"command": "node",
"args": ["/path/to/xcomet-mcp-server/dist/index.js"],
"env": {
"XCOMET_PYTHON_PATH": "~/.xcomet-venv/bin/python3"
}
}
}
}🛠️ Available Tools
xcomet_evaluate
Evaluate translation quality for a single source-translation pair.
Parameters:
Name | Type | Required | Description |
| string | ✅ | Original source text |
| string | ✅ | Translated text to evaluate |
| string | ❌ | Reference translation |
| string | ❌ | Source language code (ISO 639-1) |
| string | ❌ | Target language code (ISO 639-1) |
| "json" | "markdown" | ❌ | Output format (default: "json") |
| boolean | ❌ | Use GPU for inference (default: false) |
Example:
{
"source": "The quick brown fox jumps over the lazy dog.",
"translation": "素早い茶色のキツネが怠惰な犬を飛び越える。",
"source_lang": "en",
"target_lang": "ja",
"use_gpu": true
}Response:
{
"score": 0.847,
"errors": [],
"summary": "Good quality (score: 0.847) with 0 error(s) detected."
}xcomet_detect_errors
Focus on detecting and categorizing translation errors.
Parameters:
Name | Type | Required | Description |
| string | ✅ | Original source text |
| string | ✅ | Translated text to analyze |
| string | ❌ | Reference translation |
| "minor" | "major" | "critical" | ❌ | Minimum severity (default: "minor") |
| "json" | "markdown" | ❌ | Output format |
| boolean | ❌ | Use GPU for inference (default: false) |
xcomet_batch_evaluate
Evaluate multiple translation pairs in a single request.
Performance Note: With the persistent server architecture (v0.3.0+), the model stays loaded in memory. Batch evaluation processes all pairs efficiently without reloading the model.
Parameters:
Name | Type | Required | Description |
| array | ✅ | Array of {source, translation, reference?} (max 500) |
| string | ❌ | Source language code |
| string | ❌ | Target language code |
| "json" | "markdown" | ❌ | Output format |
| boolean | ❌ | Use GPU for inference (default: false) |
| number | ❌ | Batch size 1-64 (default: 8). Larger = faster but uses more memory |
Example:
{
"pairs": [
{"source": "Hello", "translation": "こんにちは"},
{"source": "Goodbye", "translation": "さようなら"}
],
"use_gpu": true,
"batch_size": 16
}🔗 Integration with Other MCP Servers
xCOMET MCP Server is designed to work alongside other MCP servers for complete translation workflows:
sequenceDiagram
participant Agent as AI Agent
participant DeepL as DeepL MCP Server
participant xCOMET as xCOMET MCP Server
Agent->>DeepL: Translate text
DeepL-->>Agent: Translation result
Agent->>xCOMET: Evaluate quality
xCOMET-->>Agent: Score + Errors
Agent->>Agent: Decide: Accept or retry?Recommended Workflow
Translate using DeepL MCP Server (official)
Evaluate using xCOMET MCP Server
Iterate if quality is below threshold
Example: DeepL + xCOMET Integration
Configure both servers in Claude Desktop:
{
"mcpServers": {
"deepl": {
"command": "npx",
"args": ["-y", "@anthropic/deepl-mcp-server"],
"env": {
"DEEPL_API_KEY": "your-api-key"
}
},
"xcomet": {
"command": "npx",
"args": ["-y", "xcomet-mcp-server@latest"],
"env": {
"XCOMET_PYTHON_PATH": "~/.xcomet-venv/bin/python3"
}
}
}
}Then ask Claude:
"Translate this text to Japanese using DeepL, then evaluate the translation quality with xCOMET. If the score is below 0.8, suggest improvements."
⚙️ Configuration
Environment Variables
Variable | Default | Description |
|
| xCOMET model to use |
| (auto-detect) | Python executable path (see below) |
|
| Pre-load model at startup (v0.3.1+) |
|
| Enable verbose debug logging (v0.3.1+) |
|
| DataLoader workers for |
| (HuggingFace cache) | Directory to download the checkpoint into (v0.7.0+). Unset, the model goes to the huggingface_hub cache ( |
|
| Resolve the checkpoint from the local cache only (v0.7.0+). Set to |
| (unset) | HuggingFace access token, read by huggingface_hub. An alternative to |
Model Selection
Choose the model based on your quality/performance needs:
Model | Parameters | Size | Memory | Reference | HF Auth | Quality | Use Case |
| 3.5B | ~14GB | ~8-10GB | Optional | ✅ Required | ⭐⭐⭐⭐ | Recommended for most use cases |
| 10.7B | ~42GB | ~20GB | Optional | ✅ Required | ⭐⭐⭐⭐⭐ | Highest quality, requires more resources |
| 580M | ~2GB | ~3GB | Required | Not required | ⭐⭐⭐ | Lightweight, faster loading |
Important: XCOMET-XL and XCOMET-XXL are gated models on HuggingFace. Each model requires separate access approval. See Model Download for authentication setup.
Important:
wmt22-comet-darequires areferencetranslation for evaluation. XCOMET models support referenceless evaluation.
Tip: If you experience memory issues or slow model loading, try
Unbabel/wmt22-comet-dafor faster performance with slightly lower accuracy (but remember to provide reference translations).
To use a different model, set the XCOMET_MODEL environment variable:
{
"mcpServers": {
"xcomet": {
"command": "npx",
"args": ["-y", "xcomet-mcp-server@latest"],
"env": {
"XCOMET_MODEL": "Unbabel/XCOMET-XXL"
}
}
}
}Python Path Auto-Detection
The server automatically detects a Python environment with unbabel-comet installed:
XCOMET_PYTHON_PATHenvironment variable (if set)pyenv versions (
~/.pyenv/versions/*/bin/python3) - checks forcometmoduleHomebrew Python (
/opt/homebrew/bin/python3,/usr/local/bin/python3)Fallback:
python3command
This ensures the server works correctly even when the MCP host (e.g., Claude Desktop) uses a different Python than your terminal.
Example: Explicit Python path configuration
{
"mcpServers": {
"xcomet": {
"command": "npx",
"args": ["-y", "xcomet-mcp-server@latest"],
"env": {
"XCOMET_PYTHON_PATH": "/Users/you/.pyenv/versions/3.11.0/bin/python3"
}
}
}
}⚡ Performance
Persistent Worker Architecture (v0.3.0+, stdio since v0.5.0)
The server uses a persistent Python worker process that keeps the xCOMET model loaded in memory. The Node.js MCP server talks to the worker over stdin/stdout using a line-delimited JSON-RPC protocol — no local HTTP listener, no port binding, no FastAPI.
Request | Time | Notes |
First request | ~25-90s | Model loading (varies by model size) |
Subsequent requests | ~500ms | Model already loaded |
This provides a 177x speedup for consecutive evaluations compared to reloading the model each time.
Eager Loading (v0.3.1+)
Enable XCOMET_PRELOAD=true to pre-load the model at server startup:
{
"mcpServers": {
"xcomet": {
"command": "npx",
"args": ["-y", "xcomet-mcp-server@latest"],
"env": {
"XCOMET_PRELOAD": "true"
}
}
}
}With preload enabled, all requests are fast (~500ms), including the first one.
graph LR
A[MCP Request] --> B[Node.js Server]
B -- stdio JSON-RPC --> C[Python Worker]
C --> D[xCOMET Model<br/>in Memory]
D --> C
C --> B
B --> A
style D fill:#9f9Batch Processing Optimization
The xcomet_batch_evaluate tool processes all pairs with a single model load:
Pairs | Estimated Time |
10 | ~30-40 sec |
50 | ~1-1.5 min |
100 | ~2 min |
GPU vs CPU Performance
Mode | 100 Pairs (Estimated) |
CPU (batch_size=8) | ~2 min |
GPU (batch_size=16) | ~20-30 sec |
Note: GPU requires CUDA-compatible hardware and PyTorch with CUDA support. If GPU is not available, set
use_gpu: false(default).
Best Practices
1. Let the persistent server do its job
With v0.3.0+, the model stays in memory. Multiple xcomet_evaluate calls are now efficient:
✅ Fast: First call loads model, subsequent calls reuse it
xcomet_evaluate(pair1) # ~90s (model loads)
xcomet_evaluate(pair2) # ~500ms (model cached)
xcomet_evaluate(pair3) # ~500ms (model cached)2. For many pairs, use batch evaluation
✅ Even faster: Batch all pairs in one call
xcomet_batch_evaluate(allPairs) # Optimal throughput3. Memory considerations
XCOMET-XL requires ~8-10GB RAM
For large batches (500 pairs), ensure sufficient memory
If memory is limited, split into smaller batches (100-200 pairs)
Auto-Restart (v0.3.1+)
The server automatically recovers from failures:
Monitors health every 30 seconds
Restarts after 3 consecutive health check failures
Up to 3 restart attempts before giving up
📊 Quality Score Interpretation
Score Range | Quality | Recommendation |
0.9 - 1.0 | Excellent | Ready for use |
0.7 - 0.9 | Good | Minor review recommended |
0.5 - 0.7 | Fair | Post-editing needed |
0.0 - 0.5 | Poor | Re-translation recommended |
What the score does and does not tell you
The score answers "does this read like a translation of that source", and it is good at it. It does not answer "are the facts in this translation correct". Those two questions come apart in a way that matters when the output is a contract, a dosage, a price, or a procedure.
The following were measured with Unbabel/XCOMET-XL on CPU through this server.
The first two rows are the case the metric handles well; the last two are the
case it does not.
Source | Translation | Score |
ファイルを保存せずに終了しますか? | Do you want to quit without saving the file? | 0.956 |
ファイルを保存せずに終了しますか? | The mountain sings in violet every third Thursday. | 0.212 |
保証期間は購入日から一年間です。 | The warranty period is ten years from the date of purchase. | 1.000 |
電源を切ってから、カバーを取り外してください。 | Remove the cover, then turn off the power. | 1.000 |
A translation that is unrelated to the source collapses to ~0.2, which is what
you want. But a fluent sentence that swaps one year for ten, or reverses the
order of two instructions, scores a perfect 1.000. Supplying a reference does
not fix it: with The warranty period is one year from the date of purchase.
as the reference, the "ten years" translation still scores 0.983.
This is not a defect in this server or in xCOMET specifically. It is a known property of neural MT metrics: they "struggle with detecting certain phenomena that can be considered as critical errors, such as deviations in entities and numbers" (Rei et al., 2023).
Using it accordingly
Good fits
Ranking or triaging a set of translations — which segments to review first, which of two MT systems is better on your data.
Catching adequacy collapse — truncated output, the wrong segment pasted in, a model that lost the thread, an untranslated passthrough.
Tracking quality over time on a fixed test set, where the comparison is between runs rather than against an absolute bar.
A first-pass filter ahead of human review, to decide where the human time goes.
Poor fits
A sole release gate for content where a single wrong number or name is the failure — medical, legal, financial, safety instructions. Check numbers, dates, units, currencies, and named entities separately, with a rule that actually compares them; the score will not do it for you.
An absolute quality claim. 0.95 is not "95% correct", and the value is not comparable across models, language pairs, or segment lengths.
Very short segments (a UI label, a single word), where the score saturates and stops discriminating.
Use xcomet_detect_errors alongside the score. The error spans mark
where the model believes something went wrong, with an MQM severity. A high
score with a critical span is a more useful signal than either number alone.
🔍 Troubleshooting
Common Issues
"No module named 'comet'"
Cause: Python environment without unbabel-comet installed.
Solution:
# Check which Python is being used
python3 -c "import sys; print(sys.executable)"
# If using a virtual environment, make sure it's activated
source .venv/bin/activate
pip install -r python/requirements.txt
# For MCP hosts (e.g., Claude Desktop), specify the venv Python path
export XCOMET_PYTHON_PATH=~/.xcomet-venv/bin/python3The venv stopped working after a Homebrew upgrade
Symptom: zsh: no such file or directory: .venv/bin/python3, or python3
inside an activated venv resolving to a different interpreter than the venv's,
or No module named 'comet' in a venv that worked yesterday.
Cause: A venv does not contain an interpreter — it stores an absolute
symlink to the one it was created from, recorded in pyvenv.cfg:
home = /opt/homebrew/opt/python@3.14/bin
version = 3.14.3When Homebrew upgrades or removes that formula, the link dangles and the venv
is dead. lib/python3.x/site-packages/ is still there, but nothing can run it.
Check:
ls -l .venv/bin/python3 && .venv/bin/python3 -V
cat .venv/pyvenv.cfgSolution: recreate it. uv venv --python 3.12 is the more durable form,
because uv fetches and pins that interpreter itself instead of borrowing
Homebrew's current one.
rm -rf .venv
uv venv .venv --python 3.12
source .venv/bin/activate
uv pip install "unbabel-comet>=2.2.7,<3.0"Reinstalling the packages is a few hundred MB, but the model is not re-downloaded: the checkpoint lives in the huggingface_hub cache, not in the venv (see Where the model is stored).
An old version starts after an upgrade
Symptom: a fix you know is published is missing from the running server. The startup banner in the log names an older version.
grep "running on stdio" ~/Library/Logs/Claude/mcp-server-xcomet.log | tail -1
xcomet-mcp-server v0.6.3 running on stdio(On macOS, Claude Desktop writes each MCP server's stderr to
~/Library/Logs/Claude/mcp-server-<name>.log.)
Cause: npx resolves latest from npm's cached registry metadata, and runs
the copy it already installed under ~/.npm/_npx. For a while after a release,
that copy is the previous version. It catches up on its own, but not at a time
you choose. @latest does not change this — to npm it means the same as writing
no version at all.
Solution: clear the npx cache, then restart the MCP host.
rm -rf ~/.npm/_npxps shows which copy is running, and which cache directory it came from.
ps -axo pid,command | grep xcomet-mcp-server | grep -v grepTo stay on a known build, pin an exact version: xcomet-mcp-server@0.7.0.
Model download fails or times out
Cause: Large model files (~14GB for XL) require stable internet connection. XCOMET models also require HuggingFace authentication (see Model Download).
Solution:
# Authenticate with HuggingFace (required for XCOMET-XL/XXL)
hf auth login # or: export HF_TOKEN=hf_...
# Pre-download the model manually
python -c "from comet import download_model; download_model('Unbabel/XCOMET-XL')"If the download was interrupted, the cache keeps a snapshot directory with no
checkpoints/model.ckpt in it. The server reports that path and asks you to
delete the directory; hf cache scan lists where it is.
GPU not detected
Cause: PyTorch not installed with CUDA support.
Solution:
# Check CUDA availability
python -c "import torch; print(torch.cuda.is_available())"
# If False, reinstall PyTorch with CUDA
pip install torch --index-url https://download.pytorch.org/whl/cu118Slow performance on Mac (MPS)
Cause: Mac MPS (Metal Performance Shaders) has compatibility issues with some operations.
Solution: The server automatically uses num_workers=1 for Mac MPS compatibility. For best performance on Mac, use CPU mode (use_gpu: false).
High memory usage or crashes
Cause: XCOMET-XL requires ~8-10GB RAM.
Solutions:
Use the persistent server (v0.3.0+): Model loads once and stays in memory, avoiding repeated memory spikes
Use a lighter model: Set
XCOMET_MODEL=Unbabel/wmt22-comet-dafor lower memory usage (~3GB)Reduce batch size: For large batches, process in smaller chunks (100-200 pairs)
Close other applications: Free up RAM before running large evaluations
# Check available memory
free -h # Linux
vm_stat | head -5 # macOSVS Code or IDE crashes during evaluation
Cause: High memory usage from the xCOMET model (~8-10GB for XL).
Solution:
With v0.3.0+, the model loads once and stays in memory (no repeated loading)
If memory is still an issue, use a lighter model:
XCOMET_MODEL=Unbabel/wmt22-comet-daClose other memory-intensive applications before evaluation
Getting Help
If you encounter issues:
Check the GitHub Issues
Enable debug logging (check Claude Desktop's Developer Mode logs, or set
XCOMET_DEBUG=true)Open a new issue with:
Your OS and Python version
The error message
Your configuration (without sensitive data)
🧪 Development
# Install dependencies
npm install
# Build TypeScript
npm run build
# Watch mode
npm run dev
# Run tests (Vitest)
npm test
# Run the Python-side tests (pytest only — no comet, no model)
npm run test:python
# Test with MCP Inspector
npm run inspectnpm run test:python calls python3 -m pytest, so pytest has to be importable from
whichever python3 is on your PATH. Activating the xCOMET venv does not help unless
pytest is installed in it. Any of these work:
uvx pytest tests/test_server.py -q # nothing to install
~/.xcomet-venv/bin/python -m pip install pytest # add it to the xCOMET venv
python3 -m venv .venv-dev && .venv-dev/bin/pip install pytesttests/README.md documents every suite, what it covers, and why.
📋 Changelog
See CHANGELOG.md for version history and updates.
📝 License
MIT License - see LICENSE for details.
🙏 Acknowledgments
Unbabel for the xCOMET model
Anthropic for the MCP protocol
Model Context Protocol community
📚 References
BLEU Meets COMET (Rei et al., 2023) — on neural metrics missing entity and number errors; the basis for What the score does and does not tell you
Available Tools
3 toolsxcomet_batch_evaluateBatch Evaluate TranslationsARead-onlyIdempotent
Evaluate multiple translation pairs in a batch.
This tool processes multiple source-translation pairs and provides aggregate statistics along with individual results.
Args:
pairs (array): Array of translation pairs, each with:
source (string): Original source text
translation (string): Translated text
reference (string, optional): Reference translation
source_lang (string, optional): Source language code
target_lang (string, optional): Target language code
response_format ('json' | 'markdown'): Output format (default: 'json')
use_gpu (boolean, optional): Use GPU for inference if available (default: false)
batch_size (number, optional): Inference batch size, 1-64 (default: 8). Larger = faster but uses more memory.
Returns: { "average_score": number, "total_pairs": number, "results": [ { "index": number, "score": number, "error_count": number, "has_critical_errors": boolean } ], "summary": string }
Examples:
Evaluate entire translated document
Compare MT system quality across test set
Identify segments needing attention
| Name | Required | Description | Default |
|---|---|---|---|
| pairs | Yes | Array of translation pairs to evaluate | |
| source_lang | No | Source language code | |
| target_lang | No | Target language code | |
| response_format | No | Output format | json |
| use_gpu | No | Use GPU for inference (faster if available). Default: false (CPU only) | |
| batch_size | No | Batch size for GPU processing (1-64). Larger = faster but uses more memory. Default: 8 |
Output Schema
| Name | Required | Description |
|---|---|---|
| average_score | Yes | Average quality score across all pairs |
| total_pairs | Yes | Total number of evaluated pairs |
| results | Yes | Individual results for each pair |
| summary | Yes | Overall quality summary |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds value beyond annotations by detailing GPU usage, batch size limits, and memory implications; no contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with sections, front-loaded purpose, but somewhat verbose; could trim repetitive parameter details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Fully covers all aspects given 6 params, output schema, and annotations; no gaps in usage or behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema already covers parameters well; description adds extra context like batch size range and examples, going beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool evaluates multiple translation pairs in a batch, distinguishing it from single-pair evaluate and error detection siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides examples and context but lacks explicit comparison to alternatives for when to choose batch vs single evaluate or detect-errors.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
xcomet_detect_errorsDetect Translation ErrorsARead-onlyIdempotent
Detect and categorize errors in a translation.
This tool focuses on error detection, providing detailed information about translation errors with their severity levels and positions.
Args:
source (string): Original source text
translation (string): Translated text to analyze
reference (string, optional): Reference translation
min_severity ('minor' | 'major' | 'critical'): Minimum severity to report (default: 'minor')
response_format ('json' | 'markdown'): Output format (default: 'json')
use_gpu (boolean, optional): Use GPU for inference if available (default: false)
Returns: { "total_errors": number, "errors_by_severity": { "minor": number, "major": number, "critical": number }, "errors": [ { "text": string, "start": number, "end": number, "severity": "minor" | "major" | "critical", "suggestion": string | null } ] }
Examples:
Find critical errors before publication
Identify areas needing post-editing
Quality gate for MT output
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | Original source text | |
| translation | Yes | Translated text to analyze | |
| reference | No | Optional reference translation | |
| min_severity | No | Minimum severity level to report (minor, major, critical) | minor |
| response_format | No | Output format | json |
| use_gpu | No | Use GPU for inference (faster if available). Default: false (CPU only) |
Output Schema
| Name | Required | Description |
|---|---|---|
| total_errors | Yes | Total number of errors detected |
| errors_by_severity | Yes | Error count by severity |
| errors | Yes | Detailed error list |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true, which the description does not contradict. The description adds valuable behavioral context such as the return structure (errors with severity and positions) and GPU inference capability, going beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with sections (purpose, args, returns, examples) and front-loaded with the main action. It is appropriately sized for the complexity of the tool, with no wasted sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 6 parameters, 2 required, enums, and no output schema in the input schema, the description provides complete context: behavior, parameters, output structure, and examples. Everything an agent needs to select and invoke the tool correctly is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, so baseline is 3. The description adds meaning by listing parameters with defaults and enum values, and more importantly, provides a detailed output schema in the Returns section, which is not present in the input schema. This helps the agent understand what the tool returns.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool detects and categorizes translation errors, with a specific verb and resource. It distinguishes itself from sibling tools by focusing on error detection rather than batch evaluation or overall quality scoring.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage examples (e.g., 'Find critical errors before publication', 'Quality gate for MT output'), indicating when to use the tool. However, it does not explicitly state when not to use it or compare directly with sibling tools for alternative scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
xcomet_evaluateEvaluate Translation QualityARead-onlyIdempotent
Evaluate the quality of a translation using xCOMET model.
This tool analyzes a source text and its translation, providing:
A quality score between 0 and 1 (higher is better)
Detected error spans with severity levels (minor/major/critical)
A human-readable quality summary
Args:
source (string): Original source text to translate from
translation (string): Translated text to evaluate
reference (string, optional): Reference translation for comparison
source_lang (string, optional): Source language code (ISO 639-1)
target_lang (string, optional): Target language code (ISO 639-1)
response_format ('json' | 'markdown'): Output format (default: 'json')
use_gpu (boolean, optional): Use GPU for inference if available (default: false)
Returns: For JSON format: { "score": number, // Quality score 0-1 "errors": [ // Detected errors { "text": string, "start": number, "end": number, "severity": "minor" | "major" | "critical" } ], "summary": string // Human-readable summary }
Examples:
Evaluate EN→JA translation quality
Check if MT output needs post-editing
Compare translation against reference
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | Original source text | |
| translation | Yes | Translated text to evaluate | |
| reference | No | Optional reference translation for comparison | |
| source_lang | No | Source language code (ISO 639-1, e.g., 'en', 'ja') | |
| target_lang | No | Target language code (ISO 639-1, e.g., 'en', 'ja') | |
| response_format | No | Output format: 'json' for structured data or 'markdown' for human-readable | json |
| use_gpu | No | Use GPU for inference (faster if available). Default: false (CPU only) |
Output Schema
| Name | Required | Description |
|---|---|---|
| score | Yes | Quality score between 0 and 1 |
| errors | Yes | Detected error spans |
| summary | Yes | Human-readable quality summary |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description adds that it uses xCOMET model, returns quality scores, error spans (with severity), and a summary. No contradictions; behavior is fully disclosed with no hidden side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a lead sentence, bullet points for outputs, labeled Args list, Returns section with JSON format, and usage examples. It is slightly verbose but each sentence serves a purpose, making it efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 7 parameters (2 required), 100% schema coverage, presence of output schema, and sibling tools, the description is complete: describes all parameters, return structure, usage examples, and model name. No gaps for agent decision-making.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description adds value by providing more context for each parameter (e.g., 'source: Original source text to translate from') and showing the return format with example output. This goes beyond schema terseness.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool evaluates translation quality using xCOMET model. It lists specific outputs (score, errors, summary) and examples. It distinguishes from siblings (xcomet_batch_evaluate for batch, xcomet_detect_errors for error-only) by focusing on single pair evaluation with full output.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides usage examples (evaluate EN→JA, check post-editing need, compare against reference) which imply when to use. It does not explicitly state when not to use or mention alternatives, but sibling tools are known. Still, clear context for single evaluation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
- Changed
xcomet_batch_evaluate2 fields changed- added
Output schema / properties / results / items / properties / errorsAdded value: +{ + "description": "Detected error spans for this pair", + "items": { + "additionalProperties": false, + "properties": { + "end": { + "description": "End position in translation", + "type": "number" + }, + "severity": { + "description": "Error severity level", + "enum": [ + "minor", + "major", + "critical" + ], + "type": "string" + }, + "start": { + "description": "Start position in translation", + "type": "number" + }, + "text": { + "description": "Error span text", + "type": "string" + } + }, + "required": [ + "text", + "start", + "end", + "severity" + ], + "type": "object" + }, + "type": "array" +} - changed
Output schema / properties / results / items / requiredPrevious value: -[ - "index", - "score", - "error_count", - "has_critical_errors" -]New value: +[ + "index", + "score", + "error_count", + "has_critical_errors", + "errors" +]
3 tool updates
v0.3.5- First observed
xcomet_batch_evaluate - First observed
xcomet_detect_errors - First observed
xcomet_evaluate
TDQS
Scored across 3 tools
Each tool has a clearly distinct purpose: batch evaluation, error detection, and single pair evaluation. There is no overlap; an agent can easily select the appropriate tool based on whether it needs aggregate stats, detailed error spans, or a single quality score.
All tool names follow the consistent pattern 'xcomet_<verb>' in snake_case, making it easy to predict tool functionality from the name. No mixing of conventions or irregular naming.
With 3 tools, the server is on the lower end of typical scope but still covers the core evaluation workflow. It is not unreasonably sparse; adding a few more tools (e.g., model info, comparison) would improve completeness.
The tools cover single evaluation, batch evaluation, and detailed error detection, which together address the primary use cases for translation quality assessment. Minor gaps exist, such as no tool for listing models or configuring settings, but the core functionality is present.
Maintenance
Related MCP Connectors
Translation QA: automated checks, AI evaluation, linguistic review, and visual in-context testing.
MCP server for Translation Services
Phrase MCP server: language intelligence platform for translation, terminology, and quality.
AgentQ MCP Server - AI-Powered Software Quality Assurance Platform
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables translation and text rephrasing using DeepL's API through a cloud-deployed MCP server. Provides translation between multiple languages, text rephrasing, and language detection capabilities with professional deployment features.MIT

nativ-mcpofficial
AlicenseAqualityBmaintenanceAI-powered localization platform. Translate text, search translation memory, and access style guides from any MCP-compatible AI tool.211MIT- AlicenseCqualityCmaintenanceAn MCP server for processing XLIFF and TMX translation files, enabling parsing, validation, and manipulation of translation units in localization workflows.92MIT
- AlicenseBqualityAmaintenanceSpanish dialect localization MCP server and CLI. It translates and QA-checks content across 25 regional variants with register control, structure preservation, and adversarial quality gates.164Apache 2.0