creating-agents-in-medusa について
Medusaプロジェクトに管理者向けの内部AIエージェントを追加する開発スキルです。認証付きルート、共有セッションモデル、MedusaExec、ストリーミング、管理画面のチャットUIを扱います。
主な機能
- 01管理画面専用エージェントの設計
- 02共有セッション・メッセージモデルの利用
- 03MedusaExecによるデータ操作
- 04NDJSON形式のレスポンス配信
- 05管理画面チャットUIの構築
- 06タスクに応じた実装リファレンスの読み込み
活用シーン
- 01Medusa管理画面へのAIエージェント追加
- 02認証付きエージェントチャットルートの実装
- 03エージェント会話の保存と復元
- 04ストリーミング応答のエンドツーエンドテスト
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ medusajs/ medusa-agent-skills --skill creating-agents-in-medusaインストール後、Claude Code で/creating-agents-in-medusaを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
reference/admin-extension.mdagent-setup.mdapi-route.mddata-models.mdmedusa-exec.mdservice.mdstreaming.md詳細
Medusa でのエージェントの作成
このスキルでは、Medusa プロジェクトに内部向けの管理者用AI エージェントを追加するためのフルスタックを解説します。これらのエージェントは、ストアフロントの顧客ではなく、Medusa 管理ダッシュボードを通じてマーチャントやストア運営者が使用します。顧客向けエージェント(例:ストアフロントのチャットボット)には、別のアーキテクチャが必要です。公開 API ルートを使用し、MedusaExec は使わず、ストアフロントの認証を用います。
制約事項
- 内部利用のみ — このアーキテクチャは管理ユーザー(マーチャント、運営者、サポートスタッフ)向けであり、顧客向けではありません。ルートは
src/api/admin/配下に配置し、UI は Medusa 管理ダッシュボードに配置します。また、すべてのアクセスは管理者認証によって制限されます。 - 認証は必須です — MedusaExec は、データベースへのフルアクセスを伴う任意の TypeScript を実行します。すべてのエージェントルートで
AuthenticatedMedusaRequestを使用し、src/api/admin/配下に配置してください。認証されていないエンドポイントは、リモートコード実行の脆弱性になります。 - カスタムツールではなく MedusaExec を使用します — データ操作では、エージェントが TypeScript を記述し、MedusaExec を介して実行します。実行可能な TypeScript では表現できない機能(例:シークレットキーを使った外部 API の呼び出し)に限り、カスタムツールを作成してください。
- 共有モジュールを 1 つ、エージェントを複数作成します —
AgentSessionとAgentMessageは共有インフラストラクチャです。エージェントごとのセッションを区別するにはagent_typeを使用してください。エージェントごとに別のモデルを作成しないでください。 experimental_context経由でMedusaContainerを渡します — ツールファイルからサービスを直接インポートしないでください。循環依存が発生します。- ストリーム形式は NDJSON です —
Content-Type: application/x-ndjsonを使用し、1 行につき JSON オブジェクトを 1 つ出力し、行末には\nを付けます。 - モデルを追加または変更した後はマイグレーションを実行します(
npx medusa db:generate agent && npx medusa db:migrate)。 - ツールの説明は
tool()内ではなく、設定に記述します — 設定オブジェクトが実行時にツールの説明を上書きします。
重要:必要に応じてリファレンスファイルを読み込む
⚠️ 以下のクイックリファレンスだけでは実装には不十分です。 コードを書く前に、該当するリファレンスファイルを読み込んでください。
| タスク | 読み込むファイル |
|---|---|
| 会話モデルの定義 | reference/data-models.md |
| モジュールサービスの設定 | reference/service.md |
| ツール、プロンプト、streamText の設定 | reference/agent-setup.md |
| POST チャットエンドポイントの構築 | reference/api-route.md |
| NDJSON ストリーミングの実装 | reference/streaming.md |
| 管理画面のチャット UI の構築 | reference/admin-extension.md |
| エージェントへのコード実行機能の付与 | reference/medusa-exec.md |
最低要件: コードを書く前に、現在のタスクに対応するリファレンスファイルを少なくとも 1 つ読み込んでください。
関連スキル
必要に応じて、このスキルと併せて以下を読み込んでください。
building-with-medusa— Medusa のモジュールパターン、ワークフロー、データモデルの規約について説明します。モジュールサービスやカスタムバックエンドロジックを実装する際に読み込んでください。building-admin-dashboard-customizations— 管理 UI のコンポーネントパターン、TanStack Query、ルート登録について説明します。管理画面のチャット UI を構築または拡張する際に読み込んでください。
アーキテクチャの概要
src/modules/agent/
index.ts ← Module() export + AGENT_MODULE constant
service.ts ← MedusaService + Anthropic client + stream(messages, container, config)
models/
session.ts ← AgentSession (shared across all agents, filtered by agent_type)
message.ts ← AgentMessage
agents/index.ts ← streamText() orchestration
tools/
medusa-exec.ts ← MedusaExec tool (primary tool for all data operations)
todo-write.ts ← TodoWrite tool
config/
<agent-type>.ts ← per-agent system prompt + tool descriptions
src/api/admin/agent/<agent-type>/
route.ts ← POST (AuthenticatedMedusaRequest, session lifecycle, NDJSON stream)
sessions/route.ts ← GET session list (filtered by agent_type)
sessions/[id]/route.ts ← GET messages for a session
src/admin/routes/<agent-type>/
page.tsx ← React chat UI (admin extension)
src/lib/code-mode/
executor.ts ← sandboxed TypeScript executor used by MedusaExec
よくある間違い
以下の操作をしていないことを確認してください。
セキュリティ:
- エージェントのルートで
AuthenticatedMedusaRequestではなくMedusaRequestを使用している - エージェントのルートを
src/api/admin/の外に配置している
アーキテクチャ:
-
agent_typeを使用せず、エージェントごとに個別のAgentSession/AgentMessageモデルを作成している -
experimental_contextからサービスを解決せず、ツールファイル内でサービスを直接インポートしている - MedusaExec を使用せず、データ操作用のカスタムツールを作成している
ストリーミング:
- ストリームのループ後に
res.end()がなく、レスポンスが終了しない -
Transfer-Encoding: chunkedまたはContent-Type: application/x-ndjsonヘッダーがない - クライアントで不完全な行をバッファリングしておらず、パケット分割時に JSON の解析エラーが発生する
モジュール:
-
medusa-config.tsへのモジュールの登録を忘れている - モデル変更後のマイグレーション実行を忘れている
-
tool()ではなく設定オブジェクトに記述すべきツールの説明を、tool()内にハードコードしている
利用可能なリファレンスファイル
reference/data-models.md - model.define(), agent_type discriminator, relationships, migrations
reference/service.md - MedusaService extension, Anthropic init, stream(), module index, config registration
reference/agent-setup.md - streamText(), MedusaExec tool wiring, system prompt, context passing
reference/api-route.md - POST route, session lifecycle, message persistence, streaming headers
reference/streaming.md - NDJSON emission, fullStream iteration, chunk types, client-side parsing
reference/admin-extension.md - React chat UI, streaming fetch, message rendering, tool call display, session sidebar
reference/medusa-exec.md - Executor setup, MedusaExec tool, query.graph() patterns, error codes
テスト
エージェントを実装したら、管理ダッシュボードから直接エンドツーエンドでテストします。
- Medusa 開発サーバーを起動します(
npx medusa develop) - 管理ダッシュボードを開き、サイドバーにあるエージェントのページに移動します(
defineRouteConfigで設定したラベルが表示されます) - 「ストアには商品がいくつありますか?」 など、シンプルな読み取り専用プロンプトを入力して送信します
- レスポンスがストリーミングされ、サイドバーに新しいセッションが表示されることを確認します
- 同じセッションでフォローアップメッセージを送信し、会話履歴が保持されることを確認します
- ページを再読み込みし、サイドバーからセッションを選択して、データベースからメッセージ履歴が復元されることを確認します
問題が発生した場合は、次を確認してください。
- ブラウザーのネットワークタブ — POST リクエストが
Content-Type: application/x-ndjsonを返し、チャンク化された行が含まれていることを確認します - サーバーログ —
[agent] tool_callと[agent] step_finishの行があれば、エージェントが実行されています - データベース —
agent_sessionとagent_messageテーブルに、正しいagent_typeの行があることを確認します
コメント
Markdown 対応