社内システムと会話する!Jinjer APIのMCPサーバーを自作してClaude Desktopと連携させてみた

はじめに

最近話題の Model Context Protocol (MCP) 。これを使うと、Claude DesktopなどのAIアシスタントがローカルツールや外部APIと直接会話できるようになります。

今回は、バックオフィス向けクラウドサービス 「Jinjer」のAPI をMCPサーバー化し、Claude Desktopから従業員情報を直接検索・取得できるようにした過程を共有します。

今回の成果物

Claude Desktopに「退職済みの従業員リストをちょうだい」や「2024年に入社した山田さんを探して」と頼むだけで、Jinjerから最新データを取得して回答してくれるようになります。

使用した技術スタック

  • Python 3.12+
  • uv: 高速なPythonパッケージ管理ツール
  • FastMCP: MCPサーバーを簡単に書くためのライブラリ (mcp パッケージに含まれます)
  • Jinjer API: 今回の連携先

1. プロジェクトのセットアップ (uvを使用)

今回はパッケージ管理に uv を使用しました。セットアップが爆速で快適です。

# プロジェクト作成
mkdir jinjer-mcp-server
cd jinjer-mcp-server
uv init .

# 必要なライブラリのインストール
uv add "mcp[cli]" httpx

2. 認証ロジックの実装

Jinjer APIは、APIキーとシークレットキーを使って一時的な「アクセストークン」を取得し、それを使って各エンドポイントを叩く仕組みです。
毎回トークンを取りに行くと効率が悪いので、有効期限内(4時間)は使い回すロジックを実装しました。

# server.py (抜粋)
def _get_token(self) -> str:
    current_time = time.time()
    # トークンがあり、有効期限切れまで余裕があれば再利用
    if self.access_token and current_time < self.token_expiry - 300:
        return self.access_token

    # 新しいトークンを取得 (/v2/token)
    response = self.client.get(...)
    # ... (エラー処理とトークン保存)
    return self.access_token

3. MCPツールの実装

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

従業員ID一覧の取得 (list_employee_ids)

まずは基本のID一覧取得です。

@mcp.tool()
def list_employee_ids(
    page: int = 1,
    employee_id: Optional[str] = None,
    # ... 他のパラメータ
) -> str:
    """従業員ID一覧を取得します"""
    # ... APIリクエスト処理

従業員詳細情報の取得 (list_employees)

次に、より詳細な情報(氏名、入社日など)を取得するツールも追加しました。検索パラメータを豊富に用意することで、Claudeが柔軟に検索できるようになります。

@mcp.tool()
def list_employees(
    employee_last_name: Optional[str] = None, # 名字で検索
    has_since_changed_at: Optional[str] = None, # 更新日で絞り込み
    # ...
) -> str:
    """従業員情報を取得します"""
    # ...

4. Claude Desktopへの登録

作成したサーバーをClaude Desktopに認識させるため、設定ファイル (claude_desktop_config.json) を編集します。
uv 経由で実行する設定にしておけば、仮想環境のパスを気にせず実行できて便利です。

{
  "mcpServers": {
    "jinjer": {
      "command": "uv",
      "args": [
        "--directory",
        "C:/path/to/jinjer-mcp-server",
        "run",
        "server.py"
      ],
      "env": {
        "JINJER_API_KEY": "YOUR_API_KEY",
        "JINJER_SECRET_KEY": "YOUR_SECRET_KEY"
      }
    }
  }
}

5. 実際に動かしてみる

設定を保存してClaude Desktopを再起動すると、チャット入力欄の右側にツールアイコン(コンセントのマーク)が表示されます。

ユーザー: 「2023年以降に入社した、田中という名前の従業員を探して」

Claude Desktop: (ツール list_employees を実行…)
「以下の従業員が見つかりました:
1. 田中 太郎 (2023-04-01 入社)
2. 田中 花子 (2023-10-01 入社)」

このように、自然言語でJingerのDBを検索できるようになりました!

実際の画面はこちら

mcpサーバのツールをたたいています

一覧が取得されました。なお、架空の名前に変換してます

まとめ

MCPを使うことで、独自のAPIを驚くほど簡単にLLMと連携させることができました。
特に FastMCPuv の組み合わせは開発体験が良く、サクッとツールを作るのに最適です。

さらに、APIの仕様をAIに読み込ませながら実装すれば、コードを書く必要もありません。

次は勤怠データ取得なども実装して、さらに便利にしてみたいと思います


コメント

タイトルとURLをコピーしました