「監視対象を登録して」で完了?Kiroとzabbix-mcpでZabbixを操作してみる

![]() |
こんにちは、保坂です。 |
|---|
近年、AIエージェントが外部サービスと連携するための標準プロトコルであるMCP(Model Context Protocol)が注目されています。MCPに対応したサーバーさえあれば、AIエージェントから様々なサービスをそのまま操作できるようになります。
本コラムでは、このMCPを活用し、オープンソース監視ソフトウェアZabbixをAI開発環境であるKiroから操作してみます。ホストの登録から障害確認まで、自然言語による指示だけで完結する流れをご紹介します。
AIエージェントを活用したクラウド環境の監視方法について、NTT東日本のエンジニアがご相談にお応えしますので、お気軽にご連絡ください!
はじめに
MCPとは
MCP(Model Context Protocol)は、AIエージェントが外部ツールやサービスと連携するための規格です。
MCPに対応したサーバーを用意するだけで、AIエージェントが外部サービスのAPIを直接呼び出せるようになります。サービスごとに個別の連携開発をしなくても、共通のプロトコルで「つなぐ」ことができる仕組みです。
今回利用するzabbix-mcpは、Zabbix向けに実装されたMCPサーバーです。Kiroだけでなく、Claude DesktopやCursorなど、MCPに対応したさまざまなクライアントから利用できます。
主な特徴:
- ホスト、テンプレート、トリガー、アイテム、ホストグループの柔軟なクエリ
- 障害・イベント・アラートの取得(深刻度フィルタ対応)
- ホストやテンプレートの作成・更新・削除
- マクロ設定、メンテナンス期間管理
READ_ONLY_MODEによる安全な読み取り専用運用- Zabbix 5.4以降に対応
zabbix-mcpはホスト作成や更新などの書き込み操作にも対応しています。そのため、AIエージェントから自然言語で設定変更を実施することも可能です。一方で、本番環境ですぐに設定変更を許可することに不安を感じる方もいるかもしれません。
zabbix-mcpにはREAD_ONLY_MODEが用意されており、障害確認や設定参照などの読み取り操作のみに制限できます。まずは読み取り専用で運用を開始し、安全性を確認しながら段階的に活用範囲を広げるのがおすすめです。
Kiroとは
KiroはAWS が提供するAI搭載の開発環境(IDE)です。VS Codeベースのエディタに、AIエージェントが統合されています。
KiroはMCPクライアントに対応しており、MCPサーバーを登録するだけで外部サービスとの連携が可能になります。
本コラムではAWSが提供するKiroを利用しますが、前述のとおりzabbix-mcpは他のMCPクライアントからも利用可能です。今回はKiroへzabbix-mcpを設定し、チャットから自然言語でZabbixを操作してみます。
AIエージェントを活用したクラウド環境の監視方法について、NTT東日本のエンジニアがご相談にお応えしますので、お気軽にご連絡ください!
Zabbix環境の展開
本コラムで使用するZabbixや監視対象となるEC2インスタンスなどはCloudFormationテンプレートとして定義しています。
本コラムで試すZabbix環境:

CloudFormationテンプレートサンプル
検証環境を容易に再現できるよう、本コラムではCloudFormationテンプレートを用いて監視環境を一括構築します。テンプレートにはネットワーク環境(VPC・サブネット)に加え、Zabbix Serverと監視対象EC2インスタンスが含まれています。
zabbix-sample.yaml
AWSTemplateFormatVersion: 2010-09-09
Description: Zabbix 7.0 LTS sample template.
# ==============================================================================
# Parameters
# ==============================================================================
Parameters:
AllowedCidr:
Type: String
Default: 0.0.0.0/0
Description: CIDR block allowed to access Zabbix Web UI and SSH (restrict in production)
AllowedPattern: ^(\d{1,3}\.){3}\d{1,3}/\d{1,2}$
DBRootPassword:
Type: String
NoEcho: true
MinLength: 8
MaxLength: 41
Description: MySQL root password
AllowedPattern: ^[a-zA-Z0-9!@#$%^&*()_+=\-]*$
DBZabbixPassword:
Type: String
NoEcho: true
MinLength: 8
MaxLength: 41
Description: MySQL user password for Zabbix
AllowedPattern: ^[a-zA-Z0-9!@#$%^&*()_+=\-]*$
# ==============================================================================
# Metadata
# ==============================================================================
Metadata:
AWS::CloudFormation::Interface:
ParameterGroups:
- Label:
default: Network Settings
Parameters:
- AllowedCidr
- Label:
default: Database Settings
Parameters:
- DBRootPassword
- DBZabbixPassword
# ==============================================================================
# Resources
# ==============================================================================
Resources:
# ----------------------------------------------------------------------------
# VPC
# ----------------------------------------------------------------------------
VPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
EnableDnsSupport: true
EnableDnsHostnames: true
Tags:
- Key: Name
Value: !Sub "${AWS::StackName}-vpc"
# ----------------------------------------------------------------------------
# Internet Gateway
# ----------------------------------------------------------------------------
InternetGateway:
Type: AWS::EC2::InternetGateway
Properties:
Tags:
- Key: Name
Value: !Sub "${AWS::StackName}-igw"
VPCGatewayAttachment:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
VpcId: !Ref VPC
InternetGatewayId: !Ref InternetGateway
# ----------------------------------------------------------------------------
# Public Subnet
# ----------------------------------------------------------------------------
PublicSubnet:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
CidrBlock: 10.0.1.0/24
MapPublicIpOnLaunch: true
AvailabilityZone: !Select [0, !GetAZs ""]
Tags:
- Key: Name
Value: !Sub "${AWS::StackName}-public-subnet"
# ----------------------------------------------------------------------------
# Public Route Table
# ----------------------------------------------------------------------------
PublicRouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref VPC
Tags:
- Key: Name
Value: !Sub "${AWS::StackName}-public-rt"
PublicRoute:
Type: AWS::EC2::Route
DependsOn: VPCGatewayAttachment
Properties:
RouteTableId: !Ref PublicRouteTable
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref InternetGateway
PublicSubnetRouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PublicSubnet
RouteTableId: !Ref PublicRouteTable
# ----------------------------------------------------------------------------
# NAT Gateway (Elastic IP + NAT GW)
# ----------------------------------------------------------------------------
NatGatewayEIP:
Type: AWS::EC2::EIP
DependsOn: VPCGatewayAttachment
Properties:
Domain: vpc
Tags:
- Key: Name
Value: !Sub "${AWS::StackName}-nat-eip"
NatGateway:
Type: AWS::EC2::NatGateway
Properties:
AllocationId: !GetAtt NatGatewayEIP.AllocationId
SubnetId: !Ref PublicSubnet
Tags:
- Key: Name
Value: !Sub "${AWS::StackName}-nat-gw"
# ----------------------------------------------------------------------------
# Private Subnet
# ----------------------------------------------------------------------------
PrivateSubnet:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
CidrBlock: 10.0.2.0/24
AvailabilityZone: !Select [0, !GetAZs ""]
Tags:
- Key: Name
Value: !Sub "${AWS::StackName}-private-subnet"
# ----------------------------------------------------------------------------
# Private Route Table
# ----------------------------------------------------------------------------
PrivateRouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref VPC
Tags:
- Key: Name
Value: !Sub "${AWS::StackName}-private-rt"
PrivateRoute:
Type: AWS::EC2::Route
Properties:
RouteTableId: !Ref PrivateRouteTable
DestinationCidrBlock: 0.0.0.0/0
NatGatewayId: !Ref NatGateway
PrivateSubnetRouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PrivateSubnet
RouteTableId: !Ref PrivateRouteTable
# ----------------------------------------------------------------------------
# Security Group - Zabbix Server
# ----------------------------------------------------------------------------
ZabbixSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Security group for Zabbix Server
VpcId: !Ref VPC
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: !Ref AllowedCidr
Description: Zabbix Web UI (HTTP)
Tags:
- Key: Name
Value: !Sub "${AWS::StackName}-zabbix-sg"
# ----------------------------------------------------------------------------
# Security Group - Monitored Instance
# ----------------------------------------------------------------------------
MonitoredInstanceSG:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Security group for monitored instances
VpcId: !Ref VPC
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 10050
ToPort: 10050
SourceSecurityGroupId: !Ref ZabbixSecurityGroup
Description: Allow Zabbix Server passive checks
Tags:
- Key: Name
Value: !Sub "${AWS::StackName}-monitored-sg"
# ----------------------------------------------------------------------------
# IAM Role - Zabbix
# ----------------------------------------------------------------------------
ZabbixInstanceRole:
Type: AWS::IAM::Role
Properties:
RoleName: !Sub "${AWS::StackName}-zabbix-role"
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Service: ec2.amazonaws.com
Action: sts:AssumeRole
ManagedPolicyArns:
- arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
Policies:
- PolicyName: !Sub "${AWS::StackName}-zabbix-monitoring-policy"
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Action:
- cloudwatch:DescribeAlarms
- cloudwatch:GetMetricData
- cloudwatch:ListMetrics
- ec2:DescribeInstances
- ec2:DescribeRegions
- ec2:DescribeVolumes
Resource: "*"
Tags:
- Key: Name
Value: !Sub "${AWS::StackName}-zabbix-role"
ZabbixInstanceProfile:
Type: AWS::IAM::InstanceProfile
Properties:
Roles:
- !Ref ZabbixInstanceRole
# ----------------------------------------------------------------------------
# EC2 Instance
# ----------------------------------------------------------------------------
ZabbixInstance:
Type: AWS::EC2::Instance
DependsOn: VPCGatewayAttachment
Properties:
ImageId: "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64}}"
InstanceType: t3.medium
IamInstanceProfile: !Ref ZabbixInstanceProfile
NetworkInterfaces:
- AssociatePublicIpAddress: true
DeviceIndex: "0"
SubnetId: !Ref PublicSubnet
GroupSet:
- !Ref ZabbixSecurityGroup
BlockDeviceMappings:
- DeviceName: /dev/xvda
Ebs:
VolumeSize: 30
VolumeType: gp3
Encrypted: true
Tags:
- Key: Name
Value: !Sub "${AWS::StackName}-zabbix-server"
UserData:
Fn::Base64: !Sub |
#!/bin/bash -xe
exec > >(tee /var/log/zabbix-install.log) 2>&1
echo "=========================================="
echo " Zabbix 7.0 LTS Installation Start"
echo "=========================================="
# ------------------------------------------------------------------
# 0. Wait for any existing dnf/rpm lock to be released
# ------------------------------------------------------------------
echo "Waiting for dnf/rpm lock to be released..."
while fuser /var/lib/rpm/.rpm.lock /var/cache/dnf/metadata_lock.pid 2>/dev/null; do
echo " Another process is using dnf/rpm. Waiting 5 seconds..."
sleep 5
done
echo "Lock released. Proceeding with installation."
# ------------------------------------------------------------------
# 1. System Update
# ------------------------------------------------------------------
dnf update -y
# ------------------------------------------------------------------
# 2. Install MySQL 8.4 LTS
# ------------------------------------------------------------------
dnf install -y https://dev.mysql.com/get/mysql84-community-release-el9-1.noarch.rpm
dnf install -y mysql-community-server mysql-community-client
systemctl enable mysqld --now
# Retrieve temporary root password generated by MySQL
TEMP_PASSWORD=$(grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}')
# Secure MySQL: set root password and remove defaults
mysql --connect-expired-password -uroot -p"$TEMP_PASSWORD" <<EOF
ALTER USER 'root'@'localhost' IDENTIFIED BY '${DBRootPassword}';
DELETE FROM mysql.user WHERE User='';
DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');
DROP DATABASE IF EXISTS test;
DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';
FLUSH PRIVILEGES;
EOF
# ------------------------------------------------------------------
# 3. Install Zabbix 7.0 Repository & Packages
# ------------------------------------------------------------------
rpm -Uvh https://repo.zabbix.com/zabbix/7.0/amazonlinux/2023/x86_64/zabbix-release-latest-7.0.amzn2023.noarch.rpm
dnf clean all
dnf install -y zabbix-server-mysql zabbix-web-mysql zabbix-apache-conf zabbix-sql-scripts zabbix-selinux-policy zabbix-agent zabbix-web-japanese
# ------------------------------------------------------------------
# 4. Create Zabbix Database & User
# ------------------------------------------------------------------
mysql -uroot -p'${DBRootPassword}' <<EOF
CREATE DATABASE zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
CREATE USER 'zabbix'@'localhost' IDENTIFIED BY '${DBZabbixPassword}';
GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbix'@'localhost';
SET GLOBAL log_bin_trust_function_creators = 1;
FLUSH PRIVILEGES;
EOF
# ------------------------------------------------------------------
# 5. Import Initial Schema & Data
# ------------------------------------------------------------------
zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | \
mysql --default-character-set=utf8mb4 -uzabbix -p'${DBZabbixPassword}' zabbix
# Disable log_bin_trust_function_creators after import
mysql -uroot -p'${DBRootPassword}' -e "SET GLOBAL log_bin_trust_function_creators = 0;"
# ------------------------------------------------------------------
# 6. Configure Zabbix Server - DB Password
# ------------------------------------------------------------------
sed -i "s/^# DBPassword=.*/DBPassword=${DBZabbixPassword}/" /etc/zabbix/zabbix_server.conf
# ------------------------------------------------------------------
# 7. Configure Zabbix PHP Frontend (bypass setup wizard)
# ------------------------------------------------------------------
cat > /etc/zabbix/web/zabbix.conf.php <<'PHPCONF'
<?php
$DB['TYPE'] = 'MYSQL';
$DB['SERVER'] = 'localhost';
$DB['PORT'] = '0';
$DB['DATABASE'] = 'zabbix';
$DB['USER'] = 'zabbix';
PHPCONF
# Append DB password separately to avoid heredoc interpolation issues
echo "\$DB['PASSWORD'] = '${DBZabbixPassword}';" >> /etc/zabbix/web/zabbix.conf.php
cat >> /etc/zabbix/web/zabbix.conf.php <<'PHPCONF'
$DB['SCHEMA'] = '';
$DB['ENCRYPTION'] = false;
$DB['KEY_FILE'] = '';
$DB['CERT_FILE'] = '';
$DB['CA_FILE'] = '';
$DB['VERIFY_HOST'] = false;
$DB['CIPHER_LIST'] = '';
$DB['VAULT_URL'] = '';
$DB['VAULT_DB_PATH'] = '';
$DB['VAULT_TOKEN'] = '';
$DB['DOUBLE_IEEE754'] = true;
$ZBX_SERVER = 'localhost';
$ZBX_SERVER_PORT = '10051';
$IMAGE_FORMAT_DEFAULT = IMAGE_FORMAT_PNG;
PHPCONF
# Append server name separately to use CloudFormation stack name
echo "\$ZBX_SERVER_NAME = '${AWS::StackName}';" >> /etc/zabbix/web/zabbix.conf.php
chown apache:apache /etc/zabbix/web/zabbix.conf.php
chmod 640 /etc/zabbix/web/zabbix.conf.php
# ------------------------------------------------------------------
# 8. Set default language to Japanese for Admin user
# ------------------------------------------------------------------
mysql -uzabbix -p'${DBZabbixPassword}' zabbix <<EOF
UPDATE users SET lang = 'ja_JP' WHERE username = 'Admin';
UPDATE config SET default_lang = 'ja_JP';
EOF
# ------------------------------------------------------------------
# 9. Start & Enable All Services
# ------------------------------------------------------------------
systemctl enable zabbix-server zabbix-agent httpd php-fpm --now
# ------------------------------------------------------------------
# 9. Installation Complete
# ------------------------------------------------------------------
echo "=========================================="
echo " Zabbix 7.0 LTS Installation Complete!"
echo " Web UI: http://<public-ip>/zabbix"
echo " Default login: Admin / zabbix"
echo "=========================================="
# ----------------------------------------------------------------------------
# IAM Role - Monitored Instance
# ----------------------------------------------------------------------------
MonitoredInstanceRole:
Type: AWS::IAM::Role
Properties:
RoleName: !Sub "${AWS::StackName}-monitored-role"
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Service: ec2.amazonaws.com
Action: sts:AssumeRole
ManagedPolicyArns:
- arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
Tags:
- Key: Name
Value: !Sub "${AWS::StackName}-monitored-role"
MonitoredInstanceProfile:
Type: AWS::IAM::InstanceProfile
Properties:
Roles:
- !Ref MonitoredInstanceRole
# ----------------------------------------------------------------------------
# EC2 Instance - Monitored Target
# ----------------------------------------------------------------------------
MonitoredInstance:
Type: AWS::EC2::Instance
DependsOn: PrivateRoute
Properties:
ImageId: "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64}}"
InstanceType: t3.micro
IamInstanceProfile: !Ref MonitoredInstanceProfile
SubnetId: !Ref PrivateSubnet
SecurityGroupIds:
- !Ref MonitoredInstanceSG
Tags:
- Key: Name
Value: !Sub "${AWS::StackName}-monitored-instance"
UserData:
Fn::Base64: !Sub |
#!/bin/bash -xe
exec > >(tee /var/log/zabbix-agent-install.log) 2>&1
echo "=========================================="
echo " Zabbix Agent 7.0 Installation Start"
echo "=========================================="
# ------------------------------------------------------------------
# 0. Wait for any existing dnf/rpm lock to be released
# ------------------------------------------------------------------
echo "Waiting for dnf/rpm lock to be released..."
while fuser /var/lib/rpm/.rpm.lock /var/cache/dnf/metadata_lock.pid 2>/dev/null; do
echo " Another process is using dnf/rpm. Waiting 5 seconds..."
sleep 5
done
echo "Lock released. Proceeding with installation."
# ------------------------------------------------------------------
# 1. System Update
# ------------------------------------------------------------------
dnf update -y
# ------------------------------------------------------------------
# 2. Install Zabbix Agent
# ------------------------------------------------------------------
rpm -Uvh https://repo.zabbix.com/zabbix/7.0/amazonlinux/2023/x86_64/zabbix-release-latest-7.0.amzn2023.noarch.rpm
dnf clean all
dnf install -y zabbix-agent
# ------------------------------------------------------------------
# 3. Configure Zabbix Agent
# ------------------------------------------------------------------
ZABBIX_SERVER_IP="${ZabbixInstance.PrivateIp}"
cat > /etc/zabbix/zabbix_agentd.conf <<EOF
# Zabbix Agent Configuration
PidFile=/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
# Zabbix Server connection
Server=$ZABBIX_SERVER_IP
ServerActive=$ZABBIX_SERVER_IP
Hostname=$(hostname)
# Security
AllowKey=system.run[*]
Include=/etc/zabbix/zabbix_agentd.d/*.conf
EOF
# ------------------------------------------------------------------
# 4. Start & Enable Zabbix Agent
# ------------------------------------------------------------------
systemctl enable zabbix-agent --now
# ------------------------------------------------------------------
# 5. Installation Complete
# ------------------------------------------------------------------
echo "=========================================="
echo " Zabbix Agent 7.0 Installation Complete!"
echo " Server: $ZABBIX_SERVER_IP"
echo "=========================================="
# ==============================================================================
# Outputs
# ==============================================================================
Outputs:
ZabbixWebUrl:
Description: Zabbix Web UI URL
Value: !Sub "http://${ZabbixInstance.PublicIp}/zabbix"
ZabbixServerPrivateIp:
Description: Private IP address of the Zabbix Server
Value: !GetAtt ZabbixInstance.PrivateIp
MonitoredInstanceId:
Description: Instance ID of the monitored target
Value: !Ref MonitoredInstance
MonitoredInstancePrivateIp:
Description: Private IP address of the monitored instance
Value: !GetAtt MonitoredInstance.PrivateIp
CloudFormationスタックの展開手順
1. CloudFormationのマネジメントコンソールを開き、「スタックの作成」を押下

2. スタックの作成にて、「テンプレートファイルのアップロード」を選択、「zabbix-sample.yaml」をアップロードし「次へ」を押下

3. スタックの詳細を指定にて、以下入力し「次へ」を押下
| 項目 | 入力内容 |
|---|---|
| スタック名 | スタック名を入力 |
| パラメータ / AllowedCidr | 自身の環境のグローバルIPアドレスを入力 |
| パラメータ / DBRootPassword | DBのrootユーザーのパスワードとして設定するものを入力 |
| パラメータ / DBZabbixPassword | DBのzabbixユーザーのパスワードとして設定するものを入力 |

4. スタックオプションの設定にて、最下部の「AWS CloudFormation によって IAM リソースがカスタム名で作成される場合があることを承認します。」のチェックボックスに同意し、「次へ」を押下

5. 確認して作成にて、入力した内容に誤りがない事を確認し「送信」を押下
6. 作成したスタックのステータスが「CREATE_COMPLETE」になれば展開完了

Zabbix Webインターフェースへのログインとアクセストークンの発行
1. CloudFormationスタックの展開が完了したら、作成したスタックの「出力」タブに記載された「ZabbixWebUrl」の値を確認および押下し、Zabbix WebインターフェースへWebブラウザでアクセス

スタック展開後にzabbix-serverなどがインストールされるため、アクセスできるようになるまでに時間がかかります。
2. ログイン画面にて、以下入力し「サインイン」を押下
| 項目 | 入力内容 |
|---|---|
| ユーザー名 | Admin |
| パスワード | zabbix |

3. ログイン後、左ペインより「ユーザー > APIトークン」を開き「APIトークンの作成」を押下

4. 新規APIトークン作成画面にて、以下を入力し「追加」を押下
| 項目 | 入力内容 |
|---|---|
| 名前 | mcp |
| ユーザー | Admin (Zabbix Administrator) |
| 有効期限 | 任意の有効期限を設定 |

5. 作成後、「クリップボードにコピー」し「閉じる」を押下

AIエージェントを活用したクラウド環境の監視方法について、NTT東日本のエンジニアがご相談にお応えしますので、お気軽にご連絡ください!
KiroへのMCPサーバー設定
uvのインストール
Kiroにzabbix-mcpの設定を行う前に、Pythonのパッケージマネージャであるuvをインストールしておきます。
uvのインストール (Windowsの場合)
> powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
~省略~
インストール後の確認
> uv --version
uv 0.11.32 (3010295ae 2026-07-23 x86_64-pc-windows-msvc)
KiroへのMCPサーバー設定
Kiroにzabbix-mcpを設定します。
ワークスペースの.kiro/settings/mcp.jsonに以下の内容を記述します。
{
"mcpServers": {
"zabbix": {
"command": "uvx",
"args": ["zabbix-mcp"],
"env": {
"ZABBIX_URL": "<ZabbixWebUrl>/api_jsonrpc.php",
"ZABBIX_TOKEN": "<発行したAPIトークン>"
}
}
}
}
<ZabbixWebUrl>、<発行したAPIトークン>の置換を忘れないようにしてください
設定を保存すると、KiroがMCPサーバーを自動的に起動します。
zabbix-mcpの動作確認
設定が完了したら、Kiroのチャットで簡単な確認を行います。
チャットに「zabbixに登録されているホストの一覧を教えて」と入力してみましょう。

Kiroが@zabbix/host_getツールを呼び出し、登録されているホスト情報を取得して回答してくれます。初期状態では「Zabbix server」自身のみが登録されていることが確認できます。
これでKiroからZabbixを操作する準備が整いました。
AIエージェントを活用したクラウド環境の監視方法について、NTT東日本のエンジニアがご相談にお応えしますので、お気軽にご連絡ください!
チャットでの監視ホスト登録
それでは本題です。
今回は検証環境のため、AIエージェントにホスト登録を実施してもらいます。
なお、本番環境でまずは安全に活用したい場合は、前述のREAD_ONLY_MODEを利用し、障害確認や設定参照といった読み取り用途から始める方法もあります。
マネジメントコンソールでの確認
展開したCloudFormationスタックの「出力」タブに記載された「MonitoredInstanceId」、「MonitoredInstancePrivateIp」の値を確認しておきます。

Kiroへの指示
Kiroのチャットに以下のように指示しました。
zabbixにインスタンス:i-04ce4552c4f8aa3af、IPアドレス:10.0.2.143のホストをAWS HTTPテンプレートとzabbix-agentのテンプレートで監視できるようにして。
ホスト名はmonitored-instance、リージョンはap-northeast-3、CloudWatchAPIはZabbixServerのインスタンスプロファイルを利用できるように明示して登録してくれると嬉しい。
Kiroの動作
Kiroは指示された内容を解釈し、ホスト登録にあたって以下の順序で実施してくれました。
- テンプレートとホストグループの情報を取得(利用可能なテンプレートIDやグループIDの確認)
- ホストを作成(テンプレート「AWS EC2 by HTTP」と「Linux by Zabbix agent」を紐付け)
- 必要なマクロを設定(リージョン、インスタンスID、認証方式など)
また、完了報告としてZabbixに登録した内容を整理し表示してくれました。

Zabbix Webインターフェースでの確認
Zabbix Webインターフェースの「データ収集 > ホスト」を確認すると、Kiroが登録したホストが表示されており、テンプレートも「AWS EC2 by HTTP」と「Linux by Zabbix agent」の両方が紐づけられていることが確認できます。

前回のコラム:ZabbixでAWS EC2を監視してみよう~CloudWatch連携とZabbix Agentの比較~ではZabbix Webインターフェース上で手動で入力していた作業が、自然言語による指示で完了しました。
障害確認もチャットで
監視ホストの登録だけでなく、障害の確認もチャットで行えます。
「登録してもらったホストに障害は出てますか?」と聞いてみましょう。

Kiroは@zabbix/problem_getで障害情報を取得するだけでなく、発生しているアラートの意味や考えられる原因、確認すべきポイントまで整理して提示してくれました。
Zabbix Webインターフェースの「監視データ > 障害」から同じ障害を確認でき、Kiroの回答と一致していることがわかります。

AIエージェントを活用したクラウド環境の監視方法について、NTT東日本のエンジニアがご相談にお応えしますので、お気軽にご連絡ください!
さいごに
本コラムでは、zabbix-mcpとAI開発環境Kiroを組み合わせて、自然言語でZabbixを操作する方法をご紹介しました。
従来の手動操作と比較すると、MCPを活用することで以下のような変化があります。
| 観点 | 従来の手動操作 | AIエージェント(Kiro) + MCP |
|---|---|---|
| ホスト登録 | Webインターフェースで複数画面を遷移して入力 | チャットで指示するだけ |
| 障害確認 | Webインターフェースにログインして確認 | チャットで質問するだけ |
| API操作 | JSON-RPCのリクエストを手書き | 自然言語で指示 |
| 学習コスト | ZabbixのAPI仕様を理解する必要あり | AIが仕様を理解して実行 |
今回の例では、単純にZabbix APIを呼び出しただけではありません。
Kiroは利用可能なテンプレートやホストグループの情報を事前に取得し、それらを基に必要な設定を組み立てた上でホスト登録を実施しました。
従来のチャットボットのように単一の問い合わせへ応答するだけでなく、「監視対象を登録したい」という目的に対して、必要な情報収集や設定作業を自律的に実行している点は、AIエージェントとMCPの組み合わせならではの面白さだと感じます。
なお、本コラムの構成はあくまで検証目的になります。
本番環境への適用にはAPIトークンの権限設計やREAD_ONLY_MODEの活用、ネットワーク経路のアクセス制御など、運用ポリシーに合わせた追加のセキュリティ考慮が必要です。
AIエージェントとの連携により、監視ツールの操作がより直感的で手軽になります。複雑なAPI仕様を覚えなくても、「何をしたいか」を伝えるだけで操作が完了する体験は、監視運用の効率化に大きく貢献するのではないでしょうか。
MCPはZabbixに限らず、さまざまなサービスとAIエージェントを橋渡しするプロトコルです。今後もMCPサーバーが増えていくことで、AIエージェントを軸にした運用自動化の可能性がさらに広がっていくと思います。
本コラムが皆さまの監視運用の新しい選択肢として参考になれば幸いです。
AIエージェントを活用したクラウド環境の監視方法について、NTT東日本のエンジニアがご相談にお応えしますので、お気軽にご連絡ください!
本コラムに記載されてる会社名、サービス名、商品名は、各社の商標または登録商標です。
RECOMMEND
その他のコラム
相談無料!プロが中立的にアドバイスいたします
クラウド・AWS・Azureでお困りの方はお気軽にご相談ください。






