mcpField
M
mastra-hono

mastra-hono

github.com/jwyniaエージェントワークフロー179375 回インストール35 週間前に更新
リポジトリ

mastra-hono について

mastra-honoは、Mastra v1 BetaとHono向けの開発スキルです。エージェント、ツール、ワークフロー、APIサーバーの構築を案内し、スキャフォールドとパターン集を提供します。

主な機能

  1. 01Mastraのエージェントとツールの定義
  2. 02複数ステップのワークフロー構築
  3. 03Hono経由のAPI提供
  4. 04マルチエージェントネットワークの設定
  5. 05MCPサーバーパターンの参照
  6. 06スキャフォールドと検証スクリプト

活用シーン

  1. 01ツールとメモリを備えたエージェントの作成
  2. 02ワークフローのステップとデータフロー設定
  3. 03MastraとHonoによるAPI構築
  4. 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.ts
hono-server-template.ts
tool-template.ts
vitest-setup-template.ts
workflow-template.ts
references/
agent-networks.md
agent-patterns.md
common-mistakes.md
context-network-memory.md
hono-server-patterns.md
mcp-server-patterns.md
rag-memory-patterns.md
testing-patterns.md
tool-patterns.md
workflow-data-flow.md
scripts/
check-version-patterns.ts
scaffold-agent.ts
scaffold-project.ts
scaffold-tool.ts
scaffold-workflow.ts
validate-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.outputinputData または getStepResult("step-1")
並列処理の後inputData.resultinputData["step-id"].result
分岐処理の後inputData.resultinputData["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.tsMastra+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.tsv1 と安定版のパターンが混在していないか検出する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 - マルチエージェント連携、A2A
  • references/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 - エージェント向けのリアルタイム情報検索

コメント