Model Context Protocol server for Tactical RMM API integration
This MCP server provides 24 tools covering Tactical RMM agent management, scripts, software, and audit operations. Tool naming is generally clear and verb-based (list_, get_, update_, deploy_, run_, etc.), but several critical gaps exist: (1) parameter descriptions are present but often generic (e.g., 'The agent ID' without specifying format or how to obtain it); (2) output schemas are entirely undocumented, the code shows tool definitions with inputSchema but no mention of return types or response structures; (3) error handling guidance is absent from descriptions, leaving agents without recovery paths; (4) several tools combine multiple operations or have unclear boundaries (e.g., trmm_run_script vs trmm_run_command, both execute code but on different targets, the distinction is not obviously explained); (5) no documentation of which tools are idempotent, retryable, or destructive beyond basic Risk tags (WRITE, DESTRUCTIVE); (6) many parameters like 'agent_id', 'script_path', and 'client_name' lack detail on expected format, length, or validation rules, descriptions assume the LLM knows what a 'script path' looks like relative to the scripts directory. The code shows proper JSON Schema structure for inputs (types, enums, defaults) but the descriptions do not guide LLMs on how to construct complex payloads (e.g., the 'custom_fields' array in trmm_update_agent_custom_fields requires nested objects, the description says 'Array of custom field updates' but does not explain the structure). Output handling is entirely implicit; tools like trmm_list_agents return TextContent but the actual JSON response format is unknown. The server follows basic MCP patterns (tool registration, call routing, async handlers) but lacks production-grade depth in descriptions and error paths.
Create a new custom field
Delete a script from the local scripts directory
Deploy a local script to agents. Can target specific agents, all agents in a site, or all agents for a client. Specify one of: agent_ids, site_name, or client_name. WARNING: Use only ASCII characters in scripts - special/Unicode characters can cause execution failures.
Get detailed information about a specific agent by agent ID
Get custom field values for a specific agent
Get list of installed software on a specific agent
Output schemas completely undocumented. Tool definitions specify inputSchema but no return types, field names, or response structure are documented. LLMs cannot plan downstream tool calls or extract the correct data from responses.
Parameter descriptions lack actionable detail. Most params have one-sentence descriptions (e.g., 'The agent ID to retrieve') without format guidance, constraints, or how to obtain the ID. LLMs cannot validate or construct parameters without this detail.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 57 | <=2025-11-25 | v2 |
Get all tasks configured for a specific agent
Get software inventory for all agents (warning: may be large dataset). Can filter by client, site, status, or monitoring type.
Get details of a specific script from the Script Library by ID
Read the content of a specific local script. Use the path returned from trmm_list_local_scripts (e.g., 'powershell/script_name.ps1')
List all agents in Tactical RMM. Can optionally include detailed information and filter by client, site, status, or monitoring type.
List all clients configured in Tactical RMM
Get all custom fields configured in Tactical RMM
List all scripts in the Tactical RMM Script Library
List all scripts stored in the local scripts directory, organized by type (powershell, python, bash, cmd)
Query audit logs with optional filters for agent and action type
Refresh the software inventory for a specific agent
Refresh software inventory for all agents (use with caution on large deployments). Can filter by client, site, status, or monitoring type.
Run an ad-hoc command or script code on a specific agent (test/execute endpoint). WARNING: Use only ASCII characters in scripts - special/Unicode characters can cause execution failures.
Run a script on a specific agent. The script must exist in the Script Library. WARNING: Use only ASCII characters in scripts - special/Unicode characters can cause execution failures.
Save or update a script in the local scripts directory. The script will be saved in the appropriate subdirectory based on the shell type. WARNING: Use only ASCII characters in scripts - special/Unicode characters can cause execution failures.
Update custom field values for a specific agent
Upload a local script from the scripts directory to the TRMM Script Library. WARNING: Use only ASCII characters in scripts - special/Unicode characters can cause execution failures.
Upload a script to the Tactical RMM Script Library. Creates a new script entry. WARNING: Use only ASCII characters in scripts - special/Unicode characters can cause execution failures.
No error recovery guidance in descriptions. Tools document Risk (READ_ONLY, WRITE, DESTRUCTIVE) but descriptions do not guide agents on what to do if a call fails: is it retryable? Should the user be prompted? What specific error messages indicate the user should call discovery_tool first?
Complex parameters under-specified. trmm_update_agent_custom_fields accepts a 'custom_fields' array of objects with 'field' (integer) and 'string_value' (string) but the description does not explain: what integer field IDs are valid? Can you get them from trmm_list_custom_fields? Do all field types use string_value or are there type-specific fields? This forces agents to guess.
Ambiguous tool boundaries. trmm_run_script (run script from library on agent) and trmm_run_command (run ad-hoc code on agent) are similar but the distinction is buried in descriptions. No guidance on when to choose one vs the other or how they differ in timeout, output handling, or error behavior.
Pagination parameters not clearly explained. trmm_query_audit_logs accepts page, rows_per_page, sort_by with defaults, but descriptions do not state: is page 0-indexed or 1-indexed? What happens if you request page 999? Does sort_by accept arbitrary fields or only certain ones? Without clarity, agents may request invalid pages.
Mutually exclusive parameters not documented. trmm_deploy_local_script requires 'Specify one of: agent_ids, site_name, or client_name' but the schema does not enforce this (no oneOf constraint). Schema validation should prevent invalid combinations, and the description should warn agents of the constraint.
No idempotency documentation. Tools like trmm_update_agent_custom_fields, trmm_create_custom_field, and trmm_run_script do not state whether repeating the same call produces the same result or causes side effects (duplicate custom fields, duplicate script executions). Agents need to know which tools are safe to retry.
Unicode warning in descriptions is informal and could be clearer. Several tools (trmm_deploy_local_script, trmm_save_local_script, trmm_upload_script_to_library, trmm_upload_local_script_to_library, trmm_run_command) include 'WARNING: Use only ASCII characters in scripts' but this is in the tool description, not in parameter descriptions where it matters. Agents may still attempt to pass Unicode in script_content.
Missing per-item error granularity. Batch operations like trmm_deploy_local_script (deploy to multiple agents) and trmm_refresh_all_software (refresh all agents) likely fail partially, if 3 out of 50 agents fail to refresh, the response should indicate which ones failed and why, not return a blanket success or error.