これまでの記事では、Amazon Interactive Video Service(Amazon IVS)リソースについて深い知識を持つカスタム MCP サーバーの作成方法を学んできました。このサーバーは、低レイテンシーチャンネル、リアルタイムストリーム、チャットルームに関する情報を取得するための多くのツールを公開しています。また、Amazon IVS ドキュメンテーションを含むカスタム RAG ナレッジベースに問い合わせられるため、Amazon IVS に関する特定のコード関連の質問に答えることができ、ウェブから直接 URL を取得することもできます。実に強力なサーバーです。しかし、まだこのサーバーと対話するものはまだ作成していないため、この記事では、MCP サーバーによって公開されているツールを使用できるカスタム MCP クライアントを作成していきます。このクライアントは、Amazon Bedrock Converse API を介して Claude 3.7 を呼び出します。Bedrock 経由で Claude を呼び出す際に、プロンプトに応答するために使用できるツールを指定すると、最適なツールがあれば、自動的にツールを選択して応答します。
おさらいとして、このシリーズ全体で説明してきたアーキテクチャの概要を以下に示します。
最低でも、クライアントは標準出力を介してユーザー入力を受け入り、その入力を Amazon Bedrock 経由で Claude にプロンプトとして渡します。次に何が起こるかは、Claude の応答によって大きく異なります。ツールを使わずに答えられる場合はそうしますが、ツールを呼び出す必要があると判断した場合は、どのツールを使用したいか、そのツールにどのパラメータを送信したいかを教えてくれます。このやり取りの部分はクライアントのコードの役割です。Bedrock が stopReason
tool_use
を返した場合、クライアントは MCP サーバー上のツールを呼び出し、ツールの応答をメッセージコンテキストに追加して、Bedrock に送り返します。Bedrock はこれで満足するかもしれませんし、別のツールを使用することを決めるかもしれません。クライアントは、 stopReason
の end_turn
を受け取るまでこれを繰り返します。ご想像のとおり、無限ループを避けるために、この繰り返しの最大回数を制限することをが勧められます。
MCP クライアントの作成
MCP クライアントでも @modelcontextprotocol/sdk
というライブラリーを使用します。まず、新しいプロジェクトを作成し、SDK をインストールします。
💡注意*: *以下では基本的なクライアントコードをいくつか紹介します。完全なサンプルクライアント実装は、この記事の最後に載せています。
npm init es6 -y
npm install @modelcontextprotocol/sdk
クライアントと stdio トランスポートモジュールをインポートします。
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
これで、トランスポートとクライアントを作成し、トランスポート経由でクライアントをサーバーに接続できるようになりました。node コマンドを使用して、カスタム MCP サーバーへのパスを渡していることに注目してください。また、認証情報やナレッジベース ID をハードコーディングしなくて済むように、環境変数も渡しています。
const ivsTransport = new StdioClientTransport({
command: "node",
args: ["../ivs-mcp-server/src/index.js"],
env: {
...process.env,
RAG_KNOWLEDGEBASE_ID: process.env.RAG_KNOWLEDGEBASE_ID,
AWS_ACCESS_KEY_ID: process.env.AWS_ACCESS_KEY_ID,
AWS_SECRET_ACCESS_KEY: process.env.AWS_SECRET_ACCESS_KEY,
AWS_REGION: process.env.AWS_REGION || 'us-east-1',
}
});
const ivsClient = new Client(
{
name: "IVS-MCP-Client",
version: "1.0.0"
},
{
capabilities: {
prompts: {},
resources: {},
tools: {}
}
}
);
await ivsClient.connect(ivsTransport);
Bedrock Converse API の追加
ユーザープロンプトを LLM に送信するに Bedrock Converse API が必要なので、それをインストールして、クライアントを作成しましょう。
npm install @aws-sdk/client-bedrock-runtime
import {
BedrockRuntimeClient,
ConverseCommand
} from '@aws-sdk/client-bedrock-runtime';
const bedrockRuntimeClient = new BedrockRuntimeClient({
region: process.env.AWS_REGION || 'us-east-1',
credentials: {
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
},
});
これで、Converse API経由でClaude 3.7を呼び出す関数を作成できます。ここで topP
は 0.1
と temperature
を0.2
に設定していますが、ご自身の環境に合わせて調整してください。
const MODEL_ID = "us.anthropic.claude-3-7-sonnet-20250219-v1:0";
const bedrockConverse = async (messages) => {
const inferenceConfig = {
topP: 0.1,
temperature: 0.2,
};
const input = {
modelId: MODEL_ID,
messages,
inferenceConfig,
toolConfig: toolsToBedrockSchema(availableTools),
system: [
{
text: `Your specialty is Amazon Interactive Video Service (Amazon IVS).
Wherever possible, take advantage of the tools available to you to help users
learn as much as possible about Amazon IVS.
If you are asked to generate or evaluate code, you can query IVS
knowledge base tool to query for the latest documentation.
Since IVS is a newer service, with new versions being published often,
reinforce your knowledge by directly fetching the latest version of any
documentation returned from the knowledge base.
If you are asked to edit a file, first summarize your changes and ask the user
to confirm them before writing or editing any file on the filesystem.`
}
],
};
const converseRequest = new ConverseCommand(input);
let converseResponse;
try {
converseResponse = await bedrockRuntimeClient.send(converseRequest);
}
catch (error) {
if (error.name == 'ThrottlingException') {
console.log(`🛑 Bedrock API Call Throttled. Trying again after 60 second cooldown...`);
await sleep(60000);
return await bedrockConverse(messages);
}
else {
console.error(error);
}
}
return converseResponse;
};
この関数にはいくつか注意すべき点があります。まず、詳細なシステムプロンプトを含めていることに注目してください。これは常に良いことです。次に、API スロットリング例外に対応し、クールダウン期間後に会話を再試行するためにtry/catch文を使っています。クライアント側ではこれが必ずしも必要とは限りませんが、、私のアカウントはほとんどの一般のアカウントよりもクォータが低いため、エラーによって円滑なフローが中断されることを避けるためにこれを含める必要がありました。また、入力パラメータの一部として toolConfig
を渡していることにも注目してください。 toolConfig
は toolsToBedrockSchema(availableTools)
を使用してツールの一覧を取得します。まず、availableTools
の取得方法を見てみましょう:
const availableTools = {ivs: await ivsClient.listTools()};
非常に簡単ですね。クライアントにサーバー上のツールをリストするように頼むするだけです。
次に、 toolsToBedrockSchema()
を見てみましょう。これは availableTools
をループし、MCP サーバーから返される形式から Bedrock が求める形式に変換します。わずかな変更ですが、適切に渡さないと、Bedrock はツールを使用できなくなります。
const toolsToBedrockSchema = (availableTools) => {
const tools = [];
Object.keys(availableTools).forEach((server) => {
tools.push(availableTools[server].tools.map(tool => {
let props = {};
Object.keys(tool.inputSchema.properties).forEach(prop => {
props[prop] = {
"type": tool.inputSchema.properties[prop].type,
"description": tool.inputSchema.properties[prop]?.description || prop,
};
});
return {
"toolSpec": {
"name": tool.name,
"description": tool?.description || tool.name,
"inputSchema": {
"json": {
"type": tool.inputSchema.type,
"properties": props,
"required": tool.inputSchema.required || []
}
}
}
};
}));
});
return {
tools: tools.flat()
};
};
ユーザープロンプトの処理
ユーザープロンプトを受け付けるには、クライアントは、ユーザーがそのプロンプトを入力する方法を提供する必要があります。
import readline from 'node:readline';
let userInput = readline.createInterface({
input: process.stdin,
output: process.stdout,
historySize: 50,
prompt: '> ',
});
userInput.on('line', async (prompt) => {
await handlePrompt(prompt);
userInput.prompt();
};
次に、セッションコンテキストを保存する配列と、handlePrompt()
と handleResponse()
関数を定義します。
let sessionMessages = [];
const handleResponse = async (response) => {
let ret = { keepGoing: false, response };
if (response.stopReason === 'end_turn') {
console.log('\n' + response?.output?.message?.content[0]?.text + '\n');
};
if (response.stopReason === 'tool_use') {
let processedResponse;
processedResponse = await useTool(response);
sessionMessages.push(processedResponse.output.message);
ret = { keepGoing: true, response: processedResponse };
}
return ret;
};
const handlePrompt = async (prompt) => {
sessionMessages.push({
role: "user",
content: [{ text: prompt }],
});
let response = await bedrockConverse(sessionMessages);
sessionMessages.push(response.output.message);
let looping = true;
while (looping) {
const processedResponse = await handleResponse(response);
looping = processedResponse.keepGoing;
response = processedResponse.response;
};
};
次に、Bedrock が適切と判断した場合、サーバーツールを呼び出すための useTool()
関数を作成する必要があります。ツールのレスポンスをセッションコンテキストに追加し、更新されたコンテキストで Bedrock を再度呼び出し、次に適切なアクションを決定できるようにします。
const useTool = async (response) => {
const toolInfo = item.toolUse;
console.log(`🔨 Calling MCP Server tool '${toolInfo.name}' with input '${JSON.stringify(toolInfo?.input).substring(0, 250)}'...`);
await callTool(toolInfo);
console.log(`🔎 Sending MCP Server's '${toolInfo.name}' response to Bedrock...`);
return await bedrockConverse(sessionMessages);
};
const callTool = async (toolInfo) => {
try {
const toolName = toolInfo.name;
const toolArgs = toolInfo.input;
const toolUseId = toolInfo.toolUseId;
const client = findClient(toolName);
const result = await client.callTool({
name: toolName,
arguments: toolArgs
});
sessionMessages.push({
role: "user",
content: [
{
toolResult: {
...result,
toolUseId: toolUseId,
}
}
]
});
return sessionMessages;
}
catch (error) {
console.error('Error handling tool call:', error);
return [`[Error calling tool ${toolInfo?.name || 'unknown'}: ${error.message}]`];
}
};
このまでで、ユーザープロンプトを受け入れ、MCP サーバツールに関する情報をもつBedrock 経由で Claude と対話する基本的な MCP クライアントを作成しました。
別のMCPサーバーの追加
上記で availableTools
を定義した際に、オブジェクトを使用したことにお気づきでしょうか?これは、他の MCP サーバーからツールボックス 🧰 に追加のツール ⚒️ を追加できるようにするためです。例えば、このクライアントを使用して、Amazon IVS に配信するという簡単なプロトタイプの作成を支援してもらうことを依頼できますが、最終的には必要なコードを含むかなり長いテキストが返ってくるでしょう。クライアントがファイルを直接ディスクに書き込むことができるように、ファイルシステムを操作するツーるがあった方が良いと思いませんか?その通りです!では、今度は @modelcontextprotocol/server-filesystem
という既存のMCP サーバーを使用して、別のサーバーを作成しましょう。
const fileSystemTransport = new StdioClientTransport({
command: "npx",
args: [
"-y",
"@modelcontextprotocol/server-filesystem",
"/path/to/projects",
],
});
const fileSystemClient = new Client(
{
name: "Filesystem-Client",
version: "1.0.0"
},
{
capabilities: {
prompts: {},
resources: {},
tools: {}
}
}
);
await fileSystemClient.connect(fileSystemTransport);
このサーバーでは、アクセスが許可されたディレクトリのリストを渡す必要があります。これにより、不要なファイルシステム操作を防ぐことができます。上記の例では、/path/to/projects
というパスを渡しているため、このディレクトリ(およびそのサブディレクトリ)のみがこの MCP サーバーからアクセス可能となります。
これで、このサーバーのツールを availableTools
に追加できるようになりました。
const availableTools = {
ivs: (await ivsClient.listTools()),
filesystem: (await fileSystemClient.listTools())
};
次に、Bedrock がツールを使用したい場合に適切なクライアントを探す findClient()
メソッドも追加します:
const findClient = (toolName) => {
let client;
Object.keys(availableTools).forEach((label) => {
const tool = availableTools[label].tools.find(tool => tool.name === toolName);
if (tool) client = clients[label];
});
return client;
};
複数のサーバーに同じ名前のツールが存在する場合、状況が複雑になる可能性があるため、ご注意ください。MCP クライアントプロジェクトが成熟すれば、この制限は将来的に解消されると確信しています。
MCP クライアントフロー
サーバー、Bedrock、クライアント間のやり取りを理解しやすくするために、クライアント内のいくつかのプロンプトを以下に図示しました。
サンプルMCPクライアント
以下は、このシリーズのパート 2 で作成した MCP サーバーで動作する、このデモ用 Amazon IVS MCP クライアントの完全なサンプル コードです。
環境変数
このデモを実行するには、次の環境変数を設定する必要があります。
-
AWS_REGION
: Bedrock および Amazon IVS サービスの AWS リージョン -
AWS_ACCESS_KEY_ID
: AWS アクセスキー -
AWS_SECRET_ACCESS_KEY
: AWS シークレットキー -
ALLOWED_DIRS
: ファイルシステムツールがアクセスできるディレクトリのコンマ区切りリスト(例export ALLOWED_DIRS="/path/to/project,/another/path/to/project"
) -
MODEL_ID
: Bedrock モデル ID (デフォルトは Claude 3.7 Sonnet:us.anthropic.claude-3-7-sonnet-20250219-v1:0
) -
RAG_KNOWLEDGEBASE_ID
: (オプション) Amazon IVS RAG ナレッジベースの ID (注: これはARN ではなく、AB1ABCD1AA
のような ID である必要があります) -
IVS_SERVER_PATH
: (必須) ローカルマシン上のカスタム Amazon IVS MCP サーバーへのパス
package.json
{
"name": "amazon-ivs-mcp-client-demo",
"version": "1.0.0",
"description": "",
"main": "index.js",
"type": "module",
"private": false,
"engines": {
"node": ">= 14.0.0",
"npm": ">= 6.0.0"
},
"homepage": "",
"repository": {
"type": "git",
"url": ""
},
"bugs": "",
"keywords": [],
"contributors": [],
"scripts": {
"dev": "",
"test": ""
},
"dependencies": {
"@aws-sdk/client-bedrock-runtime": "^3.774.0",
"@modelcontextprotocol/sdk": "^1.7.0"
}
}
banner.txt
Amazon IVS MCP Client
index.js
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
import { BedrockRuntimeClient, ConverseCommand } from '@aws-sdk/client-bedrock-runtime';
import readline from 'node:readline';
import util from 'node:util';
import fs from 'node:fs';
const banner = fs.readFileSync('banner.txt', 'utf8');
const printBanner = () => {
const red = '\x1b[31m';
const reset = '\x1b[0m';
console.log(`\n${red}${banner}${reset}\n`);
};
printBanner();
const MAX_TURNS = 75;
let currentTurn = 0;
const IVS_SERVER_PATH = process.env.IVS_SERVER_PATH;
if (!IVS_SERVER_PATH) {
throw new Error('IVS_SERVER_PATH environment variable is not set. This variable must point to the custom IVS MCP Server on this machine!');
}
if (!fs.existsSync(IVS_SERVER_PATH)) {
throw new Error(`IVS_SERVER_PATH environment variable is set to ${IVS_SERVER_PATH} but this path does not exist!`);
}
const VERBOSE = process.env.VERBOSE?.toLowerCase() === 'true' || false;
// a list of allowed dirs for the Filesystem MCP server
// ex: ALLOWED_DIRS="/path/to/dir,/another/dir"
const allowedDirs = process.env.ALLOWED_DIRS.split(',');
const MODEL_ID = process.env.MODEL_ID || 'us.anthropic.claude-3-7-sonnet-20250219-v1:0';
const bedrockRuntimeClient = new BedrockRuntimeClient({
region: process.env.AWS_REGION,
credentials: {
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
},
});
let sessionMessages = [];
let sessionUsage = [];
const ivsTransport = new StdioClientTransport({
command: "node",
args: [IVS_SERVER_PATH],
env: {
...process.env,
RAG_KNOWLEDGEBASE_ID: process.env.RAG_KNOWLEDGEBASE_ID,
AWS_ACCESS_KEY_ID: process.env.AWS_ACCESS_KEY_ID,
AWS_SECRET_ACCESS_KEY: process.env.AWS_SECRET_ACCESS_KEY,
AWS_REGION: process.env.AWS_REGION,
}
});
const ivsClient = new Client(
{
name: "IVS-MCP-Client",
version: "1.0.0"
},
{
capabilities: {
prompts: {},
resources: {},
tools: {}
}
}
);
await ivsClient.connect(ivsTransport);
const fileSystemTransport = new StdioClientTransport({
command: "npx",
args: [
"-y",
"@modelcontextprotocol/server-filesystem",
...allowedDirs,
],
});
const fileSystemClient = new Client(
{
name: "Filesystem-Client",
version: "1.0.0"
},
{
capabilities: {
prompts: {},
resources: {},
tools: {}
}
}
);
await fileSystemClient.connect(fileSystemTransport);
const availableTools = {
ivs: (await ivsClient.listTools()),
filesystem: (await fileSystemClient.listTools())
};
const clients = {
ivs: ivsClient,
filesystem: fileSystemClient
};
const sleep = (ms) => {
return new Promise(resolve => setTimeout(resolve, ms));
};
const startThinking = () => {
const characters = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
const cursorEsc = {
hide: '\u001B[?25l',
show: '\u001B[?25h',
};
process.stdout.write(cursorEsc.hide);
let i = 0;
const timer = setInterval(function () {
process.stdout.write('\r' + characters[i++] + ' Thinking...');
i = i >= characters.length ? 0 : i;
}, 150);
return () => {
clearInterval(timer);
process.stdout.write('\r');
process.stdout.write(cursorEsc.show);
process.stdout.write('\n');
};
};
const bedrockConverse = async (messages) => {
const stopThinking = startThinking();
const inferenceConfig = {
topP: 0.1,
temperature: 0.2,
};
const input = {
modelId: MODEL_ID,
messages,
inferenceConfig,
toolConfig: toolsToBedrockSchema(availableTools),
system: [
{
text: `Your specialty is Amazon Interactive Video Service (Amazon IVS).
Wherever possible, take advantage of the tools available to you to help users
learn as much as possible about Amazon IVS.
If you are asked to generate or evaluate code, you can query IVS
knowledge base tool to query for the latest documentation.
Since IVS is a newer service, with new versions being published often,
reinforce your knowledge by directly fetching the latest version of any
documentation returned from the knowledge base.
If you are asked to edit a file, first summarize your changes and ask the user
to confirm them before writing or editing any file on the filesystem.`
}
],
};
const converseRequest = new ConverseCommand(input);
let converseResponse;
try {
converseResponse = await bedrockRuntimeClient.send(converseRequest);
}
catch (error) {
stopThinking();
if (error.name == 'ThrottlingException') {
console.log(`🛑 Bedrock API Call Throttled. Trying again after 60 second cooldown...`);
await sleep(60000);
return await bedrockConverse(messages);
}
else {
console.error(error);
}
}
stopThinking();
return converseResponse;
};
const toolsToBedrockSchema = (availableTools) => {
const tools = [];
Object.keys(availableTools).forEach((server) => {
tools.push(availableTools[server].tools.map(tool => {
let props = {};
Object.keys(tool.inputSchema.properties).forEach(prop => {
props[prop] = {
"type": tool.inputSchema.properties[prop].type,
"description": tool.inputSchema.properties[prop]?.description || prop,
};
});
return {
"toolSpec": {
"name": tool.name,
"description": tool?.description || tool.name,
"inputSchema": {
"json": {
"type": tool.inputSchema.type,
"properties": props,
"required": tool.inputSchema.required || []
}
}
}
};
}));
});
return {
tools: tools.flat()
};
};
const findClient = (toolName) => {
let client;
Object.keys(availableTools).forEach((label) => {
const tool = availableTools[label].tools.find(tool => tool.name === toolName);
if (tool) client = clients[label];
});
return client;
};
const useTool = async (response) => {
const item = response.output.message.content.find(item => Object.keys(item).indexOf('toolUse') > -1);
const toolInfo = item.toolUse;
console.log(`🔨 Calling MCP Server tool '${toolInfo.name}' ${VERBOSE ? 'with input: ' : ''}`);
if (VERBOSE) {
console.log(util.inspect(toolInfo?.input, {
showHidden: false,
depth: 20,
colors: true,
}));
}
await callTool(toolInfo);
console.log(`🔎 Sending MCP Server's '${toolInfo.name}' response to Bedrock...`);
return await bedrockConverse(sessionMessages);
};
const callTool = async (toolInfo) => {
try {
const toolName = toolInfo.name;
const client = findClient(toolName);
const result = await client.callTool({ name: toolName, arguments: toolInfo.input });
sessionMessages.push({
role: "user",
content: [{ toolResult: { ...result, toolUseId: toolInfo.toolUseId } }]
});
return sessionMessages;
}
catch (error) {
console.error('Error handling tool call:', error);
return [`[Error calling tool ${toolInfo?.name || 'unknown'}: ${error.message}]`];
}
};
const handleResponse = async (response) => {
let ret = { isFinished: true, response };
if (VERBOSE) {
console.log(util.inspect(response, {
showHidden: false,
depth: 20,
colors: true,
}));
}
if (response?.output?.message?.content[0]?.text) {
// bedrock output
console.log('\n🟢 ' + response?.output?.message?.content[0]?.text + '\n');
};
if (response.stopReason === 'tool_use') {
response = await useTool(response);
sessionMessages.push(response.output.message);
ret = { isFinished: false, response };
}
return ret;
};
const handlePrompt = async (prompt) => {
sessionMessages.push({
role: "user",
content: [{ text: prompt }],
});
let response = await bedrockConverse(sessionMessages);
updateUsage(response?.usage);
sessionMessages.push(response.output.message);
let isFinished = false;
currentTurn = 0;
while (!isFinished) {
currentTurn++;
const processedResponse = await handleResponse(response);
isFinished = processedResponse.isFinished;
response = processedResponse.response;
updateUsage(response?.usage);
if (response.stopReason === 'tool_use' && currentTurn >= MAX_TURNS && !isFinished) {
console.log(`🚨 Reached max turns (${MAX_TURNS}). Let's stop here...`);
const item = response.output.message.content.find(item => Object.keys(item).indexOf('toolUse') > -1);
sessionMessages.push({
role: "user",
content: [
{
toolResult: {
toolUseId: item.toolUse.toolUseId,
content: [{
text: 'Reached the maximum number of turns. Provide a detailed summary of your progress so far.',
}]
}
}
]
});
response = await bedrockConverse(sessionMessages);
if (response?.output?.message?.content[0]?.text === undefined) {
console.log(`⚠️ Bedrock response was empty. Trying again...`);
sessionMessages.push({
role: 'user',
content: [{
text: 'Reached the maximum number of turns. Provide a detailed summary of your progress so far.'
}]
});
response = await bedrockConverse(sessionMessages);
}
await handleResponse(response);
isFinished = true;
}
};
};
const updateUsage = (usage) => {
if (!usage) return;
sessionUsage.push(usage);
};
const getSessionUsage = () => {
return sessionUsage.reduce((acc, cur) => {
acc.inputTokens += cur.inputTokens;
acc.outputTokens += cur.outputTokens;
acc.totalTokens += cur.totalTokens;
return acc;
}, { inputTokens: 0, outputTokens: 0, totalTokens: 0 });
};
const printUsage = (label = true) => {
console.log(`📈 ${label ? 'Current Session Usage: ' : ''}${util.inspect(getSessionUsage(), { colors: true, depth: null })}`);
};
const init = () => {
console.log(`\n❓ Ask a question, or try the following commands: clear-context, session-usage. Use 'quit' to exit.\n`);
let userInput = readline.createInterface({
input: process.stdin,
output: process.stdout,
historySize: 50,
prompt: '\x1b[34m> \x1b[0m',
});
userInput.on('line', async (prompt) => {
switch (prompt) {
case 'help':
console.log(`❓ Ask a question, or try the following commands: clear-context, session-usage. Use 'quit' to exit.`);
break;
case 'quit':
case 'exit':
console.log(`✌️ Thanks for using the IVS MCP Client.`);
printUsage();
process.exit(0);
break;
case 'clear-context':
case 'clear':
sessionMessages = [];
console.log('🧹 Session context window cleared.');
console.log('⭐️ Let\'s start over!');
break;
case 'session-usage':
case 'usage':
printUsage();
break;
default:
await handlePrompt(prompt);
break;
}
userInput.prompt();
});
userInput.on('SIGINT', () => {
console.log(`\n✌️ Thanks for using the IVS MCP Client.`);
printUsage();
process.exit(0);
});
userInput.prompt();
};
init();
まとめ
MCP クライアントとサーバーを使用して Amazon IVS リソースをより深く理解するための短い旅はこれで終わりです。ご覧のように、モデルコンテキストプロトコルを使用することで、LLM クライアントアプリケーションに不足しているデータとコンテキストを提供することができます。これにより、アプリケーションは新しい方法でデータについて学ぶのを助け、Amazon IVS のような、既存の基盤モデルがあまり馴染みのない技術を使った新しいアプリケーションを迅速にプロトタイプ化するのにも役立ちます。あなたはどのように MCP を自分のアプリケーションで活用しますか?