ubuntu-insights
README.md
# mcp-ubuntu-insights
Ubuntu のシステム情報・リソース使用量を Bob に提供する MCP サーバーです。
CPU・メモリ・ディスク・ネットワーク・サービス・プロセス情報に加え、**セキュリティ診断** と **ネットワーク詳細診断** を自然言語で問い合わせられるようになります。
## 動作環境
| 項目 | 要件 |
|---|---|
| OS | Ubuntu 24.04 LTS(WSL2 含む) |
| Node.js | v18 以上 |
| MCP クライアント | IBM Bob、AWS Kiro、Claude Code |
---
## ディレクトリ構成
```
mcp-ubuntu-insights/
├── src/
│ └── index.ts # サーバー実装(TypeScript)
├── build/
│ └── index.js # コンパイル済みバイナリ(自動生成)
├── package.json
├── tsconfig.json
└── README.md
```
登録設定ファイル(ワークスペーススコープ):
```
<ワークスペース>/
└── .bob/
└── mcp.json # Bob への MCP サーバー登録
```
---
## セットアップ手順
まず Node.js がインストール済みかどうかを確認してください。
```bash
node --version
npm --version
```
- **`v18.0.0` 以上が表示された場合** → [手順 A(インストール済み)](#手順-a-nodejs-インストール済みの場合) へ
- **`command not found` と表示された場合** → [手順 B(未インストール)](#手順-b-nodejs-未インストールの場合nvm-経由) へ
---
## 手順 A:Node.js インストール済みの場合
### A-1. リポジトリのクローン
```bash
git clone https://github.com/duelist2021jp/mcp-ubuntu-insights.git
cd mcp-ubuntu-insights
```
### A-2. 依存パッケージのインストールとビルド
```bash
npm install
npm run build
```
成功すると `build/index.js` が生成されます。
```bash
ls build/ # index.js が存在すれば OK
```
### A-2a. sudoers の設定(`get_security_audit` を使う場合)
`get_security_audit` ツールは UFW のステータス取得に `sudo` を使用します。
MCP サーバーは非対話プロセスのため、パスワードなしで実行できるよう **NOPASSWD** ルールの追加が必要です。
```bash
# ufw コマンドのみに限定した NOPASSWD ルールを追加
echo "<あなたのユーザー名> ALL=(ALL) NOPASSWD: /usr/sbin/ufw" \
| sudo tee /etc/sudoers.d/mcp-ufw
sudo chmod 440 /etc/sudoers.d/mcp-ufw
# 構文チェック("parsed OK" と表示されれば成功)
sudo visudo -c
```
> **注意**: `<あなたのユーザー名>` は `whoami` の出力に置き換えてください。
> この設定を省略した場合、`get_security_audit` の `firewall` チェックで UFW のステータスが
> 正しく取得されず、ファイアウォールが無効と誤検知されることがあります。
### A-3. Bob への登録(`mcp.json`)
`node` の絶対パスを確認します。
```bash
which node
# 例(システム標準): /usr/bin/node
# 例(nvm) : /home/testuser/.nvm/versions/node/v24.18.0/bin/node
```
ワークスペース内の `.bob/mcp.json` を作成または編集して以下を追加します。
**パスは `which node` と `pwd` の結果に合わせて変更してください。**
```bash
# build/index.js の絶対パスを確認
pwd # 例: /home/testuser/bob-study/mcp-ubuntu-insights
```
**`.bob/mcp.json`**(ワークスペースルートの `.bob/` ディレクトリに配置)
```json
{
"mcpServers": {
"ubuntu-insights": {
"command": "/usr/bin/node",
"args": ["/home/youruser/path/to/mcp-ubuntu-insights/build/index.js"]
}
}
}
```
### A-4. 接続確認
`mcp.json` を保存すると Bob がホットリロードし、MCP パネルに `ubuntu-insights` が表示されます。
表示されない場合は Bob を再起動してください。
動作確認(コマンドラインから直接テスト):
```bash
echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"0"}}}' \
| node build/index.js
# {"result":{"protocolVersion":"2024-11-05","capabilities":{"tools":{"listChanged":true}},...}}
```
---
## 手順 B:Node.js 未インストールの場合(nvm 経由)
### B-1. nvm のインストール
```bash
# nvm のインストール
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
# シェルに nvm を読み込む
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
# Node.js LTS をインストール
nvm install --lts
# バージョン確認
node --version # 例: v24.18.0
npm --version # 例: 11.16.0
```
> **注意**: 次回以降のシェル起動時も nvm が自動的に読み込まれるよう、インストーラーが
> `~/.bashrc` へ追記します。手動で追加する場合は以下を `~/.bashrc` に記述してください。
>
> ```bash
> export NVM_DIR="$HOME/.nvm"
> [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
> ```
### B-2. リポジトリのクローン・ビルド
```bash
git clone https://github.com/<your-username>/mcp-ubuntu-insights.git
cd mcp-ubuntu-insights
npm install
npm run build
```
### B-2a. sudoers の設定(`get_security_audit` を使う場合)
手順 A-2a と同様に sudoers の NOPASSWD ルールを設定してください。
→ [A-2a. sudoers の設定](#a-2a-sudoers-の設定get_security_audit-を使う場合) を参照
### B-3. Bob への登録(`mcp.json`)
nvm でインストールした Node.js の絶対パスを確認します。
```bash
which node
# 例: /home/testuser/.nvm/versions/node/v24.18.0/bin/node
```
> **重要**: Bob は `~/.bashrc` を読み込まないため `PATH` に nvm のパスが通っていません。
> `command` には `node` ではなく必ず **絶対パス** を指定してください。
**`.bob/mcp.json`**(ワークスペースルートの `.bob/` ディレクトリに配置)
```json
{
"mcpServers": {
"ubuntu-insights": {
"command": "/home/testuser/.nvm/versions/node/v24.18.0/bin/node",
"args": ["/home/testuser/bob-study/mcp-ubuntu-insights/build/index.js"]
}
}
}
```
### B-4. 接続確認
`mcp.json` を保存すると Bob がホットリロードし、MCP パネルに `ubuntu-insights` が表示されます。
表示されない場合は Bob を再起動してください。
動作確認(コマンドラインから直接テスト):
```bash
echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"0"}}}' \
| node build/index.js
# {"result":{"protocolVersion":"2024-11-05","capabilities":{"tools":{"listChanged":true}},...}}
```
---
## ゼロからスクラッチで構築する場合
GitHub からクローンせず、自分でファイルを作成する場合の手順です。
### 2. プロジェクトのセットアップ
ワークスペース内にプロジェクトディレクトリを作成し、依存パッケージをインストールします。
```bash
# ワークスペースへ移動(例)
cd /home/testuser/bob-study
# ディレクトリ作成
mkdir -p mcp-ubuntu-insights/src
cd mcp-ubuntu-insights
# package.json の初期化(後述の内容で上書きします)
npm init -y
# 依存パッケージのインストール
npm install @modelcontextprotocol/sdk zod
npm install -D @types/node typescript
```
### 3. 設定ファイルの作成
**`package.json`**
```json
{
"name": "mcp-ubuntu-insights",
"version": "0.1.0",
"description": "MCP server for Ubuntu system insights",
"type": "module",
"scripts": {
"build": "tsc && chmod 755 build/index.js"
},
"bin": {
"mcp-ubuntu-insights": "./build/index.js"
},
"files": ["build"],
"dependencies": {
"@modelcontextprotocol/sdk": "^1.29.0",
"zod": "^3.25.76"
},
"devDependencies": {
"@types/node": "^22.20.0",
"typescript": "^5.9.3"
}
}
```
**`tsconfig.json`**
```json
{
"compilerOptions": {
"target": "ES2022",
"module": "Node16",
"moduleResolution": "Node16",
"outDir": "./build",
"rootDir": "./src",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true
},
"include": ["src/**/*"],
"exclude": ["node_modules"]
}
```
### 4. サーバー実装(`src/index.ts`)
`src/index.ts` を作成します。詳細は [`src/index.ts`](src/index.ts) を参照してください。
ファイルの骨格は以下の通りです。
```typescript
#!/usr/bin/env node
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
// ...(各ツールの registerTool 呼び出し)
const server = new McpServer({ name: "mcp-ubuntu-insights", version: "0.1.0" });
// ツールを登録 → server.registerTool("ツール名", { description, inputSchema }, handler)
async function main() {
const transport = new StdioServerTransport();
await server.connect(transport);
console.error("mcp-ubuntu-insights running on stdio");
}
main().catch((error) => {
console.error("Fatal error:", error);
process.exit(1);
});
```
> **ログは必ず `console.error` を使用してください。**
> `console.log` は MCP プロトコルの stdout チャネルに書き込まれるため、接続が壊れます。
### 5. ビルド
```bash
# mcp-ubuntu-insights ディレクトリで実行
npm run build
```
成功すると `build/index.js` が生成されます。
```bash
ls build/ # index.js が存在すれば OK
```
### 6. Bob への登録(`mcp.json`)
ワークスペース内の `.bob/mcp.json` にサーバーを登録します。
**`node` の絶対パスと `build/index.js` の絶対パスは環境に合わせて変更してください。**
→ 詳細は [手順 A-3](#a-3-bob-への登録mcp-json) または [手順 B-3](#b-3-bob-への登録mcp-json) を参照してください。
> - **ワークスペーススコープ**(`.bob/mcp.json`): このワークスペースを開いている間のみ有効
> - **グローバルスコープ**(`~/.bob/settings/mcp.json`): 全ワークスペースで有効
> 同名のサーバーはワークスペーススコープがグローバルスコープを上書きします。
### 7. 接続確認
`mcp.json` を保存すると Bob がホットリロードし、MCP パネルに `ubuntu-insights` が表示されます。
表示されない場合は Bob を再起動してください。
---
## 提供ツール一覧
### 基本ツール(v0.1)
| ツール名 | 説明 | パラメーター |
|---|---|---|
| `get_system_overview` | OS・稼働時間・CPU/メモリ/ディスクの総合概要 | なし |
| `get_cpu_info` | CPUモデル・コア数・ロードアベレージ | なし |
| `get_memory_info` | メモリ・スワップ詳細(`/proc/meminfo` + `free -m`) | なし |
| `get_disk_info` | `df -h` + `lsblk` のディスク情報 | なし |
| `get_network_info` | IPアドレス・接続状況・送受信統計(基本) | なし |
| `get_running_services` | systemd サービス一覧 | `state`: `running`(既定)/ `failed` / `all` |
| `get_top_processes` | リソース消費上位プロセス | `sortBy`: `cpu`(既定)/ `memory`、`limit`: 1〜50(既定 15) |
### 新ツール(v0.2)
#### `get_security_audit` — セキュリティ診断・コンプライアンスレポート
| パラメーター | 型 | 既定 | 説明 |
|---|---|---|---|
| `checks` | `string[]` | `["all"]` | 実施するチェック項目 |
`checks` に指定できる値:
| 値 | チェック内容 |
|---|---|
| `firewall` | UFW ステータス・カーネルネットパラメーター(ip_forward 等) |
| `ssh` | sshd_config(PermitRootLogin・PasswordAuthentication・Protocol・MaxAuthTries 等) |
| `sudo` | sudoers の NOPASSWD・UID 0 アカウント・空パスワードアカウント |
| `auth_log` | `/var/log/auth.log` の認証失敗ログ件数 |
| `updates` | unattended-upgrades の設定状況 |
| `suid` | SUID/SGID ファイル・ワールドライタブルファイルの検出 |
| `all` | 上記すべて(既定) |
**戻り値の構造:**
```json
{
"summary": {
"score": 67, // 0–100 のセキュリティスコア
"rating": "要改善", // 良好 / 要改善 / 問題あり / 危険
"totalFindings": 5,
"bySeverity": { "critical": 0, "high": 1, "medium": 2, "low": 2 }
},
"findings": [
{
"severity": "high",
"item": "ファイアウォール無効",
"detail": "UFW が無効またはインストールされていません。",
"recommendation": "sudo ufw enable && sudo ufw default deny incoming ..."
}
],
"rawData": { ... }
}
```
---
#### `get_network_insights` — ネットワーク詳細診断
| パラメーター | 型 | 既定 | 説明 |
|---|---|---|---|
| `checks` | `string[]` | `["all"]` | 実施するチェック項目 |
`checks` に指定できる値:
| 値 | チェック内容 |
|---|---|
| `interfaces` | インターフェース状態(UP/DOWN)・ARPテーブル・NetworkManager状態 |
| `routing` | デフォルトゲートウェイ・ルーティングテーブル・ゲートウェイへの ping |
| `dns` | `/etc/resolv.conf`・systemd-resolved 状態・8.8.8.8 への疎通確認 |
| `ports` | 待受ポート一覧・危険ポート(Telnet/FTP/NFS等)の検出 |
| `connections` | 確立済みTCP接続・接続数異常の検出 |
| `bandwidth` | `/proc/net/dev` の送受信バイト数・エラー・ドロップ統計 |
| `all` | 上記すべて(既定) |
**戻り値の構造:**
```json
{
"summary": {
"totalFindings": 1,
"bySeverity": { "critical": 0, "high": 1, "medium": 0, "low": 0, "info": 0 },
"externalConnectivity": "ok", // ok / unreachable / unchecked
"gatewayConnectivity": "ok" // ok / unreachable / unchecked
},
"findings": [
{
"severity": "high",
"item": "危険なポートが公開されている: 23/Telnet(平文通信)",
"detail": "0.0.0.0:23 で Telnet が待ち受けています。",
"recommendation": "サービスを停止するか SSH トンネリングに移行してください。"
}
],
"network": {
"interfaces": [...],
"bandwidthStats": { "eth0": { "rxBytes": ..., "txBytes": ... } },
"dnsServers": ["127.0.0.53"],
"defaultRoutes": ["default via 172.30.192.1 dev eth0"],
"listeningPorts": [...],
"establishedConnections": 12
},
"rawData": { ... }
}
```
---
### 使い方の例
Bob のチャットで以下のように質問できます。
```
システムの概要を教えて
CPU の負荷を確認して
メモリ使用量を詳しく見せて
失敗しているサービスはある?
メモリ消費上位 20 件のプロセスを教えて
# v0.2 新機能
セキュリティ診断レポートを出して
SSH の設定に問題はある?
ファイアウォールの状態を確認して
ネットワークの問題を診断して
外部と通信できているか確認して
危険なポートが開いていないか確認して
```
---
## ツールの追加・拡張
新しいツールを追加するには `src/index.ts` に `server.registerTool(...)` を追記し、ビルドし直します。
```bash
# 編集後にビルド
cd /home/testuser/bob-study/mcp-ubuntu-insights
npm run build
```
ビルドが完了すると Bob が自動的に新しいツールを認識します(再起動不要)。
---
## トラブルシューティング
### MCP パネルにサーバーが表示されない
1. Bob を再起動する
2. `.bob/mcp.json` の JSON 構文エラーがないか確認する
3. `node` と `build/index.js` のパスが正しい絶対パスであることを確認する
4. コマンドラインから直接実行して起動エラーがないか確認する(上記「接続確認」参照)
### `node: command not found` になる
`mcp.json` の `command` には `node` ではなく **nvm でインストールした Node.js の絶対パス** を指定してください。
Bob は nvm のシェル設定(`~/.bashrc`)を読み込まないため、`PATH` に nvm のパスが通っていません。
```bash
# 正しい絶対パスを確認
which node
```
### `get_security_audit` でファイアウォールが「無効」と誤検知される
UFW はインストール・有効化済みにもかかわらず `ファイアウォール無効` と報告される場合は、
sudoers の NOPASSWD 設定が不足しています。
```bash
# 設定されているか確認
sudo cat /etc/sudoers.d/mcp-ufw
```
表示されない、または `ufw` が含まれていない場合は [A-2a. sudoers の設定](#a-2a-sudoers-の設定get_security_audit-を使う場合) を参照して設定してください。
---
### ビルドエラーが出る
TypeScript のバージョンや `@modelcontextprotocol/sdk` の API 変更が原因の場合があります。
```bash
# 依存パッケージを最新化して再ビルド
npm update
npm run build
```
TDQS
A3.7/5.0
Scored across 7 tools
Disambiguation5/5
Each tool targets a distinct system resource (CPU, disk, memory, network, services, processes) plus a summary. No overlap or ambiguity.
Naming Consistency4/5
All tools use the 'get_' prefix and snake_case, with most following 'get_<resource>_info'. Minor deviations like 'get_running_services' and 'get_system_overview' are acceptable.
Tool Count5/5
Seven tools is well-scoped for a system insights server—enough to cover core resources without being overwhelming.
Completeness4/5
Covers CPU, memory, disk, network, processes, and services. A summary tool provides an overview. Minor gaps exist (e.g., logs, detailed process info) but not critical.
Maintenance
ActivityStale
ResponsivenessNo issues