mcpField
G
glin

glin

ローカル
github.com/AkashChatterjeeデータ・分析01 週間前に更新

glin について

glinは、AIエージェントがCSVまたはExcelデータで説明可能な分類器を学習・利用するためのローカルMCPサーバーです。Explainable Boosting Machineによる予測には、SHAPやLIMEの近似ではなく、モデル構造に基づく正確な特徴別の理由が付属します。

主な機能

  1. 01CSVまたはExcelで分類器を学習
  2. 02単一または複数ケースを予測
  3. 03加法構造に基づく正確な特徴説明
  4. 04ホールドアウトデータでモデル評価
  5. 05ハイパーパラメーターの調整
  6. 06ローカルモデルの保存と管理

活用シーン

  1. 01見込み客や顧客離反の分類
  2. 02予測に基づく案件の優先順位付け
  3. 03モデル結果を左右する要因の確認

MCP 対応

glinはstdioで動作し、モデルの学習、予測、説明、調整、管理ツールをMCPクライアントに公開します。データと保存モデルはローカルに保持されます。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"akashchatterjee-glin": {
"command": "uvx",
"args": [
"glin-ml"
]
}
}
}
起動コマンドuvx glin-ml

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
pypiglin-ml0.1.5

ツール

6

掲載時のツール一覧 · 2 週間前に更新

このツールにパラメーターはありません。

詳細

翻訳後に原文が更新されています。最新の内容は原文をご確認ください。

glin

☕ glin が役に立ち、メンテナンスを支援したいと思われたら、コーヒーをごちそうしてください。

glin はMCPプラグインです。AI エージェントに高速な統計的「直感」(システム 1 思考)をもたらします。Claude Code、Claude Desktop、Cursor などのエージェントにインストールして、自然な言葉でエージェントに話しかけます。エージェントが glin のツールを呼び出します。

glin は CSV または Excel ファイルを使って説明可能なブースティングマシン(EBM)を学習します。予測にはそれぞれ、その予測につながった特徴量の正確な内訳が付いています。この内訳はモデルの加法構造から得られるもので、SHAP や LIME による近似ではありません。

glin を使うために、コードを書いたり glin のコマンドを入力したりする必要はありません。エージェントがモデルの学習、調整、予測、説明を行います。サーバーはマシン上で動作し、stdio 経由でエージェントと通信します。

glin はローカルでのみ動作します(stdio)。リモートモードや HTTP モードはありません。バージョン 0.1.3 が、リモートモードを備えていた最後のリリースです。

エージェントに依頼できること

  • 「~/data/leads.csv で converted を予測する分類器を学習して。」
  • 「この 3 件の案件のうち、どれを優先すべき?」エージェントは各案件をモデルに入力し、その理由を示します。
  • 「このモデルでは何が解約を左右している?」
  • 「モデルを調整して、実際の性能を教えて。」

会話全体は例:Claude に直接依頼するをご覧ください。

変更履歴: CHANGELOG.mdに各リリースの変更内容を記載しています。

ケーススタディ: 10 万件の営業リードのセグメント。glin を使った Claude は、新規リードの 71% を正しいセグメントに分類しました。Claude 単独では 33% でした。プロンプトにラベル付きリードを 1,000 件含めた場合、Claude の正解率は 60% で、使用トークン数は 6.7 倍になりました。

目次

インストール

glin を使うには、マシンにuvが必要です。MCP クライアントは uvx でサーバーを起動します。glin を自分でインストールする必要はありません。

サーバーコードは PyPI パッケージ glin-ml です。glin という名前は無関係な別のプロジェクトが使用しています。クライアントが初めてサーバーを起動すると、uvx が glin-ml をダウンロードしてキャッシュします。

Claude Code

このプラグインは、glin MCP サーバーとスキルを追加します。このスキルは、モデルの構築、調整、予測、説明をいつ、どのように行うかをエージェントに伝えます。プラグインは uvx --from 'glin-ml[excel]>=0.1.5' glin serve を実行します。このコマンドには Excel のサポートが含まれており、0.1.5 より古いバージョンは起動しません。

Claude Code で、次を実行します。

/plugin marketplace add AkashChatterjee/glin
/plugin install glin@glin-marketplace

ファイルは .claude-plugin/marketplace.json と plugins/glin/ にあります。

その他の MCP クライアント

Claude Desktop や Cursor などの MCP クライアントの設定に glin を追加します。Claude Desktop では、ファイルは claude_desktop_config.json です。

{
  "mcpServers": {
    "glin": {
      "command": "uvx",
      "args": ["--from", "glin-ml[excel]", "glin", "serve"]
    }
  }
}

クライアントを再起動します。すると、glin のツールとプロンプトが表示されます。[excel] エクストラは、.xlsx ファイルと .xls ファイルのサポートを追加します。CSV ファイルのみを使用する場合は、これを削除してください。Excel 入力を参照してください。

サーバーは serverInfo.version で glin のバージョンを通知します。glin serve は MCP メッセージのみを標準出力に書き込みます。ログメッセージは標準エラー出力に書き込まれます。serve の実行中、glin は interpret ライブラリのログレベルを WARNING に設定するため、トレーニングのたびにクライアントのログが大量に出力されることはありません。

--allow-dir などのサーバーフラグを追加するには、args の serve の後に指定します。csv_path の制限を参照してください。

すでにインストール済みのコピー(uv tool install glin-ml、pipx install glin-ml、または pip install glin-ml)から glin を実行するには、"command": "glin" と "args": ["serve"] を設定します。

MCP Registry

glin は公式 MCP Registry に io.github.AkashChatterjee/glin として登録されています。レジストリはメタデータのカタログであり、インストーラーではありません。MCP マーケットプレイスや一部のクライアントはこれを読み込み、サーバー一覧に glin を表示します。たとえば、VS Code はGitHub MCP Registryからサーバーをインストールします。そのため、クライアントにレジストリ検索機能がある場合に限り、レジストリから glin をインストールできます。クライアントにその機能がない場合は、その他の MCP クライアントの設定を使用してください。

レジストリのエントリは uvx glin-ml serve を実行します。レジストリの形式にはエクストラを指定するフィールドがないため、excel エクストラは含まれていません。Excel ファイルを読み込むには、その他の MCP クライアントの設定を使用してください。

リリースワークフローは、リリースごとにエントリを更新します。MCP Registry への公開を参照してください。

開発用のインストール

このリポジトリをクローンし、編集可能なコピーをインストールします。

git clone https://github.com/AkashChatterjee/glin.git
cd glin
pip install -e ".[dev]"      # also installs the Excel libraries, and xlwt to build .xls test files

MCP クライアントでチェックアウトしたコードを試すには、"command" に環境内の glin プログラムを設定し(例:/path/to/glin/.venv/bin/glin)、"args" に ["serve"] を設定します。

glin は Python SDK の mcp 1.x 系および 2.x 系(mcp>=1.21.1,<3)で動作します。1.21.1 より前のバージョンは動作しません。mcp 1.21.0 以前は、pydantic 2.14 以降でインポート時にエラーになります。また、1.x 系の初期バージョンには glin が使用する API がありません。いずれかの系統をテストするには、バージョン制約を追加してください。例:pip install -e ".[dev]" "mcp>=2,<3"。

Tests GitHub Actions ワークフロー(.github/workflows/test.yml)は、各プルリクエストと main への各プッシュでテストスイートを実行します。最新の mcp 1.x および最新の mcp 2.x を使用して、Python 3.10 と 3.12 で実行します。また、サポート対象の最も古い mcp(mcp==1.21.1)を使用して、Python 3.10 でも実行します。

モデルのトレーニング

エージェントに依頼します。データファイルと予測対象の列を指定します。

"~/data/churn.csv に対して、churn を予測する分類器をトレーニングしてください。名前は churn_v1 にしてください。"

エージェントは train_model を呼び出します。慎重に構築するには、エージェントに build_classifier プロンプトを使うよう依頼します。データをクリーニングし、リークを削除して、モデルを調整し、信頼できる性能を報告します。MCP 経由で公開されるプロンプトを参照してください。

glin は各モデルを ~/.glin/models/<name>/ に保存します。

モデル名

モデルを作成する場合(train_model の model_name)、名前は次のルールに従う必要があります。

  • 1~64 文字を使用します。
  • 英字、数字、-、_、. のみを使用します。
  • 名前の先頭に . を使用しないでください。そのため、.、..、隠し名は無効です。
  • / または \ を使用しないでください。そのため、パスや絶対パスは無効です。

モデルを使用または削除する場合(inspect_model、predict、explain_model、delete_model)、名前は models フォルダー内のフォルダー名である必要があります。/ や \ を含めることはできず、空、.、.. も無効です。そのため、たとえば空白を含む名前など、以前の glin バージョンで別の名前で保存されたモデルも引き続き使用できます。

glin は、適用されるルールに従わない名前を拒否します。エラーメッセージにはルールが示されます。また、パスにシンボリックリンクが含まれている場合も、モデルフォルダーが models フォルダーの直下にあることを glin が確認します。そのため、モデル名を使って models フォルダーの外部にあるファイルを書き込んだり、読み取ったり、削除したりすることはできません。

Excel 入力(.xlsx / .xls)

glin は、政府の表など、タイトル行や結合されたヘッダーがあるスプレッドシートを直接使って学習します。Excel のサポートはオプションの追加機能なので、基本インストールは小さいままです。.xlsx ファイルの読み取りには openpyxl を、古い .xls ファイルの読み取りには xlrd を使用します。Claude Code プラグインにはこの追加機能が含まれています。それ以外のクライアントでは、サーバーコマンドに glin-ml[excel] を指定してください(その他の MCP クライアントを参照)。

たとえば、エージェントには次のように自然言語で指示します。

"~/data/report.xlsx の Data 2023 シートを使い、ヘッダー行を 3~4 行目として、outcome を予測する分類器を学習してください。"

エージェントは sheet と header_rows を train_model に渡します。次のルールが適用されます。

  • シート: sheet には名前または 1 から始まる位置を指定します。シートが 1 つのワークブックでは、sheet の指定は不要です。シートが複数あり、sheet が指定されていない場合、シートの一覧を示すエラーが発生します。名前の大文字と小文字、および先頭と末尾の空白を無視して照合するのは、一致するシートが 1 つだけの場合に限られます。一致するシートが 2 つ以上ある場合(たとえば Data と data )、glin はそれらを一覧表示するエラーを返します。その場合は、正確な名前または位置を指定してください。
  • ヘッダーの検出: header_rows が指定されていない場合、glin はラベルらしい値が大部分のセルに入っている最初の行を探します。その上にあるタイトル行はスキップします。候補が明確でない場合、glin はエラーで停止します。エラーには該当する行が示され、header_rows の指定が求められます。glin が推測することはありません。明確でないケースは 2 つあります。1 つ目は、疎なグループラベル行がヘッダー行の隣にある場合です。2 つ目は、最初の全セルが埋まった行がデータに見える場合です。
  • 脚注: glin はシート末尾の脚注行を除外します。脚注行とは、列の半分以下にテキストがあり、数字を含まない行です。最初に値が入っているセルが Source、Note、Footnote、*、†、‡、© のいずれかで始まるか、6 語以上の文である場合、その行は脚注行とみなされます。脚注に見えない疎な最終行はデータとして残ります。glin は、除外した行のシート上の行番号を含む警告を表示します。
  • header_rows: Excel に表示される行番号を 1 から始まる形式で指定します。例:4、"3-4"、"3,4"、[3, 4]。複数行のヘッダーは、列ごとに - でつないだ 1 つの名前にまとめられます。例:2023 - sales。上のヘッダー行の空白セルには、左隣のセルのラベルが引き継がれます(結合されたグループヘッダー)。空白部分と重複部分は除外されます。重複する名前には _2、_3 の接尾辞が付きます。日付が入ったヘッダーセルは、2024-01-01 のような ISO 日付に変換されます。データは最後のヘッダー行の次から始まります。結果には、シート、ヘッダー行、および glin が読み取った行数(rows_read)が表示されます。
  • 数式: glin はセルに保存された計算結果を使用します。スプレッドシートアプリで数式を計算し、保存しておく必要があります。
  • 空の行と列: glin は完全に空の行と列を除外します。
  • CSV ファイル: CSV の動作は変わりません。CSV ファイルで sheet や header_rows を指定するとエラーになります。
モデルを削除する

たとえば、エージェントに「モデル churn_v1 を削除して」と依頼します。エージェントは delete_model を呼び出します。削除は取り消せません。モデルを新しいモデルに置き換えるには、overwrite=True を指定して再度トレーニングしてください。~/.glin/models/ 内のフォルダーを自分で削除することもできます。

glin プログラムは MCP サーバー(glin serve)を起動するだけです。モデルのトレーニング、一覧表示、削除を行うコマンドはありません。バージョン 0.1.4 が、それらの機能を備えた最後のリリースです。

MCP 経由で公開されるツール

すべてのツールに MCP アノテーション(title、readOnlyHint、destructiveHint)があります。train_model と delete_model を除き、すべてのツールは読み取り専用です。この 2 つのツールには破壊的な操作としてマークされています。overwrite=True を指定した train_model はモデルを置き換え、delete_model はモデルを削除します。クライアントは読み取り専用ツールを自動的に承認し、train_model または delete_model の実行前に確認を求めることができます。

  • list_models() は、学習済みモデルをすべて一覧表示します。
  • inspect_model(model_name) は、特徴量スキーマと目的クラスを返します。日付列は features.date に表示されます。各日付列には、派生項目と、days_since_start の起点となる start_date が表示されます。
  • predict(model_name, features, top_n=10) は、予測クラスと確率に加え、完全な監査情報を返します。
    • base_logit は切片です。
    • contributions には、各項目の寄与度が大きい順に一覧表示されます。
    • additivity_verified は、reconstructed_probability が model_probability と等しいことを確認します。どちらもクラス名をキーとして使用します。
    • 2 値の目的変数では、score_class は target_classes の 2 番目の要素です。glin はクラスを値でソートするため、アルファベット順で 2 番目のクラスとは限りません。スコアと base_logit は、このクラスの対数オッズです。正のスコアはこのクラスへの予測を後押しし、負のスコアはもう一方のクラスへの予測を後押しします。
    • predicted_class、score_class、target_classes の各要素は、目的変数の値の型になります(たとえば、JSON では 1 や true)。probabilities、model_probability、reconstructed_probability のキーは常にテキストです(たとえば、"1" や "True")。Python で score_class の確率を取得するには、model_probability[str(score_class)] を使用します。
    • 多クラスの目的変数では、base_logit はクラスごとに設定され、各項目には score_by_class が含まれます。
    • warnings には、モデルが学習時に一度も見ていない入力が一覧表示されます。各警告には feature、value、issue が含まれます。issue は unseen_category、out_of_range、unparseable_number、unparseable_date、ambiguous_date_format、date_order_mismatch のいずれかです。out_of_range の警告には training_range も含まれます。日付形式に関する警告には、glin が使用した日付を示す parsed_as も含まれます。unparseable_number は、abc や inf など、有限数ではない数値入力に対して表示されます。この場合、glin は入力を欠損値として扱います。空欄や抑制コードでは、この警告は表示されません。各 value は JSON で安全に扱えます。glin は inf を文字列 "inf" として送信します。
    • missing_features には、入力がないか空欄の項目が一覧表示されます。これらの入力は有効であり、glin は個別に報告します。
    • 日付を送信するには、"signup_date": "2024-03-06" のように生の値を渡します。glin は学習時と同じ signup_date__* 項目を導出します。寄与度には各項目名が表示されます(例:signup_date__day_of_week = sat)。日付がない場合、空欄の場合、または解析できない場合は、欠損値として扱われます。日付を解析できない場合は、警告も追加されます。
  • train_model(target_column, model_name, csv_path=None, csv_content=None, overwrite=False, hyperparameters=None, holdout_fraction=0.2, holdout_group_column=None, suppression_codes=None, sheet=None, header_rows=None) は、新しいモデルを学習します。overwrite=True を指定すると、新しいデータで既存のモデルを再学習することもできます。名前がすでに存在し、overwrite が設定されていない場合、呼び出しは失敗します。誤って置き換えられることはありません。
    • csv_path と csv_content のどちらか一方だけを指定します。
    • csv_path は、サーバーが読み取り可能な .csv、.xlsx、または .xls ファイルです。csv_path の制限を参照してください。ローカルの stdio セットアップで使用します。大きなファイル(デフォルトで最大 200 MB)にも対応しており、エージェントがファイルの内容をコピーすることはありません。
    • csv_content は、CSV の生テキストです。クライアントとサーバーでファイルシステムを共有していない場合に限り、小規模なデータに使用してください。ツール引数に数万行を渡すと処理が遅く、コンテキストを大量に使用します。
    • holdout_group_column を指定すると、ホールドアウトはグループ化ホールドアウトになります。
    • suppression_codes は、数値列で欠損値として扱うトークンを置き換えます。デフォルトは ["SUPP", "NE", "NP", "z", "*", ".."] です。特徴量列:現在の対応状況を参照してください。
    • Excel ファイルでは(glin-ml[excel] が必要です)、さらに 2 つの引数を使用できます。sheet はシート名または 1 始まりの位置です。複数のシートを含むブックでは必須です。header_rows は 4、"3-4"、または [3, 4] です。省略すると、glin が検出します。Excel 入力を参照してください。結果には、glin が使用した sheet と header_rows が表示されます。
    • 結果には、保持された特徴量と除外された特徴量、解決済みの hyperparameters、training_seconds、項目数が含まれます。date_columns は、展開された各日付列とその派生項目の対応を示します。holdout_fraction > 0 の場合、結果にはサンプル外指標の evaluation ブロックも含まれます。エージェントにモデルを調整させるを参照してください。
    • warnings には、列を除外した理由と、「Possible target leakage」に関する項目が含まれます。目的変数リークの確認を参照してください。
  • explain_model(model_name, top_n=15, include_shapes=True) は、モデルが学習した内容を表示します。glin は加法構造から正確に読み取るため、予測例をサンプリングすることはありません。結果には次の内容が含まれます。
    • 平均絶対対数オッズ寄与度の高い順に並べた各特徴量と、それぞれの主効果部分および交互作用部分。
    • ペアワイズ交互作用を含む上位の項目と、全体に占める割合。
    • 2 値の目的変数では、各特徴量について、どのカテゴリや値の範囲がどのクラスへの予測を後押しするかを示す形状。連続特徴量の場合、形状は曲線が最も高くなる値の範囲と最も低くなる値の範囲を示します(ビン境界は特徴量の単位)。境界は有効数字 4 桁で示されます。10,000,000 未満の値には指数表記を使用しません(例:2.114e+04 ではなく 21140)。
  • list_hyperparameters() は、EBM のハイパーパラメーターをすべて一覧表示します。各項目には、型、デフォルト値、許容範囲、および値を大きくまたは小さくした場合の影響に関する注記が含まれます。
  • delete_model(model_name) は、学習済みモデルとそのフォルダーを完全に削除します。inspect_model と同じ名前の規則を使用します(モデル名を参照)。モデルが存在しない場合、呼び出しは「not found」エラーで失敗します。結果には model_name、deleted、path が含まれます。

MCP 経由で公開されるプロンプト

  • build_classifier(csv_path="", target_column="", model_name="") は、1つのプロンプトであらゆるデータセットのワークフロー全体を実行します。

    1. CSV を調べて、クリーニングします。
    2. どの列が実際の予測子かを判断します。結果を説明するテキスト、識別子、自由記述テキスト、結果発生後の日付など、ターゲットリークにつながる列は除外します。
    3. 次の過学習対策のガードレールに沿って、ハイパーパラメーターを調整します。
      • 固定のホールドアウトデータを使用する。
      • 試行回数を約10回に制限する。
      • 学習データとホールドアウトデータの差を確認する。
      • シードによるばらつきを確認する。
      • よりシンプルな構成を優先する。
      • 特徴量にシグナルがない場合は早期に終了する。
    4. すべての行を使って再学習します。
    5. 期待される性能を正直に報告します。

    MCP クライアントのプロンプト選択メニューから選択してください。Claude Desktop では、サーバーのプロンプトが添付(+)メニューに表示されます。ファイルパスとターゲットを指定してください。それ以外の引数はすべて任意です。クライアントはプロンプトをユーザーに表示し、エージェントが取得できるようにしないため、このプロンプトは単独で完結します。

  • tune_model_hyperparameters(model_name="", target_column="") は、エージェントにモデルを調整させるに記載された調整ループを実行します。現在のハイパーパラメーター表が含まれています。glin はコードからデフォルト値と範囲を読み取ります。

  • prepare_csv_for_training(target_column="") は、エージェントが train_model を呼び出す前に従うチェックリストです。次の内容を扱います。

    • 解析の問題:バナー行、誤った区切り文字、不規則な行、Excel シートとヘッダー行の選択
    • 有効なターゲット列の選び方
    • 前処理で対応済みの内容:形式の不統一な数値、日付とタイムスタンプの展開、欠損値、識別子に似た列、定数列、高カーディナリティ列
    • 前処理で対応していない内容:数値のみで保存された日付、JSON やリストが埋め込まれたセル、リーク列、連続値のように見えるターゲット

    glin は前処理の実際のデフォルト値からこのガイダンスを読み取るため、コードとの不整合が生じません。

csv_path の制限

train_model(csv_path=...) は、.csv、.xlsx、.xls で終わる通常のファイルのみを読み込みます。csv_path という名前は互換性のためにそのままですが、Excel ファイルも指定できます。シンボリックリンクと .. を解決した絶対パスが、許可されたディレクトリ内にある必要があります。glin は、ディレクトリ、デバイス、その他の拡張子、存在しないファイル、パストラバーサル、および許可されたディレクトリの外を指すシンボリックリンクを拒否します。エラーにファイルの内容が含まれることはありません。

デフォルトでは、次のディレクトリが許可されます。

  • ホームディレクトリ;
  • サーバーの作業ディレクトリ。ただし、ファイルシステムのルート(/)でもホームディレクトリの親ディレクトリ(例:/Users)でもない場合に限ります。

たとえば、macOS の Claude Desktop など一部のクライアントは、サーバーを / から起動します。この場合、ホームディレクトリのみが許可されます。Claude Code はプロジェクトディレクトリからサーバーを起動するため、そのディレクトリも許可されます。ディレクトリを自分で設定するには、繰り返し指定できるフラグを使用します。

glin serve --allow-dir /data/csvs --allow-dir /srv/uploads

許可されたディレクトリが / の場合、glin は stderr に警告を書き込みます。この場合、csv_path からマシン上の任意の .csv、.xlsx、.xls ファイルを読み込めるためです。Python で build_server(allowed_dirs=[]) を指定すると、どのディレクトリも許可されません。その場合、csv_path は無効になり、csv_content のみが使用できます。

glin は、200 MB を超えるファイルを拒否します。ファイルを読み込む前にサイズを確認します。上限を変更するには、たとえば glin serve --max-file-mb 500 のように --max-file-mb を使用します。

csv_content はこれらのルールの影響を受けません。MCP クライアントの設定で、たとえば ["serve", "--allow-dir", "/data/csvs"] のように、フラグを args に追加します。

これらのチェックには、既知の制限が 2 つあります。どちらも許可されたディレクトリ内への書き込み権限が必要です。

  • 許可されたディレクトリ内にあるハードリンクが、ディレクトリ外のファイルを指している場合、そのファイルは読み込まれます。ハードリンクはファイルそのものなので、glin はその由来を確認できません。
  • glin はパスを確認してからファイルを読み込みます。確認と読み込みの間にパスが変わると、glin は新しい参照先を読み込みます。

そのため、信頼できないユーザーやプロセスが書き込み可能なディレクトリは許可しないでください。

以前のフラグ --mode stdio は、既存のクライアント設定との互換性を保つため、引き続き受け付けられます。glin はこのフラグを無視し、stderr に非推奨の通知を 1 回書き込みます。args から削除できます。--mode http と --mode sse は終了コード 2 で停止し、次のメッセージを表示します。「HTTP mode was removed in v0.1.4; v0.1.3 is the last release with it. glin runs over stdio only.」

エージェントによるモデルの調整

EBM は、各特徴量について学習した曲線と、いくつかのペアワイズ交互作用テーブルの合計です。小さな単一特徴量ツリーを使ったサイクリックブースティングで学習します。ほとんどの設定は、柔軟性と平滑性のバランスを調整します。train_model(hyperparameters={...}) では、max_bins、max_interaction_bins、interactions、learning_rate、max_rounds、early_stopping_rounds、validation_size、outer_bags、inner_bags、min_samples_leaf、max_leaves、reg_alpha、reg_lambda、smoothing_rounds、greedy_ratio、random_state を指定できます。省略した設定にはデフォルト値が適用されます。glin は、未知の名前、誤った型、範囲外の値を拒否します。エラーメッセージには、すべての問題が列挙されます。各設定は glin/hyperparameters.py で一度だけ定義されています。設定を追加または拡張する場合は、ここで行ってください。

エージェントには最適化するためのスコアが必要です。train_model は行の holdout_fraction の割合をホールドアウトし、残りの行で学習します。ホールドアウトは層化されます。分割に使うシードは random_state に依存しないため、すべての試行で同じ行がスコア評価に使われます。結果には evaluation ブロックが含まれます。

  • log_loss
  • baseline_log_loss(クラス頻度に基づく推測値)
  • train_log_loss(log_loss と比較すると、過学習または未学習を確認できます)
  • accuracy
  • balanced_accuracy
  • roc_auc

glin は、ハイパーパラメーターと指標をモデルのメタデータに保存します。

t une_model_hyperparameters プロンプトは、エージェントを次の手順に沿ってガイドします。

  1. ベースラインを学習します。
  2. 一度に 1 つか 2 つの設定を変更します。
  3. シードによるノイズを確認します。
  4. holdout_fraction=0 を指定して、すべての行で再学習します。

試行には、スクラッチ用の model_name と overwrite=True を使用してください。

グループ単位のホールドアウト

同じ州、地域、顧客、サイト、ユーザーの行は似た内容になりがちです。ランダムなホールドアウトでは、ほぼ重複するデータが両方に分かれるため、指標が実態より高くなります。実際のケースでは、ランダムなホールドアウトでモデルの正解率は82%、AUCは0.89でした。モデルが一度も見ていない州では、正解率は63%、AUCは0.77でした。

holdout_group_column="state"(またはほかの列)をtrain_modelに渡します。するとglinは、行の約holdout_fractionがホールドアウトに入るまでグループ全体をホールドアウトします。残りの行でモデルをトレーニングします。

  • 分割にはrandom_stateに依存しないシードを使うため、どの試行でも同じ行が使われます。glinはシード付きのグループ順を25通り試し、ホールドアウト内のクラス比率が全体のクラス比率に最も近い順序を選びます。

  • グループ列は通常の特徴量として残ります。そのため、予測時にはホールドアウトされたグループが未知のカテゴリになります。glinはトレーニング行のみを使って前処理を適合させます。

  • glinは前処理と同じ方法でテキスト値をグループ化します。先頭と末尾の空白を削除し、英字を小文字に変換します。そのため、"S06"と"s06 "は同じグループになり、そのグループは分割の片側だけに入ります。空のテキスト、nan、noneは欠損値です。2つ以上の表記が同じグループになる場合、glinは警告を返します。

  • evaluationにはholdout_group_column、holdout_groups、train_groupsも表示されます。これらの件数には正規化されたグループが使われます。欠損値は1つのグループとして数えます。glinは列名もモデルのメタデータに保存します。

  • glinは次の場合、明確なエラーを返します。

    • 列が存在しない、またはターゲット列である場合。
    • 異なる非NULLグループが5つ未満の場合。
    • 1つのグループが行の半数を超える場合。このグループが欠損値の場合は、エラーでその旨を示します。欠損値を補完するか、別の列を使ってください。
    • すべてのグループがホールドアウトの目標サイズに対して大きすぎる場合。エラーには最小グループのサイズが表示されます。holdout_fractionを大きくしてください。
    • ホールドアウトに2つ以上のクラスがない場合、または分割によってトレーニングデータからクラスが除外される場合。

    holdout_fraction=0の場合、glinは列を無視して警告を返します。

  • build_classifierとtune_model_hyperparametersのプロンプトでは、このような列がある場合にこのオプションを使うようエージェントに指示します。また、このホールドアウトを信頼できる推定値として報告するよう指示します。

例:Claudeに直接依頼する

モデルをトレーニングし、MCP サーバーを接続したら、自然な言葉でClaudeに話しかけます。ツールのスキーマを知っている必要はありません。

「四半期末までに優先順位を付けたい商談が3件あります。Northwind Systems($42k、商談ステージ、紹介経由、連絡先はVP、担当者はCarla Nguyen、接触記録は8件)、Summit Retail Group($8k、まだリード、流入元は有料ソーシャル、担当者はBrian Kessler)、Anchor Nonprofit($3k、まだリード、担当者はFrank Suarez、まだ活動記録なし)です。deal_predictor_v1で予測して、どれを優先すべきか教えてください。」

Claudeは各商談について1回ずつpredictを呼び出します。数値だけでなく、理由付きの順位を返します。

商談成約確率理由
Northwind Systems69%商談ステージ、紹介経由、VPの連絡先がいずれもプラスに働いています。$42kの商談金額はマイナス要因です。
Summit Retail Group35%まだリードであり、有料ソーシャル経由です。どちらも大きなマイナス要因で、それを打ち消す要素がありません。
Anchor Nonprofit34%活動記録がなく、まだリードです。レコード内にプラスとなる要素はありません。

注:言及しなかったフィールドは、モデルに欠損値として渡されます。「平均」として渡されるわけではありません。担当者名とライフサイクルステージを指定し、モデルが学習したカテゴリ(たとえばLead、Opportunity、Customer)を使ってください。すでにモデルに含まれているフィールドに余分な詳細を加えるより、こちらのほうが良い結果になります。

ケーススタディ

10万件の営業リードのセグメントでは、既知のルールが適用された合成CRMデータにglinを使用しています。ルールが既知のため、この研究では各予測、説明、what-if分析を正解と照合できます。

  • glinを使ったClaudeは、新規リードの71%を正しいセグメントに分類しました。これらのリードで達成可能な最高スコアは68%です。
  • Claude単独では33%でした。ラベル付きリード1,000件をプロンプトに含めると60%になり、リードごとに83,000トークンを使用しました。glinを使うと、Claudeの使用トークン数は約12,500でした。
  • glinは、新しいセッションごとに同じリードに対して同じ回答を返しました。
  • glinが学習した効果は、真の効果と一致しています(相関係数0.97~1.00)。
  • 4クラスのモデル1つと2つの二値モデルで、精度は同じでした。モデルを2つ使うと、それぞれの結果について個別の説明が得られます。

先行研究のインドの各地区における子どもの発育阻害(NFHS-5)では、実際の公共部門のデータにglinを使用しています。glinモデルは、地区で子どもの発育阻害が多いかどうかを予測します。モデルは予測ごとに正確な理由を示します。

データ要件

train_modelは処理を始める前にデータを検証します。データはCSV、またはヘッダー検出後のExcelブックのシートである必要があります。重大な問題がある場合は、明確なエラーを表示して学習を停止します。たとえば、目的変数のクラスが1つしかない場合です。軽微な問題の場合は警告を表示し、学習を続けます。たとえば、数値の目的変数に多数の異なる値がある場合です。

ルールはglin/validation.pyにフラットなリストとして記述されています。新しいデータ形状に対応するには、ルールを1つと前処理ケースを1つ追加します。パイプラインの残りの部分は変更不要です。

Python APIでは、DataFrameの列名がテキスト以外の場合があります。たとえば0や1です。glinはこれらをテキスト("0"、"1")に変換し、結果では変換後の名前を使います。predictでは、どちらの形式もキーとして受け付けます。0と"0"のように、テキストにしたときに同じになる名前が2つある場合はエラーになります。

現在サポートされている特徴量の列
データの形状動作
NaN を含む数値(int、float)glin は値をそのまま渡します。EBM は欠損値を独自のビンに入れます。値が繰り返される場合や、小数が含まれる場合(たとえばルピーの金額)、glin はほぼすべての値が異なる列を保持します。また、給与のように、大きく不均等な間隔がある一意の整数値も保持します。glin が識別子として削除する列については、以下の「行識別子」を参照してください。
汚れた数値文字列(新規顧客の合計料金に対する " " などの空白を含む)null 以外の値のうち少なくとも 80% を数値として解析できる場合、glin は列を float64 に変換します。解析できないセルは NaN になります。
最大 250 個の一意な値を持つカテゴリ文字列glin はテキストを小文字に変換し、前後の空白を取り除きます。EBM は各カテゴリをビンに分けます。欠損値と未確認の値は __missing__ マーカーに割り当てられます。
通貨記号や桁区切りを含む文字列($1,234.56、£1,234、€1.234,56、USD 100、Rs. 100、100 EUR)glin は数値の前後にある通貨記号、空白、および一般的な通貨コード(USD、EUR、GBP、INR、Rs. など)を削除します。その後、上記の方法で列を変換します。glin が小数点としてカンマを読み取るのは、列に明確なヨーロッパ形式の値(1.234,56、12,5、1.234.567)が含まれている場合に限ります。単独の 1,234 は桁区切りです。予測時にも同じルールが適用されます。glin はネイティブな数値(int、float)を変更しません。区切り記号が両方含まれる値では、glin は最後の区切り記号を小数点として扱います。そのため、1,500.50 と 1.500,50 はどちらも 1500.5 になります。ヨーロッパ形式の列では、1500.5 は 1500.5 ですが、1.500 は 1500 になります。両方の形式が混在する列は米国形式として解析され、glin は警告を返します。その列では、12,5 のようにカンマだけを含むヨーロッパ形式の値は 125 になります。
負の数(-5、−5、(1,234)、1234-)glin は Unicode のマイナス記号(英国の表でよく使われる −)、括弧、末尾のマイナス記号(会計データのエクスポートでよく使われる)を負号として読み取ります。
無限大(inf、-inf、inf%、float の inf)glin は無限大を欠損値(NaN)として扱います。train_model は無限大の値の個数を示す警告を返します。予測時に無限大の入力があると、unparseable_number が返されます。
パーセント文字列(44.98%、12 %、(5%))glin は値を変換する前に末尾の % を削除します。値はパーセントポイントのままです。つまり、44.98% は 0.4498 ではなく 44.98 になります。これは通貨のルールと併用できます。同じ列の 50% と 50 は同じ値になります。
数値列内の抑制コード(SUPP、NE、NP、z、*、..)glin はこれらのコードを欠損値(NaN)として扱います。列が数値かどうかを判定する際には無視されるため、列は数値のままです。一致判定では大文字と小文字、および前後の空白は区別されません。コードのセットを変更するには、EBMTabularPreprocessor(suppression_codes=[...]) または train_model(suppression_codes=[...]) を使用します。リストを指定すると、デフォルトのセットが置き換えられます。カテゴリ列は変更されないため、地域を表す NE はカテゴリのままです。glin は、セットに含まれていない短くて繰り返し現れる値(たとえば x や c)の一部も欠損値として扱います。その場合、train_model は確認のために suppression_codes を指定するよう提案する警告を返します。不明なコードが値の 20% を超えると、列はカテゴリになります。値の少なくとも半数が数値の場合、train_model は列を数値として扱える suppression_codes を提案する警告を返します。<5 と — は実際の値である可能性があるため、デフォルトのセットには含まれません。<5 は 5 未満の値を表し、— は金融関連の表でゼロを表すことがよくあります。
ブール列glin はこれらを 0/1 の連続した数値特徴量として扱います。
日付とタイムスタンプglin はこれらを検出し、名前付きの項目に分割します。日付とタイムスタンプを参照してください。
日付とタイムスタンプ

次の形式を使用できます:2024-03-06、2024-03-06 14:30:00、2024-03-06T14:30:00Z、03/06/2024、6 Mar 2024、Mar 6, 2024。Python API では実際の datetime も使用できます。

  • 検出: null 以外の値の少なくとも 80% が完全な暦日である必要があります。しきい値は EBMTabularPreprocessor(date_parse_threshold=...) で変更できます。glin は識別子とカーディナリティのルールより先に日付をチェックするため、各行で一意の日付も残ります。
  • 特徴量: glin は <col>__year、<col>__month(jan から dec)、<col>__day_of_week(mon から sun)、<col>__hour、<col>__days_since_start を作成します。days_since_start は、学習データ内で最も古い日付からの経過日数を整数で表します。glin はその日付をモデルとともに保存し、inspect_model に表示します。
  • 説明の読み方: 月と曜日はカテゴリとして扱われるため、説明には signup_date__day_of_week = sat のように表示されます。その他の特徴量は順序のある数値です。
  • 削除される要素: 学習中に値が変化しない要素は glin によって削除されます。1 年分のデータでは __year は作成されません。日付のみのデータでは __hour は作成されません。異なる日付が 1 つしかない列は削除されます。
  • sin/cos 特徴量なし: EBM は各特徴量について自由形式の曲線を学習するため、12 月から 1 月への折り返しもすでに表現できます。sin と cos の特徴量は読み取りにくいためです。
  • タイムゾーン: glin はタイムゾーンを含む値を UTC に変換します。
  • 日と月の順序: glin は値から dd/mm または mm/dd を読み取ります。12 を超える値があれば順序を判定できます。判定できない場合、glin は月が先だと仮定し、train_model は警告を返します。警告を避けるには、ISO 形式の YYYY-MM-DD を使用してください。
  • 解析できない値: 警告とともに欠損値になります。
  • 数字だけの値が日付として扱われることはありません。 年、20240306、エポック秒、ID は数値のままです。月のみや四半期を表す文字列(Jan、Q1 2020)およびバージョン文字列(1.2.3)はカテゴリのままです。日付が重要な場合は、まずこれらの値を日付文字列に変換してください。
  • 予測時: 元の日付を送信してください。学習範囲外の日付には out_of_range 警告が返されます。解析できない日付には unparseable_date が返されます。学習データにない月や曜日には unseen_category が返されます。学習時に数値形式の日付(ISO 形式または月名)がない列で、日と月の入れ替えが可能な数値形式の日付(例:05/03/2024)を指定すると、ambiguous_date_format が返されます。glin は月が先だと解釈します。学習時の順序ではあり得ない数値形式の日付(例:dd/mm の列での 02/13/2024)には、date_order_mismatch が返されます。glin は逆の順序で解釈します。どちらの警告にも、glin が使用した日付が parsed_as で表示されます。ISO 形式の日付には、これらの警告は返されません。
特徴量の列:未対応
データの形状動作理由
裸の数値(年、YYYYMMDD、エポック秒)として保存された日付glin は日付ではなく、通常の数値として扱います。glin は通常の整数列と ID やカウントを区別できません。日付を含む列は日付文字列に変換してください。
自由記述テキストglin は一意の値が 250 個を超える列を削除します。この上限未満の場合、テキストはほぼ確実に役に立たないカテゴリの集合になります。glin は自然言語処理を行いません。テキスト列はクラスの集合ではありません。
セル内のリスト、辞書、ネストされた JSONglin は解析しません。セルを不透明な文字列として扱います。構造化データを抽出する機能はありません。
行識別子(連番 ID、UUID、ハッシュ)glin は意図的に削除します。これは機能不足ではありません。glin は 50 行を超えるデータのみをチェックします。数値列の値がすべて異なる整数で、さらに次の条件のいずれかを満たす場合、その列は識別子とみなされます。
- 値が最小値から最大値までの範囲の少なくとも 20% を占める(10, 20, 30 など、一定の間隔の場合も含みます)、または
- 列名に ID を表す語 id、idx、key、uuid、guid、pk が含まれる(たとえば row_id や PassengerId)、または列名が index である。
同じルールは、ほとんどが数値であるテキスト列にも適用されます。たとえば、値に TBD が 1 つ含まれる ID などです。glin は、一意の値が 95% を超えるその他のテキスト列も削除します。
ID には予測に役立つ情報がありません。
削除対象の列(定数列、識別子のような列、カテゴリが 250 個を超える列、変動部分のない日付)features_dropped に列名が記載されます。train_model は列名と理由を含む warnings エントリも返します。数値の識別子の場合、その列が実際の測定値であれば、丸めるかビン分割するよう提案します。削除が通知なしに行われることはありません。
ターゲットリークのチェック

前処理の後、train_model は、単独でターゲットをほぼ完全に分離する特徴量列がないか確認します。これは通常、しきい値、範囲、カテゴリのマッピングを使って、その列からターゲットを導出したことを示します。その場合、モデルはターゲットを読み戻すだけになってしまいます。

glin はそのような列を warnings で Possible target leakage: ... として警告します。警告には、> 62.5 -> 'yes' のようなしきい値や範囲、または {p, q} -> 'ok' のようなカテゴリのマッピングといった根拠が表示されます。また、その列が予測時に利用できない場合は、列を削除して再トレーニングすることを提案します。このチェックは警告のみであり、トレーニングは続行されます。Python の結果には leakage_suspects も含まれます。build_classifier、prepare_csv_for_training、およびチューニング用プロンプトでは、これらの警告をユーザーと確認するようエージェントに指示します。

  • 手法: glin は特徴量ごとに、単一特徴量の決定株を適合させます。トレーニング行に対するバランス精度で決定株を評価します。ホールドアウト行は使用しません。数値特徴量では、葉の数が最大で n_classes + 1 個の決定木(しきい値が1つ、またはカットポイントが2つの範囲)を使います。カテゴリ特徴量では、各カテゴリを最多クラスにマッピングします。また glin は、異なる値が20個以下の数値特徴量にもこのカテゴリマップを使用します。このような列は、整数コードで表されたカテゴリであることが多いためです(例:アンケート回答コード)。欠損値も1つのカテゴリとして扱います。q12_code in {2, 5, 7} のようなターゲットは単調ではないため、しきい値では検出できませんが、カテゴリマップでは検出できます。glin は、バランス精度が0.99以上の特徴量にフラグを付けます。二値ターゲットの場合、これは one-vs-rest AUC が0.99以上であることも意味します。精度は高くても完全ではない予測因子では、このチェックは作動しません。
  • モデルから見た場合: glin は、数値変換後のパーセント、通貨、抑制コード付きの列をチェックします。欠損もカウントされます。ターゲットが正の場合に限って空欄になる列は、missing -> ... としてフラグが付けられます。glin は日付列を派生項目を通じてチェックし、元の列の下に報告します。たとえば、'signup' (via derived term 'signup__days_since_start') のように表示されます。
  • 偶然や記憶による分離を防ぐ仕組み:
    • 数値の各葉には、少なくとも5行が必要です(データ量が多い場合はさらに増えます)。
    • 各カテゴリには、少なくとも5行が必要です。この下限はデータ量が増えても変わりません。そのため、glin はカテゴリが100~250個ある列にもフラグを付けることがあります(前処理では最大250個まで保持します)。
    • カテゴリ列では、行の少なくとも90%が、5行以上あるカテゴリに含まれている必要があります。そのため、ほぼ一意な列が記憶によってターゲットを「分離」することはできません。テストでは、カテゴリが250個、行数が20,000のノイズ列を200個用意しても、フラグは付きませんでした。
    • glin は、行数が10未満のクラスを除外します。
    • glin は、行数が30未満の場合、このチェックをスキップします。
    • 各列の処理コストは数ミリ秒です。glin がサンプリングする行数は最大20,000行です。列が500個の場合、約2秒かかります。
  • glin は最大10列を報告し、最も該当度の高い列から順に表示します。
ターゲット列の要件
  • ターゲットには、2 つ以上の異なる非 null 値(二値または多クラス)が必要です。クラスが 1 つしかない場合は、エラーになります。
  • glin はターゲット値が欠損している行を削除し、警告を返します。その他の行には影響しません。
  • 20 を超える異なる値を持つ数値ターゲットでは、回帰ターゲットのように見えるという警告が表示されます。glin は回帰モデルではなく分類器をトレーニングするため、各値が個別のクラスになります。ターゲットをいくつかのクラスに分割する(分位点またはドメイン固有のしきい値を使用する)か、別のターゲットを選択してください。
  • 3~20 個の異なる値を持つ数値ターゲット(スコアや順序尺度など)では、警告が表示されます。多クラスモデルでは値の順序が無視されます。警告には、ターゲットの実際の値を使った例が示されます。より少ない区分にするか、二値のしきい値を使用してください。prepare_csv_for_training と build_classifier のプロンプトにも、同じガイダンスが記載されています。
  • これら 2 つのチェックは、値が数値のテキストターゲット(たとえば "85%" や "1" から "5")にも適用されます。glin は数値特徴列と同じ規則で値を解析します。モデルでは引き続き、各テキスト値がクラスとして扱われます。
  • 20 を超える異なる値を持つテキストターゲットでは、警告が表示されます。各値が個別のクラスになり、それぞれのクラスに多くの行が必要です。
  • 完全な回帰(上流の ExplainableBoostingRegressor)は別途計画されています。現時点ではまだサポートされていません。

リリース(メンテナー向け)

リリースを PyPI に公開するのは、Publish to PyPI GitHub Actions ワークフロー(.github/workflows/publish.yml)だけです。ローカルマシンからアップロードすることはありません。twine upload、uv publish、個人用 API トークンは使用しないでください。 リリースするには、次の形式のタグをプッシュします。

git tag v0.1.4
git push origin v0.1.4

ワークフローはまず Tests ワークフローを実行します(プルリクエストと同じマトリックスです)。テストが失敗すると、ワークフローは停止し、公開されません。次に sdist と wheel をビルドし、どちらにもタグのバージョンが含まれていることを確認します。その後、それらを正確にそのバージョンの glin-ml として PyPI に公開し、CHANGELOG.md から GitHub Release を作成します。

  • hatch-vcs は git タグからパッケージのバージョンを導出します。pyproject.toml に固定バージョンはないため、リリース前にパッケージのバージョンを更新する必要はありません。プラグインファイルとレジストリファイルにはそれぞれ独自のバージョンがあります(リリース手順を参照)。
  • タグのないローカルビルドでは、0.1.4.dev1+g3fa91a0 のような開発版のバージョンになります。git メタデータのないソースツリーでは、0.0.0 が返されます。
  • glin.__version__ は、インストール済みパッケージのメタデータを読み取ります。
  • ワークフローは vX.Y.Z に一致しないタグを無視します。
  • PyPI は、すでに存在するバージョン番号のアップロードを拒否します。不具合のあるリリースを修正するには、新しいバージョンにタグを付けてください。
リリース手順

オーナーはリリースごとに、次の手順を実行します。

  1. CHANGELOG.md で、[Unreleased] の下にある項目を新しい見出し ## [X.Y.Z] - YYYY-MM-DD に移動します。末尾に比較リンクを追加します。gh issue list --milestone vX.Y.Z --state closed を使って項目を比較します。
  2. リリースバージョンを server.json(version と packages[0].version)および plugins/glin/.claude-plugin/plugin.json(version)に設定します。プラグインに新しいリリースが必要な場合は、plugins/glin/.mcp.json の最小バージョンも変更します。これらの変更を main にマージします。
  3. リリースにタグを付けて、そのタグをプッシュします。例:git tag v0.1.4、git push origin v0.1.4。
  4. GitHub Actions で Publish to PyPI の実行を開き、pypi 環境を承認します。アップロードのステップは、この承認後にのみ開始されます。
  5. CHANGELOG.md にそのバージョンのセクションがない場合、または server.json か plugin.json のバージョンがタグと異なる場合、ワークフローは開始時点で停止します。すべて正しければ、PyPI に公開します。その後、バージョンに該当する CHANGELOG.md のセクションをリリースノートとして GitHub Release を作成します。また、mcp-registry ジョブは MCP Registry に公開します(MCP Registry への公開を参照)。
  6. PyPI に新しいバージョンが公開され、GitHub Release が作成されていることを確認します。
  7. MCP Registry の掲載内容を確認します。新しいバージョンに isLatest: true が表示されている必要があります。
curl "https://registry.modelcontextprotocol.io/v0.1/servers?search=io.github.AkashChatterjee/glin"

mcp-registry ジョブが失敗した場合は、MCP Registry への公開に記載されている手動の代替手順を使用します。

変更履歴をマージ済みのプルリクエストと比較するには、GitHub でドラフトリリースを開き、「Generate release notes」をクリックします。.github/release.yml により、プルリクエストはラベルごとに分類されます。

これを唯一の公開方法にするための一度限りの設定

このワークフローでは、PyPI の信頼された公開(OIDC)を通じて公開します。これにより、ローカルからのアップロードもできなくなります。

  1. PyPI → glin-ml プロジェクト → Publishing: オーナー AkashChatterjee、リポジトリ glin、ワークフロー publish.yml、環境 pypi の信頼された公開を追加します。
  2. PyPI → アカウント設定 → API トークン: glin-ml をアップロードできる API トークンをすべて削除します。新しいトークンは作成しないでください。トークンがなく、2FA が有効であれば、公開に使用できる認証情報はワークフローの有効期間の短い OIDC ID のみです。また、プロジェクトのコラボレーターも確認してください。アップロード権限が不要なユーザーは削除します。
  3. GitHub → Settings → Rules → Rulesets: v* に対するタグルールセットを追加します。タグを作成できるユーザーを制限し、タグの削除や移動を禁止します。一致する新しいタグによってリリースが開始されます。
  4. GitHub → Settings → Environments → pypi: 必須レビュアーを追加します。これにより、各リリースでアップロードのステップを実行する前に、手動での承認が必要になります。
MCP Registry への公開

レジストリにはメタデータのみが保存されます。PyPI パッケージの README に mcp-name: io.github.AkashChatterjee/glin という行があることを確認します。README では、この行は非表示のコメントとして記載されています。

publish.yml の mcp-registry ジョブがレジストリに公開します。このジョブは publish ジョブの後に実行されるため、先に PyPI にバージョンが公開されます。このジョブでは、次の手順を実行します。

  1. server.json の version と packages[0].version、および plugins/glin/.claude-plugin/plugin.json の version が、タグから v を除いた値と一致することを確認します。build ジョブでも同じ確認を行うため、不一致があると PyPI へのアップロード前に実行が停止します。確認処理は .github/scripts/check-versions.sh にあります。
  2. 固定されたリリースの mcp-publisher(Linux、amd64)をダウンロードし、SHA-256 を確認します。バージョンは publish.yml の MCP_PUBLISHER_VERSION にあります。変更する場合は、同じリリースの registry_<version>_checksums.txt ファイルにある値に合わせて MCP_PUBLISHER_SHA256 も変更してください。
  3. mcp-publisher login github-oidc でログインします。このジョブには id-token: write の権限があります。GitHub にシークレットやトークンは保存されません。
  4. mcp-publisher publish を実行します。アップロード後、PyPI CDN の反映には 1 分以上かかることがあり、その間レジストリから新しいバージョンを確認できない場合があります。コマンドが失敗すると、ジョブは 60 秒待ってから再試行します。最大 5 回まで試行します。
  5. レジストリに問い合わせ、タグのバージョンが isLatest: true として一覧に表示されていない場合は失敗します。

レジストリは、すでに存在するバージョンを拒否します。レジストリがバージョンを受け付けた後にジョブが失敗した場合は、再実行しないでください。代わりに、一覧を確認してください。

手動での代替手順

ジョブで公開できない場合は、server.json のバージョンを設定し、バージョンが PyPI に公開された後、リポジトリのルートから次のコマンドを実行してください。

mcp-publisher login github
mcp-publisher publish

その後、リリース手順にある curl コマンドで一覧を確認してください。

リリースの確認

公開せずにビルドを確認するには、ローカルで uv build を実行し、dist/ の内容を確認してください。アップロードは絶対に行わないでください。リリース後は、クリーンインストールで公開パッケージが動作することを確認してください。

uvx --refresh --from glin-ml glin --version
uvx --from glin-ml glin serve --help

最初のコマンドで、リリースしたバージョンが表示される必要があります。その後、MCP クライアントからサーバーを起動し、エージェントに小さなモデルの学習を依頼してから、delete_model で削除してください。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。