threatlocker-mcp-server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@threatlocker-mcp-serverlist all computers in my organization"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
ThreatLocker MCP Server
An MCP (Model Context Protocol) server for interacting with the ThreatLocker Portal API through Claude Desktop, Claude Code, or any MCP-compatible client.
About
This server exposes ThreatLocker Portal functionality as MCP tools, enabling AI assistants to query computers, applications, policies, audit logs, and more. It supports both local (stdio) and remote (HTTP/SSE) transports.
Current Status: Full read/write support for applications and policies. Set THREATLOCKER_READ_ONLY=true to enforce read-only mode.
Related MCP server: DelineaMCP
Disclaimer
USE AT YOUR OWN RISK
This software is provided "as is" without warranty of any kind. This is an unofficial, community-developed integration and is not affiliated with, endorsed by, or supported by ThreatLocker.
API keys are currently stored in plain text (in environment variables,
.envfiles, or MCP client config files). A more secure credential storage solution is planned for a future release.Always test in a non-production environment first
Review the source code before deploying
Monitor API usage and audit logs
The authors are not responsible for any damages, security incidents, or unintended actions resulting from use of this software
By using this software, you accept full responsibility for its use in your environment.
Protecting API Keys with ThreatLocker Storage Control
Since API keys are stored in plain text, you can use ThreatLocker's own Storage Control to restrict which applications can read the config files. This ensures that even if an unauthorized process runs on your machine, it cannot access the keys.
Files to protect:
File | Used By |
| MCP server (stdio mode) |
| Claude Desktop |
| Claude Code |
Recommended Storage Control policy:
In ThreatLocker Portal, navigate to Application Control > Storage Control
Create a Deny policy that blocks all applications from reading the config files listed above
Create Permit policies that allow only the specific applications that need access. Example:
node.exe/node— for the MCP server processClaude Desktop.exe/Claude Desktop— for Claude Desktopclaude— for Claude Code CLI
Apply the policies to the relevant computer group
This way, ThreatLocker prevents any other process from reading your API keys, even though they are stored in plain text.
Installation
Prerequisites
Node.js 24+ or Docker
ThreatLocker API key (generate in Portal)
Option 1: Docker (Recommended)
docker pull ghcr.io/bigfootbytes/threatlocker-mcp-server:latestOption 2: From Source
git clone https://github.com/BigfootBytes/threatlocker-mcp-server.git
cd threatlocker-mcp-server
npm install
npm run buildConfiguration
Claude Desktop / Claude Code
Add to your MCP config file:
Client | OS | Config Path |
Claude Desktop | macOS |
|
Claude Desktop | Windows |
|
Claude Desktop | Linux |
|
Claude Code | All | Project |
Docker configuration:
{
"mcpServers": {
"threatlocker": {
"command": "docker",
"args": ["run", "-i", "--rm", "ghcr.io/bigfootbytes/threatlocker-mcp-server:latest"],
"env": {
"THREATLOCKER_API_KEY": "your-api-key",
"THREATLOCKER_BASE_URL": "https://portalapi.g.threatlocker.com/portalapi",
"THREATLOCKER_ORG_ID": "optional-managed-org-id"
}
}
}
}Node.js configuration:
{
"mcpServers": {
"threatlocker": {
"command": "node",
"args": ["/path/to/threatlocker-mcp-server/dist/index.js"],
"env": {
"THREATLOCKER_API_KEY": "your-api-key",
"THREATLOCKER_BASE_URL": "https://portalapi.g.threatlocker.com/portalapi"
}
}
}
}Environment Variables
Variable | Required | Default | Description |
| Yes* | - | API key (stdio mode) |
| Yes* | - | Portal API URL |
| No | - | Managed organization ID |
| No |
| Transport mode: |
| No |
| HTTP server port |
| No |
| Logging: |
| No | - | CORS origins (comma-separated) |
| No | - | Set to |
*Required for stdio mode. HTTP mode uses per-request headers.
ThreatLocker API URLs
Environment | Base URL |
Production |
|
Beta |
|
Available Tools
CRUD Capabilities
Tool | Create | Read | Update | Delete | Description |
| - | :white_check_mark: | - | - | Query computers, check-ins, install info |
| - | :white_check_mark: | - | - | List groups, dropdowns |
| - | :white_check_mark: | - | - | Search apps, research details, files |
| - | :white_check_mark: | - | - | View policies by ID or application |
| - | :white_check_mark: | - | - | Unified audit logs, file history |
| - | :white_check_mark: | - | - | Pending approvals, permit details |
| - | :white_check_mark: | - | - | Child orgs, auth keys |
| - | :white_check_mark: | - | - | List and run reports |
| - | :white_check_mark: | - | - | Computer maintenance history |
| - | :white_check_mark: | - | - | Scheduled agent updates |
| - | :white_check_mark: | - | - | Portal audit logs, health center |
| - | :white_check_mark: | - | - | Network and policy tags |
| - | :white_check_mark: | - | - | Storage control policies |
| - | :white_check_mark: | - | - | Network access control policies |
| - | :white_check_mark: | - | - | Available ThreatLocker agent versions |
| - | :white_check_mark: | - | - | Currently online/connected devices |
Tool Details
Tool | Actions |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
HTTP Mode (Remote Server)
For remote deployments, run in HTTP mode:
docker run -d -p 8080:8080 -e TRANSPORT=http ghcr.io/bigfootbytes/threatlocker-mcp-server:latestEndpoints
Method | Endpoint | Auth | Description |
GET |
| No | Health check |
GET |
| No | List available tools |
GET |
| Yes | SSE stream (Claude Desktop) |
POST |
| Session | SSE client messages |
POST |
| Yes | Streamable HTTP MCP |
POST |
| Yes | Direct REST API |
Authentication Headers
Header | Required | Description |
| Yes | ThreatLocker API key |
| Yes | Portal API base URL |
| No | Managed organization ID |
Claude Remote Configuration
Streamable HTTP via mcp-remote (Claude Desktop):
Claude Desktop does not yet support Streamable HTTP natively. Use mcp-remote as a proxy:
{
"mcpServers": {
"threatlocker": {
"command": "npx",
"args": [
"mcp-remote",
"https://your-server.example.com/mcp",
"--header",
"Authorization:${THREATLOCKER_API_KEY}",
"--header",
"X-ThreatLocker-Base-URL:${THREATLOCKER_BASE_URL}"
],
"env": {
"THREATLOCKER_API_KEY": "your-api-key",
"THREATLOCKER_BASE_URL": "https://portalapi.g.threatlocker.com/portalapi"
}
}
}
}SSE (legacy):
{
"mcpServers": {
"threatlocker": {
"url": "https://your-server.example.com/sse",
"headers": {
"Authorization": "your-api-key",
"X-ThreatLocker-Base-URL": "https://portalapi.g.threatlocker.com/portalapi"
}
}
}
}Development
npm install # Install dependencies
npm run build # Compile TypeScript
npm test # Run tests
npm run dev # Watch modeLicense
GPL-3.0 - see LICENSE for details.
Available Tools
18 toolsaction_logThreatLocker Action LogARead-onlyIdempotent
Query ThreatLocker unified audit logs.
The action log records all application control events: permits, denies, network access, file operations, PowerShell execution, elevation requests, and more. This is your primary tool for investigating what happened on endpoints.
Common workflows:
Find all denies in last 24 hours: action=search, startDate="...", endDate="...", actionId=99
Find denies on a specific computer: action=search, ..., hostname="COMPUTER-NAME"
Find network blocks: action=search, ..., actionType=network, actionId=2
Find PowerShell executions: action=search, ..., actionType=powershell
Get details of a specific event: action=get, actionLogId="..."
Track a file's history across all computers: action=file_history, fullPath="C:\path\to\file.exe"
Aggregate by user to find who's triggering denies: action=search, ..., groupBys=[1]
Get file download details: action=get_file_download, actionLogId="..."
Get policy conditions for permit: action=get_policy_conditions, actionLogId="..."
Get testing environment details: action=get_testing_details, actionLogId="..."
Pitfalls:
onlyTrueDenies/simulateDeny only filter when used alone or together; they force actionId=99 internally. "True" deny = enforced block; "simulated" = would-have-blocked on a Monitor/Learning computer.
When calling get/get_file_download, pass the sourceTableId matching the row the eActionLogId came from (default 2=DenyActionLog will miss permit/baseline/eventlog events).
groupBys takes at most 2 fields; prefer it over fetching raw rows for aggregation.
username/deviceType are NOT supported search filters here (the V2 endpoint ignores them); pivot on hostname/fullPath/policyId or use groupBys=[1] to break down by user.
Permissions: View Unified Audit. Pagination: search action is paginated (use fetchAllPages=true to auto-fetch all pages). Performance: always use date filters — queries without startDate/endDate can be very slow on large organizations. Use groupBys to aggregate instead of fetching all raw rows. Key response fields: actionLogId, fullPath, processPath, hostname, username, actionType, policyName, applicationName.
Related tools: computers (find computer IDs), applications (identify apps), approval_requests (handle denied software)
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | search=query logs with filters, get=single event details, file_history=all events for a file path, get_file_download=file download info, get_policy_conditions=policy conditions for permit, get_testing_details=testing environment details, build_search_string=produce the opaque saveParameters string for saved_searches.insert (same filters as search) | |
| endDate | No | End date for search (ISO 8601 UTC) | |
| actionId | No | Filter by action: 1=Permit, 2=Deny, 3=Deny (Option to Request), 6=Ringfenced, 99=Any Deny | |
| fullPath | No | File path for search filter or file_history (wildcards supported) | |
| groupBys | No | Aggregate results by up to 2 fields. Common: 1=Username, 2=Process Path, 5=Policy Id, 6=Policy Name, 7=App Id, 8=App Name, 9=Action Type, 11=Hash, 17=Asset Name, 65=Computer Id, 70=Risk Score, 71=Risk State. See threatlocker://enums and the unified-audit KB for the full ~55-code list. | |
| hostname | No | Filter by hostname for search or file_history (wildcards supported) | |
| pageSize | No | Results per page (default: 25, max: 500) | |
| policyId | No | Filter search by the GUID of the policy that handled the event. Find via policies first. | |
| startDate | No | Start date for search (ISO 8601 UTC) | |
| actionType | No | Filter by a single action type | |
| computerId | No | Computer GUID to scope file_history. Find via computers list first. | |
| pageNumber | No | Page number (default: 1) | |
| actionLogId | No | Action log GUID (required for get, get_file_download, get_policy_conditions, get_testing_details). Find via search action first. | |
| actionTypes | No | Filter by multiple action types in one query | |
| simulateDeny | No | Include what-if denies from Monitor Only mode computers (default: false) | |
| fetchAllPages | No | Fetch all pages automatically (max 10 pages). Default: false (single page). | |
| getAllParents | No | On get: include the full parent-process chain for the event (default: false) | |
| sourceTableId | No | Source table for get/get_file_download: 1=ActionLog, 2=DenyActionLog (default), 3=BaselineActionLog, 4=EventLogActionLog. Must match the source table of the row the eActionLogId came from. | |
| onlyTrueDenies | No | Show only real enforced blocks, excluding simulated denies from Monitor Only mode (default: false) | |
| response_format | No | Output format: markdown (default, human-readable) or json (structured) | markdown |
| showKnownThreatsOnly | No | Restrict search to events flagged as known threats (default: false) | |
| showChildOrganizations | No | Include child organization logs (default: false) |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | Response data — shape varies by action |
| error | No | |
| success | Yes | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool read-only and idempotent, and the description adds auth requirements, pagination behavior, performance caveats, and hidden couplings like onlyTrueDenies/simulateDeny forcing actionId=99 and sourceTableId default 2 missing other event tables. Nothing here contradicts the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but front-loaded and sectioned into workflows, pitfalls, permissions, pagination, performance, key fields, and related tools. For a tool with 7 action modes and 22 parameters, every section earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
It covers all action modes, common workflows, failure modes, authorization, pagination, performance, and key response fields. With an output schema also present, nothing an agent needs to call this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description still enriches the schema with example query combinations, groupBys field codes, and cross-parameter constraints such as onlyTrueDenies forcing actionId=99. That is precisely the extra semantics needed for a 22-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb and resource: 'Query ThreatLocker unified audit logs.' It then lists what the log contains and calls itself the 'primary tool for investigating what happened on endpoints', which distinguishes it from sibling tools like computers or applications.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit common workflows for each action mode, negative filter guidance (username/deviceType are not supported, groupBys max 2), and a related-tools list for adjacent tasks. This lets the agent decide between action_log and its siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
applicationsThreatLocker ApplicationsADestructive
Search, inspect, create, update, and delete ThreatLocker applications.
Applications are collections of file rules (hashes, paths, certificates) that define what software is allowed or denied. ThreatLocker comes with built-in applications for common software, and you can create custom ones.
Common workflows:
Find an application by name: action=search, searchText="Chrome"
Find apps by file hash: action=search, searchBy=hash, searchText="abc123..."
Find apps by certificate: action=search, searchBy=cert, searchText="Microsoft"
Get ThreatLocker research on an app: action=research, applicationId="..."
List files in an application: action=files, applicationId="..."
Find apps actively permitted: action=search, permittedApplications=true
Find recently created custom apps: action=search, category=1, orderBy=date-created
Find matching apps by file properties: action=match, hash="...", path="...", cert="..."
Get apps for maintenance mode: action=get_for_maintenance
Get app for network policy: action=get_for_network_policy, applicationId="..."
Create custom application: action=create, name="My App", osType=1
Update application metadata: action=update, applicationId="...", name="...", osType=1
Manage a child org's app: add managedOrganizationId="child-org-guid" to create/update
Add file rules to application: action=add_file, applicationId="...", osType=1, fileRules=[{hash:"..."}, {fullPath:"...", cert:"..."}]
Remove file rules from application: action=remove_file, applicationId="...", applicationFileIds=[7111524894, 7111524907] (get IDs via action=files)
Delete application (no policies): action=delete, applications=[{applicationId:"...", name:"...", organizationId:"...", osType:1}]
Force delete (with policies): action=delete_confirm, applications=[...]
Pitfalls:
Hash-only file rules must contain only the hash (no path/cert); file paths need double-escaped backslashes in JSON.
create makes metadata only — add file rules in a follow-up add_file call; then build a policy and deploy it.
remove_file needs applicationFileId values from action=files first.
Built-in applications take policy precedence over custom apps.
Permissions: Edit Application Control Applications. Pagination: search and files actions are paginated (use fetchAllPages=true to auto-fetch all pages). Key response fields: applicationId, name, osType, computerCount, policyCount. Research fields: concernRating, reviewRating, categories, countriesWhereCodeCompiled.
Related tools: policies (see policies using this app), action_log (see app activity), approval_requests (pending approvals for this app)
| Name | Required | Description | Default |
|---|---|---|---|
| cert | No | Certificate subject for match action | |
| hash | No | SHA256 hash for match action | |
| name | No | Application name (required for create, update) | |
| path | No | Full file path for match action | |
| action | Yes | search=find applications, get=details by ID, research=ThreatLocker security analysis, files=list file rules in app, match=find apps by file hash/cert/path, get_for_maintenance=apps for maintenance mode, get_for_network_policy=app for network policy, options=application dropdown/lookup for an org, create=create custom application (metadata only), update=update app name/description, add_file=add file rules to application, remove_file=remove file rules by ID, delete=delete applications (no policies), delete_confirm=force delete (with policies) | |
| osType | No | OS type: 0=All, 1=Windows, 2=macOS, 3=Linux, 5=Windows XP | |
| certSha | No | Certificate SHA for match action | |
| orderBy | No | Field to sort by (default: name) | |
| category | No | Category: 0=All, 1=My Applications (Custom), 2=Built-In | |
| hostName | No | options: filter by hostname context. | |
| isHidden | No | Include hidden/temporary applications (default: false) | |
| pageSize | No | Results per page (default: 25, max: 500) | |
| searchBy | No | Field to search by (default: app) | |
| countries | No | ISO country codes to filter by (use with searchBy=countries) | |
| createdBy | No | Created by path for match action | |
| fileRules | No | File rules for add_file action. Each defines a matching condition (hash, path, cert, etc.). Processed via two-step prepare+insert API. | |
| validCert | No | Whether the cert supplied for match is valid/trusted (default: true) | |
| pageNumber | No | Page number (default: 1) | |
| searchText | No | Search text for search and files actions | |
| appliesToId | No | options: scope to a computer/group/org GUID. | |
| description | No | Application description | |
| isAscending | No | Sort ascending (default: true) | |
| processPath | No | Process path for match action | |
| applications | No | Applications to delete (required for delete/delete_confirm). Get details via get action first. | |
| applicationId | No | Application GUID (required for get, research, files, get_for_network_policy). Find via search action first. | |
| fetchAllPages | No | Fetch all pages automatically (max 10 pages). Default: false (single page). | |
| onlyPermitted | No | options: only return applications with active permit policies (default false). | |
| includeBuiltIn | No | options: include ThreatLocker built-in applications (default false). | |
| organizationId | No | options: organization GUID to list application options for (required). | |
| response_format | No | Output format: markdown (default, human-readable) or json (structured) | markdown |
| applicationFileIds | No | File rule IDs to remove (required for remove_file). Get IDs via action=files first. | |
| managedOrganizationId | No | Parent-org GUID to manage a child organization's applications (sets the ManagedOrganizationId/OverrideManagedOrganizationId headers for create/update). Find via organizations. | |
| permittedApplications | No | Only show apps with active permit policies (default: false) | |
| includeChildOrganizations | No | Include child organization applications (default: false) |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | Response data — shape varies by action |
| error | No | |
| success | Yes | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses critical behavioral details: create is metadata-only, delete vs delete_confirm removes without or with policies, hash-only rules must avoid path/cert, built-in applications take precedence, pagination behavior, and permission requirements. No contradictions with annotations were found.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but it is front-loaded with the core purpose and organized into Common workflows, Pitfalls, Permissions, Pagination, and Key response fields. Every section earns its place given the tool's 14 actions and 34 parameters, and the formatting makes the information quickly scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex CRUD-plus-research tool, the description covers workflows, pitfalls, required permissions, pagination, response fields, and related tools. It also lists key response fields and research fields, so an agent can interpret results without needing the output schema. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds substantial value by showing realistic action-parameter pairings, required prerequisites for parameters like applicationFileIds, and meaningful examples for search, match, create, update, add_file, and managedOrganizationId. This goes well beyond the schema's standalone explanations.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names the specific verbs (search, inspect, create, update, delete) and resource (ThreatLocker applications), then defines what an application is. The extensive workflow list makes each action's purpose concrete and distinguishes this tool from the sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit common workflows for nearly every action, including parameter combinations like action=search, searchBy=hash. It also gives clear fallback and sequencing guidance, such as 'create makes metadata only — add file rules in a follow-up add_file call' and 'remove_file needs applicationFileId values from action=files first.' Related tools are named with their purpose, helping an agent choose this tool versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
approval_requestsThreatLocker Approval RequestsADestructive
Query ThreatLocker approval requests.
When users encounter blocked software and request access, it creates an approval request. Admins review these requests to decide whether to permit the software by creating policies.
Common workflows:
List pending requests: action=list, statusId=1
Get pending request count: action=count
Find requests for a specific user: action=list, searchText="username"
Get request details: action=get, approvalRequestId="..."
Get file info for download/analysis: action=get_file_download_details, approvalRequestId="..."
Get permit options (apps, groups): action=get_permit_application, approvalRequestId="..."
Get storage request details: action=get_storage_approval, approvalRequestId="..."
Approve a request: action=permit. Two-step — call get_permit_application first, round-trip its opaque "json" blob into permitJson, then pick permitMode + policyLevel. Payload-verified, NOT live-tested: validate in a non-prod org before relying on it.
Request statuses: 1=Pending (needs review), 4=Approved, 6=Not Learned (learning mode), 10=Ignored, 12=Added to Application, 13=Escalated (from Cyber Heroes), 16=Self-Approved
Pitfalls:
list defaults to newest-first (isAscending=false) — the right default for triaging the pending queue.
Permitting a request is a two-step flow: call get_permit_application first and round-trip its opaque "json" blob; don't synthesize it.
Before approving a Built-In matching app, confirm the file isn't a shared DLL matching unrelated apps (you'd permit the whole built-in).
Permissions: View Approvals, Approve for Entire Organization/Group/Single Computer. Pagination: list action is paginated (use fetchAllPages=true to auto-fetch all pages). Key response fields: approvalRequestId, username, fullPath, actionType, statusId, computerName, requestDateTime.
Related tools: action_log (see the deny event), applications (find matching apps), policies (create permits)
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | list=search requests, get=single request details, count=pending count, get_file_download_details=file download info, get_permit_application=permit options, get_storage_approval=storage request details, reject=reject a pending request with a reason, take_ownership=assign a request to yourself, permit=approve an application request (round-trip the opaque json blob), ignore=ignore a request, permit_storage=approve a storage/USB request (round-trip get_storage_approval json), get_testing_environment=file/testing-env details for a request | |
| osType | No | permit: 1=Windows, 2=macOS, 3=Linux, 5=Windows XP. | |
| ruleId | No | permit: 0=manual rules, 1=Installation Mode 1hr, 2=Learning Mode 1hr, 3=Monitor Mode 1hr. | |
| orderBy | No | Field to order by (default: datetime) | |
| comments | No | permit: comment on the request. NOTE: overwrites any existing comment if provided. | |
| fullPath | No | permit: file path of the requested file (use \\ for backslashes). | |
| pageSize | No | Results per page (default: 25, max: 500) | |
| statusId | No | Filter by status: 1=Pending (default for list), 4=Approved, 6=Not Learned, 10=Ignored, 12=Added to Application, 13=Escalated, 16=Self-Approved | |
| ticketId | No | permit: ticket id. NOTE: overwrites existing value if provided. | |
| computerId | No | permit: requesting computer GUID. | |
| entityType | No | permit_storage: scope level for a new policy (0=computer, 1=group, 2=org). | |
| pageNumber | No | Page number (default: 1) | |
| permitJson | No | permit: the opaque "json" blob from get_permit_application, passed back VERBATIM. Do not synthesize or edit it. | |
| permitMode | No | permit: existing_app=add file rule to an existing application; matching_app=use a ThreatLocker-matched application; new_app=create a new application. Requires applicationId+applicationName (existing/matching) or newApplicationName (new). | |
| policyName | No | permit_storage: name for the new storage policy (required for storageMode=new_policy). | |
| searchText | No | Filter by text | |
| appliesToId | No | permit_storage: entity GUID the new policy applies to. | |
| isAscending | No | Sort ascending. Default: false (newest-first), the right default for triaging the pending queue. | |
| policyLevel | No | permit: scope the resulting policy to the entire organization, the computer group, or just the requesting computer. | |
| storageJson | No | permit_storage: the opaque "json" blob from get_storage_approval, passed back VERBATIM. | |
| storageMode | No | permit_storage: add_to_existing=attach the device to an existing storage policy (needs storagePolicyId); new_policy=create a new storage policy (needs policyName). | |
| allFilePaths | No | permit_storage: permit all file paths on the device (default: false); otherwise set selectedPath. | |
| ignoreReason | No | Reason shown to the requestor when ignoring (ignore action). | |
| rejectReason | No | Reason shown to the requestor when rejecting (reject action). | |
| selectedPath | No | permit_storage: specific path to permit when allFilePaths=false. | |
| applicationId | No | permit: application GUID (required for permitMode existing_app/matching_app). | |
| fetchAllPages | No | Fetch all pages automatically (max 10 pages). Default: false (single page). | |
| ignoreSubject | No | Optional response email subject for ignore. | |
| manualOptions | No | permit: file-rule conditions. A hash rule = { "hash": "..." } and NOTHING else. A property rule = any of { fullPath, cert, processPath, createdBy } (pair at least two for a stronger rule). | |
| sourceTableId | No | get_testing_environment: source log table (1=ActionLog, 2=DenyActionLog, 3=Baseline, 4=EventLog; default 2). | |
| expirationDate | No | permit_storage: approval expiry in UTC (YYYY-MM-DDTHH:MM:SSZ). | |
| notifyOnIgnore | No | Email the requestor on ignore (default: false). | |
| organizationId | No | permit: organization GUID of the request. | |
| responseReason | No | Optional response email body for reject. | |
| applicationName | No | permit: application name (required for permitMode existing_app/matching_app). | |
| computerGroupId | No | permit: computer group GUID (used as selectedComputerGroup when policyLevel=computer_group). | |
| elevationStatus | No | permit: 0=do not elevate, 1=elevate, 2=silent elevation (only with the Elevation product). | |
| organizationIds | No | permit: parent-hierarchy GUID chain (child→…→root); usually 1 entry for a child-org request. | |
| responseSubject | No | Optional response email subject for reject. | |
| response_format | No | Output format: markdown (default, human-readable) or json (structured) | markdown |
| storagePolicyId | No | permit_storage: existing storage policy GUID (required for storageMode=add_to_existing). | |
| notifyOnResponse | No | Email the requestor on response (reject/permit_storage; default: false). | |
| allStorageDevices | No | permit_storage: apply to all storage devices (default: false). | |
| approvalRequestId | No | Approval request GUID (required for get, get_file_download_details, get_permit_application, get_storage_approval). Find via list action first. | |
| networkExclusions | No | permit: network exclusions applied to the resulting ringfence permit. | |
| ringfenceActionId | No | permit: ringfence action id applied to the permit. | |
| useExistingPolicy | No | permit: update an existing policy affecting the computer instead of creating one (default false). | |
| newApplicationName | No | permit: name for the new application (required for permitMode new_app). | |
| elevationExpiration | No | permit: elevation expiry in hours (used when elevationStatus>0). | |
| showCurrentTierOnly | No | Only show requests at the current approval tier (multi-tier/MSP escalation; default: false) | |
| policyExpirationDate | No | permit: expiry for the created policy in UTC (YYYY-MM-DDTHH:MM:SSZ). | |
| requestorEmailAddress | No | permit: requestor email. NOTE: overwrites existing value if provided. | |
| ticketApprovalManager | No | permit: approval manager. NOTE: overwrites existing value if provided. | |
| showChildOrganizations | No | Include child organizations (default: false) | |
| applicationOrganizationId | No | permit: organization GUID that owns the application (defaults to organizationId). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | Response data — shape varies by action |
| error | No | |
| success | Yes | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark destructive=true, readOnly=false, idempotent=false, openWorld=true; the description goes beyond by detailing the two-step permit flow, warning not to synthesize the opaque json blob, cautioning about Built-In matching apps matching unrelated shared DLLs, listing required permissions, and explicitly admitting 'Payload-verified, NOT live-tested: validate in a non-prod org before relying on it.' This is model transparency for a mutating tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but appropriately so for a 55-param, 12-action tool. It is well-structured: summary, common workflows, statuses, pitfalls, permissions, pagination, key fields, related tools. It is front-loaded with the most useful workflows. Small deduction for some redundancy with schema descriptions (e.g., the opaque-json warning appears both in the schema and the description) and a few repetitive status/param notes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a highly complex tool with 55 parameters, 12 actions, and no simple output contract explained, the description covers prerequisites (two-step flows), safety caveats, permission requirements, pagination behavior, response fields, status codes, and sibling relationships. It also mentions the open-world caveat via 'validate in a non-prod org.' Nothing essential for an agent to call the tool confidently seems missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description does add meaning beyond the schema by grouping relevant parameters into workflows (permit flow, storage flow, list/count/get flow) and clarifying which action requires which preliminary call (get_permit_application before permit; get_storage_approval before permit_storage). It also adds high-level parameter semantics like 'fetchAlPages=true' for pagination and 'isAscending=false' as the right triage default. Minor deduction because much param-level detail is already in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb and resource ('Query ThreatLocker approval requests') and quickly enumerates the domain: blocked-software requests created by users and reviewed by admins. It then provides concrete common workflows that distinguish the core actions (list, count, get, get_permit_application, permit) from one another, and names related siblings (action_log, applications, policies) to situate the tool. This is far beyond a vague one-liner.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use context for each common workflow, including specific parameter molds (action=list, statusId=1 for pending; searchText for user; two-step permit flow). It also gives alternatives: action_log for deny events, applications for matching apps, policies for creating permits, and even flags where the action is NOT live-tested. An agent can correctly select this tool and the right action without guessing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
computer_groupsThreatLocker Computer GroupsARead-onlyIdempotent
List and inspect ThreatLocker computer groups.
Computer groups organize computers and define policy scope. Policies are applied to groups, not individual computers. The "global" group (includeGlobal=true) permits applications across all groups.
Common workflows:
Get all groups with computers: action=list, includeAllComputers=true
Get group dropdown for UI/selection: action=dropdown
Get groups across organizations (MSP): action=dropdown_with_org, includeAvailableOrganizations=true
Filter by OS type: osType=1 (Windows), 2 (macOS), 3 (Linux)
Get groups for approval workflow: action=get_for_permit
Get group by install key: action=get_by_install_key, installKey="..."
Permissions: Super Admin (for list), Edit Computers, Edit Computer Groups, View Computers. Key response fields: computerGroupId, name, osType, computerCount, organizationId.
Related tools: computers (list computers in groups), policies (policies applied to groups)
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | list=full details with computers, dropdown=simple list for selection, dropdown_with_org=includes parent/child orgs, get_for_permit=groups for approval workflow, get_by_install_key=get group by 24-char install key | |
| osType | No | OS type: 0=All, 1=Windows, 2=macOS, 3=Linux, 5=Windows XP | |
| installKey | No | 24-character install key (required for get_by_install_key) | |
| hideGlobals | No | Hide global groups (dropdown action) | |
| fetchAllPages | No | Fetch all pages automatically (max 10 pages). Default: false (single page). | |
| includeGlobal | No | Include global application-permitting group (list action) | |
| computerGroupId | No | Filter by specific computer group GUID (list action) | |
| response_format | No | Output format: markdown (default, human-readable) or json (structured) | markdown |
| includeIngestors | No | Include ingestors (list action) | |
| includeDnsServers | No | Include DNS servers (list action) | |
| includeAllPolicies | No | Include all policies attached to groups (list action) | |
| includeAllComputers | No | Include all computers in response (list action) | |
| includeParentGroups | No | Show parent computer groups (list action) | |
| includeAccessDevices | No | Include access devices (list action) | |
| includeOrganizations | No | Include accessible organizations (list action) | |
| includeLoggedInObjects | No | Add contextual path labels (list action) | |
| includeRemovedComputers | No | Include removed computers (list action) | |
| includeAvailableOrganizations | No | Include child and parent organizations (dropdown_with_org action) |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | Response data — shape varies by action |
| error | No | |
| success | Yes | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context beyond annotations: the global group's special 'permits applications across all groups' behavior, the policy-scope implication, required permissions, and key response fields. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded: purpose, domain concept, common workflows, permissions, key fields, and related tools. Every section earns its place; the workflow bullet list is dense but scannable. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite 18 parameters and 5 action variants plus an output schema, the description covers all critical decision points: common workflows, permissions, key response fields, and relationships to sibling tools. The output schema itself handles return-value details, so nothing essential is missing for selecting and invoking the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds meaning to several parameters by framing them in workflows (e.g., includeGlobal=true permits applications across all groups, osType enum examples, includeAllComputers for full group details). It also clarifies the 'global' concept and lists key response fields, enhancing the agent's understanding beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource ('List and inspect ThreatLocker computer groups') and immediately clarifies the domain concept (groups organize computers and define policy scope). It also differentiates itself from sibling tools via the 'Related tools' line, explicitly stating computers lists computers in groups and policies are applied to groups.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Common workflows' section gives explicit action+parameter recipes for common scenarios: list with includeAllComputers, dropdown for UI selection, dropdown_with_org for MSP, osType filters, get_for_permit for approval workflow, and get_by_install_key with a 24-char key. It also lists required permissions. However, it does not explicitly state when NOT to use this tool versus alternatives, only a brief related-tools pointer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
computersThreatLocker ComputersADestructive
Query and inspect ThreatLocker computers.
Common workflows:
Find computers by logged-in user: action=list, searchBy=2, searchText="username"
Find computers by IP: action=list, searchBy=4, searchText="192.168.1.100"
List computers needing review: action=list, kindOfAction="NeedsReview"
Get computer details by ID: action=get, computerId="..."
View check-in history: action=checkins, computerId="..."
Get installation info for new deployments: action=get_install_info
Rename / re-group a computer: action=edit, computerId="...", computerGroupId="...", name="..."
Move a computer to another org: action=move_org, computerId="...", computerGroupId="...", organizationId="...", osType=1, targetComputerGroupId="...", targetOrganizationId="..."
Remove computers from the Portal: action=delete, deleteComputers=[{computerId, computerName, organizationId}] (same org; does NOT uninstall)
Restart every agent in the org: action=restart_org (includeChildOrganizations=true also hits child orgs)
Remove duplicate records: action=remove_duplicate
Pitfalls:
get returns the editable computer record, not live protection state; read current mode/isolation from list results or maintenance_mode history.
This is the triage entry point: find a box here, grab its computerId/organizationId/computerGroupId, then hand off to maintenance_mode, approval_requests, or action_log.
Permissions: View Computers, Edit Computers (for modifications), Install Computers (for install info). Pagination: list and checkins actions are paginated (use fetchAllPages=true to auto-fetch all pages). Key response fields: computerId, computerName, computerGroupName, lastCheckin, action (Secure/Installation/Learning/MonitorOnly), threatLockerVersion.
Related tools: computer_groups (manage groups), maintenance_mode (maintenance history), action_log (audit events)
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New computer name (required for edit action). | |
| action | Yes | list=search computers, get=details by ID, checkins=connection history, get_install_info=deployment info, isolate=cut network (Detect+Agent>=8.2), lockdown=block executions+isolate, enable_protection=re-secure / clear isolation, baseline_rescan=re-profile system files, restart_service=restart the ThreatLocker agent service, edit=rename/move-group/proxy settings, move_org=move a computer to another organization, delete=remove computers from the Portal (does NOT uninstall), restart_org=restart every computer in the org, remove_duplicate=remove duplicate computer records | |
| osType | No | move_org: OS type of the computer (1=Windows, 2=macOS, 3=Linux, 5=Windows XP). | |
| endDate | No | Isolation/lockdown window end (ISO 8601 UTC). | |
| options | No | edit: ThreatLocker option names to set on the computer. | |
| orderBy | No | Field to sort by (default: computername) | |
| pageSize | No | Results per page (default: 25, max: 500) | |
| proxyURL | No | edit: full proxy URL (proxyServerOption + proxyUrlEntry). | |
| searchBy | No | Field to search by: 1=Computer/Asset Name, 2=Username, 3=Computer Group Name, 4=Last Check-in IP, 5=Organization Name | |
| permitEnd | No | Re-secure automatically at window end (default: true). | |
| startDate | No | Isolation/lockdown window start (ISO 8601 UTC). | |
| computerId | No | Computer GUID (required for get, checkins, isolate, lockdown, enable_protection). Find via list action first. | |
| pageNumber | No | Page number (default: 1) | |
| searchText | No | Search text for list action | |
| isAscending | No | Sort ascending (default: true) | |
| kindOfAction | No | Additional filter for computer state | |
| action_filter | No | Filter by computer mode for list action | |
| applicationId | No | Application scope for isolation: "autocomp" (default), "autogroup", or an application GUID. | |
| computerGroup | No | Computer group GUID for list action. Find via computer_groups first. | |
| fetchAllPages | No | Fetch all pages automatically (max 10 pages). Default: false (single page). | |
| hideHeartbeat | No | Hide heartbeat entries for checkins action | |
| proxyUrlEntry | No | edit: proxy host, e.g. "proxy.example.com". | |
| enableLearning | No | Enable a learning window during baseline_rescan (default: false). | |
| organizationId | No | Owning organization GUID (required for isolate/lockdown/enable_protection). | |
| useProxyServer | No | edit: enable a proxy server (default: false). | |
| computerGroupId | No | Computer group GUID for isolate/lockdown/enable_protection (optional). | |
| deleteComputers | No | delete: computers to remove from the Portal. ALL must be in the same organization. Removes from Portal only — does not uninstall the agent. | |
| response_format | No | Output format: markdown (default, human-readable) or json (structured) | markdown |
| proxyServerOption | No | edit: proxy protocol, e.g. "https://". | |
| childOrganizations | No | Include child organizations (default: false) | |
| enableLearningRescan | No | move_org: enable Learning + baseline rescan after the move (default: false). | |
| targetOrganizationId | No | move_org: destination organization GUID. | |
| targetComputerGroupId | No | move_org: destination computer group GUID. | |
| includeChildOrganizations | No | restart_org/remove_duplicate: also affect child organizations (default: false). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | Response data — shape varies by action |
| error | No | |
| success | Yes | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive/non-readOnly behavior, and the description reinforcees and expands this with critical nuances: delete removes from Portal but does NOT uninstall, get returns editable record not live protection state, restart_org can hit child orgs, and remove_dupicate is for duplicate records. No contradiction with annotations; the description adds material safety-relevant behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-organized into labeled sections: Common workflows, Pitfalls, Permissions, Pagination, Key response fields, Related tools. Front-loaded with the primary purpose, then bullet lists that are easy to scan. It is long, but appropriate for a 34-parameter multi-action tool where every section adds load-bearing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the large parameter count, output schema, and annotations, the description covers the essential operational context: how to find computers, what each major action does, permissions needed, pagination behavior, key response fields, and related tools. No critical gap that would leave an agent guessing how to invoke the tool for common workflows.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds real value by combining parameters into workflows (e.g. deleteComputers all in same org, fetchAllPages for paginated list/checkins, move_org requires osType + target ids). It doesn't fully enumerate every action's required parameter set, but the workflows and pitfalls cover the most important combinations.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a clear verb + resource ('Query and inspect ThreatLocker computers') and the workflow list gives concrete action+parameter combinations for each major operation. The Related tools section explicitly names computer_groups, maintenance_mode, and action_log, distinguishing this tool from its siblings. Although the opening phrase 'Query and inspect' slightly undersells the mutating/delete actions, the workflow list quickly disambiguates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance with exact action+parameter recipes, e.g. 'Find computers by logged-in user: action=list, searchBy=2, searchText="username"'. Pitfalls direct agents away from get for live state and toward list or maintenance_mode history. It also positions the tool as the triage entry point and recommends hand-off to maintenance_mode, approval_requests, or action_log.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
maintenance_modeThreatLocker Maintenance ModeADestructive
Query ThreatLocker maintenance mode history for computers.
Maintenance mode temporarily changes a computer's protection level. Types include:
Monitor Only (1): Logs but doesn't block (audit mode)
Installation Mode (2): Allows new software installs, auto-learns new applications
Learning Mode (3): Monitors and records software usage without blocking
Tamper Protection Disabled (6): Allows ThreatLocker service changes
Common workflows:
View maintenance history for a computer: action=get_history, computerId="..."
Audit who put computers in installation mode: check history across computers
Maintenance mode history shows who enabled it, when, duration, and what applications were learned during that time.
Pitfalls:
Learning Mode (3) requires a "Default - (Group Name)" Default Deny policy to exist in the group, or it silently does nothing.
Isolation (14) and Lockdown (15) require ThreatLocker Detect and Agent >= 8.2.
usersList entries are "DOMAIN\USERNAME" and only apply when allUsers=false; default window is 1 hour if no end time is given.
Permissions: Edit Computers, Manage Application Control Installation Mode, Manage Application Control Learning Mode. Pagination: get_history is paginated (use fetchAllPages=true to auto-fetch all pages). Key response fields: maintenanceModeId, maintenanceTypeId, displayName, startDateTime, endDateTime, addedBy, endedBy.
Related tools: computers (get computer IDs, see current mode), computer_groups (group-level modes)
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | Optional notes recorded with the maintenance window. | |
| action | Yes | get_history=paginated history for a computer, enable=put a computer into a maintenance mode (MaintenanceModeInsert), end=end an active maintenance window early (MaintenanceModeEndById), update_end_time=extend/shorten an active window (maintenanceTypeId must match the active mode) | |
| allUsers | No | Apply to all users (default: true). When false, supply usersList. | |
| pageSize | No | Results per page (default: 25, max: 500) | |
| permitEnd | No | Re-secure automatically at window end (default: true). | |
| usersList | No | "DOMAIN\\USERNAME" entries; only used when allUsers=false. | |
| computerId | Yes | Computer GUID (required). Find via computers list first. | |
| pageNumber | No | Page number (default: 1) | |
| endDateTime | No | Window end (ISO 8601 UTC) for enable. Defaults to +1 hour if omitted. | |
| ticketNumber | No | Optional ticket reference recorded with the maintenance window. | |
| fetchAllPages | No | Fetch all pages automatically (max 10 pages). Default: false (single page). | |
| startDateTime | No | Window start (ISO 8601 UTC) for enable. Defaults to now if omitted. | |
| response_format | No | Output format: markdown (default, human-readable) or json (structured) | markdown |
| maintenanceModeId | No | Active maintenance window GUID (required for end). Get it from get_history. | |
| maintenanceTypeId | No | Maintenance type (required for enable/end): 1=MonitorOnly, 2=Installation, 3=Learning, 4=Elevation, 6=TamperProtectionDisabled, 14=Isolation, 15=Lockdown, 16=DisableOpsAlerts, 17=NetworkControlMonitorOnly, 18=StorageControlMonitorOnly, 19=InstallationLegacy. For end, must match the active mode. | |
| maintenanceEndDate | No | New window end (UTC YYYY-MM-DDTHH:MM:SSZ) for update_end_time. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | get_history: array of maintenance mode records |
| error | No | |
| success | Yes | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even with readOnlyHint=false and destructiveHint=true annotations, the description adds substantial behavioral context: what each maintenance mode type does, silent failure of Learning Mode without a Default Deny policy, version requirements for Isolation/Lockdown, usersList format, default 1-hour window, required permissions, pagination behavior, and key response fields. This goes well beyond the annotations and is consistent with them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well organized into labeled sections: types, workflows, pitfalls, permissions, pagination, response fields, and related tools. Each section carries useful agent-facing information, and the complexity of a 16-parameter, 4-action tool justifies the length. A few points overlap with schema details, but the structure keeps it scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with multiple actions, pitfalls, and permissions, the description is remarkably complete. It explains when to use each workflow, what could silently go wrong, which permissions are required, how pagination works, what the key response fields are, and which sibling tools provide supporting data. Even with an output schema present, the description still adds valuable operational context without omitting critical guidance.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaningful meaning beyond the schema: it explains mode IDs in human terms, warns about mode-specific pitfalls, clarifies usersList as 'DOMAIN\USERNAME' entries, and notes the default window when no end time is given. It does not restate raw parameter definitions but enriches how the parameters should be used.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names a specific verb and resource: 'Query ThreatLocker maintenance mode history for computers.' It clearly differentiates the tool's history-focused purpose and later lists mode types, workflows, and related tools. However, the tool also supports enable/end/update_end_time actions, and the description never explicitly states those mutation capabilities as part of its purpose; they are only implied through pitfalls and the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides concrete common workflows ('View maintenance history for a computer', 'Audit who put computers in installation mode') and points to related tools for complementary tasks: computers for IDs/current mode and computer_groups for group-level modes. It does not explicitly explain when to choose this tool over others or when not to use it, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
network_access_policiesThreatLocker Network Access PoliciesA
Query ThreatLocker network access control policies.
Network access policies define firewall rules for endpoints — controlling which applications can make or receive network connections, and to which destinations (IPs, ports, domains).
Common workflows:
List all network access policies: action=list
Search by name: action=list, searchText="RPC"
Filter by computer group: action=list, appliesToId="group-id"
Get policy details by ID: action=get, networkAccessPolicyId="..."
Pitfalls:
Network Control has no Global policy level (unlike application control).
Tag-based rules need the tag label + id resolved via the tags tool (dropdown); parent-org tags use the "ParentOrg\TagName" format.
direction: 1=Inbound, 2=Outbound; policyActionId: 1=Permit, 2=Deny.
Permissions: Edit Network Control Policies, View Network Control Policies. Pagination: list action is paginated (use fetchAllPages=true to auto-fetch all pages). Key response fields: networkAccessPolicyId, name, computerGroupName, isEnabled, applicationName.
Related tools: policies (application control policies), computer_groups (where policy applies), tags (network tags used in policies)
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Policy name (required for create). | |
| ports | No | Port entries, e.g. ["20-25","3389"] (create). | |
| action | Yes | get=single policy by ID, list=search/list network access policies, create=create a network control policy (deploy afterwards) | |
| status | No | 1=Active, 3=Inactive (default: 1). | |
| allPorts | No | Match any port (create). | |
| pageSize | No | Results per page (default: 25, max: 500) | |
| protocol | No | 1=TCP, 2=UDP, 3=Both (default: 3). | |
| direction | No | 1=Inbound, 2=Outbound (required for create). | |
| allSources | No | Match any source (create). | |
| pageNumber | No | Page number (default: 1) | |
| searchText | No | Search text to filter policies | |
| appliesToId | No | Computer group GUID to filter by. Find via computer_groups first. | |
| fetchAllPages | No | Fetch all pages automatically (max 10 pages). Default: false (single page). | |
| policyActionId | No | 1=Permit, 2=Deny (required for create). | |
| allDestinations | No | Match any destination (create). | |
| computerGroupId | No | Org/group/computer GUID the policy applies to (required for create). No Global level in Network Control. | |
| response_format | No | Output format: markdown (default, human-readable) or json (structured) | markdown |
| sourceLocations | No | Source locations (create). | |
| destinationLocations | No | Destination locations (create). | |
| networkAccessPolicyId | No | Network access policy GUID (required for get). Find via list action first. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | Response data — shape varies by action |
| error | No | |
| success | Yes | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal read-write behavior (readOnlyHint=false), and the description adds useful operational context: permissions, pagination behavior, enum meanings for direction/policyActionId, and parent-org tag formatting. It does not disclose any create-side effects or deployment nuance, and the 'Query' framing downplays the mutation capability, so it is not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is clearly organized into definition, common workflows, pitfalls, permissions, pagination, key response fields, and related tools. It is long but every section earns its place given the tool's 20-parameter, three-action surface area, and the opening sentence is direct.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with 20 parameters, an output schema, and annotations, the description covers read workflows, filtering, pagination, permissions, and key pitfalls. The notable gap is that create is not represented in the common workflows or prose, leaving the mutating path to be inferred from the schema enum description alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds genuine value beyond the schema by explaining tag label/id resolution, the 'ParentOrg\TagName' format, direction/policyActionId mappings, appliesToId lookup via computer_groups, and fetchAllPages behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly names the resource ('ThreatLocker network access control policies') and the primary read verb ('Query'), and it differentiates from sibling tools by noting 'Related tools: policies (application control policies)'. However, the tool's schema supports create as a first-class action, and the description's 'Query' opening plus common-workflow list only cover list/get, so the full purpose is understated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Common workflows' section gives concrete invocation patterns (action=list, searchText, appliesToId, action=get) and the pitfalls section tells agents about no-Global-level and tag-format constraints. It stops short of explicit 'use policies for application-control instead' routing, though the 'Related tools' line does clarify the sibling division.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
online_devicesThreatLocker Online DevicesARead-onlyIdempotent
Query ThreatLocker online devices.
Returns devices currently connected and reporting to the ThreatLocker platform. Useful for real-time visibility into which endpoints are active.
Common workflows:
Check how many devices are online right now: action=list
Verify a specific computer is connected: action=list, then search results for hostname
Monitor fleet connectivity after a network change: action=list, compare count to computers tool total
Paginate through large device lists: action=list, pageNumber=2, pageSize=100
Permissions: View Computers. Pagination: list action is paginated (use fetchAllPages=true to auto-fetch all pages). Key response fields: computerName, computerGroupName, lastCheckin, ipAddress.
Related tools: computers (full inventory with details, modes, groups), computer_groups (group membership and structure)
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | list=get currently online devices | |
| orderBy | No | Field to sort by (e.g. lastcheckin) | |
| pageSize | No | Results per page (default: 25, max: 500) | |
| pageNumber | No | Page number (default: 1) | |
| isAscending | No | Sort ascending when true | |
| fetchAllPages | No | Fetch all pages automatically (max 10 pages). Default: false (single page). | |
| response_format | No | Output format: markdown (default, human-readable) or json (structured) | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | list: array of online device objects |
| error | No | |
| success | Yes | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior. The description adds valuable behavioral context: listing is paginated, fetchAllPages can auto-fetch up to 10 pages, the action parameter is currently limited to list, and View Computers permission is required. This goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with a short summary, bulleted workflows, permissions, pagination notes, key response fields, and related tools. It is longer than the minimum but every section adds operational value; only minor redundancy exists between 'currently connected' and 'active endpoints'.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool, the description covers what the tool does, when to use it, permissions, pagination behavior, useful response fields, and related alternatives. The output schema handles return-value specifics, so nothing essential is missing for an agent to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, so the baseline is 3. The description adds practical parameter semantics by demonstrating action=list, pageNumber=2, pageSize=100, and fetchAllPages=true in realistic workflows, which helps an agent select parameters meaningfully beyond the raw schema definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource (ThreatLocker online devices), the operation (query/list), and the outcome (devices currently connected and reporting). It distinguishes itself from related tools by noting computers is for full inventory with details and computer_groups is for membership structure.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit common workflows with concrete examples, including checking online count, verifying a specific hostname, monitoring fleet connectivity, and paginating large lists. It also names related tools and their different purposes, giving the agent clear guidance on when to choose this tool versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
organizationsThreatLocker OrganizationsADestructive
Query ThreatLocker organizations.
Organizations are the top-level containers in ThreatLocker. MSPs have a parent organization with child organizations for each client. Enterprises may have organizations per business unit or location.
Common workflows:
List child organizations: action=list_children
Search for a client org: action=list_children, searchText="client name"
List all nested children (full tree): action=list_children, includeAllChildren=true
Get installation auth key: action=get_auth_key
Get orgs available for moving computers: action=get_for_move_computers
Provision a client org: action=timezones (pick an id) → action=create_child, displayName="...", timezoneId="..." → get_auth_key → deploy
Rotate the org auth key: action=rotate_auth_key (DESTRUCTIVE — invalidates the old key and breaks existing deploy scripts)
The organizationId is needed for many API calls (policies, applications, etc.) to scope the request to a specific organization.
Pitfalls:
get_auth_key returns the install/auth key used to deploy agents and to resolve groups via computer_groups get_by_install_key.
Permissions: View Organizations, Edit Organizations, Super Admin - Child. Pagination: list_children is paginated (use fetchAllPages=true to auto-fetch all pages). Key response fields: organizationId, name, displayName, dateAdded, computerCount.
Related tools: computers (computers in org), computer_groups (groups in org), policies (policies in org)
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | create_child: RMM identifier used in deploy scripts (defaults to displayName). A mismatch creates duplicates. | |
| action | Yes | list_children=list child orgs, get_auth_key=installation key for current org, get_for_move_computers=orgs available for computer relocation, timezones=list valid timezone ids (for create_child), create_child=create a child organization, rotate_auth_key=generate a NEW org auth key (DESTRUCTIVE: breaks existing deploy scripts) | |
| domains | No | create_child: org domains (e.g. ["client.com"]). | |
| options | No | create_child: org option names (inherits from parent if omitted). | |
| orderBy | No | Field to order by | |
| pageSize | No | Results per page (default: 25, max: 500) | |
| pageNumber | No | Page number (default: 1) | |
| searchText | No | Filter by name (for list_children) | |
| timezoneId | No | create_child: timezone id from action=timezones (required). Use the exact id value, not the display name. | |
| displayName | No | create_child: human-readable org name (required). | |
| isAscending | No | Sort ascending (default: true) | |
| fetchAllPages | No | Fetch all pages automatically (max 10 pages). Default: false (single page). | |
| itarCompliant | No | create_child: restrict access/management to inside the USA (default false). | |
| proxyUrlEntry | No | create_child: proxy URL; requires useProxyServer=true. | |
| timeoutOnLogin | No | create_child: login timeout in minutes. | |
| useProxyServer | No | create_child: enable proxy configuration (default false). | |
| response_format | No | Output format: markdown (default, human-readable) or json (structured) | markdown |
| proxyServerOption | No | create_child: proxy protocol ("http://"/"https://"); requires useProxyServer=true. | |
| includeAllChildren | No | Include nested children (default: false) | |
| elevationDefaultHours | No | create_child: default elevation expiry hours (0=no expiration). | |
| hasDisabledEmailNotifications | No | create_child: disable user emails except password resets (default false). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | Response data — shape varies by action |
| error | No | |
| success | Yes | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the annotations by specifying what the destructive rotation does ('invalidates the old key and breaks existing deploy scripts'), what get_auth_key returns, pagination fetching behavior, required permissions, and key response fields. This gives the agent concrete behavioral expectations for each action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but exceptionally organized with labeled sections: workflows, pitfals, permissions, pagination, response fields, and related tools. Every section earns its place and adds operational value; the most critical workflow snippets are listed early.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with 21 parameters and six actions, the description covers workflows, destruction warnings, permissions, pagination, response fields, and sibling-tool relationships. An output schema exists, and the description correctly avoids redundant return-value explanation while providing complementary operational context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the baseline is 3, and the description adds meaningful workflow context around parameters (e.g., timezoneId must come from action=timezones, name mismatches create duplicates, fetchAllPages vs pagination). It does not need to re-explain every parameter because the schema already covers them, but the action-to-parameter orchestration is valuable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as the entry point for ThreatLocker organizations and enumerates the distinct actions it supports (list_children, get_auth_key, create_child, etc.). It also defines organizations as top-level containers and distinguishes this tool from siblings like computers, computer_groups, and policies, so an agent can select it confidently.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit common workflows with exact action values and parameter examples, such as listing children with searchText and creating a child org with timezoneId. It also states pitfals, pagination behavior, permissions, and related sibling tools, giving clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
policiesThreatLocker PoliciesADestructive
Manage ThreatLocker policies.
Use list_all to search policies by computer group / org / filter without an applicationId; use list_by_application when you already have an applicationId.
Policies define what applications can run on which computer groups. A policy links an application (set of file rules) to a computer group with an action (permit/deny/ringfence).
Common workflows:
Get policy details by ID: action=get, policyId="..."
List all policies for an application: action=list_by_application, applicationId="...", organizationId="..."
Find policies for a specific group: action=list_by_application, applicationId="...", organizationId="...", appliesToId="group-id"
Include deny policies in results: action=list_by_application, ..., includeDenies=true
Create new policy: action=create, name="...", applicationIds=["..."], computerGroupId="...", osType=1, policyActionId=1
Update policy (full replace - get first!): action=update, policyId="...", name="...", applicationIds=["..."], computerGroupId="...", osType=1, policyActionId=1
Delete policies: action=delete, policyIds=["..."], organizationId="..."
Copy policies between groups: action=copy, osType=1, policyIds=["..."], sourceAppliesToId="...", sourceOrganizationId="...", targetAppliesToIds=["..."]
Deploy pending changes: action=deploy, organizationId="..."
IMPORTANT: After create/update/delete/copy, deploy changes with action=deploy to push to computers. IMPORTANT: Update is a full replace — use action=get first to read current values, then provide ALL fields.
Policy actions: Permit (allow), Deny (block), Ringfence (allow but restrict network/storage access)
Pitfalls:
Precedence is first-match-wins (Global > Global Group > Entire Org > Computer > Computer Group). New policies land at the bottom unless orderBefore=true.
monitorMode=1 (Secured) creates an explicit deny that overrides Learning Mode; monitorMode=2 is Monitor Only.
allowRequest/killRunningProcesses are only valid with policyActionId=2 (Deny).
Ringfence requires policyActionId=6 + ringfencingOptions (5 restrict flags + rf* arrays). rfFilePolicy permission: permit 1=read-only/2=read+write, deny 1=deny-write/2=deny-read+write. rfNetworkPolicy.server uses "tag:".
policySchedules requires policyScheduleStatus=2; networkExclusions pairs with restrictNetworkAccess=true.
update is FULL-REPLACE: get first, then resend ALL nested arrays (ringfencingOptions/policySchedules/networkExclusions/userGroups/parentProcessIdList/requestEmailAddressesList) you want to keep — omitting one removes it. Payload-verified, NOT live-tested.
Scoping: userGroups needs allUserGroups=false; deviceType needs allDevices=false; parentProcessIdList needs parentRestrictionEnabled=true (apps must match the policy osType); applicationSelection=1 (all apps) needs a name containing "Permit All" or starting "Default - "; notifyOnRequest/requestEmailAddressesList are Deny-only (policyActionId=2).
Permissions: View Application Control Policies, Edit Application Control Policies. Pagination: list_by_application is paginated (use fetchAllPages=true to auto-fetch all pages). Key response fields: policyId, name, policyActionId, applicationId, computerGroupId, isEnabled.
Related tools: applications (what the policy permits), computer_groups (where policy applies), action_log (see policy enforcement)
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Policy name (required for create, update) | |
| action | Yes | get=single policy by ID, list_all=search/list policies for a group or org (no applicationId needed), list_by_application=all policies for an application, create=create new policy, update=update existing policy (full replace - use get first to read current values), delete=delete policies, copy=copy policies between groups, deploy=deploy pending policy changes | |
| filter | No | list_all filter: ""=all, nomatch, match, over6weeks, ringfence, noringfence, elevation, permitonly | |
| osType | No | OS type: 1=Windows, 2=macOS, 3=Linux, 5=Windows XP (required for create, update, copy) | |
| endDate | No | Expiration date in UTC (YYYY-MM-DDTHH:MM:SSZ). Used with policyScheduleStatus=1. | |
| pageSize | No | Results per page (default: 25, max: 500) | |
| policyId | No | Policy GUID (required for get, update) | |
| isEnabled | No | Enable policy (default: true for create) | |
| logAction | No | Log to Unified Audit (default: true for create) | |
| policyIds | No | Policy GUIDs (required for delete, copy) | |
| activeOnly | No | list_all: only return active policies | |
| allDevices | No | true=policy applies to all device types; false=restrict to deviceType. | |
| deviceType | No | Single device interface to scope to (requires allDevices=false). Only one per policy. | |
| pageNumber | No | Page number (default: 1) | |
| searchText | No | Free-text filter for list_all | |
| userGroups | No | User/AD-group scoping (requires allUserGroups=false). Re-send all on update or they are removed. | |
| appliesToId | No | Computer group GUID to filter by. Find via computer_groups first. | |
| description | No | Policy description / notes. | |
| monitorMode | No | 0=Inherit, 1=Secured (explicit deny that overrides Learning Mode), 2=Monitor Only. | |
| orderBefore | No | Place the new policy at the top of its scope instead of the bottom (policy precedence is first-match-wins). | |
| allowRequest | No | Allow users to request access when denied. Only valid with policyActionId=2 (Deny). | |
| allUserGroups | No | true=policy applies to all users; false=restrict to userGroups. Full-replace on update. | |
| applicationId | No | Application GUID (required for list_by_application). Find via applications search first. | |
| fetchAllPages | No | Fetch all pages automatically (max 10 pages). Default: false (single page). | |
| includeDenies | No | Include deny policies (default: false) | |
| applicationIds | No | Application GUIDs (required for create, update). Mapped to applicationIdList. | |
| organizationId | No | Organization GUID (required for list_by_application, deploy). Find via organizations first. | |
| policyActionId | No | 1=Permit, 2=Deny, 6=Permit+Ringfence (required for create, update) | |
| computerGroupId | No | Computer group GUID (required for create, update) | |
| elevationStatus | No | 0=None, 1=Elevate+Notify, 2=Silent, 3=Force Standard User | |
| notifyOnRequest | No | Email admins on approval requests. Only valid with policyActionId=2 (Deny); requires requestEmailAddressesList. | |
| policySchedules | No | Recurring schedule windows (requires policyScheduleStatus=2). | |
| response_format | No | Output format: markdown (default, human-readable) or json (structured) | markdown |
| showAllPolicies | No | list_all: include inherited higher-level policies | |
| elevationEndDate | No | Expiry for an elevation policy in UTC, distinct from endDate. | |
| networkExclusions | No | Internet-ringfence exclusions (pairs with ringfencingOptions.restrictNetworkAccess=true). | |
| sourceAppliesToId | No | Source computer group GUID (required for copy) | |
| ringfencingOptions | No | Ringfencing config (requires policyActionId=6). 5 restrict flags are required; rf* arrays are optional. | |
| targetAppliesToIds | No | Target computer group GUIDs (required for copy) | |
| parentProcessIdList | No | Application GUIDs allowed to launch this policy's apps (requires parentRestrictionEnabled=true; all must match the policy osType). Full-replace on update. | |
| applicationSelection | No | 0=use applicationIds (default), 1=all applications. Value 1 requires the policy name to contain "Permit All" or start with "Default - ". | |
| killRunningProcesses | No | Kill running processes when policy denies. Only valid with policyActionId=2 (Deny). | |
| policyScheduleStatus | No | 0=None, 1=Expiration, 2=Schedule | |
| sourceOrganizationId | No | Source organization GUID (required for copy) | |
| parentRestrictionEnabled | No | Enable parent-process restriction (requires parentProcessIdList). | |
| requestEmailAddressesList | No | Admin emails notified on requests (with notifyOnRequest=true; Deny-only). Full-replace on update. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | Response data — shape varies by action |
| error | No | |
| success | Yes | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations: it discloses that update is a full-replace requiring get first, that changes must be deployed, that precedence is first-match-wins, that monitorMode=1 overrides Learning Mode, and that the implementation is payload-verified but not live-tested. These are non-obvious behavioral traits that materially affect safe invocation and are not conveyed by annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but topically organized and mostly dense. It earns its length given 46 parameters and 8 actions. However, the full-replace warning is effectively given three times: in the workflow bullet, in the 'IMPORTANT' callout, and again in the Pitfalls section. This redundancy prevents a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex, mutating tool with 46 parameters and many actions, the description covers workflow examples, pitfalls, scoping constraints, permissions, pagination, key response fields, and related tools. An output schema exists, so return-value documentation is not required here, and what is included is sufficient for an agent to select and invoke the tool correctly in most scenarios.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds substantial meaning: it maps each action to its required parameters, gives concrete example values, explains conditional validity constraints (e.g., allowRequest and killRunningProcesses are Deny-only, ringfencing requires policyActionId=6), and warns about full-replace behavior for nested arrays on update. This is genuinely valuable beyond the property descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Manage ThreatLocker policies' and then immediately defines a policy as linking an application (set of file rules) to a computer group with an action. This makes the specific object and domain clear, and the explicit comparison between list_all and list_by_application plus the 'Related tools' section distinguishes it from sibling tools such as network_access_policies and storage_policies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use list_all vs list_by_application, provides a set of common workflows with required parameters per action, and adds critical routing guidance such as 'After create/update/delete/copy, deploy changes with action=deploy'. Alternatives like applications, computer_groups, and action_log are named and their role in the policy workflow is stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reportsThreatLocker ReportsARead-onlyIdempotent
Query and run ThreatLocker reports.
Access pre-built and custom reports configured in the ThreatLocker portal. Reports provide aggregated views of security data across your organization.
Common workflows:
List all available reports: action=list
Run a specific report: action=get_data, reportId="..." (get IDs from list action first)
Review security posture: list reports, then run relevant compliance or audit reports
Export data for external analysis: run a report and process the returned data
Permissions: View Reports. Key response fields: reportId, name, description, reportData (dynamic columns per report type).
Related tools: action_log (raw audit events), system_audit (portal audit trail), computers (device inventory)
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | list=show available reports, get_data=run report and get results | |
| endDate | No | End of the report window (ISO 8601 UTC). | |
| reportId | No | Report GUID (required for get_data action). Find via list action first. | |
| startDate | No | Start of the report window (ISO 8601 UTC). Omit to use the report default window. | |
| fetchAllPages | No | Fetch all pages automatically (max 10 pages). Default: false (single page). | |
| offsetInMinutes | No | Timezone offset in minutes for date bucketing (e.g. -300 for UTC-5). Default: 0 (UTC). | |
| response_format | No | Output format: markdown (default, human-readable) or json (structured) | markdown |
| includeChildOrganizations | No | Include child organizations in the report (default: false) |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | Response data — shape varies by action |
| error | No | |
| success | Yes | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false; the description adds that reports are aggregated views and requires 'View Reports' permission, plus notes reportData is dynamic. No contradiction exists, and the added context about permission and aggregation goes beyond what annotations alone convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with a one-sentence purpose, then uses compact bullet-style workflows. Every section earns its place, though 'Export data for external analysis' is somewhat obvious; still, clarity and structure are strong.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering safety, the description supplies the remaining selection context: permissions, related tools, key response fields, and planned workflows. An agent can navigate list/get_data and know when to choose a sibling tool. Complete for this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All parameters are described in the schema (100% coverage), so the baseline is 3. The description's workflows add meaning by showing how action and reportId relate (list first, then get_data) and indicating the report window defaults and output format, going slightly beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Query and run ThreatLocker reports,' a specific verb+resource combination, and clarifies it covers pre-built and custom reports. It distinguishes from siblings via the 'Related tools' line and the aggregation focus, so an agent can tell reports from raw audit or device inventory tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Common workflows' section explicitly maps actions to tasks (list, get_data, export) and instructs to get reportId from the list action first. It lists related tools like action_log and system_audit for raw events/trail, implying this tool is for aggregated views, though it never explicitly states when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
saved_searchesThreatLocker Saved SearchesADestructive
Manage saved Unified Audit / investigation searches.
A saved search has two parts: searchData (the reproducible parameters, as JSON) and saveParameters (a human-readable label). saveSearchPageId selects which page the search belongs to (valid values 1-10; e.g. the Unified Audit page).
Common workflows:
List saved searches for a page: action=list, saveSearchPageId=
Save a search: action_log build_search_string (→ saveParameters label) → action=insert, saveSearchId=, saveSearchPageId=, organizationId="...", searchName="...", saveParameters="Any Deny", searchData={the search params object}
Delete a saved search: action=delete, saveSearchId="..."
Pitfalls:
searchData is REQUIRED and must be valid JSON (object or JSON string) — the API deserializes it and returns an opaque 500 if it is missing or malformed. (Verified live 2026-07-06.)
saveParameters is the display label from action_log build_search_string (e.g. "Any Deny").
saveSearchPageId must be a valid page type (1-10); 0/other values return "Page type wasn't found".
insert requires you to supply a fresh saveSearchId GUID.
Permissions: View Unified Audit.
Related tools: action_log (build_search_string produces saveParameters)
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | list=saved searches for a page, insert=save a new search, delete=delete a saved search | |
| datetime | No | Optional created timestamp (UTC). | |
| username | No | Optional owner username. | |
| searchData | No | REQUIRED for insert: the search parameters that make the search reproducible, as a JSON object or JSON string. The API deserializes this server-side, so it MUST be valid JSON (missing/non-JSON => opaque 500). | |
| searchName | No | Display name of the saved search (required for insert). | |
| searchCount | No | Optional usage counter. | |
| saveSearchId | No | Saved-search GUID. For insert, supply a NEW GUID; for delete, the existing one. | |
| fetchAllPages | No | Fetch all pages automatically (max 10 pages). Default: false (single page). | |
| organizationId | No | Organization GUID (required for insert). | |
| saveParameters | No | Human-readable search label from action_log build_search_string, e.g. "Any Deny" (required for insert). Round-trip verbatim. | |
| response_format | No | Output format: markdown (default, human-readable) or json (structured) | markdown |
| saveSearchPageId | No | The page/feature the saved searches belong to (required for list and insert; e.g. the Unified Audit page id). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | Response data — shape varies by action |
| error | No | |
| success | Yes | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by disclosing verified failure modes (opaque 500 on malformed searchData, 'Page type wasn't found' for invalid saveSearchPageId), requiring a fresh GUID for insert, and noting the round-trip requirement for saveParameters. This gives an agent concrete expectations for what happens and what to avoid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with workflows, pitfalls, permissions, and related tools. There is minor redundancy (saveParameters is described in both the intro and the pitfalls), but the extra length is justified by the complexity and risk of the operations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the return format does not need to be explained. All operational prerequisites, failure modes, required parameters per action, and related tools are covered, making the description complete for an agent to select and invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the schema already covers all 12 parameters, the description adds critical operational semantics: valid saveSearchPageId range (1-10), the requirement to generate a new saveSearchId for insert, that searchData must be valid JSON and is server-side deserialized, and that saveParameters comes from action_log. These details materially improve correct invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource ('saved Unified Audit / investigation searches') and the three concrete operations (list, insert, delete) that make up 'manage'. It distinguishes the tool from siblings by naming the action_log relationship and by scoping the resource to saved searches rather than audits or policies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit workflows for list, save, and delete, including exact parameter mappings for each workflow. It also names the related tool (action_log) and states when to use it (build_search_string produces saveParameters), plus the required permission.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scheduled_actionsThreatLocker Scheduled ActionsA
Query ThreatLocker scheduled agent actions.
Scheduled actions are pending operations on ThreatLocker agents, primarily version updates. Updates are batched and scheduled within maintenance windows to avoid disruption.
Common workflows:
List all scheduled actions: action=list
Search with filters: action=search, organizationIds=["..."], computerGroupIds=["..."]
Get scheduled action details: action=get, scheduledActionId="..."
Get available targets for scheduling: action=get_applies_to
Scheduled action types: Version Update (scheduledType=1).
Pitfalls:
isAscending is inverted by the API: true (or omitted) sorts descending (high to low); set false for ascending.
search (GetByParameters) is keyed by scheduledId — pass it to filter to a specific scheduled action's computers; use list for the top-level set.
Permissions: Edit Computers, Edit Computer Groups, View Computers. Pagination: search action is paginated (use fetchAllPages=true to auto-fetch all pages). Key response fields: scheduledAgentActionId, scheduledType, scheduledDateTime, computerName, computerGroupName, status.
Related tools: computers (see current versions), computer_groups (target groups for updates), organizations (filter by org)
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | list=all scheduled actions, search=filtered search, get=single action details, get_applies_to=available scheduling targets, schedule=schedule a batched agent version update, abort=cancel a scheduled action (abortAll=true for the whole action, or appliesTo=[computers] for specific ones) | |
| osType | No | Filter get_applies_to targets by OS: 1=Windows, 2=Mac, 3=Linux, 7=Red Hat Enterprise Linux 6 | |
| orderBy | No | Field to sort by | |
| abortAll | No | abort: cancel the entire scheduled action across all targets. When true, appliesTo is ignored; when false/omitted, supply appliesTo. | |
| pageSize | No | Results per page (default: 25, max: 500) | |
| appliesTo | No | Targets for schedule (each {appliesToId, appliesToTypeId}); for abort, the computers to cancel (each {appliesToId}). Resolve ids via get_applies_to. | |
| startDate | No | When the rollout starts (ISO 8601). Defaults to now. | |
| pageNumber | No | Page number (default: 1) | |
| searchText | No | Free-text filter for search (e.g. computer name). | |
| batchAmount | No | Computers updated per batch (REQUIRED for schedule). Omitting it would update the whole fleet at once. | |
| isAscending | No | Sort order. Note: the API inverts this — true (or omitted) returns results in descending order (high to low); set false for ascending. Default: true. | |
| scheduledId | No | Filter search to the computers within a specific scheduled action (GUID). Find via list first. | |
| fetchAllPages | No | Fetch all pages automatically (max 10 pages). Default: false (single page). | |
| scheduledType | No | Scheduled type: 1=Version Update (the only supported type). Default: 1. | |
| windowEndTime | No | Daily window end, 24h "HH:MM". | |
| includeChildren | No | Include child organizations (list and get_applies_to actions) | |
| organizationIds | No | Filter by organization GUIDs. Find via organizations first. | |
| response_format | No | Output format: markdown (default, human-readable) or json (structured) | markdown |
| targetVersionId | No | ThreatLocker version GUID to roll out (schedule action). Get it from the versions tool value field. | |
| windowStartTime | No | Daily window start, 24h "HH:MM". | |
| computerGroupIds | No | Filter by computer group GUIDs. Find via computer_groups first. | |
| scheduledActionId | No | Scheduled action GUID (required for get). Find via list or search first. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | Response data — shape varies by action |
| error | No | |
| success | Yes | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral context beyond annotations: the isAscending inversion pitfall, search being keyed by scheduledId, pagination behavior, required permissions, and key response fields. It also discloses that schedule/abort are mutations, which aligns with readOnlyHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Despite being long, the description is well-structured with sections for workflows, pitfalls, permissions, pagination, response fields, and related tools. Every section earns its place given the tool's 22-parameter complexity and mixed read/write actions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers typical workflows, important pitalls, permissions, pagination behavior, response fields, and relations to sibling tools. With an output schema present, no critical guidance is missing for an agent to select and invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage, baseline is 3, and the description adds meaning by explaining cross-parameter behavior: how scheduledId filters search, how batchAmount omission affects scheduling, how isAscending is inverted, and how fetchAllPages works. This exceeds what the schema alone provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly names the resource (ThreatLocker scheduled agent actions) and lists the main query workflows, distinguishing it from related tools. However, the opening verb 'Query' understates the tool's full scope, since the action enum also includes schedule and abort mutations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Common workflows map actions to use cases, and related tools are named with their purpose (computers, computer_groups, organizations). It gives good context but does not explicitly state when not to use this tool versus a specific alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
storage_policiesThreatLocker Storage PoliciesARead-onlyIdempotent
Query ThreatLocker storage control policies.
Storage policies define rules for file and folder access on endpoints — controlling which applications can read, write, or execute from specific storage locations (local drives, USB devices, network shares).
Common workflows:
List all storage policies: action=list
Search by name: action=list, searchText="USB"
Filter by computer group: action=list, appliesToId="group-id"
Get policy details by ID: action=get, storagePolicyId="..."
Pitfalls:
Read-only tool: storage policy creation/editing is not available via the public API (no documented write endpoint).
Storage policies are first-match top-down — permits must be ordered above denies.
Permissions: View Storage Control Policies, Edit Storage Control Policies. Pagination: list action is paginated (use fetchAllPages=true to auto-fetch all pages). Key response fields: storagePolicyId, name, policyType, osType, computerGroupName, isEnabled.
Related tools: policies (application control policies), computer_groups (where policy applies), applications (what the policy permits)
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | get=single policy by ID, list=search/list storage policies | |
| osType | No | OS type: 0=All, 1=Windows, 2=macOS, 3=Linux, 5=Windows XP | |
| pageSize | No | Results per page (default: 25, max: 500) | |
| pageNumber | No | Page number (default: 1) | |
| policyType | No | Filter by policy type (integer). Note: valid values are not documented in the public API/KB; pass only if you know the value from the portal. | |
| searchText | No | Search text to filter policies | |
| appliesToId | No | Computer group GUID to filter by. Find via computer_groups first. | |
| fetchAllPages | No | Fetch all pages automatically (max 10 pages). Default: false (single page). | |
| response_format | No | Output format: markdown (default, human-readable) or json (structured) | markdown |
| storagePolicyId | No | Storage policy GUID (required for get). Find via list action first. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | Response data — shape varies by action |
| error | No | |
| success | Yes | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and idempotentHint annotations, the description discloses that no public write endpoint exists, that policies evaluate first-match top-down with permits above denies, lists required permissions, states pagination behavior, and notes key response fields. This is rich behavioral disclosure with no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well structured with a clear summary line, common workflows, pitfalls, permission/pagination notes, and related tools. Content is front-loaded and every bullet adds operational value without redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter tool with annotations and an output schema, the description covers usage workflows, domain semantics, limitations, permissions, pagination, and key response fields. Nothing essential seems missing for correct selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds meaningful parameter usage patterns with examples for `action`, `searchText`, `appliesToId`, `storagePolicyId`, and `fetchAllPages`, plus a caveat about `policyType` not being documented in public KB. This exceeds the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Query ThreatLocker storage control policies.' It clearly ties policies to file/folder access on storage locations and explicitly distinguishes from `policies` as application control policies in the Related tools section.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides concrete common workflows for list/get, search, filtering, and pagination, and names `policies` as the related sibling with a parenthetical distinction (application control vs storage control). It doesn't explicitly say when NOT to use this tool or give contrastive conditions, but the context is strong enough for an agent to select correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
system_auditThreatLocker System AuditARead-onlyIdempotent
Query ThreatLocker portal audit logs.
System audit tracks administrator actions in the ThreatLocker portal: logins, policy changes, approvals, configuration modifications. This is different from action_log which tracks endpoint events.
Common workflows:
Find all logins in date range: action=search, startDate="...", endDate="...", auditAction=Logon
Find failed login attempts: action=search, ..., auditAction=Logon, effectiveAction=Denied
Find changes by a specific admin: action=search, ..., username="admin@company.com"
Find policy modifications: action=search, ..., auditAction=Modify, details="policy"
Get health center dashboard: action=health_center, days=7
Search health center by location: action=health_center, searchText="lat:X&long:Y"
Audit actions: Create (new objects), Delete (removals), Logon (portal access), Modify (changes), Read (views). Supports * wildcard in text fields.
Permissions: View System Audit, View Health Center. Pagination: search and health_center actions are paginated (use fetchAllPages=true to auto-fetch all pages). Key response fields: systemAuditId, username, action, effectiveAction, details, ipAddress, dateTime.
Related tools: action_log (endpoint events, not portal events), organizations (filter by org)
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Number of days for health_center (default: 7, min: 1, max: 365) | |
| action | Yes | search=query audit logs with filters, health_center=health dashboard data | |
| details | No | Filter by details text (wildcards supported) | |
| endDate | No | End date (ISO 8601 UTC) | |
| objectId | No | Filter by specific object GUID | |
| pageSize | No | Results per page (default: 25, max: 500) | |
| username | No | Filter by admin email address (maps to the API emailAddress field; wildcards supported) | |
| ipAddress | No | Filter by IP address | |
| startDate | No | Start date (ISO 8601 UTC) | |
| pageNumber | No | Page number (default: 1) | |
| searchText | No | Search text for health_center | |
| auditAction | No | Filter by audit action type | |
| fetchAllPages | No | Fetch all pages automatically (max 10 pages). Default: false (single page). | |
| effectiveAction | No | Filter by effective action | |
| response_format | No | Output format: markdown (default, human-readable) or json (structured) | markdown |
| viewChildOrganizations | No | Include child organizations (default: false) |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | Response data — shape varies by action |
| error | No | |
| success | Yes | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, but the description adds substantial behavioral context: required permissions, pagination behavior with max pages, wildcard support, audit action semantics, and key response fields. This goes well beyond the structured annotation data and helps the agent predict side effects and invocation constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded with a clear purpose, followed by a helpful common-workflow section and concise enum/pagination/permission notes. It is longer than minimal but every section earns its place; only minor redundancy with the schema's parameter descriptions prevents a perfect score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 16-parameter tool with two distinct actions, the description is exceptionally complete: it covers both actions, provides concrete usage patterns, explains the key enum values, notes pagination and fetchAllPages, lists required permissions, identifies key response fields, and points to related tools. Since an output schema exists, return-value detail is not required. Nothing critical for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter. The description adds extra meaning through examples (e.g., auditAction=Logon with effectiveAction=Denied for failed logins) and clarifies the audit action enum values (Create, Delete, Logon, Modify, Read) and wildcard usage. It doesn't fully compensate for every parameter's nuance, but it meaningfully augments the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Query ThreatLocker portal audit logs' and immediately clarifies what system audit tracks (administrator actions like logins, policy changes, approvals, configuration modifications). It explicitly differentiates itself from action_log, which tracks endpoint events, so an agent can distinguish this tool from its siblings without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance with common workflow examples for both actions (search and health_center), names the related tool action_log as the alternative for endpoint events, and states required permissions (View System Audit, View Health Center). It also explains pagination behavior, making it clear when fetchAllPages should be used.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tagsThreatLocker TagsA
Query ThreatLocker tags for network and policy management.
Tags are reusable labels for IP addresses, domains, ports, or other network identifiers. They simplify policy management by letting you reference "CRM Servers" instead of listing individual IPs.
Common workflows:
List all available tags: action=dropdown
Include ThreatLocker built-in tags: action=dropdown, includeBuiltIns=true
Get tag details by ID: action=get, tagId="..."
Update tag membership: action=update, tagId="...", organizationId="..." (full-object replace — get first, resend ALL item arrays you want to keep; there is no insert/delete endpoint)
Tags are used in:
Network Control policies (allow/deny traffic to tagged destinations)
Ringfencing (restrict app network access to tagged resources)
Storage Control (restrict file access to tagged paths)
Parent organization tags appear as "parentOrgName\tagName" format.
Pitfalls:
Use dropdown to get the label+value (tagId) needed when building network/ringfence policy payloads.
Parent-organization tags use the "ParentOrg\TagName" format.
Permissions: Edit Network Control Policies, Manage Tags, Edit Application Control Policies. Key response fields: tagId, name, tagType, values (IP/domain/port entries).
Related tools: policies (use tags in policy rules), applications (ringfence with tags)
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Tag name (update). | |
| tagId | No | Tag GUID (required for get, update). Find via dropdown action first. | |
| action | Yes | get=single tag details, dropdown=list all available tags for selection, update=replace a tag's membership (full-object replace — get first, resend all items) | |
| active | No | Whether the tag is active (update; default true). | |
| tagType | No | Tag type filter: 1=Network tags (default) | |
| allTagItems | No | update: optional flattened tag-item view (round-trip from get). | |
| tagItemsIPv4 | No | update: IPv4 entries {label,value}. Full replace. | |
| tagItemsIPv6 | No | update: IPv6 entries {label,value}. Full replace. | |
| tagItemsText | No | update: text/domain entries {label,value}. Full replace. | |
| fetchAllPages | No | Fetch all pages automatically (max 10 pages). Default: false (single page). | |
| organizationId | No | Organization GUID that owns the tag (required for update). | |
| includeBuiltIns | No | Include ThreatLocker built-in tags (default: false) | |
| response_format | No | Output format: markdown (default, human-readable) or json (structured) | markdown |
| tagItemsReadablePath | No | update: readable-path entries {label,value}. Use \\ in path values. Full replace. | |
| tagItemsWritablePath | No | update: writable-path entries {label,value}. Use \\ in path values. Full replace. | |
| includeNetworkTagInMaster | No | Include network tags in master (default: true) |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | Response data — shape varies by action |
| error | No | |
| success | Yes | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description is rich in behavioral detail: full-object replace semantics, 'get first, resend ALL item arrays you want to keep', no insert/delete endpoint, parent-organization naming format, pagination, and permissions. These details go far beyond the annotations and help the agent avoid data loss; no contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with headers, workflows, pitfalls, permissions, and key fields, and it fronts the action patterns. It is long, but the 16-parameter surface justifies it; there is minor redundancy in the parent-tag naming format being stated twice.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (16 parameters, multi-action dispatch, mutable update semantics), the description covers workflows, prerequisites, pitfalls, permissions, key response fields, and related tools. An output schema exists, so the lack of a full return spec is acceptable; the description is complete enough for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description still adds workflow-level semantics: parameter combos for each action, the prerequisite of dropdown before get/update, full-replace behavior of item arrays, and the need for organizationId on update. This materially helps correct parameter selection beyond the schema itself.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource (ThreatLocker tags) and enumerates the exact actions (dropdown, get, update) with common workflows, so an agent can tell what the tool does. It slightly understates scope by opening with 'Query' when a full-object-replace update is also a core operation, but the body immediately corrects that.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Common workflows act as usage guidance: 'List all available tags: action=dropdown', 'Update tag membership: action=update, tagId=..., organizationId=...'. It gives clear contextual advice such as using dropdown to obttain tagId for policy payloads, though it does not explicitly state when not to use this tool versus a sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_requestsThreatLocker Upload RequestsA
Request and retrieve forensic file uploads from endpoints.
Common workflows:
Request a file upload: action=insert, uploadRequestId=, organizationId="...", computerId="...", shA256="..." (or filepath)
Retrieve an upload request: action=get, uploadRequestId="..."
Pitfalls:
The SHA-256 field is literally "shA256" (odd casing) in the API.
insert requires you to supply a fresh uploadRequestId GUID.
Writes are payload-verified, NOT live-tested.
Permissions: View Unified Audit / forensics.
Related tools: action_log (locate the file event), computers (get computerId)
| Name | Required | Description | Default |
|---|---|---|---|
| hash | No | ThreatLocker hash of the file. | |
| action | Yes | insert=request a file upload from an endpoint (forensics), get=retrieve an upload request | |
| shA256 | No | SHA-256 of the file (note the API field casing "shA256"). | |
| filename | No | File name to upload. | |
| filepath | No | Full file path (use \\ for backslashes). | |
| computerId | No | Computer GUID the file lives on (required for insert). | |
| fetchAllPages | No | Fetch all pages automatically (max 10 pages). Default: false (single page). | |
| organizationId | No | Organization GUID (required for insert). | |
| response_format | No | Output format: markdown (default, human-readable) or json (structured) | markdown |
| uploadRequestId | No | Upload-request GUID. For insert, supply a NEW GUID; for get, the existing one. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | Response data — shape varies by action |
| error | No | |
| success | Yes | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses important behavioral caveats beyond annotations: the field casing quirk 'shA256', the need for a fresh GUID on insert, and 'Writes are payload-verified, NOT live-tested.' Annotation contradictions: false; readOnlyHint=false is consistent with write operations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with 'Common workflows', 'Pitfalls', and 'Permissions' sections. Every sentence adds value, and key constraints are front-loaded before peripheral options.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the 10 params, output schema, and annotations, the description covers the core actions, required fields, critical pitfalls, permissions, and related tools. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds workflow-level meaning: which parameters are required for insert vs get, the new-GUID requirement for uploadRequestId, and the shA256 casing pitfall. This enriches the schema without duplicating it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the verb + resource: 'Request and retrieve forensic file uploads from endpoints.' It explicitly distinguishes the two core actions (insert vs get) and is clearly differentiated from related siblings like action_log and approval_requests.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit common workflows with exact action values and required parameters ('action=insert, uploadRequestId=<new GUID>...'), plus related tools for supporting context (action_log for locating events, computers for computerId). It also states permissions needed, giving clear guidance on when and how to use the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
versionsThreatLocker VersionsARead-onlyIdempotent
Query available ThreatLocker agent versions.
Returns all agent versions available in the portal, including which are enabled for installation, which is the default for new groups, and when each was released.
Common workflows:
List all available versions: action=list
Find the latest version: action=list, look for highest version number with isEnabled=true
Check if a specific version is still available: action=list, search results for version string
Identify the default version for new computer groups: action=list, look for isDefault=true
Plan upgrade rollouts: action=list, compare to installed versions from computers tool
Permissions: Edit Computers, Edit Computer Groups, View Computers, Install Computers. No pagination — returns all versions in a single response. Key response fields: label (version string), value (version ID), isEnabled, dateTime (release date), isDefault, OSTypes.
Related tools: computers (see installed versions per machine), scheduled_actions (schedule version updates), computer_groups (group-level version settings)
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | list=get all available ThreatLocker agent versions | |
| fetchAllPages | No | Fetch all pages automatically (max 10 pages). Default: false (single page). | |
| response_format | No | Output format: markdown (default, human-readable) or json (structured) | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | list: array of agent versions |
| error | No | |
| success | Yes | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly, openWorld, idempotent, and non-destructe behavior. The description adds useful context: permissions required, response fields, and the claim 'No pagination — returns all versions in a single response.' However, that claim is in tension with the fetchAllPages parameter in the schema, which makes the behavioral guidance slightly inconsistent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized into summary, workflows, permissions, pagination, response fields, and related tools; every section serves a purpose. Minor repetition of 'action=list' in each workflow bullet pads the text slightly, but it remains easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and strong annotations, the description does not need to explain return values, yet it still enumerates permissions, no-pagination behavior, key response fields, and common workflows. The only notable gap is the ambiguity between the 'No pagination' statement and the fetchAllPages parameter, which an agent would need to reconcile before calling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with clear enum/default/description for every parameter, so the baseline of 3 applies. The description reinforces action=list and lists key response fields, but it adds little parameter-specific meaning beyond the schema. The 'No pagination' note also mildly conflicts with the fetchAllPages parameter, preventing a higher score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Query available ThreatLocker agent versions,' a clear verb and resource, and then specifies what is returned: enabled versions, default version, and release dates. It also references related tools and workflows, helping distinguish it from siblings like computers and computer_groups.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Common workflows' section gives concrete scenarios with action=list, such as finding the latest version, checking availability, and identifying defaults. It also points to related tools like computers for installed versions and scheduled_actions for updates, though it stops short of explicit 'use X instead' exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
18 tool updates
v1.3.1- First observed
action_log - First observed
applications - First observed
approval_requests - First observed
computer_groups - First observed
computers - First observed
maintenance_mode - First observed
network_access_policies - First observed
online_devices - First observed
organizations - First observed
policies - First observed
reports - First observed
saved_searches - First observed
scheduled_actions - First observed
storage_policies - First observed
system_audit - First observed
tags - First observed
upload_requests - First observed
versions
TDQS
Scored across 18 tools
Each tool maps to a distinct ThreatLocker domain—computers, groups, applications, policies, logs, approvals, organizations, reports, maintenance, scheduling, tags, storage/network policies, versions, online devices, saved searches, and upload requests. Potential overlaps like system_audit vs action_log and policies vs storage_policies/network_access_policies are clearly differentiated by both naming and description.
All tools follow the same snake_case resource-noun pattern: computers, computer_groups, applications, policies, action_log, maintenance_mode, storage_policies, etc. While actions are passed via an 'action' parameter rather than verb-prefixed tool names, the convention is uniform and easy to predict.
18 tools is above the ideal 3-15 range, but the count is justified by the breadth of the ThreatLocker platform—each tool covers a distinct functional area. It feels slightly heavy rather than bloated, and there are no redundant tools that could be merged.
Core lifecycle coverage is strong for applications and policies (create/update/delete/deploy), and there are solid querying tools for logs, approvals, and computers. However, several areas are read-only or lack management operations: computer_groups cannot be created/edited/deleted, storage_policies and network_access_policies are read-only, maintenance_mode is history-only, and scheduled_actions cannot be created or cancelled.
Maintenance
Related MCP Connectors
Official Microsoft MCP Server to query Microsoft Entra data using natural language
An MCP server that provides an API to LLMs to manage their JumpCloud resources.
MCP server for Pentest-Tools.com: run scans, manage findings and reports via your preffered LLM.
MCP server that lets AI assistants use all OneSchema features exposed via the public API.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceMCP server for ThreatLocker — zero-trust application allowlisting, approval requests, audit logs1-

DelineaMCPofficial
AlicenseNot gradedqualityBmaintenanceMCP server for the Delinea Secret Server and Platform APIs, enabling AI agents to manage secrets, users, groups, folders, roles, and access requests through natural language commands.46MIT- AlicenseNot gradedqualityBmaintenanceMCP server that enables AI-powered assessment of Active Directory on-premises environments by exposing AD data as queryable tools for LLMs like Claude.MIT
- AlicenseCqualityCmaintenanceAn MCP server that connects AI assistants to the ThreatLocker Portal API with 44 tools for managing computers, approvals, action logs, tags, maintenance mode, and more across single-org and multi-tenant setups.441MIT