languages.pyโข5.34 kB
"""Language management tools for POEditor MCP server."""
from typing import Any, Dict, List
from mcp.types import Tool, TextContent, INVALID_PARAMS
from mcp import McpError
from ..poeditor_client import POEditorClient, POEditorError
def get_language_tools() -> List[Tool]:
"""Get all language-related tools."""
return [
Tool(
name="list_languages",
description="List languages in a project",
inputSchema={
"type": "object",
"properties": {
"project_id": {
"type": "string",
"description": "Project ID"
}
},
"required": ["project_id"]
}
),
Tool(
name="add_language",
description="Add a language to a project",
inputSchema={
"type": "object",
"properties": {
"project_id": {
"type": "string",
"description": "Project ID"
},
"language_code": {
"type": "string",
"description": "Language code (e.g., 'en', 'es', 'fr')"
}
},
"required": ["project_id", "language_code"]
}
),
Tool(
name="delete_language",
description="Delete a language from a project",
inputSchema={
"type": "object",
"properties": {
"project_id": {
"type": "string",
"description": "Project ID"
},
"language_code": {
"type": "string",
"description": "Language code"
}
},
"required": ["project_id", "language_code"]
}
)
]
async def handle_list_languages(
client: POEditorClient,
arguments: Dict[str, Any]
) -> List[TextContent]:
"""Handle list_languages tool call."""
project_id = arguments.get("project_id")
if not project_id:
raise McpError(INVALID_PARAMS, "project_id is required")
try:
languages = await client.list_languages(project_id)
if not languages:
return [TextContent(
type="text",
text=f"No languages found in project {project_id}."
)]
output = f"**Languages in Project {project_id}:**\n\n"
for lang in languages:
name = lang.get('name', 'Unknown')
code = lang.get('code', 'unknown')
percentage = lang.get('percentage', 0)
output += f"- **{name}** ({code}): {percentage}% translated\n"
return [TextContent(type="text", text=output)]
except POEditorError as e:
raise McpError(INVALID_PARAMS, f"POEditor API error: {e}")
except Exception as e:
raise McpError(INVALID_PARAMS, f"Unexpected error: {e}")
async def handle_add_language(
client: POEditorClient,
arguments: Dict[str, Any]
) -> List[TextContent]:
"""Handle add_language tool call."""
project_id = arguments.get("project_id")
language_code = arguments.get("language_code")
if not project_id:
raise McpError(INVALID_PARAMS, "project_id is required")
if not language_code:
raise McpError(INVALID_PARAMS, "language_code is required")
try:
result = await client.add_language(project_id, language_code)
output = f"**Language Added Successfully!**\n\n"
output += f"- **Project ID:** {project_id}\n"
output += f"- **Language Code:** {language_code}\n"
return [TextContent(type="text", text=output)]
except POEditorError as e:
raise McpError(INVALID_PARAMS, f"POEditor API error: {e}")
except Exception as e:
raise McpError(INVALID_PARAMS, f"Unexpected error: {e}")
async def handle_delete_language(
client: POEditorClient,
arguments: Dict[str, Any]
) -> List[TextContent]:
"""Handle delete_language tool call."""
project_id = arguments.get("project_id")
language_code = arguments.get("language_code")
if not project_id:
raise McpError(INVALID_PARAMS, "project_id is required")
if not language_code:
raise McpError(INVALID_PARAMS, "language_code is required")
try:
success = await client.delete_language(project_id, language_code)
if success:
output = f"**Language {language_code} deleted successfully from project {project_id}!**"
else:
output = f"**Failed to delete language {language_code} from project {project_id}**"
return [TextContent(type="text", text=output)]
except POEditorError as e:
raise McpError(INVALID_PARAMS, f"POEditor API error: {e}")
except Exception as e:
raise McpError(INVALID_PARAMS, f"Unexpected error: {e}")
# Tool handler mapping
LANGUAGE_HANDLERS = {
"list_languages": handle_list_languages,
"add_language": handle_add_language,
"delete_language": handle_delete_language,
}