mastra-hono について
mastra-honoは、Mastra v1 BetaとHono向けの開発スキルです。エージェント、ツール、ワークフロー、APIサーバーの構築を案内し、スキャフォールドとパターン集を提供します。
主な機能
- 01Mastraのエージェントとツールの定義
- 02複数ステップのワークフロー構築
- 03Hono経由のAPI提供
- 04マルチエージェントネットワークの設定
- 05MCPサーバーパターンの参照
- 06スキャフォールドと検証スクリプト
活用シーン
- 01ツールとメモリを備えたエージェントの作成
- 02ワークフローのステップとデータフロー設定
- 03MastraとHonoによるAPI構築
- 04MCPクライアント向けMCPサーバーの作成
MCP 対応
Mastraを通じてエージェントやツールを公開するMCPサーバーの作成方法を扱います。対象はMCP互換クライアントです。
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ jwynia/ agent-skills --skill mastra-honoインストール後、Claude Code で/mastra-honoを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
assets/agent-template.tshono-server-template.tstool-template.tsvitest-setup-template.tsworkflow-template.tsreferences/agent-networks.mdagent-patterns.mdcommon-mistakes.mdcontext-network-memory.mdhono-server-patterns.mdmcp-server-patterns.mdrag-memory-patterns.mdtesting-patterns.mdtool-patterns.mdworkflow-data-flow.mdscripts/check-version-patterns.tsscaffold-agent.tsscaffold-project.tsscaffold-tool.tsscaffold-workflow.tsvalidate-workflow-schemas.ts詳細
Mastra + Hono 開発
Mastra v1 Beta と Hono API サーバーを使用して、本番環境に対応した AI エージェント、ツール、ワークフローを構築します。このスキルでは、エージェントの定義からデプロイまで、スタック全体を扱います。
対象バージョン:Mastra v1 Beta(安定版リリースは2026年1月を予定)
このスキルを使用する場面
次の場合に使用します:
- ツールとメモリを備えた Mastra エージェントを作成する
- Zod の入出力スキーマを使用してツールを定義する
- 複数ステップのデータフローを備えたワークフローを構築する
- Mastra アダプターを使用して Hono API サーバーをセットアップする
- マルチエージェント連携のためのエージェントネットワークを実装する
- エージェントやツールを公開する MCP サーバーを作成する
- RAG と会話メモリを統合する
次の場合には使用しないでください:
- Mastra 安定版(0.24.x)を使用する場合。パターンが大きく異なります
- AI を使用しない Web API を構築する場合(Hono を直接使用してください)
- エージェントやツールを使わずに、シンプルな LLM 呼び出しを行う場合
前提条件
- Node.js 22.13.0+(v1 Beta で必須)
- パッケージマネージャー:npm、pnpm、または bun
- API キー:OpenAI、Anthropic、またはその他の対応プロバイダー
# Install v1 Beta packages
npm install @mastra/core@beta @mastra/hono@beta
npm install @ai-sdk/openai # or other provider
npm install zod hono @hono/node-server
クイックスタート
最小構成のエージェント + ツール + Hono サーバー
// src/mastra/tools/weather-tool.ts
import { createTool } from "@mastra/core/tools";
import { z } from "zod";
export const weatherTool = createTool({
id: "get-weather",
description: "Fetches current weather for a location",
inputSchema: z.object({
location: z.string().describe("City name, e.g., 'Seattle'"),
}),
outputSchema: z.object({
temperature: z.number(),
conditions: z.string(),
}),
// v1 Beta signature: (inputData, context)
execute: async (inputData, context) => {
const { location } = inputData;
const { abortSignal } = context;
if (abortSignal?.aborted) throw new Error("Aborted");
// Fetch weather data...
return { temperature: 72, conditions: "sunny" };
},
});
// src/mastra/agents/weather-agent.ts
import { Agent } from "@mastra/core/agent";
import { openai } from "@ai-sdk/openai";
import { weatherTool } from "../tools/weather-tool.js";
export const weatherAgent = new Agent({
name: "weather-agent",
instructions: "You are a helpful weather assistant.",
model: openai("gpt-4o-mini"),
tools: { weatherTool }, // Object, not array
});
// src/mastra/index.ts
import { Mastra } from "@mastra/core/mastra";
import { weatherAgent } from "./agents/weather-agent.js";
export const mastra = new Mastra({
agents: { weatherAgent },
});
// src/index.ts
import { serve } from "@hono/node-server";
import { Hono } from "hono";
import { MastraServer } from "@mastra/hono";
import { mastra } from "./mastra/index.js";
const app = new Hono();
const server = new MastraServer({ app, mastra });
await server.init();
app.get("/", (c) => c.text("Mastra + Hono Server"));
serve({ fetch: app.fetch, port: 3000 });
console.log("Server running at http://localhost:3000");
// Agent endpoint: POST /api/agents/weather-agent/generate
基本パターン
エージェントの定義
import { Agent } from "@mastra/core/agent";
const agent = new Agent({
name: "my-agent", // Required: unique identifier
instructions: "You are a helpful assistant.", // Required: system prompt
model: openai("gpt-4o-mini"), // Required: LLM model
tools: { weatherTool, searchTool }, // Optional: object with named tools
});
// Model routing (1113+ models from 53 providers)
model: "openai/gpt-4o-mini"
model: "anthropic/claude-3-5-sonnet"
model: "google/gemini-2.5-flash"
// Model fallbacks for resilience
model: [
{ model: "anthropic/claude-3-opus", maxRetries: 3 },
{ model: "openai/gpt-4o", maxRetries: 2 },
{ model: "google/gemini-pro", maxRetries: 1 },
]
// Agent execution with memory
const response = await agent.generate("Remember my name is Alex", {
memory: {
thread: "conversation-123", // Isolates conversation
resource: "user-456", // Associates with user
},
});
ツールのシグネチャ(v1 Beta — 重要)
// v1 Beta: execute(inputData, context)
execute: async (inputData, context) => {
const { location } = inputData; // First parameter: parsed input
const { mastra, runtimeContext, abortSignal } = context; // Second: context
// Access nested agents via mastra
const helper = mastra?.getAgent("helperAgent");
// Always check abort signal for long operations
if (abortSignal?.aborted) throw new Error("Aborted");
return { temperature: 72, conditions: "sunny" };
}
// WRONG for v1 Beta:
execute: async ({ context }) => { ... } // This is stable 0.24.x signature
ワークフローのデータフロー(重要)
ここで最も多くのエラーが発生します。完全なパターンについては、references/workflow-data-flow.md を参照してください。
import { createWorkflow, createStep } from "@mastra/core/workflows";
const step1 = createStep({
id: "step-1",
inputSchema: z.object({ message: z.string() }),
outputSchema: z.object({ formatted: z.string() }),
execute: async ({ inputData }) => {
// inputData = workflow input (for first step)
return { formatted: inputData.message.toUpperCase() };
},
});
const step2 = createStep({
id: "step-2",
inputSchema: z.object({ formatted: z.string() }), // MUST match step1 output
outputSchema: z.object({ emphasized: z.string() }),
execute: async ({ inputData }) => {
// inputData = step1's return value directly
return { emphasized: `${inputData.formatted}!!!` };
},
});
const workflow = createWorkflow({
id: "my-workflow",
inputSchema: z.object({ message: z.string() }), // MUST match step1 input
outputSchema: z.object({ emphasized: z.string() }), // MUST match final output
})
.then(step1)
.then(step2)
.commit();
スキーマの一致ルール:
| ルール | 説明 |
|---|---|
| ワークフローの入力 → ステップ 1 の入力 | 完全に一致する必要があります |
| ステップ N の出力 → ステップ N+1 の入力 | 完全に一致する必要があります |
| 最終ステップの出力 → ワークフローの出力 | 完全に一致する必要があります |
ステップ内のデータアクセス:
execute: async ({
inputData, // Previous step's output (or workflow input for step 1)
getStepResult, // Access ANY step's output by ID
getInitData, // Get original workflow input
mastra, // Access agents, tools, storage
}) => {
const step1Result = getStepResult("step-1");
const originalInput = getInitData();
return { result: inputData.formatted };
}
Hono サーバーのセットアップ
import { MastraServer } from "@mastra/hono";
const app = new Hono();
const server = new MastraServer({ app, mastra });
await server.init();
// Endpoints auto-registered:
// POST /api/agents/{agent-name}/generate
// POST /api/agents/{agent-name}/stream
// POST /api/workflows/{workflow-id}/start
カスタムルートプレフィックス:
const server = new MastraServer({
app,
mastra,
prefix: "/v1/ai" // Routes at /v1/ai/agents/...
});
カスタム API ルート:
import { registerApiRoute } from "@mastra/core/server";
registerApiRoute("/my-custom-route", {
method: "POST",
handler: async (c) => {
const mastra = c.get("mastra");
const agent = mastra.getAgent("my-agent");
const result = await agent.generate("Hello");
return c.json({ response: result.text });
},
});
よくある間違いのクイックリファレンス
| トピック | 誤り | 正しい例 |
|---|---|---|
| インポート | import { Agent } from "@mastra/core" | import { Agent } from "@mastra/core/agent" |
| tools 配列 | tools: [tool1, tool2] | tools: { tool1, tool2 } |
| メモリコンテキスト | { threadId: "123" } | { memory: { thread: "123", resource: "user" } } |
| ワークフローのデータ | context.steps.step1.output | inputData または getStepResult("step-1") |
| 並列処理の後 | inputData.result | inputData["step-id"].result |
| 分岐処理の後 | inputData.result | inputData["step-id"]?.result(任意) |
| ネストされたエージェント | import agent; agent.generate() | mastra.getAgent("name").generate() |
| 状態の変更 | state.counter++ | setState({ ...state, counter: state.counter + 1 }) |
| v1 のツール実行 | execute: async ({ context }) | execute: async (inputData, context) |
スクリプトのリファレンス
| スクリプト | 目的 | 使用方法 |
|---|---|---|
scaffold-project.ts | Mastra+Hono の新規プロジェクトを作成する | deno run --allow-all scripts/scaffold-project.ts --name my-project |
scaffold-agent.ts | ツールを備えたエージェントを作成する | deno run --allow-all scripts/scaffold-agent.ts --name weather |
scaffold-workflow.ts | ステップを備えたワークフローを作成する | deno run --allow-all scripts/scaffold-workflow.ts --name process-data |
scaffold-tool.ts | スキーマを備えたツールを作成する | deno run --allow-all scripts/scaffold-tool.ts --name fetch-weather |
validate-workflow-schemas.ts | ステップのスキーマが一致するか検証する | deno run --allow-read scripts/validate-workflow-schemas.ts ./src/mastra/workflows/ |
check-version-patterns.ts | v1 と安定版のパターンが混在していないか検出する | deno run --allow-read scripts/check-version-patterns.ts ./src/mastra/ |
その他のリソース
参考ファイル
references/workflow-data-flow.md- 完全なデータフローパターン(重要)references/common-mistakes.md- アンチパターンと修正方法の詳細references/agent-patterns.md- エージェント定義の詳細references/tool-patterns.md- ツールのシグネチャとラッパーreferences/hono-server-patterns.md- サーバーのセットアップ、ルート、ミドルウェアreferences/testing-patterns.md- Vitest のセットアップ、LLM のモックreferences/mcp-server-patterns.md- Model Context Protocol の作成references/agent-networks.md- マルチエージェント連携、A2Areferences/rag-memory-patterns.md- ベクトルストア、埋め込み、メモリreferences/context-network-memory.md- エージェントメモリ用のコンテキストネットワーク
アセットテンプレート
assets/agent-template.ts- エージェントのボイラープレートassets/tool-template.ts- ツールのボイラープレート(v1 シグネチャ)assets/workflow-template.ts- ワークフローのボイラープレートassets/hono-server-template.ts- Hono+Mastra サーバーのセットアップassets/vitest-setup-template.ts- テスト設定
外部ドキュメント
制限事項
- v1 Beta のみを対象としています。安定版(0.24.x)のパターンは大きく異なります
- スクリプトの実行には、適切な権限を設定した Deno ランタイムが必要です
- MCP サーバーのパターンには、MCP 対応クライアントが必要です
- エージェントネットワークでは、参加するすべてのエージェントが同じ Mastra インスタンスに登録されている必要があります
関連スキル
- research-workflow - AI エージェント設計の詳細な調査
- web-search - エージェント向けのリアルタイム情報検索
コメント
Markdown 対応