📠

MastraでMCPサーバー利用時に使用しないツールを除外する

に公開

例えば、Supabase MCPサーバーを利用すると、以下のツールが使用できる。

  • supabase_list_tables: 1つまたは複数のスキーマ内の全テーブルを一覧表示する。
  • supabase_list_extensions: データベース内の全拡張機能を一覧表示する。
  • supabase_list_migrations: データベース内の全マイグレーションを一覧表示する。
  • supabase_apply_migration: データベースにマイグレーションを適用する(DDL操作時に使用)。
  • supabase_execute_sql: Postgresデータベースで生のSQLを実行する(DDL操作以外で使用)。
  • supabase_list_edge_functions: Supabaseプロジェクトの全Edge Functionsを一覧表示する。
  • supabase_deploy_edge_function: SupabaseプロジェクトにEdge Functionをデプロイ(新規作成またはバージョン更新)する。
  • supabase_get_logs: Supabaseプロジェクトのサービス毎のログを取得する(直近1分以内)。
  • supabase_get_project_url: プロジェクトのAPI URLを取得する。
  • supabase_get_anon_key: プロジェクトの匿名APIキーを取得する。
  • supabase_generate_typescript_types: プロジェクト用のTypeScript型定義を生成する。
  • supabase_create_branch: Supabaseプロジェクトに開発ブランチを作成する。
  • supabase_list_branches: Supabaseプロジェクトの全開発ブランチを一覧表示する。
  • supabase_delete_branch: 開発ブランチを削除する。
  • supabase_merge_branch: 開発ブランチのマイグレーションとEdge Functionを本番環境にマージする。
  • supabase_reset_branch: 開発ブランチのマイグレーションをリセットする。
  • supabase_rebase_branch: 開発ブランチを本番環境の最新状態にリベースする。

何もしない場合、これらのツール情報が毎回LLMに送られる。
コンテキストも多くなるし、どのツールを利用すればよいかAIが混乱してしまう可能性もあるため、確実に使わないツールはできれば除外したい。

実装方法

というわけで、Mastra Agentでツールを取得する段階で、使うツールのみを選択する または 使わないツールを除外するようにフィルタリングする。

import { openai } from '@ai-sdk/openai';
import { Agent } from '@mastra/core/agent';
import { MCPClient } from "@mastra/mcp";

const mcp = new MCPClient({
  servers: {
    supabase: {
      "command": "/Users/user/.volta/bin/npx",
      "args": [
        "-y",
        "@supabase/mcp-server-supabase@latest",
        "--access-token",
        process.env.SUPABASE_ACCESS_TOKEN || "",
        "--project-ref",
        process.env.SUPABASE_PROJECT_REF || "",
        "--read-only"
      ]
    },
  },
});

const allTools = await mcp.getTools();

// 必要なツールのみを選択する場合
const requiredToolNames = ['supabase_execute_sql'];
const filteredTools = Object.fromEntries(
  Object.entries(allTools)
    .filter(([toolName]) => requiredToolNames.includes(toolName))
);

// 除外するツールを選択する場合
// const toolsToExclude = ['supabase_list_tables'];
// const filteredTools = Object.fromEntries(
//   Object.entries(allTools)
//     .filter(([toolName]) => !toolsToExclude.includes(toolName))
// );

export const nikeAgent = new Agent({
  name: 'Your Agent',
  instructions: `You are a helpful assistant.`,
  model: openai("gpt-4.1-mini"),
  tools: filteredTools,
});

以下のように指定したツールのみが使えるようになっているのがわかる

公式ドキュメント: https://mastra.ai/ja/docs/agents/using-tools-and-mcp

Discussion