← 記事一覧に戻る

楽天RMS APIのMCPサーバーを自作して、Claude Codeから商品管理を全自動化した話
テクノロジー

楽天RMS APIのMCPサーバーを自作して、Claude Codeから商品管理を全自動化した話

ShopifyがMCPネイティブ対応を全店舗に展開した。楽天は? まだない。
だから自分で作った。

この記事では、楽天RMS APIをMCP(Model Context Protocol)サーバー化して、Claude Codeから自然言語で商品管理を操作できるようにした実装の全貌を紹介します。

楽天RMS API MCPサーバー アイキャッチ

そもそもMCPとは

MCP(Model Context Protocol)は、Anthropicが2024年11月にリリースしたオープン標準プロトコルです。LLM(大規模言語モデル)と外部ツール・データソースを統一的に接続するための仕組みで、2026年現在、公開されているMCPサーバーは3,000以上に達しています。

簡単に言えば、AIに「手」と「目」を与えるためのUSBポートのようなもの。MCPサーバーを用意すれば、AIが外部のAPIやデータベースを直接操作できるようになります。

ShopifyはもうMCP対応済み

2026年3月3日、ShopifyとGoogleは「Universal Commerce Protocol」を共同発表しました。これはMCPの上に構築されたEC特化の標準プロトコルで、ShopifyはMCPネイティブ対応を全店舗に展開済みです。

つまり、Shopifyの店舗はすでにAIエージェントから直接操作可能な状態にあるわけです。

楽天市場は?

楽天市場にはまだMCP対応がありません。RMS AIアシスタントは提供されていますが、それはRMSの管理画面内に閉じた機能。外部のAIツールからRMSの商品データを直接操作する仕組みは存在しません。

ということで、自分で作ることにしました。

MCPサーバー開発イメージ

何を作ったのか

楽天RMS API MCPサーバー

Pythonで約600行。FastMCPフレームワークを使って、楽天のItemAPI 2.0とShopAPI 1.0をMCPツールとして公開するサーバーです。

できることは以下の通り:

ツール名

機能

操作タイプ

rms_get_item

商品単件取得

読み取り

rms_search_items

条件検索(名前、価格帯、在庫状態等)

読み取り

rms_bulk_get_items

一括取得(最大50件)

読み取り

rms_upsert_item

商品登録/完全更新

書き込み

rms_patch_item

商品部分更新

書き込み

rms_delete_item

商品削除

書き込み

rms_get_shop_info

店舗情報取得

読み取り

これをClaude Codeに接続すると、自然言語で楽天の商品情報を操作できるようになります。


実際のデモ

デモ1: 商品を検索する

ユーザー: test_itemって商品探せる?

Claude Codeが即座にMCPサーバー経由で楽天RMS APIを呼び出し、商品情報を取得して表形式で表示してくれます。RMSにログインする必要すらありません。

デモ2: 商品名を変更する

ユーザー: この商品の名前、架空のサプリの名前に変えて

Claude Codeが架空のサプリ名を考案し、rms_patch_itemでAPIに直接パッチを送信。数秒で商品名が更新されます。

デモ3: 価格変更

ユーザー: この商品の販売価格を3000円にし、店舗通常価格を5000円と表示して

全SKU(red/blue)の販売価格と参考価格を一括で変更。RMSの管理画面を開くことなく、会話するだけで完了です。

デモ4: 全商品をExcelに出力

ユーザー: 全ての商品を取得してエクセルにして

127商品の全データ(22項目)を取得し、フィルター付きのExcelファイルを自動生成。RMSのCSVダウンロードより速いかもしれません。

Claude Codeでの操作デモ

技術スタック

使用技術

  • Python 3.11+
  • FastMCP — Anthropic公式のMCPサーバーフレームワーク
  • httpx — 非同期HTTPクライアント
  • Pydantic — バリデーション & 型安全
  • uv — パッケージ管理

楽天API

  • ItemAPI 2.0(JSON) — 商品のCRUD操作
  • ShopAPI 1.0(XML) — 店舗情報取得

認証

楽天RMS APIのESA認証(サービスシークレット + ライセンスキーのBase64エンコード)を使用しています。


実装のポイント

1. FastMCPでツールを定義する

FastMCPを使えば、Pythonの関数にデコレータをつけるだけでMCPツールとして公開できます。

from mcp.server.fastmcp import FastMCP

mcp = FastMCP("rakuten_rms_mcp")

@mcp.tool(
    name="rms_search_items",
    annotations={
        "readOnlyHint": True,
        "destructiveHint": False,
    },
)
async def rms_search_items(params: SearchItemsInput) -> str:
    """条件を指定して商品を検索する。"""
    query_params = params.to_query_params()
    data = await items_request("GET", "items/search", params=query_params)
    return json.dumps(data, ensure_ascii=False, indent=2)

ポイントは annotations です。readOnlyHint や destructiveHint を設定することで、LLMがツールの性質を理解し、破壊的操作の前にはユーザーに確認を求めるようになります。

2. Pydanticでバリデーション

ツールの入力をPydanticモデルで定義することで、LLMが不正なパラメータを渡してもバリデーションエラーとして処理されます。

class SearchItemsInput(BaseModel):
    title: Optional[str] = Field(default=None, description="商品名(部分一致)")
    standard_price_from: Optional[int] = Field(default=None, ge=0)
    hits: Optional[int] = Field(default=None, ge=1, le=100)

description フィールドは、LLMがツールの使い方を理解するための重要な情報源です。日本語で書いておけば、ユーザーが日本語で指示しても正しくマッピングされます。

3. エラーハンドリングを人間向けに

APIエラーをLLM(≒ユーザー)が理解できるメッセージに変換しています。

def handle_api_error(e: Exception) -> str:
    if isinstance(e, httpx.HTTPStatusError):
        status = e.response.status_code
        if status == 401:
            return "認証エラー: serviceSecretまたはlicenseKeyが無効です"
        if status == 429:
            return "レート制限: リクエスト頻度を下げてください"
    ...

MCPツールの戻り値は文字列なので、例外をraiseするのではなく、人間が読んで対処できるエラーメッセージを返すのがベストプラクティスです。

4. Claude Codeへの接続

.mcp.json に以下を追加するだけで接続完了です。

{
  "mcpServers": {
    "rakuten-rms-mcp": {
      "type": "stdio",
      "command": "uv",
      "args": [
        "run",
        "--directory",
        "/path/to/rakuten-rms-mcp",
        "mcp",
        "run",
        "server.py:mcp"
      ],
      "env": {
        "RMS_LICENSE_KEY": "your_license_key",
        "RMS_SERVICE_SECRET": "your_service_secret"
      }
    }
  }
}

これで何が変わるのか

Before: RMS管理画面での手動作業

  1. RMSにログイン
  2. 商品管理画面を開く
  3. 商品を検索
  4. 1商品ずつ編集画面を開いて修正
  5. 保存

× 商品数が多いと地獄

After: Claude Codeに話しかけるだけ

  1. 「全商品の価格を10%値上げして」
  2. 完了

○ 自然言語で一括操作


Easy Creativeでの活用

私たちが開発している「Easy Creative(イージークリエイティブ)」は、楽天市場の出品者向けA/Bテスト・クリエイティブ最適化SaaSです。

このMCPサーバーの技術をベースに、以下のような機能を提供・開発中です:

  • 商品画像のA/Bテスト自動化 — 画像を差し替えて効果を自動測定
  • AI画像生成 — 楽天に最適化されたサムネイルをAIが自動生成
  • RPP広告効果測定 — 広告パフォーマンスの可視化

楽天の売上を伸ばしたい方は、14日間無料でお試しいただけます。

▶ Easy Creativeを無料で試す

Easy Creative サービス紹介

まとめ

  • MCPはLLMと外部ツールをつなぐ標準プロトコル。ShopifyはすでにMCP対応済み
  • 楽天RMS APIをMCPサーバー化することで、Claude Codeから自然言語で商品管理が可能に
  • Python約600行、FastMCPを使えば1日で動くものができる
  • 「RMSにログインして手動で商品編集」の時代は、そろそろ終わりかもしれない

楽天のEC運営にAIを活用したい方、ぜひ試してみてください。


この記事は株式会社UFASが運営するEasy Creative開発チームによるものです。