🔥

Genkit MCP を使った AI アプリケーションの外部拡張

に公開

はじめに

生成 AI アプリを素早くかつ安全に外部システムへ拡張する方法として、Anthropic が提唱した Model Context Protocol (MCP) が注目を集めています。

本記事では、Google Firebase チーム製の AI オーケストレーションフレームワーク Genkit に実装されている Genkit MCP プラグインを使い、最小構成で AI アプリと外部サービスを連携させる手順をまとめます。

この記事で扱うこと

  • Genkit MCP の構成と役割
  • MCP クライアント/サーバーを最小コードで実装
  • Cloud Run functions へのデプロイとオブザーバビリティ

この記事で扱わないこと

  • MCP そのものの詳細仕様 (優れた解説記事が既に多数あるため)
  • AI モデルのチューニング方法

Genkit MCP のおおまかな構成

立ち位置 役割 実際に使用するメソッド
MCP ホスト LLM アプリ本体 (ここでは Genkit) -
MCP クライアント 外部 MCP サーバーへ接続しツール / リソース を呼び出す mcpClient()
MCP サーバー Genkit 側で定義したツール / プロンプトを外部へ公開 mcpServer()

開発環境のセットアップ

プロジェクト初期化
mkdir genkit-mcp-sample
cd genkit-mcp-sample
npm init -y
npm install typescript @types/node --save-dev
npx tsc --init
npm i genkit genkitx-mcp firebase-functions @genkit-ai/googleai
mkdir -p src
touch src/index.ts src/client.ts src/google-maps-flow.ts
Google AI Studio の API キーを環境変数にセット
export GEMINI_API_KEY=<your API key>
Google Maps Platform の API キーを環境変数にセット
export GOOGLE_MAPS_API_KEY=<your API key>

その他詳細な設定に関しては下記リポジトリを参照してください。

Genkit MCP クライアントを実装する

以下は Google Maps Platform の MCP Server をローカル子プロセスで起動し、Geocoding API ツールを呼び出す例です。

src/client.ts
import { mcpClient } from 'genkitx-mcp'

export const mapsClient = mcpClient({
  name: 'maps',
  serverProcess: {
    command: 'npx',
    args: ['-y', '@modelcontextprotocol/server-google-maps'],
    env: {
      ...process.env as Record<string, string>,
    GOOGLE_MAPS_API_KEY: process.env.GOOGLE_MAPS_API_KEY || '',
    },
  },
})

起動後、maps/geocodemaps/place_search といったツールが Genkit Developer UI に自動で登録されます。

maps-tools

Genkit を使用した実装

まずは、Genkit の 1 関数を示す Flow を実装します。

src/google-maps-flow.ts
import { z } from 'genkit'
import { ai } from "."

export const googleMapsFlow = ai.defineFlow({
  name: 'google-maps-flow',
  inputSchema: z.string(),
}, async (prompt) => {
  const { text } = await ai.generate({
    prompt,
    tools: [
      'maps/maps_geocode',
      // ↓ Register tools as needed below ↓
      // 'maps/maps_reverse_geocode',
      // 'maps/maps_search_places',
      // 'maps/maps_place_details',
      // 'maps/maps_distance_matrix',
      // 'maps/maps_elevation',
      // 'maps/maps_directions',
    ]
  })
  return text
})

次に、Genkit Flow の登録を行います。

src/index.ts
import { genkit } from 'genkit'
import { gemini25FlashPreview0417 } from '@genkit-ai/googleai'
import { defineSecret } from 'firebase-functions/params'
import { logger } from 'genkit/logging'
import { mapsClient } from './client'
import { onCallGenkit } from 'firebase-functions/https'
import { googleMapsFlow } from './google-maps-flow'

// Set logging level to debug for detailed operation logs
logger.setLogLevel(`debug`)

// API keys stored in Google Cloud Secret Manager
export const googleAIapiKey = defineSecret(`GOOGLE_GENAI_API_KEY`)
export const mapsApiKey = defineSecret(`GOOGLE_MAPS_API_KEY`)

// Initialize Genkit
export const ai = genkit({
  plugins: [ mapsClient ],
  model: gemini25FlashPreview0417,
})

export const callGoogleMaps = onCallGenkit({
  secrets: [ googleAIapiKey ],
  region: 'asia-northeast1',
  cors: true,
},
  googleMapsFlow
)

Genkit Developer UI でローカル環境で動作確認

npx genkit start -o -- tsx --watch src/index.ts

東京スカイツリーの座標を聞いてみます。
すると、座標が返ってきたことが確認できました。

dev-ui

Cloud Run functions (for Firebase) にデプロイ

Genkit は Cloud Run functions for Firebase (2nd Gen = Cloud Run) と相性が良く、コマンド一発で簡単に対象の Google Cloud / Firebase プロジェクトへデプロイすることができます。

firebase deploy --only functions

オブザーバビリティ

Genkit 開発サーバで動かす間は Genkit Developer UI の Monitoring タブ だけで、「LLM → ツール呼び出し → 外部 MCP Server」というフローが一望できます。

trace

これによって、Google Maps Platform の MCP Server の maps/maps_geocode がコールされていることを確認できました。

本番デプロイ後は、Firebase コンソールの Genkit メニュー から同様の確認が可能です。

genkit-menu

詳細はこちらを参照してください。

サンプルコード

あわせて読みたい (Genkit に興味を持った方向け)

GitHubで編集を提案

Discussion