8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MCPを使って機械学習してみた!

Last updated at Posted at 2025-05-29

はじめに

こんにちは。株式会社船井総合研究所でデータ分析を担当している平尾です。
今回は、MCPを用いて機械学習による計算を行ってみました。

scikit-learnのdiabetesデータを用いてXGBoostにより
予測モデルを作成し、それをMCPに組み込みました。

モデルの準備

前回の記事(グリッドサーチとOptunaを実際に使って比較してみた!)と同じようにデータフレームを作成します。「データの準備」をご覧ください。

続いて、同記事の「パラメータ比較」の「Optuna」列に記載の通りに
モデルのパラメータを設定し、モデルを作成します。

import xgboost as xgb

model = xgb.XGBRegressor(
    objective='reg:squarederror',
    booster="gbtree",                               
    n_estimators=100,                                                                 
    learning_rate=0.068,
    max_depth=2,
    min_child_weight=4,
    subsample=0.22,
    colsample_bytree=0.85,
    reg_lambda=7,
)
model.fit(X,y)
pickle.dump(model, open(f"model.pickle", "wb"))

MCP実行環境の準備

# Pythonプロジェクト作成
uv init hellomcp
cd hellomcp

# 仮装環境作成
uv venv
source .venv/bin/activate

# MCPサーバーのPython SDKをインストール
uv add "mcp[cli]"

MCPサーバーのテストツール"MCP Inspector"の使い方より引用
uvのインストールに関しては、uvの使い方: Pythonパッケージ&プロジェクトマネージャーをご覧ください。

MCPサーバーの構築

# simple_calculator_server.py
from mcp.server.fastmcp import FastMCP
import logging
import pickle
import pandas as pd
import xgboost

logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

# サーバーインスタンスの作成
mcp = FastMCP(
    name="calculator",
    description="糖尿病進行度を予測します",
)

@mcp.tool()
async def calculate(age: int, sex: str, bmi:float, bp:float, tc:int, ldl:float, hdl:float, tch:float, ltg:float, glu:int) -> float:
    
    # 男性の場合は1、女性の場合は2に変換
    if sex == '男性':
        sex = 1
    else:
        sex = 2

    # データの正規化
    age = (age-48.5180995)/13.1090278 
    sex = (sex-1.4683258)/0.4995612
    bmi = (bmi-26.3757919)/4.4181216
    bp = (bp-94.6470136)/13.8312834
    tc = (tc-189.1402715)/34.6080517
    ldl = (ldl-115.4391403)/30.4130810
    hdl = (hdl-49.7884615)/12.9342022
    tch = (tch-4.0702489)/1.2904499
    ltg = (ltg-4.6414109)/0.5223906
    glu = (glu-91.2601810)/11.4963347

    # 列名とデータ型を指定
    data = {
        "age":age,
        "sex": sex,
        "bmi": bmi,
        "bp": bp,
        "tc": tc,
        "ldl": ldl,
        "hdl":hdl,
        "tch":tch,
        "ltg":ltg,
        "glu":glu
    }

    # データフレームを作成
    index = [0]  
    df = pd.DataFrame(data, index=index)
    
    loaded_model = pickle.load(open("model.pickle", "rb"))
    prediction = loaded_model.predict(df)
    return prediction

if __name__ == "__main__":
    logger.info("糖尿病進行度を予測します")
    mcp.run()

コーディングは以下の記事を参考にしています。
Part1 : Azure AI Foundry で MCPを使ってみた【深掘りと最新動向調査】
(Stdioサーバー実装例 (Python FastMCP))

また、データの正規化に用いる平均値、標準偏差に関しては、
Diabetes dataの「Proc Means and Proc Print Output」のデータを用いています。

性別に関しては、元データが1,2というように表されており、それぞれの数字がどちらの性別を示すかは調べてもわかりませんでした。
そのため、ここでは男性を1、女性を2として設定しました。

toolの中身を説明します。
説明変数を入力するとそれぞれ標準化され、
説明変数のデータフレームが作成されます。

そのデータフレームがモデルに読み込まれ、
目的変数である糖尿病進行度が出力されます。

MCPサーバーをMCP Inspectorで動かしてみる

まず、MCPサーバーを以下のように起動します。

mcp dev diabetes.py

そうすると、以下の画面がでてきます。
その中のhttpで始まるURLをクリックします。

スクリーンショット 2025-05-20 135654.png

ブラウザに以下の画面が開きます。
黒いボタン「Connect」をクリックします。
スクリーンショット 2025-05-20 135815.png

Toolsの赤丸のボタンをクリックします。

スクリーンショット 2025-05-20 135954.png

赤丸の「calculate」をクリックします。
スクリーンショット 2025-05-20 140155.png

右側に説明変数を入力する画面が出てきます。
スクリーンショット 2025-05-28 185527.png

項目を全て入力しRun Toolを押すと、計算結果が出力されます。
(ここでは、以下のように値を与えています。
age: 24, sex: 男性 ,bmi:30,bp:90.4, tc:200, ldl:120.9, hdl:78.3, tch:5.6, ltg:3.2, glu:80 )

スクリーンショット 2025-05-28 164026.png

MCPサーバーをClaudeに接続

それでは、実際にMCPサーバーをClaudeに接続してみます。
Claudeに各説明変数を与えて、会話ベースで目的変数を出してもらうようにします。

まず、Pythonファイルの一部を書き換えます。
(参考:リモートで動作する MCP Server を実装し、Claude アプリから呼び出してみる)

書き換え前

if __name__ == "__main__":
    logger.info("糖尿病進行度を予測します")
    mcp.run()

書き換え後

def main():
    mcp.run(transport='sse')

if __name__ == "__main__":
    logger.info("糖尿病進行度を予測します")
    main()

MCPサーバーを以下のように起動します。(ファイル名を変更しました。)

python diabetes_sse.py  

Claudeを開き、左上の三本線のマークから「設定」をクリックします。
スクリーンショット 2025-05-28 162149.png

「構成を編集」をクリックします。
スクリーンショット 2025-05-28 161719.png

claude_desktop_config_jsonを開き、以下のように設定します。
(参考:リモートで動作する MCP Server を実装し、Claude アプリから呼び出してみる)

{
    "mcpServers": {
        "predict": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "http://localhost:8000/sse"
            ]
        }
    }
}

左上の三本線のマークから「終了」をクリックします。
スクリーンショット 2025-05-28 162214.png

再度Claudeを立ち上げると、設定画面が以下のようになっています。
スクリーンショット 2025-05-28 163012.png

さて、ようやく用意ができました。

以下のように指示を与えてみます。
(MCPInspectorで与えた値と同じです。)
「age: 24, sex: 男性 ,bmi:30,bp:90.4, tc:200, ldl:120.9, hdl:78.3, tch:5.6, ltg:3.2, glu:80 これらの値で予測値を出してください」
スクリーンショット 2025-05-29 100825.png

許可をしてください。
スクリーンショット 2025-05-29 100912.png

すると以下のように予測値を返してくれます。
スクリーンショット 2025-05-29 100957.png

予測値は、先ほどのMCP Inspectorでの結果と一致しています。

では、「では40歳女性の場合はどうですか?」と追加で聞いてみます。
スクリーンショット 2025-05-29 101212.png
先ほど与えた値のうち、年齢と性別だけ変更して予測値を出してくれました。

おわりに

実は、ClaudeとMCPを繋げる段階で非常に苦労しました。
claude_desktop_config.jsonをどう書き換えても、Claudeを再インストールしてもずっと繋がりませんでした。

実は、「リモートで動作する MCP Server を実装し、Claude アプリから呼び出してみる」にある通り、今までの方法ではClaudeを MCP接続できなくなったようです。

そのため、上記サイトのclaude_desktop_config.jsonの書き方を試すまでは
繋がりませんでした。

(しかし、私の場合今でもチャット入力欄にトンカチマークはでてきません。MCP接続できるとトンカチマークが出てくるようです。)

8
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?