この記事では、MCP(モデルコンテキストプロトコル)サーバーをオーケストレートする方法を示します。 リアルワールドのTypeScriptアプリケーションで、 プロジェクトは私たちのベースとして、安全でスケーラブルで維持可能なオーケストラのためのベスト・プラクティスに焦点を当てています。 トップ > インデックス Azure AI 旅行代理店 Azure AI Travel Agents プロジェクトの概要に興味がある方は、発表ブログをご覧ください! ブログ発表 なぜ llamaindex.TS と MCP なのか? llamaindex.TS は、TypeScript で LLM で動作するアプリケーションを構築するためのモジュラーで構成可能なフレームワークを提供します。 MCPはツールの相互運用性とストリーミングを可能にし、複数のAIサービスをオーケストラリングするのに理想的です。 プロジェクト構造 The Llamaindex.TS orchestrator lives in オリジナルタイトル さまざまなLLMバックエンドとMCPクライアントのためのプロバイダーモジュールで、現在、我々はサポートしています: src/api/src/orchestrator/llamaindex Azureオープン Docker モデル Azure AI Foundry ローカル GitHubモデル オレンジ 自由にコードベースを探索し、 . より多くのプロバイダーを提案 MCP クライアントを Streamable HTTP で設定する Llamaindex.TS を使用せずに MCP サーバーと相互作用するには、Llamaindex.TS を使用してカスタマイズされた実装を書くことができます。 効率的な、認証された、およびストリーミング通信のために。 StreamableHTTPClientTransport // filepath: src/api/src/mcp/mcp-http-client.ts import EventEmitter from 'node:events'; import { Client } from '@modelcontextprotocol/sdk/client/index.js'; import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js'; export class MCPClient extends EventEmitter { private client: Client; private transport: StreamableHTTPClientTransport; constructor(serverName: string, serverUrl: string, accessToken?: string) { this.transport = new StreamableHTTPClientTransport({ url: serverUrl, headers: accessToken ? { Authorization: `Bearer ${accessToken}` } : {}, }); this.client = new Client(serverName, this.transport); } async connect() { await this.client.initialize(); } async listTools() { return this.client.listTools(); } async callTool(name: string, toolArgs: any) { return this.client.callTool(name, toolArgs); } async close() { await this.client.closeGracefully(); } } ALWAYS PASS THE ヘッダーは、上記のようにセキュアなアクセスを提供します。 Best Practice: Authorization MCP ツールを手動で呼び出す MCP サーバからターゲットの勧告を取得したいとします。 import { MCPClient } from '../../mcp/mcp-http-client'; const DESTINATION_SERVER_URL = process.env.MCP_DESTINATION_RECOMMENDATION_URL!; const ACCESS_TOKEN = process.env.MCP_DESTINATION_RECOMMENDATION_ACCESS_TOKEN; const mcpClient = new MCPClient('destination-recommendation', DESTINATION_SERVER_URL, ACCESS_TOKEN); await mcpClient.connect(); const tools = await mcpClient.listTools(); console.log('Available tools:', tools); const result = await mcpClient.callTool('getDestinationsByPreferences', { activity: 'CULTURAL', budget: 'MODERATE', season: 'SUMMER', familyFriendly: true, }); console.log('Recommended destinations:', result); await mcpClient.close(); 常にMCPクライアントを優雅に閉じ、リソースをリリースします。 Tip: オーケストラリング LLMs and MCP Tools with Llamaindex.TS THE 顧客から MCP サーバーに接続し、ダイナミックにツールの定義を取得することを容易にします。以下は、プロジェクトのオーケストラのセットアップのサンプルです。 各 MCP サーバーのためのツールを取得し、エージェントを作成します。 mcp @llamaindex/tools mcp 以下は、何が何であるかという例です。 オブジェクトはこう見えるかもしれません: mcpServerConfig const mcpServerConfig = { url: "http://localhost:5007", // MCP server endpoint accessToken: process.env.MCP_ECHO_PING_ACCESS_TOKEN, // Secure token from env name: "echo-ping", // Logical name for the server }; 次に、この config を使用して、 お客様: mcp import { mcp } from "@llamaindex/tools"; import { agent, multiAgent, ToolCallLLM } from "llamaindex"; // ...existing code... const mcpServerConfig = mcpToolsConfig["echo-ping"].config; const tools = await mcp(mcpServerConfig).tools(); const echoAgent = agent({ name: "EchoAgent", systemPrompt: "Echo back the received input. Do not respond with anything else. Always call the tools.", tools, llm, verbose, }); agentsList.push(echoAgent); handoffTargets.push(echoAgent); toolsList.push(...tools); // ...other code... const travelAgent = agent({ name: "TravelAgent", systemPrompt: "Acts as a triage agent to determine the best course of action for the user's query. If you cannot handle the query, please pass it to the next agent. If you can handle the query, please do so.", tools: [...toolsList], canHandoffTo: handoffTargets .map((target) => target.getAgents().map((agent) => agent.name)) .flat(), llm, verbose, }); agentsList.push(travelAgent); // Create the multi-agent workflow return multiAgent({ agents: agentsList, rootAgent: travelAgent, verbose, }); このパターンを繰り返して、MCP サーバーから実行時に発見されたツールによって各エージェントが動作する複数のエージェントワークフローを作成できます。 . 完全な例 次に、この LLM インスタンスを使用して、ルートプランニングや目的地勧告などの MCP ツールへの呼び出しをオーケストラできます。 セキュリティ考慮事項 常にアクセストークンとセキュアなヘッダーを使用してください。 決してハードコードの秘密を隠さないでください、環境変数や秘密マネージャーを使用してください。 コミュニティに参加する: Azure AI Foundry 開発者コミュニティに参加して、経験を共有し、質問をし、サポートを受けることをお勧めします。 aka.ms/foundry/discord Discord コミュニティに参加して、リアルタイムの議論とサポートをご利用ください。 aka.ms/foundry/forum - Azure AI Foundry 開発者フォーラムを訪れて、質問をし、知識を共有してください。 結論 llamaindex.TS を MCP の Streamable HTTP トランスポートと組み合わせると、TypeScript で強力でセキュアでスケーラブルな AI ワークフローをオーケストラできます。 References: LAMAINDEX.TS ドキュメント MCP Streamable HTTP Spec Azure AI 旅行代理店 サンプル