tacticalrmm-mcp-server
# TacticalRMM MCP Server
[](https://www.npmjs.com/package/@nightsquawktech/tacticalrmm-mcp-server)
[](https://www.npmjs.com/package/@nightsquawktech/tacticalrmm-mcp-server)
[](https://scorecard.dev/viewer/?uri=github.com/NightSquawk/tacticalrmm-mcp-server)
[](https://github.com/NightSquawk/tacticalrmm-mcp-server/blob/v1.0.0/LICENSE)
[](https://nodejs.org)
An MCP (Model Context Protocol) server for **TacticalRMM**, connecting your self-hosted RMM instance to AI tools.
## Quick start
### Claude
[](https://github.com/NightSquawk/tacticalrmm-mcp-server/releases/download/mcpb-v0.1.0/tacticalrmm-mcp-server-0.1.0.mcpb)
**bash (macOS/Linux):**
```bash
TACTICALRMM_BASE_URL="https://api.yourdomain.com"
TACTICALRMM_API_KEY="your-api-key"
claude mcp add tacticalrmm \
--env TACTICALRMM_BASE_URL="$TACTICALRMM_BASE_URL" \
--env TACTICALRMM_API_KEY="$TACTICALRMM_API_KEY" \
-- npx -y @nightsquawktech/tacticalrmm-mcp-server
```
**PowerShell (Windows):**
```powershell
$TACTICALRMM_BASE_URL = "https://api.yourdomain.com"
$TACTICALRMM_API_KEY = "your-api-key"
claude mcp add tacticalrmm `
--env "TACTICALRMM_BASE_URL=$TACTICALRMM_BASE_URL" `
--env "TACTICALRMM_API_KEY=$TACTICALRMM_API_KEY" `
-- npx -y @nightsquawktech/tacticalrmm-mcp-server
```
### Cursor
[](https://cursor.com/en/install-mcp?name=tacticalrmm&config=eyJjb21tYW5kIjogIm5weCIsICJhcmdzIjogWyIteSIsICJAbmlnaHRzcXVhd2t0ZWNoL3RhY3RpY2Fscm1tLW1jcC1zZXJ2ZXIiXSwgImVudiI6IHsiVEFDVElDQUxSTU1fQkFTRV9VUkwiOiAiaHR0cHM6Ly9hcGkueW91cmRvbWFpbi5jb20iLCAiVEFDVElDQUxSTU1fQVBJX0tFWSI6ICJ5b3VyLWFwaS1rZXkiLCAiVEFDVElDQUxSTU1fVElNRU9VVF9NUyI6ICIzMDAwMCJ9fQ%3D%3D)
Or put the [mcp.json](#mcpjson) block in `.cursor/mcp.json`, then verify with:
```bash
agent mcp list
```
(The Cursor CLI manages configured servers but has no `mcp add`; install is via the button or `mcp.json`.)
### VS Code
[](https://insiders.vscode.dev/redirect/mcp/install?name=tacticalrmm&config=%7B%22command%22%3A%20%22npx%22%2C%20%22args%22%3A%20%5B%22-y%22%2C%20%22%40nightsquawktech/tacticalrmm-mcp-server%22%5D%2C%20%22env%22%3A%20%7B%22TACTICALRMM_BASE_URL%22%3A%20%22https%3A//api.yourdomain.com%22%2C%20%22TACTICALRMM_API_KEY%22%3A%20%22your-api-key%22%2C%20%22TACTICALRMM_TIMEOUT_MS%22%3A%20%2230000%22%7D%7D)
**bash (macOS/Linux):**
```bash
TACTICALRMM_BASE_URL="https://api.yourdomain.com"
TACTICALRMM_API_KEY="your-api-key"
code --add-mcp '{"name":"tacticalrmm","command":"npx","args":["-y","@nightsquawktech/tacticalrmm-mcp-server"],"env":{"TACTICALRMM_BASE_URL":"'"$TACTICALRMM_BASE_URL"'","TACTICALRMM_API_KEY":"'"$TACTICALRMM_API_KEY"'"}}'
```
**PowerShell (Windows):**
```powershell
$TACTICALRMM_BASE_URL = "https://api.yourdomain.com"
$TACTICALRMM_API_KEY = "your-api-key"
$config = @{
name = "tacticalrmm"
command = "npx"
args = @("-y", "@nightsquawktech/tacticalrmm-mcp-server")
env = @{
TACTICALRMM_BASE_URL = $TACTICALRMM_BASE_URL
TACTICALRMM_API_KEY = $TACTICALRMM_API_KEY
}
} | ConvertTo-Json -Compress
code --add-mcp $config
```
### Codex
**bash (macOS/Linux):**
```bash
TACTICALRMM_BASE_URL="https://api.yourdomain.com"
TACTICALRMM_API_KEY="your-api-key"
codex mcp add tacticalrmm \
--env TACTICALRMM_BASE_URL="$TACTICALRMM_BASE_URL" \
--env TACTICALRMM_API_KEY="$TACTICALRMM_API_KEY" \
-- npx -y @nightsquawktech/tacticalrmm-mcp-server
```
**PowerShell (Windows):**
```powershell
$TACTICALRMM_BASE_URL = "https://api.yourdomain.com"
$TACTICALRMM_API_KEY = "your-api-key"
codex mcp add tacticalrmm `
--env "TACTICALRMM_BASE_URL=$TACTICALRMM_BASE_URL" `
--env "TACTICALRMM_API_KEY=$TACTICALRMM_API_KEY" `
-- npx -y @nightsquawktech/tacticalrmm-mcp-server
```
Or add it to `~/.codex/config.toml` under `[mcp_servers.tacticalrmm]`.
### mcp.json
Every environment variable the server reads, with recommended values:
```json
{
"mcpServers": {
"tacticalrmm": {
"command": "npx",
"args": ["-y", "@nightsquawktech/tacticalrmm-mcp-server"],
"env": {
"TACTICALRMM_BASE_URL": "https://api.yourdomain.com",
"TACTICALRMM_API_KEY": "your-api-key",
"TACTICALRMM_TIMEOUT_MS": "30000"
}
}
}
}
```
File locations: `.mcp.json` in your project root (Claude Code), `claude_desktop_config.json` (Claude Desktop), `.cursor/mcp.json` (Cursor).
## Configuration
| Variable | Required | Default | Purpose |
|---|---|---|---|
| `TACTICALRMM_BASE_URL` | yes | | Your TacticalRMM API URL, e.g. `https://api.yourdomain.com` |
| `TACTICALRMM_API_KEY` | yes | | API key from Settings > Global Settings > API Keys |
| `TACTICALRMM_TIMEOUT_MS` | no | `30000` | HTTP timeout for API requests, minimum 1000 |
## Security & write safety
TacticalRMM credentials: create a dedicated API key in Settings > Global Settings > API Keys, scoped to a read-only user role if your instance uses roles.
- This server exposes **zero write operations**. It cannot modify agents, run scripts, or change anything on your RMM.
- All requests go directly from your machine to your TacticalRMM instance; nothing passes through third parties.
> [!IMPORTANT]
> The tool surface is a guardrail, not a security boundary. The env vars in your MCP config are real credentials, and an AI agent with shell access can bypass the MCP tools and call the TacticalRMM API directly with them. If you need hard read-only, enforce it at the source: scope the API key's user role to read-only permissions in TacticalRMM.
## Tools
```
tacticalrmm_get_server_info TacticalRMM server version and info
tacticalrmm_list_clients List clients
tacticalrmm_list_sites List sites
tacticalrmm_list_agents List agents with filters
tacticalrmm_get_agent Get one agent's details
tacticalrmm_list_agent_checks Checks on an agent
tacticalrmm_list_agent_tasks Automated tasks on an agent
tacticalrmm_list_agent_services Windows services on an agent
tacticalrmm_list_agent_software Installed software on an agent
tacticalrmm_list_agent_notes Notes on an agent
tacticalrmm_list_agent_history Command/script history for an agent
tacticalrmm_list_agent_pending_actions Pending actions for an agent
tacticalrmm_list_win_updates Windows updates for an agent
tacticalrmm_list_checks List checks across agents
tacticalrmm_get_check_history History datapoints for a check
tacticalrmm_list_alerts List alerts
tacticalrmm_list_tasks List automated tasks
tacticalrmm_list_policies List automation policies
tacticalrmm_list_scripts List scripts
tacticalrmm_list_pending_actions Pending actions across all agents
tacticalrmm_get_custom_fields Custom field definitions
tacticalrmm_get_audit_logs Query audit logs
```
## API coverage
22 operations covered. All read-only; TacticalRMM uses PATCH request bodies for some query endpoints (alerts, check history, audit logs).
| Category | Operations |
|---|---|
| Agents | 10 |
| Monitoring | 3 |
| Automation | 3 |
| Organization | 2 |
| System | 4 |
<details>
<summary><strong>Agents</strong> (10 operations)</summary>
| Method | Path | Tool |
|---|---|---|
| GET | `/agents/` | `tacticalrmm_list_agents` |
| GET | `/agents/{agent_id}/` | `tacticalrmm_get_agent` |
| GET | `/agents/{agent_id}/checks/` | `tacticalrmm_list_agent_checks` |
| GET | `/agents/{agent_id}/tasks/` | `tacticalrmm_list_agent_tasks` |
| GET | `/services/{agent_id}/` | `tacticalrmm_list_agent_services` |
| GET | `/software/{agent_id}/` | `tacticalrmm_list_agent_software` |
| GET | `/agents/{agent_id}/notes/` | `tacticalrmm_list_agent_notes` |
| GET | `/agents/{agent_id}/history/` | `tacticalrmm_list_agent_history` |
| GET | `/agents/{agent_id}/pendingactions/` | `tacticalrmm_list_agent_pending_actions` |
| GET | `/winupdate/{agent_id}/` | `tacticalrmm_list_win_updates` |
</details>
<details>
<summary><strong>Monitoring</strong> (3 operations)</summary>
| Method | Path | Tool |
|---|---|---|
| GET | `/checks/` | `tacticalrmm_list_checks` |
| PATCH | `/checks/{check_id}/history/` | `tacticalrmm_get_check_history` |
| PATCH | `/alerts/` | `tacticalrmm_list_alerts` |
</details>
<details>
<summary><strong>Automation</strong> (3 operations)</summary>
| Method | Path | Tool |
|---|---|---|
| GET | `/tasks/` | `tacticalrmm_list_tasks` |
| GET | `/scripts/` | `tacticalrmm_list_scripts` |
| GET | `/automation/policies/` | `tacticalrmm_list_policies` |
</details>
<details>
<summary><strong>Organization</strong> (2 operations)</summary>
| Method | Path | Tool |
|---|---|---|
| GET | `/clients/` | `tacticalrmm_list_clients` |
| GET | `/clients/sites/` | `tacticalrmm_list_sites` |
</details>
<details>
<summary><strong>System</strong> (4 operations)</summary>
| Method | Path | Tool |
|---|---|---|
| GET | `/core/version/` + `/core/dashinfo/` | `tacticalrmm_get_server_info` |
| GET | `/core/customfields/` | `tacticalrmm_get_custom_fields` |
| GET | `/logs/pendingactions/` | `tacticalrmm_list_pending_actions` |
| PATCH | `/logs/audit/` | `tacticalrmm_get_audit_logs` |
</details>
## Contributing
Contributions and issues are welcome. Please open an issue first before submitting a PR.
## License
AGPL-3.0: free for personal and open-source use. Organizations that cannot comply with the AGPL can purchase a commercial license, and hosted/managed versions are available. See [COMMERCIAL.md](https://github.com/NightSquawk/tacticalrmm-mcp-server/blob/v1.0.0/COMMERCIAL.md) or contact hello@nightsquawk.tech.
### Copyright
For copyright concerns or takedown requests, contact hello@nightsquawk.tech.
TDQS
Scored across 22 tools
Each tool targets a distinct resource type (server info, clients, agents, sites, software, services, Windows updates, alerts, checks, tasks, scripts, policies, history, notes, pending actions, custom fields, audit logs). The only potential overlap is list_agents vs get_agent, but the singular vs plural and argument requirement make them clearly different.
All 22 tools follow a consistent tacticalrmm_<verb>_<object> pattern using snake_case and only two verbs (get and list). This uniformity makes tool names highly predictable and easy to navigate.
22 tools is slightly above the ideal 3-15 range, but the broad scope of TacticalRMM resources justifies the number. The set could feel repetitive since all tools are read-only list/get operations, but each endpoint is distinct and relevant to the domain.
The tool set is entirely read-only, offering no create, update, delete, execute, or run operations. For an RMM platform, this is a significant gap that prevents agents from taking management actions, limiting the server's usefulness beyond monitoring and reporting.