Skip to main content
Glama
CyberHawk Veeam MCP

CyberHawk Veeam MCP

by rudraverma

CyberHawk Threat Intel


What this is

CyberHawk Veeam MCP turns Claude (Code, Desktop, or any MCP-compatible client) into a hands-on operator for Veeam Backup & Replication. Instead of only asking about your backups, you can drive them:

"Start the nightly ESXi backup job." "Why did the SQL replica job fail last night — and fix it." "Which repository is almost full?" "Show me any malware detection events from the last week." "Create a new backup job for the three web VMs, daily at 2am, to the main repository."

It speaks the VBR Public REST API v1 directly — the same documented API the Veeam console uses — so it supports full read + write across jobs, sessions, backups, restores, infrastructure, and threat detection.

How this differs from the official Veeam MCP

The official veeam-ai/veeam-mcp-server is a read-only proxy to Veeam's cloud "Veeam Intelligence" chatbot — it exposes a single question-answering tool and requires Advanced mode + a non-Community license. CyberHawk Veeam MCP is a different design: it talks straight to your VBR's on-box REST API, needs no cloud service, and exposes granular operator tools with real write capability.

Official Veeam MCP

CyberHawk Veeam MCP

Backend

Veeam Intelligence cloud chatbot

VBR on-box REST API v1

Capability

Read-only Q&A

Full read + write operator

Tools

1 (question answering)

30+ granular tools

License requirement

Non-Community + Advanced mode

Enterprise Plus (REST API gate)

Cloud dependency

Yes

No — stays on your network

⚠️ Authorized use only. This server can start, stop, create, and delete jobs and launch restores against production backup infrastructure. Run it only against Veeam instances you own or are authorized to operate. Ships with a VEEAM_READONLY safety switch.


Related MCP server: VeChain AI Terminal MCP Server

Capabilities (30+ tools)

Category

Tools

Discovery

veeam_server_info, veeam_api_request (raw escape-hatch to any endpoint)

Jobs — read

list_jobs, get_job, list_job_states, get_job_objects

Jobs — control

start_job, stop_job, retry_job, enable_job, disable_job

Jobs — config

create_job, update_job, delete_job

Sessions & diagnosis

list_sessions, get_session, get_session_logs, stop_session, diagnose_job

Backups & restore points

list_backups, get_backup_objects, list_restore_points, get_restore_point

Restore

list_restore_sessions, start_instant_recovery_vmware, stop_restore_session

Infrastructure

list_repositories, get_repository_states, list_proxies, list_managed_servers, list_credentials, browse_inventory

Security (VBR 12.1+)

list_malware_events, get_malware_settings

Not limited to hardcoded endpoints. The veeam_api_request tool can reach any VBR REST endpoint (failover plans, SureBackup, tape, agents, cloud/SaaS) — so new-version features work without waiting for a code update.

Cross-version by design. The required x-api-version header is auto-detected: the server tries your configured value, then falls back through every known VBR rev until authentication succeeds — so the same build runs against VBR 12.0, 12.1, 12.2, 12.3, and forward.


Requirements

  • Node.js 20+ (or Docker) on the machine that runs the MCP server

  • Veeam Backup & Replication 12.0 or newer with the RESTful API service running (default TCP port 9419)

  • An Enterprise Plus license (or an Enterprise Plus trial / NFR key) on the VBR server — see the license note below

  • A Veeam account (Windows local/domain account) that can log into the VBR console

  • An MCP client: Claude Code, Claude Desktop, VS Code, etc.

⚠️ License requirement — the Veeam REST API needs Enterprise Plus. This is a Veeam licensing gate, not a limitation of this project. On Community Edition (or when no valid license is installed), the RESTful API service loads but stays in standby mode and never binds port 9419 — so nothing will answer. Veeam offers free 30-day Enterprise Plus trials and NFR keys that enable it. Verify your API is live by confirming https://<vbr-host>:9419/swagger loads.

Quick check that the listener is up (PowerShell): Test-NetConnection localhost -Port 9419. If it reports TcpTestSucceeded : False, check your license edition in Console → Help → License Information — it must be Enterprise Plus.


Installation

The install command is npx -y github:rudraverma/veeam-mcp — but you don't run it yourself in a terminal. With MCP, your client (Claude Desktop / Code) runs it for you every time it starts. You just tell the client to use that command by adding the block below to its config — the "command" and "args" lines are the npx command:

npx -y github:rudraverma/veeam-mcp
        └── expressed as →  "command": "npx", "args": ["-y", "github:rudraverma/veeam-mcp"]

Fastest (Claude Code) — one command that does everything

If you use Claude Code, skip editing any files — run one command and it registers the server for you:

claude mcp add veeam -s user \
  -e VEEAM_HOST=localhost \
  -e VEEAM_USERNAME=svc-claude \
  -e VEEAM_ACCEPT_SELF_SIGNED=true \
  -e VEEAM_READONLY=true \
  -- npx -y github:rudraverma/veeam-mcp

That's it. Add your Veeam password as one more -e flag (same -e VEEAM_...=value form as the others), then restart Claude Code. Flip VEEAM_READONLY to false once your first read-only connection checks out. Manage it later with claude mcp list and claude mcp remove veeam.

-s user installs it for your whole user account (every project). Drop it for a project-only install, or use -s project to share it with a repo via .mcp.json.

Any other MCP client — edit the config file

Step 1. Open your MCP client config file:

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

Step 2. Add this block (fill in your Veeam details) and save:

{
  "mcpServers": {
    "veeam": {
      "command": "npx",
      "args": ["-y", "github:rudraverma/veeam-mcp"],
      "env": {
        "VEEAM_HOST": "localhost",
        "VEEAM_PORT": "9419",
        "VEEAM_USERNAME": "DOMAIN\\svc-claude",
        "VEEAM_PASSWORD": "<your-password>",
        "VEEAM_ACCEPT_SELF_SIGNED": "true",
        "VEEAM_READONLY": "false"
      }
    }
  }
}

Step 3. Restart your MCP client. That's it — no clone, no build, no other steps.

Prefer to run the command yourself first? (Optional sanity check.) Set your VEEAM_* variables in the shell environment (or copy .env.example to .env and fill it in), then run the command below. It prints a connected to … line and then waits for the client — press Ctrl+C to exit:

npx -y github:rudraverma/veeam-mcp

Notes:

  • Requires: git and Node.js 20+ on your PATH (that's all npx needs).

  • First launch takes ~30–60s while npx installs and builds; every launch after that is instant from cache.

  • Point VEEAM_HOST at a remote VBR IP/hostname if the MCP isn't running on the backup server itself.

  • Start safe: set VEEAM_READONLY to "true" for your first connection to confirm everything reads correctly, then flip to "false" for full control.

Recommended: use a dedicated Veeam service account (e.g. svc-claude, non-MFA — Veeam's REST API and MFA don't mix) with a role assigned under Users and Roles in the console, rather than a personal admin login.

Option B — From source (offline / air-gapped / development)

Clone and build once, then launch the built file directly.

Windows (PowerShell):

git clone https://github.com/rudraverma/veeam-mcp.git
cd veeam-mcp
npm install        # runs the build automatically (prepare script)

macOS / Linux:

git clone https://github.com/rudraverma/veeam-mcp.git
cd veeam-mcp
npm install        # runs the build automatically (prepare script)

Then point your client at the built file (adjust the path):

{
  "mcpServers": {
    "veeam": {
      "command": "node",
      "args": ["/path/to/veeam-mcp/build/index.js"],
      "env": {
        "VEEAM_HOST": "localhost",
        "VEEAM_PORT": "9419",
        "VEEAM_USERNAME": "svc-claude",
        "VEEAM_PASSWORD": "your-password",
        "VEEAM_ACCEPT_SELF_SIGNED": "true",
        "VEEAM_READONLY": "false"
      }
    }
  }
}

Optional smoke test before wiring it into a client — copy .env.example to .env, fill it in, then:

npm start            # prints "connected to https://<host>:9419 …" on stderr
npm run inspector    # or click through the tools in the MCP Inspector

Option C — Docker

git clone https://github.com/rudraverma/veeam-mcp.git && cd veeam-mcp
docker build -t veeam-mcp .
{
  "mcpServers": {
    "veeam": {
      "command": "docker",
      "args": ["run", "--rm", "-i", "--env-file", "/path/to/.env", "veeam-mcp"]
    }
  }
}

Restart your MCP client after editing the config.


Configuration reference

Variable

Default

Description

VEEAM_HOST

localhost

VBR host or IP

VEEAM_PORT

9419

VBR REST API port

VEEAM_BASE_URL

(unset)

Full base URL override (wins over host/port)

VEEAM_USERNAME

(required)

Windows account that can log into VBR

VEEAM_PASSWORD

(required)

Password for that account

VEEAM_API_VERSION

1.1-rev1

Starting x-api-version guess (auto-detected)

VEEAM_ACCEPT_SELF_SIGNED

true

Accept VBR's self-signed TLS certificate

VEEAM_READONLY

false

true blocks all state-changing tools

VEEAM_TIMEOUT_MS

60000

HTTP request timeout

API version map (only needed if auto-detection is disabled by network policy):

VBR build

x-api-version

12.0

1.1-rev0

12.1

1.1-rev1

12.1.1 / 12.1.2

1.1-rev2

12.2

1.2-rev0

12.3

1.2-rev1


Usage examples

Once connected, talk to your MCP client naturally:

  1. Health check — "Show me the state of all Veeam jobs — anything failed or warning?" → list_job_states

  2. Start a job — "Run the 'ESXi-Nightly' backup job now." → list_jobs → start_job

  3. Diagnose a failure — "Why did the 'SQL-Replica' job fail last night?" → diagnose_job (finds the latest session, reads the failed log records, explains the cause)

  4. Fix and retry — "That failed because the repository was full — free space check, then retry the job." → get_repository_states → retry_job

  5. Capacity review — "Which repositories are over 80% used?" → get_repository_states

  6. Create a job — "Create a daily backup job for VMs web01, web02, web03 to the Main repository at 2am." → list_managed_servers → browse_inventory → list_repositories → create_job

  7. Restore point lookup — "List the latest restore points for the DC01 VM." → list_restore_points

  8. Instant recovery — "Instant-recover DC01 from last night's restore point to the ESXi lab host." → list_restore_points → start_instant_recovery_vmware

  9. Threat hunt — "Any Veeam malware detection events this week? Summarize them for an IR ticket." → list_malware_events

  10. Advanced / any endpoint — "Show me all failover plans." → veeam_api_request GET /api/v1/failoverPlans


Safety model

Backup infrastructure is critical, so the server is deliberate about writes:

  • VEEAM_READONLY=true turns the server into a pure observability tool — every start/stop/create/delete/restore tool refuses to run and returns a clear message. Great for a first deployment or for read-only analysts.

  • Every mutating tool is explicitly labelled (e.g. "destructive", "impactful") in its description so the model asks for confirmation on risky actions.

  • No bulk destructive operations — deletes require a specific job ID; there is no wildcard delete.

  • Credentials never leave your network — auth goes straight to your VBR host; there is no cloud dependency and secrets are read only from environment variables.


Project structure

veeam-mcp/
├── src/
│   ├── index.ts                 # MCP server entry point
│   ├── config.ts                # env config + validation + API-version candidates
│   ├── veeam/
│   │   └── VbrClient.ts          # OAuth2 auth, token refresh, version auto-detect, request layer
│   ├── util/
│   │   └── result.ts             # MCP tool result helpers
│   └── tools/
│       ├── index.ts              # registers all tool groups
│       ├── server.ts             # server_info + raw api_request
│       ├── jobs.ts               # list/get/control/create/update/delete jobs
│       ├── sessions.ts           # sessions + diagnose_job
│       ├── backups.ts            # backups + restore points
│       ├── restore.ts            # restore operations
│       ├── infrastructure.ts     # repositories, proxies, servers, credentials, inventory
│       └── security.ts           # malware detection (VBR 12.1+)
├── .env.example                  # configuration template (copy to .env)
├── Dockerfile                    # container build
├── esbuild.config.js             # bundler
├── package.json
├── tsconfig.json
├── LICENSE                       # Apache 2.0
└── README.md

Troubleshooting

Symptom

Fix

Cannot reach VBR at … (ECONNREFUSED)

Check VEEAM_HOST/VEEAM_PORT; confirm the Veeam RESTful API service is running (TCP 9419).

TLS error … self-signed

Set VEEAM_ACCEPT_SELF_SIGNED=true (default).

Authentication failed (401)

Verify VEEAM_USERNAME / VEEAM_PASSWORD; the account must be able to log into the VBR console. Note: MFA on the account can break REST auth (known Veeam issue) — use a dedicated non-MFA service account.

Every write returns "read-only mode"

You have VEEAM_READONLY=true; set it to false.

malwareDetection returns an error

That feature requires VBR 12.1+; older builds don't expose it.

A specific action isn't a dedicated tool

Use veeam_api_request with the endpoint from https://<host>:9419/swagger.



Connect with CyberHawk Threat Intel

Available Tools

34 tools
browse_inventoryBrowse virtual infrastructure inventoryA

Browse the virtual infrastructure (hosts, folders, VMs) beneath a managed server so you can select objects to include when creating a job. Provide the hostId from list_managed_servers.

Inputs: hostId (required), viewType.

create_jobCreate a new jobA

Create a new backup/replication job. Provide the full job specification object as documented by the VBR REST API for your build. Tip: call get_job on an existing similar job to obtain a template spec, edit it, and pass it here.

Inputs: jobSpec.

delete_jobDelete a job (destructive)A

Permanently delete a job configuration by ID. Destructive — the job and its schedule are removed. Backups already created are retained unless removed separately. Requires a specific job ID; there is no bulk delete.

Inputs: jobId (required).

diagnose_jobDiagnose why a job failedA

One-shot triage: given a job ID, find its most recent session, read the failure/warning log records, and return the job state, the latest session result, and the log entries flagged Failed/Warning so you can explain the root cause and propose a fix. Start here whenever the user asks "why is failing?".

Inputs: jobId (required).

disable_jobDisable a jobA

Disable a job so it no longer runs on schedule (does not delete it).

Inputs: jobId (required).

enable_jobEnable a jobA

Enable a disabled job so it runs on its schedule again.

Inputs: jobId (required).

get_backup_objectsList objects in a backupB

List the protected objects (VMs/machines) contained in a specific backup.

Inputs: backupId (required).

get_jobGet job configurationA

Get the full configuration of a single job by its ID (schedule, virtual objects, storage, retention).

Inputs: jobId (required).

get_job_objectsList objects included in a jobA

List the VMs / machines / objects that a given job protects.

Inputs: jobId (required).

get_malware_settingsGet malware detection settings (VBR 12.1+)A

Return VBR’s malware-detection configuration (what is enabled, thresholds, exclusions). Requires VBR 12.1+.

Inputs: no named parameters.

get_repository_statesRepository capacity / free spaceA

Return capacity, used space, and free space per repository. Use this to answer "is a repository full?" — a common root cause of Failed backups.

Inputs: no named parameters.

get_restore_pointGet restore point detailA

Get details for a single restore point: creation time, type (full/incremental), and source object.

Inputs: restorePointId (required).

get_sessionGet session detailA

Get one session: result, state, progress percentage, start/end time, and per-object results.

Inputs: sessionId (required).

get_session_logsGet session log recordsA

Return the detailed log records for a session — the individual steps and their status. This is the primary source for understanding WHY a run failed or warned (VDDK errors, snapshot failures, network timeouts, repository full, etc.).

Inputs: sessionId (required).

list_backupsList backupsA

List backup chains known to VBR (the stored result of jobs). Each backup groups the restore points for its protected objects. Filter by name where supported.

Inputs: limit, nameFilter.

list_credentialsList stored credentials (metadata only)A

List credential records known to VBR (usernames/descriptions and their IDs — never secrets). Credential IDs are referenced when creating jobs or adding managed servers.

Inputs: no named parameters.

list_jobsList backup/replication jobsA

List all configured jobs (backup, replication, backup copy, agent, etc.) with their IDs and settings. Use nameFilter to narrow by job name and typeFilter to narrow by job type. Job IDs returned here feed every other job tool.

Inputs: skip, limit, nameFilter, typeFilter.

list_job_statesList job states (status / last result / next run)A

Return the live state of jobs: current status (running/idle), last result (Success/Warning/Failed), last run time, next scheduled run, and progress. This is the fastest way to answer "what is failing?" or "what is running right now?".

Inputs: nameFilter.

list_malware_eventsList malware / threat detection events (VBR 12.1+)A

List malware-detection events raised by VBR — suspicious activity, infected restore points, encrypted-data and deleted-file anomalies. Requires VBR 12.1 or newer; on older builds this returns an error (that is expected). Feed these events into ransomware detection and incident response.

Inputs: limit, stateFilter.

list_managed_serversList managed serversA

List servers managed by VBR (vCenter/ESXi hosts, Windows/Linux servers). Host IDs here are needed when browsing inventory to build a job.

Inputs: no named parameters.

list_proxiesList backup proxiesA

List backup proxies and their configuration (transport mode, max concurrent tasks).

Inputs: no named parameters.

list_repositoriesList backup repositoriesB

List all backup repositories (their type, path, and configuration).

Inputs: nameFilter.

list_restore_pointsList restore pointsA

List recovery points available to restore from. Filter by nameFilter to find points for a specific VM/machine. Restore point IDs feed the restore tools.

Inputs: limit, nameFilter, platformFilter.

list_restore_sessionsList restore sessionsB

List restore operations (their sessions) so you can track progress of an in-flight recovery.

Inputs: limit, stateFilter.

list_sessionsList job sessions (run history)A

List job run sessions, newest first. Filter by jobId to see one job’s history, by stateFilter ("Working"/"Stopped") for live runs, or by typeFilter. Each session ID feeds get_session and get_session_logs.

Inputs: jobId, limit, typeFilter, stateFilter.

retry_jobRetry a failed jobA

Retry the failed objects of a job after a Failed/Warning result.

Inputs: jobId (required).

start_instant_recovery_vmwareStart VMware Instant Recovery (destructive/impactful)A

Launch Instant Recovery of a VMware VM directly from a backup restore point. Impactful — it publishes a running VM into your vSphere environment. Provide the restore point ID and the VMware restore specification (target host, resource pool, datastore, VM name, power-on, NIC mapping) per your VBR build’s schema. If your build’s field names differ, fetch the exact schema from https://:9419/swagger and submit via veeam_api_request instead.

Inputs: restorePointId (required), restoreSpec.

start_jobStart a jobA

Start a backup/replication job now. Returns the session that was created — pass its ID to get_session / get_session_logs to follow progress.

Inputs: jobId (required).

stop_jobStop a running jobA

Gracefully stop a currently running job. Optionally set graceful=false to stop immediately.

Inputs: jobId (required), graceful.

stop_restore_sessionStop a restore sessionA

Stop an in-progress restore session (e.g. cancel a mount / Instant Recovery publish).

Inputs: sessionId (required).

stop_sessionStop a running sessionA

Stop an in-progress session by ID (e.g. cancel a stuck run).

Inputs: sessionId (required).

update_jobUpdate a job configurationA

Replace a job configuration by ID. Fetch the current spec with get_job, modify the fields you need (schedule, retention, included objects, repository), and pass the whole object back here.

Inputs: jobId (required), jobSpec.

veeam_api_requestVeeam raw REST request (advanced)A

Escape hatch for ANY VBR Public REST API v1 endpoint not covered by a dedicated tool — failover plans, SureBackup, agents, cloud/SaaS, tape, tags, etc. Supply the HTTP method and path (e.g. GET "/api/v1/failoverPlans"). This is what makes the server work across every VBR build: if a newer version adds an endpoint, you can reach it here without a code change. In read-only mode, only GET is permitted.

Inputs: path (required), method (required), body, query.

veeam_server_infoVeeam server infoA

Get VBR server identity: name, build/patch version, database info, and the negotiated REST API version. Call this first to confirm connectivity and to learn which VBR build you are operating against.

Inputs: no named parameters.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4/5.0

    Scored across 34 tools

    Disambiguation5/5

    Each tool has a clearly distinct purpose, targeting specific operations (create, list, get, delete, start, stop, etc.) on different resources (jobs, sessions, backups, repositories, etc.). The detailed descriptions further eliminate ambiguity.

    Naming Consistency4/5

    The vast majority of tools follow a consistent verb_noun pattern (e.g., list_jobs, create_job, get_session). A few deviations like veeam_api_request and veeam_server_info break the pattern slightly, but overall the naming is predictable.

    Tool Count5/5

    34 tools cover the full scope of Veeam Backup & Replication operations without being excessive. Each tool serves a clear purpose, and the count is well-calibrated for a complex infrastructure backup tool.

    Completeness5/5

    The tool set provides comprehensive coverage: job lifecycle (CRUD, start/stop, enable/disable), monitoring (sessions, logs, states), restore operations, infrastructure management, malware detection, and a generic API escape hatch for any missing endpoints. No obvious gaps for the intended domain.

    Maintenance

    ActivityInactive
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      C
      quality
      D
      maintenance
      Enables AI agents to control and monitor Veeam Backup & Replication v13 infrastructure through 328 MCP tools using the official REST API. Supports both stdio mode for local clients like Claude Desktop and streamable HTTP mode for remote integration with platforms like Dify.
      100
      ISC
    • A
      license
      Not graded
      quality
      C
      maintenance
      Extends Veeam Intelligence to MCP-compatible clients, enabling secure, real-time operational insight across Veeam Backup & Replication, Veeam ONE, and VSPC via natural language or AI workflows.
      20
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      Enables AI assistants to interact with Veeam Backup & Replication infrastructure through natural language, allowing monitoring, management, and troubleshooting of backup jobs, sessions, and restore points.
      MIT