こんにちは。株式会社船井総合研究所でデータ分析を担当している平尾です。
今回は、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"))
# 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パッケージ&プロジェクトマネージャーをご覧ください。
# 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サーバーを以下のように起動します。
そうすると、以下の画面がでてきます。
その中のhttpで始まるURLをクリックします。
ブラウザに以下の画面が開きます。
黒いボタン「Connect」をクリックします。
Toolsの赤丸のボタンをクリックします。
項目を全て入力し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 )
それでは、実際に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サーバーを以下のように起動します。(ファイル名を変更しました。)
Claudeを開き、左上の三本線のマークから「設定」をクリックします。
claude_desktop_config_jsonを開き、以下のように設定します。
(参考:リモートで動作する MCP Server を実装し、Claude アプリから呼び出してみる)
{
"mcpServers": {
"predict": {
"command": "npx",
"args": [
"mcp-remote",
"http://localhost:8000/sse"
]
}
}
}
再度Claudeを立ち上げると、設定画面が以下のようになっています。
さて、ようやく用意ができました。
以下のように指示を与えてみます。
(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 これらの値で予測値を出してください」
予測値は、先ほどのMCP Inspectorでの結果と一致しています。
では、「では40歳女性の場合はどうですか?」と追加で聞いてみます。
先ほど与えた値のうち、年齢と性別だけ変更して予測値を出してくれました。
実は、ClaudeとMCPを繋げる段階で非常に苦労しました。
claude_desktop_config.jsonをどう書き換えても、Claudeを再インストールしてもずっと繋がりませんでした。
実は、「リモートで動作する MCP Server を実装し、Claude アプリから呼び出してみる」にある通り、今までの方法ではClaudeを MCP接続できなくなったようです。
そのため、上記サイトのclaude_desktop_config.jsonの書き方を試すまでは
繋がりませんでした。
(しかし、私の場合今でもチャット入力欄にトンカチマークはでてきません。MCP接続できるとトンカチマークが出てくるようです。)
Views: 1