Mirai Translate TECH BLOG

株式会社みらい翻訳のテックブログ

みらい翻訳APIを使った翻訳MCPサーバを構築する

MCPサーバとは

MCP(Model Context Protocol)サーバとは、ChatGPTやClaude Desktop等のLLMを組み込んだアプリケーションが、外部のコンピュータシステムの機能(データベースや、REST APIサーバやOSのAPI等)と接続するために使用するサーバです。

一般的には、下図のように、LLMアプリケーションとMCPサーバが接続され、MCPサーバがデータベースやAPIサーバ等の外部システムと接続されます。

みらい翻訳APIサービスについて

本記事では、みらい翻訳APIサービスを利用した翻訳MCPサーバの構築方法について説明します。

みらい翻訳APIサービスは、高精度翻訳AIに加えて、特許・法務に特化した翻訳AIを提供するAPIサービスです。多言語対応の翻訳APIを提供しており、ビジネス文書や技術文書の翻訳に適しています。また、用語集などで翻訳結果をコントロールすることで自社の社内用語に合わせた翻訳を行うこともできます。

構築するシステムの構成は以下の通りになります。

これによりLLMのアプリケーションの中でも、ビジネスや技術文書に特化した高精度な翻訳を実現することが可能になります。

MCPの公式SDKを使った翻訳MCPサーバの構築

では、ここからみらい翻訳APIを使った翻訳MCPサーバの構築方法について説明します。本記事では、MCPの公式のMCP Python SDKを使って、みらい翻訳APIを呼び出すMCPサーバを構築します。

プロジェクトの作成

最初に、MCPサーバのプロジェクトを作成します。以下のuvコマンドを実行して、プロジェクトを作成します。

uv init --package miraitranslate-mcp-server 

次に、プロジェクトのディレクトリに移動して、必要なパッケージを追加します。

cd miraitranslate-mcp-server
uv add "mcp[cli]" "requests"

みらい翻訳APIクライアントの実装

開発の準備が完了したので、みらい翻訳APIを呼び出すクライアントを実装します。みらい翻訳APIの仕様書を参照しながら、src/miraitranslate_mcp_server/client.pyを作成して以下のコードを記述します。このコードは単純なREST APIクライアントですので、特に難しいことはありません。

from dataclasses import dataclass
from typing import List, Optional, Dict, Any
import requests
from urllib.parse import urljoin


@dataclass
class UserOption:
    concat: bool = True
    adapt_phrases: Optional[List[Dict[str, str]]] = None
    jastyle: Optional[str] = None


class MiraiTranslateClient:
    def __init__(
        self,
        base_url: str,
        subscription_key: str,
        lang_from: str,
        lang_to: str,
        profile: str = "default",
    ):
        """
        みらいPFテキスト翻訳APIクライアント

        Args:
            base_url: APIのベースURL
            subscription_key: 認証用のサブスクリプションキー
            lang_from: 原文言語コード
            lang_to: 訳文言語コード
            profile: プロファイル名
        """
        self.base_url = base_url
        self.subscription_key = subscription_key
        self.lang_from = lang_from
        self.lang_to = lang_to
        self.profile = profile

    def translate(
        self,
        sources: List[str],
        user_options: Optional[UserOption] = None,
        ud_ids: Optional[List[str]] = None,
        tm_ids: Optional[List[str]] = None,
        user_log: Optional[str] = None,
        app_id: Optional[str] = None,
    ) -> Dict[str, Any]:
        """
        テキストを翻訳する

        Args:
            sources: 翻訳する原文のリスト
            user_options: 翻訳オプション
            ud_ids: ユーザ辞書IDのリスト
            tm_ids: 翻訳メモリIDのリスト
            user_log: サーバログに記載される任意の文字列
            app_id: サーバログに記載される任意の文字列

        Returns:
            原文・訳文などのデータを含む翻訳処理結果
        """
        if not user_options:
            user_options = UserOption()

        url = urljoin(self.base_url, "/mt/v2/translate")
        params = {
            "subscription-key": self.subscription_key,
            "langFrom": self.lang_from,
            "langTo": self.lang_to,
            "profile": self.profile,
        }

        payload = {
            "sources": sources,
            "user-options": {
                "concat": user_options.concat,
            }
        }

        if user_options.adapt_phrases:
            payload["user-options"]["adaptPhrases"] = user_options.adapt_phrases
        if user_options.jastyle:
            payload["user-options"]["jastyle"] = user_options.jastyle
        if ud_ids:
            payload["udIds"] = ud_ids
        if tm_ids:
            payload["tmIds"] = tm_ids
        if user_log:
            payload["userLog"] = user_log
        if app_id:
            payload["appId"] = app_id

        response = requests.post(url, params=params, json=payload)
        response.raise_for_status()
        return response.json()

MCPサーバからみらい翻訳APIクライアントの呼び出しの実装

MCPサーバ内のクライアントクラスからみらい翻訳APIを呼び出す部分の実装は完了しました。次に、このクライアントを使ったMCPサーバの実装を行います。src/miraitranslate_mcp_server/server.pyを作成して以下のコードを記述します。

from mcp.server.fastmcp import FastMCP
import os

from miraitranslate_mcp_server.client import MiraiTranslateClient

# みらい翻訳APIのベースURLとサブスクリプションキーは環境変数から取得します。
base_url = os.getenv("MIRAITRANSLATE_API_BASE_URL")
subscription_key = os.getenv("MIRAITRANSLATE_SUBSCRIPTION_KEY")

mcp = FastMCP("Translation MCP Server")  # 1. MCPサーバのインスタンスを作成

# 2. MCPのツールの定義。Docstringを使って、ツールの説明を記述します。この説明は、MCPクライアントのLLMが読み取って呼び出しを判断しますので、過不足のない厳密な仕様を記述してください。
@mcp.tool()
def translate(text: str, source_language: str, target_language: str) -> str:
    """
    指定された言語ペアでテキストを翻訳します。

    Args:
        text: 翻訳するテキスト
        source_language: 原文言語コード。以下のいずれかを指定します。
            - en: 英語
            - ja: 日本語
            - zh: 中国語
        target_language: 訳文言語コード。以下のいずれかを指定します。
            - en: 英語
            - ja: 日本語
            - zh: 中国語

    Returns:
        翻訳結果
    """
    client = MiraiTranslateClient(
        base_url=base_url,
        subscription_key=subscription_key,
        lang_from=source_language,
        lang_to=target_language,
        profile="default"
    )
    logging.info(f"base_url: {base_url}, subscription_key: {subscription_key}, source_language: {source_language}, target_language: {target_language}, text: {text}")
    result = client.translate(sources=[text])
    return result["translations"][0]

def main() -> None:
    mcp.run()

1.では、MCPサーバのインスタンスを作成しています。FastMCPMCPサーバの実装を簡単にするためのクラスです。

2.では、MCPのツールを定義しています。このツールは、指定された言語ペアでテキストを翻訳する機能を提供します。MiraiTranslateClientを使って、みらい翻訳APIを呼び出し、翻訳結果を返します。

MCPのサーバ(今回作成するサーバ)とMCPのクライアント(Cursor等のLLMアプリケーション)は、最初に下図のようなやり取りを行います。

上記のレスポンスの初期化では、MCPサーバが提供するツール(@mcp.tool()でデコレーションされた関数)等の情報をMCPクライアントに通知します。(SDKを使う場合は、開発者はこの通知の実装は特に意識しません。) LLMアプリケーションは、この情報をもとにMCPサーバが提供する機能を呼び出します。

MCPサーバが提供する機能には以下のようなものがあります。

  • tools: @mcp.tool()でデコレーションされた関数で、外部システムで計算や処理を行うための機能
  • resources: @mcp.resource()でデコレーションされた関数で、ファイルの内容やデータベースの内容等を取得するための機能
  • prompts: @mcp.prompt()でデコレーションされた関数で、LLMに対してプロンプトを提供するための機能

最後にsrc/miraitranslate_mcp_server/__init__.pyを編集して、MCPサーバのパッケージを初期化します。

import miraitranslate_mcp_server.server as server

def main() -> None:
    server.main()

MCPサーバを接続

翻訳MCPサーバの実装が完了したので、次にLLMアプリケーションと接続します。ここでは、Cursorを使った接続方法を説明します。

Cursorを起動して、右上の歯車のアイコンをクリックしCursor Settings画面を開き、MCP Toolsを選択します。

Add Custom MCPをクリックして、以下のように設定します。

{
  "mcpServers": {
    "みらい翻訳": {
      "command": "uv",
      "args": [
        "run",
        "--directory",
        "/<MCPサーバのパス>/miraitranslate-mcp-server",
        "miraitranslate-mcp-server"
      ],
      "env": {
        "MIRAITRANSLATE_API_BASE_URL": "<みらい翻訳APIのベースURL>",
        "MIRAITRANSLATE_SUBSCRIPTION_KEY": "<みらい翻訳APIのサブスクリプションキー>"
      }
    }
  }
}

<MCPサーバのパス>は、MCPサーバのプロジェクトディレクトリのパスに置き換えてください。<みらい翻訳APIのベースURL><みらい翻訳APIのサブスクリプションキー>は、みらい翻訳APIサービスの設定に従って適切な値を設定してください。

Windows環境でCursorを使用していて、みらい翻訳MCPサーバをWSL上で実行している場合は、以下のように設定します。

{
  "mcpServers": {
    "みらい翻訳": {
      "command": "wsl.exe",
      "args": [
        "bash -c 'UV_ENV_FILE=/<MCPサーバのパス>/miraitranslate-mcp-server/.env /<uvコマンドへのパス>/uv run --directory /<MCPサーバのパス>/miraitranslate-mcp-server miraitranslate-mcp-server'"
      ]
    }
  }
}

.envファイルは以下のように作成します。

MIRAITRANSLATE_API_BASE_URL=<みらい翻訳APIのベースURL>
MIRAITRANSLATE_SUBSCRIPTION_KEY=<みらい翻訳APIのサブスクリプションキー>

翻訳MCPサーバの呼び出し例

設定が完了したら、CursorのChat画面で以下のように入力して翻訳MCPサーバを呼び出します。(この文章は弊社のVISONです。)

みらい翻訳で以下を英語に翻訳してください。
---
言語の壁を超え、新しい生活と仕事の様式をもたらす共通語の機能を機械翻訳として2028年までに作る。

以下の画面のように、翻訳結果が表示されます。

ちなみに、Mirai TranslatorのWeb版でも同じ翻訳結果が得られます。

まとめ

本記事では、みらい翻訳APIを使った翻訳MCPサーバの構築方法について説明しました。MCPサーバを使うことで、LLMアプリケーションから外部システムの機能を簡単に呼び出すことができ、ビジネスや技術文書の翻訳に特化した高精度な翻訳を実現することが可能になります。