Comprehensive Model Context Protocol server for Weblate translation management, enabling AI assistants to perform translation tasks, project management, and content discovery with smart format transformations.
A Model Context Protocol (MCP) server that provides seamless integration with Weblate translation management platform. This server enables AI assistants to interact directly with your Weblate instance for comprehensive translation management.
This MCP server acts as a bridge between AI assistants (like Claude Desktop) and your Weblate translation management platform. Instead of manually navigating the Weblate web interface, you can use natural language to:
The easiest way to use this MCP server is with npx - no installation required!
For Claude Desktop or other MCP clients:
{
"mcpServers": {
"weblate": {
"command": "npx",
"args": ["-y", "@mmntm/weblate-mcp"],
"env": {
"WEBLATE_API_URL": "https://your-weblate-instance.com/api",
"WEBLATE_API_TOKEN": "your-weblate-api-token"
}
}
}
}
Manual testing:
# Test the server directly
npx @mmntm/weblate-mcp
# Clone and install
git clone <this-repo>
cd weblate-mcp
pnpm install
# Configure environment
cp .env.example .env
# Edit .env with your Weblate API URL and token
# Build and start
pnpm build
pnpm start
Server runs on http://localhost:3001
by default.
WEBLATE_API_URL=https://your-weblate-instance.com
WEBLATE_API_TOKEN=your-api-token-here
PORT=3001
NODE_ENV=production
LOG_LEVEL=info
Add to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json
):
{
"mcpServers": {
"weblate": {
"command": "npx",
"args": ["-y", "@mmntm/weblate-mcp"],
"env": {
"WEBLATE_API_URL": "https://your-weblate-instance.com/api",
"WEBLATE_API_TOKEN": "your-weblate-api-token"
}
}
}
}
For development or local builds:
{
"mcpServers": {
"weblate": {
"command": "node",
"args": ["/path/to/weblate-mcp/dist/main.js"],
"env": {
"WEBLATE_API_URL": "https://your-weblate-instance.com/api",
"WEBLATE_API_TOKEN": "your-api-token"
}
}
}
}
{
"transport": "http",
"url": "http://localhost:3001/mcp"
}
Tool | Description |
---|---|
listProjects |
List all available Weblate projects with URLs and metadata |
Tool | Description |
---|---|
listComponents |
List components in a specific project with source language details |
Tool | Description |
---|---|
searchUnitsWithFilters β |
Efficient search using Weblate's native filtering syntax |
searchStringInProject |
Search for translations containing specific text in a project |
getTranslationForKey |
Get translation value for a specific key |
writeTranslation |
Update or write translation values with approval support |
bulkWriteTranslations β‘ |
Batch update multiple translations efficiently with error handling |
findTranslationsForKey |
Find all translations for a specific key across languages |
The searchUnitsWithFilters
tool uses Weblate's native filtering syntax, making it the most efficient way to find translations:
Example efficient queries:
state:=0
- Find untranslated stringsstate:=10
- Find strings that need editingsource:"login"
- Find strings containing "login"component:common AND state:=0
- Complex filtersTool | Description |
---|---|
listLanguages |
List languages available in a specific project |
Tool | Description |
---|---|
getProjectStatistics |
Comprehensive project statistics with completion rates and string counts |
getComponentStatistics |
Detailed statistics for a specific component |
getProjectDashboard |
Complete dashboard overview with all component statistics |
getTranslationStatistics |
Statistics for specific translation (project/component/language) |
getComponentLanguageProgress |
Translation progress for all languages in a component with progress bars |
getLanguageStatistics |
Statistics for a language across all projects |
getUserStatistics |
User contribution statistics and activity metrics |
Tool | Description |
---|---|
listRecentChanges |
Recent changes across all projects with user and timestamp filtering |
getProjectChanges |
Recent changes for a specific project |
getComponentChanges |
Recent changes for a specific component |
getChangesByUser |
Recent changes by a specific user |
// List all projects
await list_projects();
// Get specific project details
await get_project({ slug: "my-project" });
// Create a new project
await create_project({
name: "New Project",
slug: "new-project",
web: "https://example.com"
});
// List translations for a component
await list_translations({
project_slug: "my-project",
component_slug: "frontend"
});
// Get specific translation
await get_translation({
project_slug: "my-project",
component_slug: "frontend",
language_code: "fr"
});
// Update translations
await update_translation({
project_slug: "my-project",
component_slug: "frontend",
language_code: "fr",
translations: {
"welcome": "Bienvenue",
"goodbye": "Au revoir"
}
});
Document | Description |
---|---|
π Documentation Hub | Complete documentation overview and quick start |
π Installation & Setup | Installation, configuration, and Claude Desktop setup |
π API Reference | Complete API documentation with examples |
π οΈ Development Guide | Contributing, development setup, and testing |
ποΈ Architecture | Codebase structure, patterns, and design decisions |
π¦ Release Process | Release management and publishing workflow |
π Changesets Guide | Version management with changesets |
βββββββββββββββββββ ββββββββββββββββββββ βββββββββββββββββββ
β MCP Client βββββΆβ Weblate MCP βββββΆβ Weblate API β
β (IDE/Editor) β β Server β β (REST API) β
βββββββββββββββββββ ββββββββββββββββββββ βββββββββββββββββββ
β
βΌ
ββββββββββββββββββββ
β MCP Tools β
β β’ Projects β
β β’ Components β
β β’ Translations β
β β’ Languages β
ββββββββββββββββββββ
Technology Stack:
# Start development server with hot reload
pnpm run dev
# Run tests
pnpm test
# Run end-to-end tests
pnpm run test:e2e
# Generate test coverage
pnpm run test:cov
# Build for production
pnpm build
src/tools/
See Development Guide for detailed instructions.
We welcome contributions! Please see our Contributing Guidelines:
MIT License - see LICENSE file for details.
Built with β€οΈ for the translation community
Need help? Check our documentation or create an issue!