
Generative AI Use Cases(GenU)でMCPサーバーを利用したチャット機能を使ってみた
はじめに
MCPの登場によりAIアプリケーションと外部ツールの統合が容易になりました。
最近はMCP対応していることはサーバー、クライアント共に重要な要素となります。
そんな中AWSがAIユースケース集として公開しているGenerative AI Use Cases(以降、GenU)でもv4.3.0からMCPに対応したチャット機能が使えるようになりました。
今回はMCPの有効化から実際の呼び出しまで試してみたいと思います。
やってみる
前提
- GenUがデプロイ済みであること
- 開発環境でDockerが利用可能なこと
GenUの設定変更
まずはじめにparameter.ts
もしくはcdk.json
でmcpEnabled: true
をMCPを有効化します。
const envs: Record<string, Partial<StackInput>> = {
'': {
modelRegion: "us-west-2",
modelIds: [
"us.anthropic.claude-3-7-sonnet-20250219-v1:0",
"us.anthropic.claude-sonnet-4-20250514-v1:0",
"us.anthropic.claude-opus-4-20250514-v1:0",
"anthropic.claude-3-5-sonnet-20241022-v2:0",
],
+ mcpEnabled: true,
}
};
cdk.jsonの場合
"context": {
"env": "",
"ragEnabled": false,
"kendraIndexArn": null,
"kendraIndexLanguage": "ja",
"kendraDataSourceBucketName": null,
"kendraIndexScheduleEnabled": false,
"kendraIndexScheduleCreateCron": null,
"kendraIndexScheduleDeleteCron": null,
"ragKnowledgeBaseEnabled": false,
"ragKnowledgeBaseId": null,
"ragKnowledgeBaseStandbyReplicas": false,
"ragKnowledgeBaseAdvancedParsing": false,
"ragKnowledgeBaseAdvancedParsingModelId": "anthropic.claude-3-sonnet-20240229-v1:0",
"ragKnowledgeBaseBinaryVector": false,
"embeddingModelId": "amazon.titan-embed-text-v2:0",
"rerankingModelId": null,
"queryDecompositionEnabled": false,
"selfSignUpEnabled": true,
"allowedSignUpEmailDomains": null,
"samlAuthEnabled": false,
"samlCognitoDomainName": "",
"samlCognitoFederatedIdentityProviderName": "",
"hiddenUseCases": {},
"modelRegion": "us-east-1",
"modelIds": [
"us.anthropic.claude-sonnet-4-20250514-v1:0",
"us.anthropic.claude-opus-4-20250514-v1:0",
"us.anthropic.claude-3-7-sonnet-20250219-v1:0",
"us.anthropic.claude-3-5-haiku-20241022-v1:0",
"us.amazon.nova-premier-v1:0",
"us.amazon.nova-pro-v1:0",
"us.amazon.nova-lite-v1:0",
"us.amazon.nova-micro-v1:0",
"us.deepseek.r1-v1:0"
],
"imageGenerationModelIds": ["amazon.nova-canvas-v1:0"],
"videoGenerationModelIds": ["amazon.nova-reel-v1:0"],
"speechToSpeechModelIds": ["amazon.nova-sonic-v1:0"],
"endpointNames": [],
"agentEnabled": false,
"searchAgentEnabled": false,
"searchApiKey": "",
"agents": [],
"inlineAgents": false,
- "mcpEnabled": false,
+ "mcpEnabled": true,
"flows": [],
"allowedIpV4AddressRanges": null,
"allowedIpV6AddressRanges": null,
"allowedCountryCodes": null,
"hostName": null,
"domainName": null,
"hostedZoneId": null,
"dashboard": false,
"anonymousUsageTracking": true,
"guardrailEnabled": false,
"crossAccountBedrockRoleArn": "",
"useCaseBuilderEnabled": true,
"@aws-cdk/aws-lambda:recognizeLayerVersion": true,
"@aws-cdk/core:checkSecretUsage": true,
"@aws-cdk/core:target-partitions": ["aws", "aws-cn"],
"@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": true,
"@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": true,
"@aws-cdk/aws-ecs:arnFormatIncludesClusterName": true,
"@aws-cdk/aws-iam:minimizePolicies": true,
"@aws-cdk/core:validateSnapshotRemovalPolicy": true,
"@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": true,
"@aws-cdk/aws-s3:createDefaultLoggingPolicy": true,
"@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": true,
"@aws-cdk/aws-apigateway:disableCloudWatchRole": true,
"@aws-cdk/core:enablePartitionLiterals": true,
"@aws-cdk/aws-events:eventsTargetQueueSameAccount": true,
"@aws-cdk/aws-iam:standardizedServicePrincipals": true,
"@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": true,
"@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": true,
"@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": true,
"@aws-cdk/aws-route53-patters:useCertificate": true,
"@aws-cdk/customresources:installLatestAwsSdkDefault": false,
"@aws-cdk/aws-rds:databaseProxyUniqueResourceName": true,
"@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": true,
"@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": true,
"@aws-cdk/aws-ec2:launchTemplateDefaultUserData": true,
"@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": true,
"@aws-cdk/aws-redshift:columnId": true,
"@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": true,
"@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": true,
"@aws-cdk/aws-apigateway:requestValidatorUniqueId": true,
"@aws-cdk/aws-kms:aliasNameRef": true,
"@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": true,
"@aws-cdk/core:includePrefixInUniqueNameGeneration": true,
"@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": true
}
}
MCPサーバーの設定はpackages/cdk/mcp-api/mcp.json
で変更可能です。
デフォルトで以下のサーバーが設定されています。
{
"mcpServers": {
"time": {
"command": "uvx",
"args": ["mcp-server-time"]
},
"awslabs.aws-documentation-mcp-server": {
"command": "uvx",
"args": ["awslabs.aws-documentation-mcp-server@latest"]
},
"awslabs.cdk-mcp-server": {
"command": "uvx",
"args": ["awslabs.cdk-mcp-server@latest"]
}
}
}
今回はデフォルトのまま利用しますが、必要に応じてサーバーを追加して下さい。
現状だとMCPクライアントはstdio
のみ等、制約も多いようです。
詳細を以下をご確認ください。
各種設定が終わったらデプロイします。
npm run cdk:deploy
動作確認
デプロイが終わるとユースケースの一覧にMCP チャット
が追加されているはずです。
aws-documentation-mcp-server
を使用して最新ドキュメントを参照して欲しいので、Bedrockのモデルについて質問してみます。
MCPサーバーに接続して情報を取得しているようです。
しばらくするとトレースが表示され、展開することで思考の過程が確認できます。
ドキュメントの参照が終わると回答を生成してくれました。
所々怪しい箇所はありますが、概ね適切な回答が返ってきているようです。
まとめ
GenUがMCPに対応したので、実際に試してみました。
Lambda上で実行している都合上、制約も多いですがこれからの機能拡充が楽しみです。
どなたかの参考になれば幸いです。