EasyDeploy AI について
EasyDeploy AIは、データサイエンスのワークフロー向けにEasyDeploy APIを公開するMCPサーバーです。CSVによるAutoMLの学習と予測に対応し、データ準備からホールドアウト検証までのガイドも備えています。
主な機能
- 01CSVデータセットでのAutoML学習
- 02データセットのアップロードとバージョン管理
- 03単件・一括予測の実行
- 04レポートとモデル指標の確認
- 05モデルエイリアスの管理
- 06get_startedによるワークフローガイド
活用シーン
- 01準備済みCSVからのモデル学習
- 02ホールドアウトデータセットを使った性能推定
- 03モデルバージョンまたはエイリアスを指定した予測
MCP 対応
EasyDeployの公開REST APIをMCPクライアント向けのツールとして公開し、データセットのアップロード、学習、レポート、予測を提供します。ホスト型HTTPとローカルstdioで接続できます。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://mcp.easydeploy.ai/mcpclaude mcp add --transport http ai-easydeploy-easydeploy-ai https://mcp.easydeploy.ai/mcp{"mcpServers":{"ai-easydeploy-easydeploy-ai":{"type":"http","url":"https://mcp.easydeploy.ai/mcp"}}}Cursor で開く{"servers":{"ai-easydeploy-easydeploy-ai":{"type":"http","url":"https://mcp.easydeploy.ai/mcp"}}}VS Code で開く{"mcpServers":{"ai-easydeploy-easydeploy-ai":{"type":"http","url":"https://mcp.easydeploy.ai/mcp"}}}{"mcpServers":{"ai-easydeploy-easydeploy-ai":{"serverUrl":"https://mcp.easydeploy.ai/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
詳細
EasyDeploy AI MCP (easydeploy-ai-mcp)
Claude、Cursor、Claude Code、その他の MCP クライアント向けに、EasyDeploy の公開 REST API をツールとして提供する Model Context Protocol(MCP)サーバーです。
PyPI パッケージ名: easydeploy-ai-mcp · インポートパッケージ: easydeploy_ai_mcp
目次
- Claude との接続
- 利用できる機能
- 要件
- インストール
- 環境変数
- ローカル MCP(stdio)
- リモート MCP(HTTP)
- ドキュメント
- REST API リファレンス
- リリースと API の互換性
- 開発
- セキュリティ
- ライセンス
Claude との接続
ホスト型コネクター(claude.ai または Claude Desktop)
MCP エンドポイントをホストしています。Claude 内で一度追加すれば、接続してサインインした後、新しいチャットで他の有効なコネクターと同じように EasyDeploy を利用できます。
- ブラウザーで Claude を開くか、Claude Desktop を開きます。
- Settings を開き、Connectors を選択して、Add custom connector を選びます。
- 次の内容をそのまま入力します。
- Name:
EasyDeploy AI - Remote MCP server URL:
https://mcp.easydeploy.ai/mcp
- Name:
- コネクターを保存すると、コネクター一覧に EasyDeploy が表示されます。
- EasyDeploy コネクターの項目を開いて Connect を選び、ブラウザーでサインインを完了します。この操作により、Claude が EasyDeploy アカウントを利用できるようになります。
接続とサインイン(Claude 内): カスタムコネクターの設定後、Claude に MCP URL と Connect ボタンが表示された EasyDeploy カードが表示されます。この手順でサインインしてください。Claude に API キーを貼り付ける必要はありません。アクセス権は、ブラウザーで認証した EasyDeploy プロファイルに紐づきます。
Claude Desktop とファイルのアップロード: ファイルのアップロードや一部のツール呼び出しでは、ネットワーク経由で EasyDeploy に接続します。Desktop では、呼び出し先ドメインを許可しない限り、Claude は外部への通信をブロックします。Settings → Capabilities を開いて Allow network egress を有効にし、ドメインの許可リストに次のホストをそのまま追加してください。
api.easydeploy.ai
公開本番サーバーへのアップロードで使用するホストはこれだけです。このホストだけをそのまま許可し、それ以上の範囲を許可しないでください。別の EasyDeploy API を指定したサーバー(EDA_API_BASE で設定したサーバー)では、代わりにその API のホストが必要です。また、start_upload の手順書には許可する必要がある正確なホストが記載されています。
ドメインの許可リスト UI は、有料の Claude プランで利用できます。
詳しい説明や別の設定方法(たとえば独自のデプロイメントの URL を使う場合)は、docs/claude-getting-started.md を参照してください。
まずはこちら:get_started
get_started は EasyDeploy のデータサイエンス手引きを返します。モデリングタスクを始める際に最も役立ちます。Claude コネクターのディレクトリ要件に従い、説明とサーバーの MCP instructions では、エージェントがいつ呼び出すべきかではなく、何を返すのかを説明しています。ホストはツールの説明とサーバーの指示をキャッシュし、多くの場合、モデルに指示を表示しません。一方、ツールの結果は呼び出しのたびに最新のものが取得されます。そのため、手引きは説明文ではなくツールの結果に含まれています。名前と説明は固定され、内容はリリースごとに更新されるため、再接続する必要はありません。
get_started()は概要を返します。役割、各ステップで使うツールを含むワークフロー全体、遵守すべき重要なルールが含まれます。get_started(section=...)は指定したセクションを返します。prepare、split、upload、train、validate、predictを指定できます。allを指定すると、すべてのセクションが返されます。- 各結果には、
guide_version、updated、各セクションのリスト(それぞれ1行の概要付き)、および次に読むセクションを示すnextが含まれます。
コンテンツは Markdown としてパッケージ内に収録されており、セクションごとにファイルが用意されています。src/easydeploy_ai_mcp/guide/ を参照してください。このツールは読み取り専用で、API を呼び出しません。
あなたはデータサイエンティストです
EasyDeploy はモデルの検索、特徴量エンジニアリング、ハイパーパラメーターのチューニング、学習、デプロイ、予測を行います。データのクレンジング、ターゲットの定義、データの分割、未学習データでのモデルの検証は行いません。エージェントは get_started プレイブックに従って、これらの作業を行います。
- 準備します。 あなたと判断事項およびターゲットを決め、データを調べ、学習ファイルから識別子と予測時点で不明な情報を削除し、ターゲットを一文で定義します。ID はテストファイルやスコアリングファイルに残してもかまいません。予測では、モデルの学習に使われていない列は無視され、出力にはそのまま含まれるため、結果を元のデータに結合しやすくなります。データの変更や列の削除は、適用する前にあなたの確認を得ます。
- 分割します。 分類では層化抽出で 80/20 に分割し、時系列データでは時系列順に分割します。同じエンティティが両方のファイルに含まれないようにし、重複もなくします。SMOTE などのデータのバランス調整は、学習ファイルのみに適用します。
- アップロードして学習します。 ファイルは個別にアップロードし、
dataset_typeをtrainとtestに設定します(validationは任意です)。モデルのバージョンは学習データセットのバージョンのみを使って作成します。 - ホールドアウトデータで検証します。 レポートの交差検証スコアは学習ファイル内で測定され、学習時の適合度指標はインサンプルの値です。実際の推定値は、テストデータセットのバージョンに対して
run_batch_predictionを実行して得られます。ダウンロードした CSV には、正解ラベルを含むすべての入力列が元の行順で保持され、prediction列とprobability_<class>列が追加されます。エージェントは CSV から指標を計算し、各種の誤りのコストに基づいて判定しきい値を選びます(コストが不明な場合に限り、最良の F1 を選びます)。回帰の場合は誤差の範囲を報告します。 - 実際の出力を使います。 ダッシュボード、レポート、スコア付きリストは、モック値ではなく実際の予測をもとに作成します。
学習ファイルを EasyDeploy に取り込む
start_upload はアップロードセッションを開始し、エージェントはホストが提供するバイト転送チャネルの中から最適なものを選びます。ファイルの内容が会話や、どのチャネルのツール引数を通じて送信されることもありません — エージェントは URL を渡すか、curl を実行し、データそのものを渡すことはありません。
| チャネル | 使用される場合 | フロー |
|---|---|---|
| ファイルパラメーター | openai/fileParams に対応するホスト(Codex、ChatGPT)。start_upload は _meta: {"openai/fileParams": ["file"]} を宣言するため、ホストがダウンロード URL を含む file 引数を設定します。サンドボックスのネットワークは不要です。 | start_upload(..., file=…) → セッションが RECEIVING になる → get_upload_status をポーリングする → complete_upload |
| ゲートウェイ PUT(デフォルト) | Claude Code、Cowork、および外部接続が許可された claude.ai/Desktop のサンドボックス。ファイルごとに最大 6 MB です。それを超えるとゲートウェイは 413 を返し、分割して送信する方法はありません。 | start_upload → ファイルがあるシェルで、返された curl_command を実行する → get_upload_status をポーリングする → complete_upload |
| 共有リンクから取得 | サンドボックスから外部接続できないものの、ファイルがすでに共有可能な URL にある場合:リンクを知っている全員に公開設定された Google Sheets または Drive のリンク、OpenAI のファイルリンク、またはその他の許可リスト登録済みホスト。EasyDeploy がサーバー側で最大 256 MB までのバイトデータを取得します。 | start_upload → upload_from_url(upload_request_id, source_url) → get_upload_status をポーリングする → complete_upload |
get_upload_status は URL_ISSUED → RECEIVING → UPLOADED → VALIDATING → READY | REJECTED → CONSUMED(および EXPIRED)を報告します。complete_upload には READY が必要です — データセットのバージョンになるすべてのバイトデータは、まず CSV バリデーターを通過します。処理中のセッション、REJECTED、または EXPIRED の場合は、実行すべき操作を示す内容とともに 400 が返されます。REJECTED の場合、error フィールドに失敗したチェックが記載されます。complete_upload は安全に再試行できます。すでに CONSUMED のセッションに対しては既存のデータセットバージョンが返され、409 が返された場合は同じセッションへの別の呼び出しがまだ処理中です(数秒待ってから再試行してください)。get_upload_status の対象は start_upload で開始したセッションのみです。Web モデルビルダーからアップロードされたファイルは Web アプリに登録されるため、ここには表示されません。
新しいデータセットまたは新しいバージョン。 start_upload で dataset_id を省略すると、complete_upload は指定した名前で新しいデータセットを作成します。既存のデータセットの ID を渡すと、アップロードはそのデータセットの新しいバージョンになります。この場合、complete_upload の name は無視され、データセット名はそのまま保持されます。complete_upload は dataset と datasetVersion をそれぞれ 1 回返し、列名は columnNames リストに含めます。qa_status は情報提供のみで、処理を制限するものではありません。version_type が関係するのは、1 つのケースだけです。明示的な dataset_version_id を指定して submit_training_job を呼び出すと、raw バージョンは拒否されます。モデルバージョン固有のデータセットで学習するには、dataset_version_id を省略してください。
ホストにバイト転送チャネルがまったくない場合のフォールバック(外部接続もファイルブリッジもない場合):エージェントは学習ファイルを保存し、ダウンロードできるようにあなたに渡したうえで、start_upload が返す fallback テキストを使って Web モデルビルダーを案内します。このテキストには環境に適したモデルビルダーの URL が含まれています(例:easydeploy.ai/model-builder)。そこでアップロードした後、入力したデータセット名をエージェントに伝えるか、ページのデータセット URLを貼り付けてください。エージェントは list_datasets でデータセットを特定し、行数を確認してから続行します。このアップロードはデータセットとしてすでに登録されているため、complete_upload は使用しません。プランで許可されている場合は、上記の許可リスト項目を追加すると、この回り道を避けられます。
モデルレポートを読む
get_model_report はレポートと構造化された metrics オブジェクトを返します(API からそのまま引き継がれます)。モデル検索では、候補を10分割交差検証でスコアリングします(分類器では ROC-AUC に基づいて層化・シャッフルし、回帰器では負の MSE に基づいてシャッフルします。time_series_mode=true で作成したバージョンでは、前進分割の TimeSeriesSplit を使用します)。その後、最良のモデルを全行で再学習します。別個のテストセットはありません。metrics.trainingFit の正解率、混同行列、クラスごとの適合率/再現率、およびインサンプル ROC-AUC は学習データへの適合結果であり、metrics.crossValidation.score は学習ファイル内で測定されたレポートのアウトオブサンプル推定値です。ホールドアウト推定値は、レポートからではなく、run_batch_prediction で独自のテストファイルをスコアリングして得られます。metrics.crossValidation.strategy には実行で使用した CV(前進分割の場合は time_series_split)が記録され、metrics.warnings は引用時に注意すべき点を示します。文章による概要は LLM が作成するため、表現が厳密でない場合があります。
エイリアスでモデルを昇格する
エイリアスとは、モデルのバージョンのうちちょうど1つを指す、staging や production のような名前付きポインターです。run_prediction と run_batch_prediction では、model_version_id(特定のバージョン)または model_id + alias(呼び出しの実行時にエイリアスが指しているバージョン)のいずれかを指定します。両方を指定することはできません。エイリアスでスコアリングすれば、呼び出しを変更せずに新しいバージョンへ昇格できます。結果の modelVersionId には実際にスコアリングしたバージョンが常に示され、alias には解決されたエイリアスがそのまま返されます。
list_model_aliases は各エイリアスの参照先を表示します。set_model_alias はエイリアスを作成または移動します。変更の前には必ずドライランで確認します。新しいバージョンの学習に使用した列またはターゲットが、エイリアスの現在の参照先バージョンと異なる場合(追加・削除された列を含む TRAINING_COLUMNS_CHANGED、TARGET_FEATURE_CHANGED、TRAINING_COLUMNS_UNKNOWN)、何も書き込まず、警告とともに needs_confirmation: true を返します。これによりエージェントは変更内容をユーザーに提示できます。書き込みが行われるのは、confirm=true を指定して再度呼び出した場合のみです。警告がない場合は、確認後すぐに書き込みます。
API キーには full または predict(スコアリング用の読み取り、予測、アップロード)というスコープがあります。エイリアスを移動できるのは full スコープのキーのみです。predict 専用のキーでは 403 INSUFFICIENT_SCOPE が返され、ツールのエラーには full スコープのキーが必要であることが示されます。エイリアス引数を使うには、エイリアス用ルートを備えた EasyDeploy API が必要です。古いバックエンドを指すセルフホスト環境の EDA_API_BASE では、バックエンド独自の 400 または 404 が返されます。
お使いのコンピューター上でのローカル MCP(stdio)
EasyDeploy API キーを使って、ご自身のマシンで MCP サーバーを実行します。インターネットには公開されません。
1. インストール
pip install easydeploy-ai-mcp
2. Claude Desktop の設定に追加
Claude Desktop の設定ファイルを編集(または新規作成)します。
| OS | パス |
|---|---|
| macOS | ~/Library/Application Support/Claude/claude_desktop_config.json |
| Windows | %APPDATA%\Claude\claude_desktop_config.json |
以下を JSON のルートに統合します(既存のキーはそのまま残してください)。
{
"mcpServers": {
"EasyDeploy AI": {
"command": "easydeploy-ai-mcp-stdio",
"env": {
"EDA_API_KEY": "eda_live_YOUR_KEY"
}
}
}
}
eda_live_YOUR_KEY を EasyDeploy ダッシュボードの Account → API Keys で取得したキーに置き換えます。Claude が PATH 上で見つけられない場合は、easydeploy-ai-mcp-stdio の絶対パスを使用してください(which easydeploy-ai-mcp-stdio を実行すると確認できます)。
3. Claude Desktop を再起動
アプリを完全に終了してから、再度開きます。MCP サーバーに EasyDeploy AI が表示されます。
Docker またはクラウドプロバイダーでのセルフホストについては、リモート MCP(HTTP)を参照してください。
提供される機能
- 30 個のツール:
get_started(手順ガイド)に加え、プロジェクト、データセット(3 種類のアップロード方法を含む)、モデルバージョン、モデルエイリアス、トレーニングジョブ、予測、アカウントの状態を扱うツールが含まれます。 - すべてのツールにタイトルと注釈(
titleはツール本体とannotations.titleの両方に設定され、さらにreadOnlyHint、destructiveHint、idempotentHint、openWorldHintも設定されます)があるため、ホスト側で読み取りと書き込みを判別できます。get_startedとその他 17 個のget_*/list_*ツールは読み取り専用です。既存のレコードのフィールドを上書きする可能性がある書き込みは、destructiveHint: trueになります:create_project、create_model、create_dataset_version(ID を指定すると、そのレコードを更新します)、update_dataset、submit_training_job(ジョブを再送信すると、モデルバージョンがその場で再トレーニングされます)、set_model_alias(既存のエイリアスを移動する可能性があります。また、同じ呼び出しを繰り返しても変更がないため、update_dataset以外で唯一の冪等な書き込みです)。その他の書き込みはレコードを追加するだけなので、destructiveHint: falseです。削除を行うツールはありません。EasyDeploy が外部 URL を取得するのは、upload_from_urlとstart_upload(ホストのfileを指定した場合)のみです。create_projectとcreate_modelは作成または更新を行うため、非冪等な書き込みとしてマークされています。データセット名の変更には専用ツールupdate_datasetを使用します。get_datasetは純粋な読み取りです。 - ローカルクライアント向けの stdio トランスポート、または
/mcp上の Streamable MCP と、ロードバランサー向けの GET /healthz を備えた HTTP。 - セキュリティ強化: EasyDeploy API への呼び出しは HTTPS のみです。HTTP MCP エンドポイントには
MCP_SERVICE_TOKENを任意で設定できます。エージェントに適した形でレスポンスフィールドを必要に応じて削減します。クエリ値(OAuth コード、state、PKCE 値)はアクセスログに記録されません。トークンと登録のレスポンスにはCache-Control: no-storeを設定します。
本番環境および SOC 2 に関する要件が厳しい環境では、データを自社のインフラ内に保つため、セルフホストを推奨します。ホスト型コネクター https://mcp.easydeploy.ai/mcp は、ほとんどのユーザーに適しています。
要件
- Python 3.10+
- ダッシュボード(Account → API Keys)で取得した EasyDeploy API key。クライアントはデフォルトで本番環境の EasyDeploy API ホストを使用します。
インストール
PyPI から(最初のリリース後)
pip install easydeploy-ai-mcp
ソースから
git clone https://github.com/easydeploy-ai/easydeploy-ai-mcp.git
cd easydeploy-ai-mcp
pip install -e ".[dev]" # includes pytest
# or minimal runtime only:
pip install .
環境変数
| 変数 | 必須 | 説明 |
|---|---|---|
EDA_API_KEY | stdio / legacy HTTP | stdio と legacy HTTP(OAuth なし)で必須です。EDA_OAUTH_ENABLED=1 の場合、外部 API 呼び出しには使用されません。各 MCP リクエストには Authorization: Bearer <JWT or eda_live_…> を含める必要があります。 |
EDA_API_BASE | いいえ | デフォルトの本番 API(https://api.easydeploy.ai)を上書きします。本番以外のエンドポイントを対象とする場合にのみ設定してください。末尾の /v1 は省略可能です。 |
EDA_UI_BASE_URL | いいえ | ui_url フィールドのプレフィックスです(デフォルトは https://easydeploy.ai)。 |
MCP_SERVICE_TOKEN | いいえ | 従来の単一テナント用ゲートです。設定すると、HTTP モードでは /mcp に対する Authorization: Bearer <token> が必要になります(GET /healthz は対象外)。EDA_OAUTH_ENABLED とは併用できません。 |
EDA_OAUTH_ENABLED | いいえ | HTTP トランスポートを OAuth 2.0 リソースサーバーとして実行するには 1 を設定します。EDA_COGNITO_USER_POOL_ID と EDA_COGNITO_CLIENT_ID が必要です。リモート MCP(HTTP)を参照してください。 |
EDA_COGNITO_USER_POOL_ID | OAuth | EasyDeploy API のアクセストークンを発行する Cognito ユーザープールです。 |
EDA_COGNITO_CLIENT_ID | OAuth | アクセストークンの client_id クレームで想定されるアプリクライアント ID です。 |
EDA_COGNITO_REGION | いいえ | ユーザープールの AWS リージョンです(デフォルトは us-east-1)。 |
EDA_REPORT_MAX_WAIT_SECONDS | いいえ | get_model_report のポーリング時間の上限(秒)です(デフォルトは 45、最大は 60)。 |
EDA_REPORT_POLL_INTERVAL_SECONDS | いいえ | ポーリング間隔(秒)です(デフォルトは 10)。 |
HOST / PORT | いいえ | HTTP のバインド先です(デフォルトは 0.0.0.0 / 8080)。 |
EDA_TRUST_FORWARDED_HEADERS | いいえ | ALB/リバースプロキシの背後で 1 を設定すると、RFC 9728 の resource に https が使用されます(X-Forwarded-Proto を信頼します)。 |
EDA_MCP_OAUTH_ISSUER | いいえ | authorization_servers およびプロキシの /.well-known/oauth-authorization-server の issuer に使用する、公開 MCP ベース URL(パスなし)です。デフォルトはリクエストのオリジンです。プロキシの背後で Host / X-Forwarded-Proto が正しくない場合に使用してください。 |
EDA_CORS_EXTRA_ORIGINS | いいえ | 組み込みリスト(Claude、ChatGPT、VS Code Web、Cursor、MCP Inspector)に加えて許可する、ブラウザーのオリジンをカンマ区切りで指定します。 |
EDA_MCP_OAUTH_BROKER | いいえ | 認可リダイレクトを仲介するには 1 を設定します。デフォルトでは無効です。仲介認可を参照してください。 |
EDA_MCP_EXTRA_REDIRECT_HOSTS | いいえ | 仲介モード:クライアントの redirect_uri として許可する追加の HTTPS コールバックをカンマ区切りで指定します。host(任意のパス)、host/path(完全一致)、host/path/(プレフィックス)、.host(ホストとサブドメイン)。 |
EDA_MCP_EXTRA_REDIRECT_SCHEMES | いいえ | 仲介モード:クライアントの redirect_uri として許可する追加のプライベート用途 URI スキーム(RFC 8252 §7.1)をカンマ区切りで指定します。 |
EDA_MCP_ALLOW_LOOPBACK_REDIRECT | いいえ | 仲介モード:http://127.0.0.1:<port> へのコールバックを拒否するには 0 を設定します。デフォルトは 1 です。デスクトップクライアントではこれらが必要です。 |
EDA_MCP_BROKER_SECRET | いいえ | 仲介モード:OAuth の state を保護する HMAC キーです。実際のデプロイでは必ず設定してください。未設定時の代替値は公開情報である Cognito のプール ID とクライアント ID から導出され、サーバーは警告をログに記録します。 |
ローカル MCP(stdio)
クライアント(Claude Desktop、Cursor など)がサーバーをサブプロセスとして起動する場合に使用します。
export EDA_API_KEY="eda_live_..."
easydeploy-ai-mcp-stdio
または、python -m easydeploy_ai_mcp
設定例のスニペット:
{
"mcpServers": {
"easydeploy-ai": {
"command": "easydeploy-ai-mcp-stdio",
"env": {
"EDA_API_KEY": "eda_live_..."
}
}
}
}
リモート MCP(HTTP)
FastMCP を介して Streamable HTTP を /mcp で提供します(固定した FastMCP 3.x のバージョンで確認してください)。ヘルスチェック:GET /healthz。
export EDA_API_KEY="eda_live_..."
easydeploy-ai-mcp-http
または、uvicorn easydeploy_ai_mcp.http_main:app --host 0.0.0.0 --port 8080
別の ASGI アプリに mcp.http_app() を組み込む場合は、FastMCP HTTP アプリの lifespan を引き継いでください(FastMCP ASGI)。easydeploy_ai_mcp.http_main は uvicorn 用にすでに引き継ぎを行います。
認証モード
いずれか1つだけを選んでください(EDA_OAUTH_ENABLED と MCP_SERVICE_TOKEN の両方を設定すると、インポート時にエラーが発生します)。
- OAuth 2.0 リソースサーバー(マルチテナント):
EDA_OAUTH_ENABLED=1とEDA_COGNITO_USER_POOL_IDおよびEDA_COGNITO_CLIENT_IDを設定します。オプションの エクストラをインストールします:pip install easydeploy-ai-mcp[oauth]。サーバーは、受信した Cognito アクセストークン JWT を Cognito JWKS に照らしてローカルで検証し(issuer、署名、exp、token_use=='access'、client_id)、そのトークンを EasyDeploy API に転送します。 EasyDeploy API キー(プレフィックスeda_live_)も同じAuthorization: Bearerヘッダーで受け付け、 そのまま転送されます。失効の正本は API です。RFC 9728 メタデータは/.well-known/oauth-protected-resourceで公開されます。RFC 8414 プロキシメタデータにはregistration_endpointとgrant_types_supported(authorization_code、refresh_token)が含まれ、POST /oauth/registerは固定の Cognito MCPEDA_COGNITO_CLIENT_ID(RFC 7591 形式のパブリッククライアント)を返します。要求されたgrant_typesのうちサポート対象のものは、指定どおりに返されます(authorization_codeとrefresh_token。指定がない場合は両方)。401 レスポンスにはWWW-Authenticate: Bearer …が含まれるため、MCP クライアントは認証サーバーを検出できます。 注:Cognito アクセストークンにはaudではなくclient_idが含まれます。オーディエンスは設定しないでください。 - 共有シークレットゲート(レガシーのシングルテナント):
MCP_SERVICE_TOKENを設定します。すべての 送信 API 呼び出しでは、静的なEDA_API_KEYを使用します。 - 認証なし:開発用途のみ。
ブローカー経由の認可
Cognito は redirect_uri をアプリクライアントのコールバックリストと文字どおり照合します。ワイルドカード、プレフィックス、ポートは使えず、Hosted UI を表示する前に /oauth2/authorize でチェックします。そのため、コールバックが登録されていないクライアントにはサインインページが表示されません。ブラウザーには redirect_mismatch が表示され、「設定に問題がある」のではなく「コネクターがログインページを読み込めなかった」ように見えます。
これはコールバックが固定で1つのクライアントでは機能しますが、それ以外のクライアントでは機能しません。
| クライアント | コールバック | 登録可能か |
|---|---|---|
| Claude(Web、Desktop) | https://claude.ai/api/mcp/auth_callback | はい |
| ChatGPT カスタムコネクター | https://chatgpt.com/connector_platform_oauth_redirect、または発行者を特定できない場合は https://chatgpt.com/connector/oauth/<callback_id> | 前者のみ |
| VS Code / Insiders | https://vscode.dev/redirect | はい |
| Claude Code、Cursor、MCP Inspector | http://127.0.0.1:<port chosen at runtime>/callback | いいえ |
EDA_MCP_OAUTH_BROKER=1 を設定すると、サーバーは Cognito に独自のコールバック {issuer}/oauth/callback を送信します。これは一度登録すればよい固定 URL です。クライアントの実際の redirect_uri は OAuth の state に封印され、Cognito から戻ると、クライアント自身の state を復元したうえで、その URI に認可コードを転送します。Cognito はトークン交換時にも redirect_uri を再確認するため、/token は一致するように書き換えます。
これによりリダイレクトのチェックが Cognito からこのサーバーに移りますが、チェック自体は引き続き必須です。 チェックがなければ、誰でも自身が管理するコールバックを使ってここでフローを開始し、サインイン済みユーザーの認可コードを取得できてしまいます。oauth_broker.py のチェックは、置き換える登録リストと同程度に厳格です。HTTPS コールバックは既知のクライアントのホストと完全に一致し、クライアントのコールバックパスが判明している場合はパスも一致する必要があります(claude.ai/api/mcp/auth_callback、chatgpt.com/connector/oauth/…、vscode.dev/redirect)。サブドメインは暗黙に許可されません。そうしないと、ベンダーのドメイン配下にあるオープンリダイレクトや期限切れの CNAME が、認可コードの収集場所になってしまう可能性があります。RFC 8252 §7.3 に従ってループバックを許可し、短い許可リストにあるプライベート用途のスキームも許可します。コードの許可範囲を広げるのではなく、EDA_MCP_EXTRA_REDIRECT_HOSTS / EDA_MCP_EXTRA_REDIRECT_SCHEMES で拡張してください。
ブローカーモードでは PKCE が必須です。 Cognito は code_challenge を任意として扱い、ブローカーの /token 書き換えによって Cognito が行った唯一のチェックも取り除かれるため、PKCE のないフローではコードが何にも結び付けられません。ブラウザーの履歴やプロキシログでコードを見つけた人なら誰でも、引き換えられてしまいます。/authorize は code_challenge_method=S256 のないブローカー経由のリクエストを拒否します。すべての MCP クライアントは、すでにこれを送信します。
適用する順序が重要です。 まず Cognito アプリクライアントに {issuer}/oauth/callback を登録し、その後で EDA_MCP_OAUTH_BROKER=1 を設定してください。逆の順序で行うと、現在動作しているクライアントが動かなくなるため、デフォルトでは無効になっています。
Docker — ローカルで実行(ECS/Fargate にデプロイするものと同じイメージです。easydeploy-ai-mcp[oauth] を含みます):
# Convenience: build + run (reads .env in the repo root if present)
./scripts/run_mcp_docker_local.sh
# Explicit env vars (no .env)
./scripts/run_mcp_docker_local.sh -e EDA_API_KEY="eda_live_..."
# Different host port
PORT=9000 ./scripts/run_mcp_docker_local.sh
AWS でホスト(Fargate + ALB): このリポジトリの Dockerfile をビルドしてコンテナレジストリにプッシュし、その後、HTTPS ロードバランサーの背後にデプロイします。上記の環境変数をタスク/コンテナに設定してください。
手動で同等の操作を行う場合:
docker build -t easydeploy-ai-mcp .
docker run --rm -p 8080:8080 \
-e EDA_API_KEY="eda_live_..." \
easydeploy-ai-mcp
ドキュメント
- docs/claude-getting-started.md — EasyDeploy + Claude:コネクター、またはローカル Desktop の設定 JSON
- docs/claude.md — Claude コネクターと Claude Code の比較、トランスポート、ヘッダー
REST API リファレンス
この MCP サーバーは、EasyDeploy の公開 REST API を利用する薄いクライアントです。エンドポイントの動作、リクエスト本文、レスポンスの形式は EasyDeploy(ダッシュボード、製品ヘルプ、easydeploy.ai の公式 API 資料)で定義されています。このリポジトリでは OpenAPI 仕様全体を複製せず、各操作を MCP ツールに対応付けています。
リリースと API の互換性
このリポジトリは、EasyDeploy MCP サーバーのオープンソース版です。新しいリリースは、顧客向けに公開されているEasyDeploy パブリック REST API(ダッシュボードおよび公式 API 資料に記載)に追随します。API にエンドポイントが追加または変更された場合は、ここにも対応する更新が行われます。ツールやクライアントの動作を変更する場合は、コントリビューターガイドのCONTRIBUTING.mdに従ってください。
開発
pip install -e ".[dev]"
pytest
任意 — HTTP アプリで実際の Cognito JWT を使用する場合(ライブ JWKS、モックなし):EDA_INTEGRATION_COGNITO_ACCESS_TOKEN と、OAuth モードで使用するものと同じ EDA_COGNITO_* 変数を設定し、pytest tests/test_cognito_jwt_integration.py -v を実行してください。詳細は、そのファイルの docstring を参照してください。
プルリクエストや問題の報告については、CONTRIBUTING.mdを参照してください。
セキュリティ
脆弱性の報告とデプロイに関する注意事項については、SECURITY.mdを参照してください。
ライセンス
MIT — LICENSEを参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。