Skip to main content
Glama
ukkugh

tenable-identity-exposure-mcp

by ukkugh

Tenable Identity Exposure MCP Server

An MCP server exposing the Tenable Identity Exposure (TIE, formerly Tenable.ad) REST API as tools for LLM clients. Built on FastMCP from the official mcp SDK.

Verified end-to-end against a live TIE SaaS instance (v3.120.1).

⚠️ Disclaimer: This is not an officially supported Tenable project. It was built with assistance from Claude — treat its output as a starting point and validate responses against the Tenable console before acting on them.

Origin: this repository builds on knethteo/tenable-identity-exposure-mcp by Kenneth Teo, MIT-licensed. See LICENSE for the original copyright.

Credentials are never stored in this repository

There is no API key here, and there never has been — .env is git-ignored and absent from the history. Every user supplies their own key at runtime; see Configuration. TIE API keys are per-user, do not expire, and inherit the issuing account's console permissions, so share a single key only if you are willing to lose per-person attribution in the TIE audit log. Prefer one least-privilege key per person.

Tools

Tool

Description

tie_catalog

List available resources (flat + nested) — call this first

tie_request

Raw HTTP call to any endpoint (method, path, params, body)

tie_resource_action

Generic CRUD (list/get/create/update/delete) on flat resources

tie_recent_activity

Unified IoE+IoA timeline for the last N hours (one call)

tie_profiles

List security profiles (IoE/IoA data is profile-scoped)

tie_scores

Per-directory security scores for a profile

tie_topology

AD topology (domains, forests, trusts) for a profile

tie_attacks

IoA attack instances (requires resource_type + resource_value)

tie_alerts

Alerts for a profile

tie_deviances

IoE deviant AD objects for a checker within a time window

tie_deviances_by_checker

Full IoE deviances for a checker (no date filter)

tie_deviances_by_directory

Full IoE deviances for a directory (no date filter)

tie_search_events

Search AD security events in a date range

tie_search_ad_objects

Search AD objects (users/computers/groups/OUs)

tie_whoami

Current user identity, roles, permissions

tie_checkers_summary

All IoE checker definitions, essential fields only (no description blobs)

tie_deviances_bulk

All active IoE deviances in a few paginated calls

Read-only by default

Non-GET calls are refused unless the server is started with --allow-writes (or TIE_ALLOW_WRITES=true). This applies to tie_request and to the create/update/delete actions of tie_resource_action.

Some endpoints are never writable, even with --allow-writes: users, roles, saml-configuration, ldap-configuration, syslogs, email-notifiers, lockout-policy, application-settings, attack-type-configuration, license, infrastructures, directories, and the uncatalogued /api/login, /api/logout, /api/relays. These reconfigure authentication, access control, or alert/log forwarding, change the monitored AD topology, or — in the case of /api/login — would turn the server into a credential-testing oracle for the console. The block covers nested routes too, so PATCH /api/infrastructures/{i}/directories/{d} is refused, not just the top-level path.

Deviance records are never writable either. PATCH/PUT/DELETE is refused on /api/profiles/{p}/checkers/{c}/deviances and /api/profiles/{p}/checkers/{c}/ad-objects/{a}/deviances, alongside the single-deviance route the topology block already covered. Those two bulk routes close every deviance for a checker or an AD object in one call: silently erasing findings is the worst thing this server could be talked into doing. POST on the same paths is a search and stays available — TIE models several reads as POST.

Credential endpoints are never readable either, by any method or tool and regardless of --allow-writes:

Endpoint

Why

/api/api-key

returns the console API key this server authenticates with

/api/report-access-token

returns the embedded-report access token

/api/relays/linking-key

returns the relay enrolment secret

Read-only mode is worth nothing if the model can read the key: TIE API keys do not expire and carry the issuing account's full console permissions, so anyone who sees the transcript could drive the console directly. tie_catalog declares these endpoints as blocked so the model is told once rather than retrying around one refusal at a time.

Two more endpoints stay readable but come back redacted. Per Tenable's published OpenAPI spec, GET /api/ldap-configuration returns searchUserPassword and GET /api/application-settings returns smtpAccountPassword. Both were already write-protected, but that only guarded writes — reading either one handed the model a live credential, and in the LDAP case searchUserDN + searchUserPassword is a complete Active Directory service-account bind pair, not merely a console one.

Blocking them outright would cost real audit capability (whether LDAP is enabled, which SMTP relay is configured, the log-retention window), so the endpoints remain readable and only the credential fields are replaced:

{ "enabled": true, "url": "ldaps://dc1.example",
  "searchUserDN": "CN=svc-tie,OU=Service,DC=example",
  "searchUserPassword": "<redacted: credential; this server never returns it>" }

The redaction matches field names (password, passphrase, secret, privatekey) so a credential field Tenable adds later is covered without a code change, and it is applied only to those two endpoints — Active Directory data legitimately carries PasswordNeverExpires, passwordLastSet and "Password not required", and those are the findings this server exists to report, not secrets to hide. A field that is absent or empty is left as-is, so "no bind password is configured" stays a readable answer.

tie_request also refuses absolute URLs — only server-relative paths such as /api/about are accepted, so the API key cannot be sent to another host.

None of this replaces server-side authorization. Scope the API key to a least-privilege TIE role as well.

Time windows, profiles, and token budget

  • Time-aware tools (tie_recent_activity, tie_deviances) accept a relative hours=N window or explicit date_start/date_end. All timestamps are UTC.

  • IoE/IoA data is profile-scoped. The API does not expose which profile your console has selected, so pass profile_id explicitly — use tie_profiles to list them.

  • By default, deviance/object results are slimmed: descriptions are rendered from their templates and oversized attribute values (SID lists, member dumps) are dropped. Pass verbose=true for the full raw payload. This applies to every deviance tool, tie_deviances_bulk included — at its default caps (4,000 records) the raw payload runs to tens of megabytes.

  • Results that were cut short say so. Anything that stops at a page cap, a result cap, or a failed sub-lookup reports it in a notes array, and a directory list that cannot be read is an error rather than an empty timeline. Read notes before concluding that something does not exist.

Related MCP server: Tenable Identity Exposure MCP Server

Configuration

Set via environment variables (or the equivalent CLI flags):

Variable

Flag

Description

TIE_URL

--tie-url

Base URL, e.g. https://your-client.tenable.ad

TIE_API_KEY

--tie-api-key

API key (see below)

TIE_VERIFY_SSL

--no-verify-ssl

true (default); false for self-signed certs

TIE_ALLOW_WRITES

--allow-writes

false (default) — see Read-only by default

--host / --port

Bind address for sse/http; 127.0.0.1:8000 by default

--allowed-host

Extra Host header value to accept on sse/http (repeatable) — see below

Auth uses the X-API-Key header.

Getting the API key: TIE console → user profile icon (top right) → My Account / PreferencesAPI key. It is a per-user setting, the same path on SaaS and on-premises. The key inherits the issuing account's role permissions, so create a dedicated least-privilege service account for it.

Not a Tenable Vulnerability Management key. TIE uses a single opaque key in an x-api-key header against your own console hostname (https://<client>.tenable.ad). Tenable VM / Tenable One use an accessKey+secretKey pair in an X-ApiKeys header against cloud.tenable.com. They are not interchangeable — and if Tenable Cloud Data Collection is enabled, TIE auto-creates tie-{username}-{random} accounts inside your Tenable VM container that will not work here.

Install & run

Setting this up for the first time? ONBOARDING.md walks through it end to end on Windows, Linux, and macOS — install, getting an API key, registering with Claude Code, and a set of checks to confirm it works. The rest of this section is the short version.

python -m venv .venv && . .venv/bin/activate
pip install -e .

cp .env.example .env   # fill in TIE_URL and TIE_API_KEY

# stdio (Claude Desktop / Claude Code)
set -a; . ./.env; set +a
tenable-tie-mcp

# or network transports (bind 127.0.0.1 by default — they have no auth of
# their own, so widen --host only behind an authenticating proxy)
tenable-tie-mcp --transport sse --port 8000
tenable-tie-mcp --transport http --port 8000

Reaching a network transport from another host

FastMCP validates the Host header against an allow-list that contains only loopback names, so --host alone is not enough: a server bound to 0.0.0.0 answers 421 Misdirected Request to any client that addresses it by IP or DNS name. Name the host your clients actually use:

# clients connect to http://tie-mcp.internal:8000/sse
tenable-tie-mcp --transport sse --host 0.0.0.0 --port 8000 \
                --allowed-host tie-mcp.internal:8000

Passing --host <name> (rather than 0.0.0.0) adds that name automatically. Loopback stays accepted either way, and the server logs a warning whenever the allow-list is widened — this is a Host header check, not authentication. Anyone who can reach the port inherits the configured API key's permissions, so put it behind an authenticating proxy.

Tests

uv pip install --group dev
pytest
mypy

Running with uv / uvx (alternative to a manual venv)

uv can manage the environment for you. uv is the full tool; uvx (alias for uv tool run) runs a package in a throwaway env, like npx. Both need uv installed (brew install uv).

# uv run: resolves deps from pyproject.toml into a managed .venv, then runs
uv run tenable-tie-mcp

# uvx: run ephemerally from the project path, nothing persisted
uvx --from . tenable-tie-mcp

Claude Desktop / Claude Code config

Use the full path to the executable. Claude Desktop does not launch from your shell, so it does not inherit your PATH — a bare tenable-tie-mcp will fail with "command not found" unless the tool is on the system PATH (e.g. a pipx install).

For a venv install, point at the venv's launcher:

{
  "mcpServers": {
    "tenable-tie": {
      "command": "/absolute/path/to/tenable-ie-mcp/.venv/bin/tenable-tie-mcp",
      "env": {
        "TIE_URL": "https://your-host.tenable.ad",
        "TIE_API_KEY": "your-key"
      }
    }
  }
}

Find the exact path with echo "$PWD/.venv/bin/tenable-tie-mcp" from the project root. See claude_desktop_config.sample.json for a complete example.

If you installed globally with pipx install . (or uv tool install), the bare "command": "tenable-tie-mcp" works because it lands on the system PATH.

With uv (alternative)

Point command at the full path of uv (which uv, e.g. /opt/homebrew/bin/uv) and let it manage the environment:

{
  "mcpServers": {
    "tenable-tie": {
      "command": "/opt/homebrew/bin/uv",
      "args": ["run", "--directory", "/absolute/path/to/tenable-ie-mcp", "tenable-tie-mcp"],
      "env": {
        "TIE_URL": "https://your-host.tenable.ad",
        "TIE_API_KEY": "your-key"
      }
    }
  }
}

Docker

docker compose up --build   # reads TIE_URL / TIE_API_KEY from environment

Example prompts

  • "Show me IoE and IoA activity in the last 12 hours." → tie_recent_activity

  • "Which security profiles exist?" → tie_profiles

  • "List the monitored directories and their security scores."

  • "Show the latest IoA attacks against directory 8."

  • "What IoE deviances appeared for checker 15 in the last day?" → tie_deviances

  • "Show unread alerts for profile 2."

Notes

  • profile_id defaults to 1 (the default Tenable profile) in the convenience tools.

  • Attacks must be scoped: resource_typeinfrastructure|directory|hostname|ip and resource_value is the id or name/ip.

  • Non-JSON responses are returned as {"content_type": ..., "text": ...} rather than crashing.

  • Scoring and prioritization: TIE checkers carry no native severity or criticality score — the published checker schema has no such field. remediationCost is the only effort hint, and note that it comes back as an integer (the console renders the easy / medium / hard labels itself) and Tenable marks it deprecated, so it is a weak basis for ranking on its own. If your workflow requires AES (Asset Exposure Score) or ACR (Asset Criticality Rating) — for example, to rank affected identities by business risk — connect your environment to Tenable One. Tenable One aggregates data across TIE, Tenable Vulnerability Management, and other sources to produce unified AES/ACR scores that can be surfaced here via the API.

Available Tools

17 tools
tie_alertsA

List alerts for a security profile.

Args: profile_id: Security profile id (default 1). page: Page number (1-based). per_page: Results per page. archived: Optionally filter by archived status (True/False).

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
archivedNo
per_pageNo
profile_idNo

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden of behavioral disclosure. It states that this is a listing operation, implying read-only, and describes pagination parameters. However, it does not disclose any response format, result ordering, or potential side effects beyond what can be inferred from 'list'.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise: a single-purpose sentence followed by a clean argument list. It is front-loaded with the action, and every line serves a purpose, covering all parameters without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

While the parameter documentation is clear, there is no output schema and the description does not mention what the returned alert objects contain. For a list tool, an agent needs to know the shape of the results to process them correctly, making the description incomplete in that respect.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has no property descriptions (0% coverage), but the description explicitly explains each parameter: profile_id, page, per_page, and archived. This fully compensates for the lack of schema descriptions and adds meaning beyond type/default information.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'List alerts for a security profile' with a specific verb and resource. It distinguishes from sibling tools like tie_scores and tie_topology by focusing on alerts.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context: use this tool to list alerts filtered by profile, pagination, and archived status. It does not explicitly mention when not to use it or alternatives, but the purpose is sufficiently clear to guide selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tie_attacksA

List IoA attack instances for a resource within a profile.

The TIE API requires scoping attacks to a resource. For example, to see attacks against directory id 8: resource_type="directory", resource_value="8".

Args: resource_type: What resource_value refers to — infrastructure, directory, hostname, or ip. resource_value: The id (for infrastructure/directory) or name/ip value to scope to. profile_id: Security profile id (default 1). attack_type_ids: Optional list of attack type ids to filter (e.g. DCSync, Kerberoasting). date_start: Optional ISO 8601 start of date range. date_end: Optional ISO 8601 end of date range. include_closed: Include closed attacks (default False). limit: Max results (default 50). order: Sort order by date, "desc" (newest first) or "asc". search: Optional free-text search filter.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
orderNodesc
searchNo
date_endNo
date_startNo
profile_idNo
resource_typeYes
include_closedNo
resource_valueYes
attack_type_idsNo

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden of explaining behavior. It discloses key defaults (include_closed=False, limit=50, order=desc) and explains the meaning of order and the requirement of resource scoping. It does not mention pagination, auth, or error behavior, but for a read-only list tool this is reasonable. It adds value beyond the schema by describing the effect of parameters.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured: a one-sentence purpose, a brief context paragraph with an example, and a clean list of arguments. Every sentence adds value, and the front-loaded purpose makes it easy for an agent to quickly understand the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 10 parameters, no output schema, and no annotations, the description covers the necessary context thoroughly. It explains the required scoping, all parameters with defaults, and provides an example. It is complete enough for an agent to invoke the tool correctly without additional documentation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has no parameter descriptions (0% coverage), so the description fully compensates by explaining every parameter in the Args section. It clarifies resource_type values, resource_value meaning, attack_type_ids examples (DCSync, Kerberoasting), ISO 8601 for dates, and default values. This is essential and well done.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'List IoA attack instances for a resource within a profile.' This clearly states the tool's function and scope, and distinguishes it from sibling tools like tie_alerts or tie_search_events that target different data. The example further clarifies the intended use.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states that the TIE API requires scoping attacks to a resource and gives a concrete example with resource_type and resource_value. This provides clear context for when and how to use the tool. However, it does not explicitly mention alternatives or when not to use this tool, so it falls 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.

tie_catalogA

List all available Tenable Identity Exposure API resources and their paths.

Call this first to discover what resources exist before using other tools.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of disclosing the tool's behavior. It clearly states that the tool lists resources and paths, and the instruction to call it first implies it is a safe, read-only discovery operation. The context signals also confirm no parameters are needed, reinforcing that it is a straightforward listing action.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise, consisting of two short sentences. The first sentence states the primary function, and the second provides usage guidance. Every word earns its place, and the information is front-loaded with the action and target.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (no parameters, no complex logic) and the presence of an output schema, the description fully covers what an agent needs to know. It explains what the tool returns (a list of resources and paths) and when to invoke it (first). The absence of side effects and the read-only nature are implied clearly enough for a catalog discovery tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, and the input schema is an empty object, so there is no parameter information to clarify. The description correctly adds no parameter details because none exist. According to the rubric, a baseline of 4 is appropriate for 0-parameter tools.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses the specific verb 'List' and identifies the resource as 'all available Tenable Identity Exposure API resources and their paths', which precisely states what the tool does. It also distinguishes itself from the sibling tools by framing itself as the discovery entry point, saying 'Call this first to discover what resources exist before using other tools.'

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use the tool: 'Call this first to discover what resources exist before using other tools.' This clearly indicates the intended usage context. However, it does not mention any exclusions or alternative scenarios, so it stops short of a perfect score.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tie_checkers_summaryA

Get all IoE checker definitions — essential fields only, no description blobs.

Returns id, codename, name, categoryId, and remediationCost for every checker. This is ~100x smaller than tie_resource_action resource="checkers", which embeds multi-KB description/recommendation/vulnerabilityDetail blobs per checker (~500 KB total for ~64 checkers). Use this to enumerate checkers, build a remediation plan, or map deviance checkerId values to human-readable names.

Note: TIE checkers carry remediationCost (easy/medium/hard) but no native severity/ criticality score. For AES (Asset Exposure Score) or ACR (Asset Criticality Rating) scoring, connect to Tenable One — see the README for details.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the transparency burden. It discloses the return fields, the size/performance advantage (~100x smaller), and clarifies that checkers have no native severity/criticality score. While it doesn't explicitly state read-only behavior, the context makes it obvious; a 4 reflects strong transparency with minor omissions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear opening sentence, followed by return field details, performance context, and usage guidance. It is slightly longer than strictly necessary, but every sentence serves a purpose, so it remains concise without padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description fully covers the tool's purpose, output, performance characteristics, and relationship to sibling tools, all within a zero-parameter context. It also explains a domain-specific nuance (remediationCost vs severity) and directs to external resources when needed, leaving no significant gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has 0 parameters, so the schema provides complete coverage. Per the rubric, zero params earns a baseline score of 4. The description adds no parameter-specific detail because none is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Get all') and resource ('IoE checker definitions') with a clear scope ('essential fields only'). It explicitly contrasts with tie_resource_action resource="checkers", thereby distinguishing it from a sibling tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly lists use cases: 'enumerate checkers, build a remediation plan, or map deviance checkerId values to human-readable names.' It also notes the alternative for full data (tie_resource_action) and points to Tenable One for AES/ACR scoring, 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.

tie_deviancesA

Find AD objects with IoE deviances for a checker within a time window.

This is the time-filterable deviance query (server-side dateStart/dateEnd via the checker's ad-objects/search endpoint). Provide hours for a relative window (e.g. hours=12) or explicit date_start/date_end. With neither, defaults to the last 24h.

Args: checker_id: IoE checker id (see resource="checkers"). profile_id: Security profile id (default 1). Note: your console may use a non-default profile — call tie_profiles to list them. directory_ids: Restrict to these directory ids (default: all directories in scope). hours: Relative look-back window in hours (e.g. 12). Ignored if date_start given. date_start: Explicit ISO 8601 UTC start (e.g. "2026-07-07T16:00:00.000Z"). date_end: Explicit ISO 8601 UTC end (default: now). reasons: Optional reason ids to filter (see /api/profiles/{id}/checkers/{id}/reasons). show_ignored: Include deviances that are currently ignored (default False). page: Page number (1-based). per_page: Results per page. verbose: If False (default), truncate giant attribute values.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
hoursNo
reasonsNo
verboseNo
date_endNo
per_pageNo
checker_idYes
date_startNo
profile_idNo
show_ignoredNo
directory_idsNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It discloses server-side date filtering, defaults to the last 24h, truncation of attribute values when verbose=False, pagination behavior, and show_ignored semantics. It stops short of mentioning authentication, rate limits, or error handling, but for a read-only search tool it provides substantial behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a one-sentence summary, a clarifying note about time windows, and a bulleted Args list. It is longer due to 11 parameters, but each sentence and bullet is informative. A tighter wording (e.g., combining some defaults) could slightly improve it, but it is not bloated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 11 parameters, no output schema, and no annotations, the description covers all parameters, defaults, and endpoint behavior. It mentions server-side execution and verbose truncation, which helps infer return shape, but it does not explicitly describe the response structure or error scenarios. Still, it is nearly complete for a list/query tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. The 'Args' section explains all 11 parameters with types, defaults, and formats (e.g., 'ISO 8601 UTC start', 'default: all directories in scope', 'ignored if date_start given'). This adds significant meaning beyond the schema's bare names and types.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Find AD objects with IoE deviances for a checker within a time window,' which is a specific verb + resource + scope statement. It clearly positions this as the time-filterable deviance query, distinguishing it from sibling tools like tie_deviances_by_checker, tie_deviances_bulk, and tie_deviances_by_directory.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly frames this as 'the time-filterable deviance query' and explains when to use hours vs. explicit date_start/date_end, implying this is the go-to for time-windowed deviance lookups. It also cross-references tie_profiles for profile selection, offering practical context, though it does not explicitly list exclusions or name alternative tools for other scenarios.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tie_deviances_bulkA

Fetch all IoE deviances in a few paginated calls (bulk alternative to per-checker fan-out).

Uses GET /api/deviances/changed with cursor pagination to pull deviances across all checkers at once — typically 1–5 API calls instead of one call per checker (~64). This is the recommended starting point for remediation-plan workflows.

Deviances include checkerId and adObjectId (numeric ID, not display name). Use tie_checkers_summary to map checkerId → checker name, and tie_search_ad_objects to resolve adObjectId → object name if needed.

Args: profile_id: Filter to a specific profile id (client-side). None = include all profiles. resolved: Include resolved/closed deviances (default False = active only). batch_size: Records per API page (default 200). max_batches: Safety cap on pagination loops (default 20 = up to 4000 records).

ParametersJSON Schema
NameRequiredDescriptionDefault
resolvedNo
batch_sizeNo
profile_idNo
max_batchesNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full transparency burden and delivers. It discloses pagination mechanics (cursor pagination, 1–5 API calls), the safety cap logic, and the data fields returned (checkerId, adObjectId). It also clarifies the client-side filtering behavior for profile_id, which is beyond parameter semantics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured with a purpose-led opening, a data note, and a parameter list. Each sentence earns its place; no fluff or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the tool's functionality, pagination behavior, parameter semantics, and ID resolution paths. It doesn't fully describe the output record structure beyond the two key fields, but given the context and sibling tools, it is sufficient for the agent to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description includes an Args section that explains each parameter's purpose and behavior, going far beyond the schema's type/default only. It defines client-side filtering, resolved inclusion logic, batch size meaning, and the max_batches safety cap with concrete record limits. This fully compensates for the 0% schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool fetches all IoE deviances in a paginated bulk call, distinguishing it from the per-checker fan-out approach. It also positions it as the recommended starting point for remediation workflows, making its purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly identifies this as the bulk alternative to per-checker fan-out and recommends it for remediation-plan workflows. It also instructs users on how to map IDs using sibling tools, providing clear usage context. It stops short of explicitly naming the per-checker alternatives, but the context signals and sibling list imply them.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tie_deviances_by_checkerA

List IoE deviances for a given checker within a profile (full detail, no date filter).

For a time-bounded view use tie_deviances(hours=...) or tie_recent_activity instead. The TIE API models this as a POST with a filter expression body; an empty expression returns all deviances for the checker.

Args: checker_id: IoE checker id (see tie_resource_action resource="checkers"). profile_id: Security profile id (default 1). page: Page number (1-based). per_page: Results per page. expression: Optional filter expression object. Defaults to {} (no filter). verbose: If False (default), render descriptions and drop giant attribute values to save tokens. Set True for the full raw payload.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
verboseNo
per_pageNo
checker_idYes
expressionNo
profile_idNo

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Since annotations are absent, the description carries the full responsibility for behavioral disclosure. It reveals that the TIE API models this as a POST with a filter body, explains the effect of the verbose flag on token usage, and states the no-date-filter constraint. These insights go beyond what a simple 'list' would imply and are crucial for an agent to anticipate output size and API semantics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The opening sentence is concise and front-loaded, and the subsequent Args block is necessary given the schema lacks descriptions. While the text is a bit longer than minimal, every sentence earns its place—the POST body detail and verbose explanation are useful, not redundant. A slightly leaner formatting could tighten it, but it remains efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 6-parameter tool with no annotations and no output schema, the description covers all critical aspects: purpose, alternatives, parameter semantics, and even output verbosity control. It does not explicitly describe the return structure, but the phrase 'List IoE deviances' and the verbose flag sufficiently imply the output format. The description is complete enough 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.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description's Args block fully compensates by documenting all six parameters with meaningful details. It explains checker_id references the checkers resource, profile_id default, page and per_page pagination, expression as an optional filter object defaulting to {}, and verbose behavior. This adds far more value than the bare schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'List IoE deviances for a given checker within a profile (full detail, no date filter).' This clearly distinguishes the tool from siblings by explicitly noting the absence of a date filter, making it immediately obvious what the tool does and how it differs from tie_deviances or tie_recent_activity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly provides alternative tools for time-bounded queries: 'For a time-bounded view use tie_deviances(hours=...) or tie_recent_activity instead.' This gives clear when-to-use and when-not-to-use guidance, along with named alternatives. It also explains that an empty expression returns all deviances, further clarifying expected usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tie_deviances_by_directoryA

List IoE deviances for a specific directory (full detail, no date filter).

Args: infrastructure_id: Infrastructure (forest) id — see resource="infrastructures". directory_id: Directory id — see resource="directories". page: Page number (1-based). per_page: Results per page. verbose: If False (default), render descriptions and drop giant attribute values.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
verboseNo
per_pageNo
directory_idYes
infrastructure_idYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden. It discloses that there is no date filter, that it returns full detail, and that verbose=False drops giant attribute values and renders descriptions – concrete behavior beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A one-line summary is followed by a tidy Arg list with each parameter on its own line. No redundant filler; all lines add semantic value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

It covers the tool's purpose and all parameters, but since there is no output schema, it doesn't describe the shape of the returned deviance items or error handling. The absence of explicit alternative-tool guidance leaves a small gap in the overall context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The Args block explains all five parameters, including page being 1-based, per_page as results per page, verbose behavior, and pointers to resource schemas. Since the schema itself has no descriptions, this fully compensates.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'List IoE deviances for a specific directory', providing a clear verb and scoped resource. 'Full detail, no date filter' adds behavioral scope and differentiates it from siblings like tie_deviances and tie_deviances_by_checker.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly states this is for a specific directory, which implies the primary use case. However, it doesn't explicitly name alternative tools or state when not to use it, so it misses exclusionary guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tie_profilesA

List security profiles (id + name).

IoE/IoA data is scoped to a profile. The console has a selected profile that the API does not expose, so pass the right profile_id explicitly to other tools.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the burden of behavioral disclosure. It goes beyond a simple list statement by explaining the data scoping relationship and the need for explicit profile_id, which is important context. Though it doesn't explicitly say 'read-only', the listing verb and context make the safe-read behavior clear.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the core purpose, followed by essential context. Every sentence earns its place without redundancy or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless list tool with no output schema, the description fully covers the return fields (id+name), the reason the tool exists, and how to use the result. It tells the user exactly why they need this tool and what to do with the output, making it complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

This tool has zero parameters, so the baseline is 4. The description adds value by explaining the significance of profile_id that consumers of this tool will use, even though it doesn't need to describe any parameters for this tool itself.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists security profiles with their id and name. It provides a specific verb and resource, and it stands apart from sibling tools by being the only one focused on profiles, which are foundational for other operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains that IoE/IoA data is scoped to a profile and that the console's selected profile is not exposed via API, so users must pass the correct profile_id explicitly to other tools. This gives clear guidance on when to use this tool and how to apply its results.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tie_recent_activityA

Unified recent-activity timeline of IoE alerts and IoA attacks in one call.

Answers questions like "show me IoE/IoA in the last 12 hours". IoE is sourced from the profile's alert feed (time-ordered) and each in-window alert is enriched with its deviance detail (checker + rendered description). IoA is sourced from the attacks endpoint per directory. Results are merged and sorted newest-first. All timestamps are UTC.

Args: hours: Look-back window in hours (default 12). profile_id: Security profile id (default 1). See tie_profiles. include_ioe: Include IoE deviance alerts (default True). include_ioa: Include IoA attacks (default True). directory_ids: Restrict to these directory ids (default: all in scope). max_items: Cap on items per category — IoE and IoA are budgeted separately (default 50). The IoA cap applies across all directories, not per directory; any truncation is reported in notes. verbose: If False (default), attribute values are slimmed.

ParametersJSON Schema
NameRequiredDescriptionDefault
hoursNo
verboseNo
max_itemsNo
profile_idNo
include_ioaNo
include_ioeNo
directory_idsNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It details how IoE alerts are enriched, how IoA is sourced per directory, how results are merged and sorted, UTC timestamp usage, and the separate budgeting of max_items with truncation reported in 'notes.' This is comprehensive and goes far beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and then logically flows into data sources, behavioral details, and parameter explanations. Every sentence adds value; the 'Args' list is a compact and clear way to document seven parameters without verbose prose. The length is appropriate for the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no output schema, the description provides substantial context: data sources, enrichment, merging, sorting, truncation reporting, and defaults. It does not explicitly describe the output item structure, but the mention of 'deviance detail (checker + rendered description)' gives a partial picture. This is strong but leaves some ambiguity about the exact return format.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides only titles and defaults with zero descriptions, but the description's 'Args' section thoroughly explains every parameter, including hours, profile_id, include_ioe/ioa, directory_ids, max_items, and verbose. It also clarifies nuanced behavior like max_items applying separately to IoE and IoA and 'across all directories' for IoA. This fully compensates for the schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Unified recent-activity timeline of IoE alerts and IoA attacks in one call,' which uses a specific verb ('timeline') and clearly identifies the resource and scope. This distinguishes it from sibling tools like tie_alerts and tie_attacks, which likely handle each category separately. The purpose is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a concrete example question ('show me IoE/IoA in the last 12 hours') and explains the data sources, which implies when to use this tool. It references tie_profiles for the profile_id parameter, providing a cross-tool pointer. However, it does not explicitly name alternative tools or state when not to use this one, 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.

tie_requestA

Make a direct HTTP call to any Tenable Identity Exposure API endpoint.

Only server-relative paths are accepted; absolute URLs are refused so the API key cannot be sent to another host. Non-GET methods require the server to have been started with --allow-writes. Credential endpoints are refused for every method, including GET.

Args: method: HTTP method (GET, POST, PUT, PATCH, DELETE). path: API path, e.g. "/api/directories" or "/api/attacks/123". params: Optional query string parameters as a dict. body: Optional request body as a dict (used with POST/PUT/PATCH).

Returns: Parsed JSON response from the TIE API.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNo
pathYes
methodYes
paramsNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and discloses key behaviors: refusal of absolute URLs for security, the --allow-writes requirement for non-GET, credential endpoint blocking, and the return type (parsed JSON). Missing details like error handling or rate limits, but the security constraints add meaningful transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is efficiently structured with a clear lead sentence, security context, parameter list, and return type. Every sentence provides necessary information without redundancy, and the formatting makes it easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a generic raw API caller with no annotations and no output schema, the description covers purpose, constraints, parameters, and return type adequately. It could be more complete by mentioning error/status handling or authentication nuances, but the provided information is solid for typical use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Even though the schema has 0% description coverage, the description's Args section fully explains each parameter. It clarifies the method enum, gives concrete path examples ('/api/directories' or '/api/attacks/123'), and defines params and body as optional dicts with usage notes. This goes well beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states 'Make a direct HTTP call to any Tenable Identity Exposure API endpoint' with a specific verb and resource, clearly distinguishing this generic raw API caller from sibling tools that wrap specific endpoints.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides clear context on when to use this tool (for any endpoint, especially those not covered by dedicated tools) and explicitly lists constraints (server-relative paths only, --allow-writes for non-GET, credential endpoints refused). However, it does not name alternative tools or explicitly say 'use this when no other tool applies'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tie_resource_actionA

Perform CRUD operations on a TIE resource.

Args: resource: Resource name from tie_catalog (e.g. "directories", "attacks", "users"). action: Operation — list, get, create, update, or delete. id: Resource ID for get/update/delete operations. body: Request body for create/update operations. params: Optional query parameters (e.g. pagination, filters).

Writes (create/update/delete) require the server to have been started with --allow-writes, and are refused outright for protected resources such as users, roles, the authentication settings, and the monitored AD topology. Credential resources are refused for every action, including list/get.

Examples: List all directories: resource="directories", action="list" Get directory #5: resource="directories", action="get", id=5 List recent attacks: resource="attacks", action="list", params={"page": 1} Create a dashboard: resource="dashboards", action="create", body={...}

ParametersJSON Schema
NameRequiredDescriptionDefault
idNo
bodyNo
actionNolist
paramsNo
resourceYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full responsibility for behavioral disclosure. It clearly states that writes require --allow-writes, lists protected resources that are refused, and notes that credential resources are refused for all actions. This is strong transparency, though it does not cover error behavior or response format.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is organized with a purpose sentence, an Args list, a restrictions paragraph, and examples. It is longer than strictly minimal but every section contributes necessary information for a generic CRUD tool; there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single generic CRUD tool with no output schema or annotations, the description covers operations, parameters, restrictions, and examples. It is missing return-value and error behavior details and does not explicitly point to tie_catalog for resource discovery, but it is otherwise sufficient for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% parameter descriptions, but the description's Args section fully compensates by explaining every parameter, enumerating the five actions, and providing concrete examples for resource, action, params, and body. This goes well beyond the schema's minimal default values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear verb+resource statement ('Perform CRUD operations on a TIE resource') and enumerates the supported actions. It distinguishes itself from siblings by being the generic CRUD endpoint, though it does not explicitly contrast with dedicated resource tools like tie_attacks or tie_catalog.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides usage context by requiring a resource from tie_catalog and giving concrete examples, but it never explicitly states when to prefer this generic tool over specialized siblings or when not to use it. The restrictions on protected resources are mentioned, but no direct alternatives or exclusions are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tie_scoresA

Get per-directory security scores for a profile.

Returns a list of {directoryId, score} reflecting the AD security posture (higher is better; scores reflect outstanding IoE deviances).

Args: profile_id: Security profile id (default 1).

ParametersJSON Schema
NameRequiredDescriptionDefault
profile_idNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the burden of behavioral disclosure. It explains the return format as a list of {directoryId, score} and interprets the score direction ('higher is better; scores reflect outstanding IoE deviances'), which is valuable context. The verb 'Get' and 'Returns' imply a read-only operation, though it does not explicitly state side-effect freedom or error behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured: a purpose statement, a return-value explanation, and a parameter description. Every sentence earns its place with no unnecessary fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given one parameter, no output schema, and no annotations, the description covers the essential input and output semantics. It explains the returned list structure and score interpretation, making it nearly complete. It does not define 'IoE deviances' or cover pagination, but these may be domain-specific or irrelevant for this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. It adds the meaning 'Security profile id' and notes the default value, which the schema alone does not provide. This is adequate for the single parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Get per-directory security scores for a profile', specifying the verb, resource, and scope. It distinguishes this from sibling tools by focusing on scores rather than raw deviances or topology.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies it is used for retrieving a summary of security posture per directory, but it does not explicitly mention when to choose this over alternatives like tie_deviances_by_directory, nor does it state exclusions. The context is clear but no direct comparisons are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tie_search_ad_objectsA

Find Active Directory objects whose name or DN contains query.

IMPORTANT: /api/ad-objects has no server-side search. It returns the last known state of every object, cursor-paginated (~1000 per page, roughly 2 MB each on a small forest). Filtering here is therefore CLIENT-SIDE, and only objects within the scanned prefix can match — raise max_scanned to widen the sweep, and read scanned/truncated in the result before concluding that something does not exist.

For deviance investigation prefer tie_deviances / tie_deviances_by_checker, which are filtered server-side.

Args: query: Substring to look for, case-insensitive. Matched against objectId and the naming attributes (cn, name, displayName, sAMAccountName, distinguishedName, userPrincipalName) — not against bulk blobs like ntSecurityDescriptor, which would produce meaningless hits. directory_id: Restrict to one directory (see resource="directories"). object_class: Substring of the objectClass attribute, e.g. "user", "computer", "group", "organizationalUnit". Note this is the LDAP objectClass; the object's own type field is the data source (LDAP or SYSVOL), not the object category. max_results: Stop after this many matches (default 50). max_scanned: Cap on objects fetched while searching (default 5000). timestamp: Optional ISO 8601 UTC point in time; defaults to now. verbose: If False (default), oversized attribute values are dropped.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
verboseNo
timestampNo
max_resultsNo
max_scannedNo
directory_idNo
object_classNo

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It does this thoroughly: explains the lack of server-side search, describes client-side scanning semantics, warns about pagination (~1000 per page, ~2 MB each), and tells users to inspect `scanned`/`truncated` in results. This goes far beyond a typical tersely-worded tool description.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Though longer than average, the description's length is justified by the tool's complexity and lack of annotations. The structure is effective: opening purpose, an IMPORTANT behavioral caveat block, a sibling-alternative line, then a cleanly labeled Args list. Every sentence communicates essential operational knowledge, with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers purpose, behavioral constraints, parameter semantics, defaults, result interpretation (`scanned`/`truncated`), and alternatives. Even without an output schema, the tool's return behavior is adequately conveyed. This is a complete, self-sufficient description for a complex search tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for every parameter. It does: `query` (substring matching, case-insensitive, against specific attributes), `directory_id`, `object_class` (LDAP objectClass vs the object's own `type` field), `max_results`, `max_scanned`, `timestamp`, and `verbose` all receive meaningful semantic explanations beyond the bare schema definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'Find Active Directory objects whose name or DN contains `query`.' It clearly distinguishes this from deviance-focused siblings by explicitly naming tie_deviances and tie_deviances_by_checker as the preferred server-side alternatives for deviance investigation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use this tool versus alternatives: 'For deviance investigation prefer tie_deviances / tie_deviances_by_checker, which are filtered server-side.' It also provides critical usage caveats about client-side filtering, `max_scanned`, and reading `scanned`/`truncated` before concluding an object doesn't exist.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tie_search_eventsA

Search AD security events within a date range.

Args: directory_ids: One or more directory ids to search (see resource="directories"). date_start: ISO 8601 start of range, e.g. "2026-07-01T00:00:00.000Z". date_end: ISO 8601 end of range. profile_id: Security profile id (default 1). expression: Optional filter expression object. Defaults to {} (no filter). order: Optional ordering object, e.g. {"column": "date", "direction": "desc"}.

ParametersJSON Schema
NameRequiredDescriptionDefault
orderNo
date_endYes
date_startYes
expressionNo
profile_idNo
directory_idsYes

TDQS

A3.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. However, it only states the action without mentioning whether the operation is read-only, requires special permissions, or has any side effects, pagination behavior, or output format. The term 'search' implies read-only, but it is not explicitly disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with a concise one-sentence purpose, followed by a well-structured Args list. Every line adds necessary detail, and there is no redundant or filler content. The structure is easy to parse and appropriately sized for the 6-parameter tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has 6 parameters, no output schema, and no annotations. While the parameter documentation is complete, the description lacks any indication of the return value, response structure, or potential limitations like pagination. Given the absence of an output schema, this leaves a notable gap for an agent to understand what the tool actually returns.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The Args section thoroughly documents all six parameters, including formats (e.g., ISO 8601 for dates), defaults (e.g., profile_id default 1), and examples (e.g., ordering object). This fully compensates for the 0% schema description coverage, providing meaning beyond the bare type and title information.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose with a specific verb ('Search'), resource ('AD security events'), and scope ('within a date range'). This distinguishes it from siblings like 'tie_search_ad_objects', which searches AD objects instead of events.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for searching security events but provides no explicit guidance on alternatives or when not to use. A clear context is present, but no exclusions or alternative tools are mentioned, leaving the agent to infer from the tool name and sibling list.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tie_topologyA

Get the Active Directory topology (domains, forests, and trust relationships).

Args: profile_id: Security profile id (default 1).

ParametersJSON Schema
NameRequiredDescriptionDefault
profile_idNo

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description carries the full burden. It discloses the output scope (domains, forests, trust relationships) and the read-only nature is implied by 'Get', but it does not mention authentication, permissions, or return format details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise: one purpose sentence followed by a single parameter definition. Every word adds value, and the key information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema or annotations, the description does a good job of stating what the tool returns (domains, forests, trust relationships). It lacks details on response structure or edge cases, but it is sufficient for a simple read-only topology query.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema only provides a type and default for profile_id. The description adds essential meaning by clarifying it is a 'Security profile id', compensating for the 0% schema description coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Get') and a clear resource ('Active Directory topology') with an explicit enumeration of the content (domains, forests, and trust relationships). This clearly distinguishes it from sibling tools like tie_search_ad_objects or tie_catalog.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for retrieving AD topology but provides no explicit guidance on when to use this tool versus alternatives. There are no exclusions or prerequisites mentioned, so the context is clear but not fully prescriptive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tie_whoamiA

Get the current user's identity, roles, and permissions (from the API key).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the burden of disclosing behavioral traits. It mentions that the data comes from the API key, which implies no separate login flow, and the verb 'Get' implies a safe read operation. However, it does not explicitly state that no state is modified or describe error handling for invalid keys, leaving some ambiguity.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, focused sentence that front-loads the action and resource. Every word earns its place, with no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple no-argument tool, the description is complete: it states the returned information (identity, roles, permissions) and the source (API key). No output schema exists, but the description sufficiently explains the return value's nature for the tool's low complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the schema already fully documents argument expectations. The description adds no parameter details but this is unnecessary; a baseline of 4 is appropriate since there are no parameters to compensate for.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function with a specific verb ('Get') and resource ('current user's identity, roles, and permissions'), distinguishing it from sibling tools which all focus on data listings, scoring, or actions rather than user context.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use this tool (to retrieve current user info) and notes the API key as the source, but does not explicitly mention alternatives or exclusions. Since no sibling tool serves this purpose, the guidance is adequate without being explicit.

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.

  1. 17 tool updatesv0.1.0
    • First observedtie_alerts
    • First observedtie_attacks
    • First observedtie_catalog
    • First observedtie_checkers_summary
    • First observedtie_deviances
    • First observedtie_deviances_bulk
    • First observedtie_deviances_by_checker
    • First observedtie_deviances_by_directory
    • First observedtie_profiles
    • First observedtie_recent_activity
    • First observedtie_request
    • First observedtie_resource_action
    • First observedtie_scores
    • First observedtie_search_ad_objects
    • First observedtie_search_events
    • First observedtie_topology
    • First observedtie_whoami

TDQS

A3.9/5.0

Scored across 17 tools

Disambiguation3/5

Several tools overlap in purpose: tie_deviances, tie_deviances_by_checker, tie_deviances_by_directory, and tie_deviances_bulk all query deviances with different parameterizations. tie_resource_action and tie_request both provide generic API access, and tie_recent_activity overlaps with tie_alerts and tie_attacks. Descriptions mitigate some ambiguity, but agents may struggle to pick the right tool for time-bounded deviance queries.

Naming Consistency3/5

All tools share the 'tie_' prefix, but naming patterns are inconsistent: some are verb_noun (tie_search_events), some are noun_phrase (tie_checkers_summary, tie_deviances_bulk), and a few are single nouns (tie_profiles, tie_catalog). The lack of a uniform verb_noun or action-first convention makes the set feel less predictable.

Tool Count3/5

With 17 tools, the set sits just above the ideal 3-15 range. The sheer number of deviance query variants (four) and generic utilities (catalog, request, resource_action) inflate the count, though the complexity of the TIE API partially justifies the breadth.

Completeness4/5

The tool surface covers most core workflows: discovery, topology, scores, events, deviances, attacks, and alerts. Generic CRUD via tie_resource_action fills in gaps. However, there is no explicit tool for mutating deviance state (e.g., ignore or resolve), and the generic tools may not expose all such endpoints cleanly, representing a notable gap.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    C
    quality
    A
    maintenance
    MCP server for the Tenable Identity Exposure API, providing 131 tools for complete API coverage with multi-tenant support and granular security controls.
    100
    27
    16
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Exposes the Tenable Identity Exposure (TIE) REST API as tools for LLM clients, enabling queries on security profiles, activity timelines, AD objects, and more.
    15
    5
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    MCP server for Tenable.io/One Vulnerability Management that provides read-only tools for querying scans, assets, plugins, and vulnerabilities, plus specialized reporting tools for VPR re-prioritization, CISA KEV/EPSS exposure, and scan delta comparisons.
    11
    3
    MIT
  • A
    license
    B
    quality
    B
    maintenance
    A read-only MCP server for Microsoft Intune and Entra ID that enables list, get, search, and reporting operations for tenant visibility, audits, troubleshooting, and health reporting without write actions. It includes authentication helpers, report exports, and metadata discovery tools.
    36
    1
    MIT