Skip to main content
Glama
MysticCoss

Splunk MCP WebUI

by MysticCoss
README.md
# Splunk MCP WebUI

[![CI](https://github.com/MysticCoss/splunk-mcp-webui/actions/workflows/ci.yml/badge.svg)](https://github.com/MysticCoss/splunk-mcp-webui/actions/workflows/ci.yml)

MCP (Model Context Protocol) server cho Splunk — dựa trên các tool của Splunk MCP Server chính hãng, nhưng:

| | MCP chính hãng | Splunk MCP WebUI |
|---|---|---|
| Kết nối | splunkd REST API (port 8089) + token/app cài trong Splunk | **Splunk Web UI (port 8000)** — login bằng form như trình duyệt |
| Cấu hình | token, cert, app, roles... | **Chỉ 3 field: `splunk_url`, `username`, `password`** |
| Số tool | ~20 | **6 tool cốt lõi** |

Chỉ cần Splunk Web mở được là dùng được — không cần port quản trị 8089, không cần token, không cần cài app lên Splunk.

## Các tool

| Tool | Mô tả |
|---|---|
| `splunk_run_query` | Chạy SPL query, trả về kết quả JSON (mặc định 100 dòng, có `truncated` + `next_offset` để lấy trang tiếp; `_raw` tự cắt ở 1000 ký tự) |
| `splunk_get_job_results` | Lấy tiếp kết quả của 1 job đã chạy xong **theo sid** — phân trang khối lượng lớn mà không phải chạy lại search |
| `splunk_get_search_job_status` | Xem trạng thái 1 job (done/running/failed) và tổng số kết quả |
| `splunk_get_indexes` | Danh sách index dạng compact (tên, kích thước, số event, splunk_server...); `full: true` để lấy toàn bộ config |
| `splunk_get_index_info` | Thông tin chi tiết 1 index |
| `splunk_get_metadata` | Metadata `hosts` / `sources` / `sourcetypes` theo index và khoảng thời gian |

## Cài đặt

```powershell
git clone https://github.com/MysticCoss/splunk-mcp-webui
cd splunk-mcp-webui
pip install -r requirements.txt
```

Hoặc cài như package: `pip install git+https://github.com/MysticCoss/splunk-mcp-webui` — sau đó chạy bằng lệnh `splunk-mcp-webui`.

## Cấu hình

Copy `config.example.json` thành `config.json` rồi sửa. Client tìm config theo thứ tự:

1. Đường dẫn trong biến môi trường `SPLUNK_MCP_CONFIG` (nếu đặt)
2. `config.json` cạnh thư mục `splunk_mcp_webui/` (khi clone repo)
3. `~/.splunk-mcp/config.json` (tiện khi cài bằng `pip install git+...` — không có thư mục project)

```json
{
  "splunk_url": "https://splunk-cua-ban",
  "username": "admin",
  "password": "mat-khau"
}
```

> `config.json` chứa credential thật nên đã bị `.gitignore` loại khỏi repo — chỉ commit `config.example.json`.

Các key tùy chọn (đều có giá trị mặc định, không cần khai báo):

| Key | Mặc định | Mô tả |
|---|---|---|
| `locale` | `en-US` | Locale path của Splunk Web (`vi-VN`, `en-US`...) — tự detect khi có thể |
| `verify_ssl` | `false` | Xác thực chứng chỉ SSL — mặc định chấp nhận self-signed; đặt `true` để xác thực nghiêm ngặt hoặc đường dẫn CA bundle nội bộ |
| `read_only` | `true` | Chặn các SPL command sửa dữ liệu: `delete`, `outputlookup`, `collect`, `script`, `sendemail`... Đặt `false` để cho phép |
| `max_raw_chars` | `1000` | Giới hạn ký tự của field `_raw` trong kết quả search (0 = không giới hạn) |
| `request_timeout` | `60` | Timeout cho mỗi HTTP request (giây) |
| `search_timeout` | `300` | Timeout tối đa cho 1 search job (giây) |
| `poll_interval` | `1` | Chu kỳ poll trạng thái job (giây) |
| `default_row_limit` | `100` | Số dòng trả về mặc định của `splunk_run_query` |
| `max_row_limit` | `1000` | Số dòng tối đa mỗi lần fetch — kết quả nhiều hơn thì dùng `offset` để lấy trang tiếp |

## SSL self-signed

Mặc định client **chấp nhận mọi chứng chỉ SSL** — kể cả self-signed, cert nội bộ hay cert tự ký của Splunk:

```json
{
  "verify_ssl": false
}
```

Đây là giá trị mặc định, không cần khai báo trong `config.json`. Chỉ khi muốn xác thực chứng chỉ nghiêm ngặt thì mới đặt `true`, hoặc trỏ tới **CA bundle nội bộ** (hỗ trợ cert CA riêng của công ty):

```json
{
  "verify_ssl": "C:\\certs\\corp-ca.pem"
}
```

Đó là tất cả. Mọi thứ khác tự xử lý: tự detect `http/https`, locale (`en-US`...), session cookie, CSRF form-key, tự re-login khi session hết hạn, SSL self-signed được tự động chấp nhận.

> `splunk_url` chấp nhận mọi dạng: `splunk.corp.local`, `10.0.0.5:8000`, `http://10.0.0.5:8000`, `https://splunk.corp.local:8000/en-US`.
> Mật khẩu có thể đặt qua biến môi trường `SPLUNK_URL` / `SPLUNK_USERNAME` / `SPLUNK_PASSWORD` (ghi đè file) để không lưu plain-text. Đường dẫn config khác: `SPLUNK_MCP_CONFIG`.
> ⚠️ Khi `splunk_url` ghi rõ `https://`, client **không bao giờ** tự hạ cấp xuống HTTP — handshake TLS hỏng sẽ báo lỗi thay vì gửi mật khẩu plaintext.

## Bảo mật — dùng tài khoản quyền tối thiểu

`read_only: true` (mặc định) chặn các lệnh sửa dữ liệu (`delete`, `outputlookup`, `mcollect`, `dump`, `script`, `map`, `savedsearch`, macro...) — nhưng đây là **lớp bảo vệ best-effort**, không thay thế phân quyền của Splunk. Hãy tạo account MCP riêng với quyền tối thiểu:

- **Không có** capability `can_delete`
- **Không có** quyền `list_storage_passwords` (tránh lộ mật khẩu đã lưu qua lệnh `rest`)
- Giới hạn `srchIndexesAllowed` đúng các index cần đọc
- Giới hạn `srchJobsQuota` và `srchTimeWin` (cửa sổ thời gian tìm kiếm)

Ngoài ra lưu ý: nội dung log (có thể chứa PII/dữ liệu nhạy cảm) sẽ được gửi tới nhà cung cấp LLM qua MCP client — cân nhắc khi dùng với dữ liệu SOC nội bộ.

> SSO/SAML: login đi qua form local-credential (`loginType=splunk`) nên **hoạt động trên instance bật SSO** (kể cả Azure AD). Tuy nhiên account phải dùng xác thực local (username/password) — SAML-only/MFA-only không dùng được.

## Kiểm tra kết nối trước khi dùng

```powershell
python tests\test_real.py
```

## Đăng ký vào MCP client

### Claude Code

```powershell
claude mcp add splunk-webui -s user -- python C:\duong\dan\splunk-mcp-webui\run.py
```

- `-s user`: cài cấp user, dùng được cho mọi project trên máy. Bỏ tham số này thì chỉ áp dụng cho project hiện tại.
- Kiểm tra: mở Claude Code, gõ `/mcp` — phải thấy `splunk-webui` kèm 6 tool.

### Claude Desktop / opencode

Thêm vào file cấu hình MCP của client:

```json
{
  "mcpServers": {
    "splunk-webui": {
      "command": "python",
      "args": ["C:\\duong\\dan\\splunk-mcp-webui\\run.py"]
    }
  }
}
```

Chạy trực tiếp (stdio): `python run.py` hoặc `python -m splunk_mcp_webui`.

## Cách hoạt động

```
MCP client ──stdio──> run.py ──HTTP──> Splunk Web (port 8000)
                         │ 1. GET  /en-US/account/login        → cookie + CSRF
                         │ 2. POST /en-US/account/login        → session cookie
                         │ 3. POST /en-US/splunkd/__raw/services/search/jobs  → tạo job
                         │ 4. GET  /en-US/splunkd/__raw/services/search/jobs/{sid} → poll
                         │ 5. GET  .../{sid}/results           → kết quả JSON
```

Không dùng port 8089 — mọi REST call đi qua proxy `splunkd/__raw/` của chính Splunk Web (giống hệt khi bạn mở Search & Reporting trên trình duyệt).

## Test offline (không cần Splunk thật)

```powershell
python tests\test_offline.py       # 46 test: login cũ/mới, CSRF, guard, timeout, SSL fallback, concurrency...
python tests\test_config.py        # 12 test: validation config, env override, fail-loud
python tests\test_mcp_server.py    # test 6 tool qua giao thức MCP
```

License: MIT (xem `LICENSE`).

> Thư mục `ref\` (bản giải nén app MCP chính hãng làm tham chiếu schema) không được commit vào repo — tham khảo `splunk-mcp-server_200.tgz` từ SplunkBase nếu cần.