Skip to main content
Glama
greynoise-mcp-server

greynoise-mcp-server

Official

GreyNoise MCP Server

A Model Context Protocol server for the GreyNoise API. It gives MCP-compatible clients (Claude Desktop, Claude Code, Cursor, etc.) access to GreyNoise threat intelligence — IP context, GNQL search, Recall timeseries, tags, CVEs, sensor sessions, BSI, callback/C2 data — plus operational tools to act on findings (blocklists and alerts).

Requires a GreyNoise API key. Your plan's entitlements determine which capabilities are available; the server exposes every tool and returns a clear "not entitled" message for any capability your plan doesn't include, so the rest keep working.

Installation

MCPB bundle (Claude Desktop)

Download greynoise-mcp-server.mcpb from the releases page and double-click to install. It prompts for your API key.

npx (config-based clients)

{
  "mcpServers": {
    "greynoise": {
      "command": "npx",
      "args": ["@greynoise/greynoise-mcp-server"],
      "env": { "GREYNOISE_API_KEY": "your-greynoise-api-key" }
    }
  }
}

Local build

{
  "mcpServers": {
    "greynoise": {
      "command": "node",
      "args": ["/absolute/path/to/greynoise-mcp-server/build/index.js"],
      "env": { "GREYNOISE_API_KEY": "your-greynoise-api-key" }
    }
  }
}

Related MCP server: OSINT MCP Server

Configuration

Variable

Required

Default

Purpose

GREYNOISE_API_KEY

yes (stdio)

—

GreyNoise API key. For HTTP transport the key is taken per-request from the Authorization: Bearer header instead.

GREYNOISE_API_BASE

no

https://api.greynoise.io/

Override the API base (e.g. staging).

PORT

no

9191

HTTP transport listen port.

MCP_ALLOWED_HOSTS

no

127.0.0.1:<port>,localhost:<port>

Allowed Host header values (DNS-rebinding protection) for HTTP transport.

Transports

npx @greynoise/greynoise-mcp-server                      # stdio (default)
npx @greynoise/greynoise-mcp-server --transport http     # streamable HTTP on $PORT

stdio is the default and what desktop/CLI clients use. HTTP transport authenticates each request via a Bearer token, builds an isolated server per request, and enforces DNS-rebinding protection. Express is loaded lazily for HTTP; install it if you use that transport (npm install express).

Capabilities

Every tool returns both human-readable text and machine-readable structuredContent (validated against a published outputSchema), and carries MCP annotations so clients can apply safety policy — read-only tools run freely; write tools are marked, and destructive ones (delete-*) request confirmation.

IP analysis

Tool

Description

lookup-ip-context

Full context for one IP: classification, tags, ISI (scan/HTTP/TLS/SSH/TCP raw data), BSI, geo, network metadata.

quick-check-ip

Fast, lightweight classification + business-service check for one IP.

multi-ip-check

Check up to 10,000 IPs at once, with a summary breakdown.

GNQL (GreyNoise Query Language)

Tool

Description

gnql-query

Full GNQL search including raw scan data; scroll pagination.

gnql-metadata-query

Lighter GNQL search (metadata only). Supports format: "csv" for spreadsheet output.

gnql-stats

Aggregate statistics for a GNQL query (top orgs, countries, tags, ASNs, classifications, …).

Recall (temporal analysis)

Tool

Description

gnql-timeseries

Hourly IP-activity records for a query over a time range.

gnql-timeseries-stats

Unique-IP counts per hour/day over a time range.

Tags

Tool

Description

get-tag-list

Complete tag list (cached 1h).

search-tags

Search tags by query / category / intention / CVE.

get-tag-details

Full record for one tag by id or slug.

get-tag-activity

Time-series activity for a tag or CVE.

analyze-tags-activity

Filter tags and aggregate their activity into a summary.

Vulnerabilities

Tool

Description

get-cve-details

GreyNoise intel for one CVE: CVSS/EPSS, KEV status, exploitation + observed activity.

get-trending-vulnerabilities

Currently trending and anomalous vulnerability tags.

Sessions (sensor network data)

Tool

Description

search-sessions

Query/filter sensor sessions over a time range (Lucene syntax).

session-fields

Discover the queryable session field schema.

session-counts

Session counts grouped by one or more fields (nested drill-down).

session-connections

Connection graph (nodes + links) between source/destination fields.

session-timeseries

Session volume over time, optionally grouped by a field.

session-unique-values

Distinct values of a field, optionally with counts.

get-session

Full metadata for one session by ID.

get-session-pcap

Download one session's PCAP to a temp file.

export-sessions-pcap

Export a PCAP across multiple sessions matching a query.

export-session-data

Download one session as PCAP or raw payload.

BSI — Business Service Intelligence (requires BSI license)

Tool

Description

bsi-lookup

Provider matches for one IPv4.

bsi-bulk-lookup

Provider matches for up to 1,000 IPv4 addresses.

bsi-trust-stats / bsi-company-stats / bsi-category-stats

IP/CIDR counts grouped by trust level / company / category.

Callback / C2 (requires entitlement)

Tool

Description

callback-ip-lookup

One callback/C2 IP: attack stage, RIOT status, enrichment, downloaded files.

list-callback-ips

Paginated callback IPs filtered by stage, dates, file attributes, scanners.

export-callback-ips

Export matching callback IPs as a plain list.

callback-overview

Aggregate statistics for matching callback IPs.

Operational — Blocklists (write; requires entitlement)

Tool

Notes

create-blocklist

Create a dynamic blocklist from a GNQL query.

list-blocklists / get-blocklist / get-blocklist-ips

Read.

update-blocklist

Update query/name/limit/enabled.

delete-blocklist

Destructive — clients confirm.

Operational — Alerts (write; requires entitlement)

Tool

Notes

create-alert

Scheduled GNQL alert with email/webhook recipients.

list-alerts / get-alert

Read.

update-alert

Update query/schedule/recipients/name/enabled.

enable-alert / disable-alert

Resume / pause.

delete-alert

Destructive — clients confirm.

test-alert-webhook

Send a test payload to a webhook URL.

Resources

Read-only URIs clients can fetch or reference directly:

Resource

Description

greynoise://ip/{ip}

IP context (JSON).

greynoise://cve/{cveId}

CVE exploitation details (JSON).

greynoise://tag/{slug}

Tag metadata by slug (with slug autocompletion).

greynoise://article/{id}

A single GreyNoise research article.

greynoise://articles

List of published research articles.

greynoise://article-categories

Article categories.

Prompts

Guided analysis workflows:

Prompt

Arguments (* = required)

ip-threat-analysis

ip*, include_related

cve-analysis

cve_id*, timeframe

vendor-threat-report

vendor*, technology, timeframe*

emerging-threat-report

days, focus_area

security-posture-assessment

organization*, technologies*, industry

threat-hunting

indicator_type*, indicator_value*, environment*

Development

npm install
npm run build        # bundle with tsup -> build/index.js
npm run dev          # watch + rebuild + run
npm test             # jest
npm run typecheck    # tsc --noEmit
npm run pack:mcpb    # build the .mcpb bundle

The zod schemas in src/greynoise/schemas/ are the single source of truth for API response shapes (they validate responses at runtime and drive each tool's outputSchema). A vendored copy of the API's OpenAPI spec lives in spec/oas-production.yaml; run the /update-api reconciliation to check tools/schemas against it.

Releasing

Releases are automated via GitHub Actions, with a manual approval gate. Two workflows:

  • .github/workflows/ci.yml — runs on every PR/push: typecheck, tests, build, npm audit, and a .mcpb build. No credentials required.

  • .github/workflows/release.yml — runs on a v* tag: publishes to npm via staged publishing and drafts a GitHub Release with the .mcpb. Nothing goes public without a human.

Prerequisites (one-time, already configured)

  • npm Trusted Publisher (OIDC) — configured on npmjs.com for this repo + release.yml with npm stage publish (stage-only) permission. No NPM_TOKEN is stored; auth is tokenless via GitHub OIDC.

  • The workflow has id-token: write and contents: write, and upgrades npm to satisfy staged publishing (npm ≥ 11.15.0, Node ≥ 22.14).

Cutting a release

Push a version tag — that's the whole release. The git tag is the single source of truth: the workflow stamps it into package.json + manifest.json (and the User-Agent) at build time, so there's nothing to bump or keep in sync by hand.

git tag v0.5.1 && git push origin v0.5.1

The tag triggers release.yml, which stages that version to npm and creates a draft GitHub Release. Neither is public yet.

Approving (the manual gate)

Staged publishes require a maintainer with 2FA — they can't be approved from CI (by design):

npm stage list @greynoise/greynoise-mcp-server   # find the stage-id
npm stage view <stage-id>                         # (optional) inspect
npm stage approve <stage-id>                       # 2FA -> version goes live

(Or approve from the package page on npmjs.com.) Then publish the draft GitHub Release from the Releases tab to make the .mcpb public.

Changelog

See NEWS.md.

Available Tools

48 tools
analyze-tags-activityAnalyze Tags ActivityA
Read-only

Filter GreyNoise tags then aggregate their v3/tags/{id}/activity into a summary (total active IPs by classification, most active tags, per-tag detail). query substring-matches name/description/slug/label; category and intention are exact (case-insensitive) matches. days must be 1, 10, or 30 (default 30).

NameRequiredDescriptionDefault
daysNoDays of activity: 1, 10, or 3030
queryNoSubstring to match in name, description, slug, or label
categoryNoExact category match, e.g. 'activity'
intentionNoExact intention match, e.g. 'malicious', 'benign'

Output Schema

NameRequiredDescription
messageNo
tags_detailNo
time_periodNo
analyzed_tagsYes
most_active_tagsNo
total_active_ips_by_classificationNo

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already indicate read-only and open-world behavior. The description adds value by detailing parameter matching rules and the output summary structure. It does not contradict annotations.

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: first summarizes purpose and output, second details parameter behavior. It is concise, front-loaded, and every sentence adds value.

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 an output schema exists (though not shown), the description explains the summary output components and parameter behavior fully. Annotations provide open-world context. The description is complete for an agent to use correctly.

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 description coverage is 100%, and the description adds detailed semantics: query matches across multiple fields, category and intention are exact case-insensitive, and days restricted to specific values with default. This goes beyond the schema descriptions.

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 action (filter and aggregate), the resource (GreyNoise tags activity), and the output summary (total active IPs by classification, most active tags, per-tag detail). It distinguishes from sibling tools like get-tag-details and get-tag-activity by focusing on aggregation.

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 guidelines for parameter matching: query substring-matches name/description/slug/label, category and intention are exact case-insensitive, and days must be 1, 10, or 30. It does not explicitly state when to use this tool over alternatives, but the aggregation purpose is clear.

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

bsi-bulk-lookupBSI Bulk IP LookupA
Read-only

Look up BSI provider matches for up to 1,000 IPv4 addresses. Results preserve request order; any IPv6 address fails the whole request with HTTP 400. Requires a BSI license.

NameRequiredDescriptionDefault
ipsYesIPv4 addresses to look up (1-1000, IPv6 not supported)

Output Schema

NameRequiredDescription
resultsNo

TDQS

A4.5/5.0
Behavior5/5

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

Beyond annotations (readOnlyHint, openWorldHint), the description discloses order preservation, whole-request failure on IPv6, and license requirement—no contradiction 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.

Conciseness5/5

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

Two sentences with zero waste: first sentence states purpose and capacity, second covers order, failure mode, and prerequisites. Information is front-loaded and every sentence earns its place.

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 existence of an output schema and full annotation coverage, the description still adds necessary constraints (IPv6 failure, license, order) and is complete for the tool's complexity.

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

Parameters3/5

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

The schema fully describes the 'ips' parameter (type, format, constraints). The description adds only behavioral context (order preservation) rather than clarifying parameter meaning, so baseline 3 applies.

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 action (look up), resource (BSI provider matches), and constraints (up to 1,000 IPv4 addresses). It distinguishes this bulk tool from the likely single-IP sibling 'bsi-lookup'.

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 context: order preservation, IPv6 failure behavior, and license requirement. It does not directly name alternatives but the sibling list and task imply single vs bulk distinction.

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

bsi-category-statsBSI Category StatsA
Read-only

Counts of BSI IPs and CIDRs grouped by category. Requires BSI entitlements.

NameRequiredDescriptionDefault
dateNoSnapshot date: 'now' (default, live BSI data) or 'YYYY-MM-DD' for historical data (404 if unavailable)

Output Schema

NameRequiredDescription
dateNo
statsNo
sourceNo

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is clear. The description adds the requirement for BSI entitlements, which is useful behavioral context. No contradictions.

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?

Two sentences front-load the core purpose and constraints with no extraneous content. Every word earns its place.

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 tool has an output schema, so return values are covered. The description is sufficient given the tool's simplicity (one optional parameter). It explains the data grouping and entitlement requirement, leaving no major gaps.

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

Parameters3/5

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

Schema coverage is 100% with a full description of the date parameter including pattern and default. The description adds no extra meaning beyond the schema, so baseline 3 is appropriate.

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 provides counts of BSI IPs and CIDRs grouped by category, and mentions required entitlements. It distinguishes effectively from sibling tools like bsi-company-stats or bsi-trust-stats, which group by different criteria.

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

Usage Guidelines2/5

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

The description only notes that BSI entitlements are required. It does not provide guidance on when to choose this tool over siblings like bsi-company-stats or bsi-trust-stats, nor does it mention any scenarios where it should not be used.

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

bsi-company-statsBSI Company StatsA
Read-only

Counts of BSI IPs and CIDRs grouped by company name. Requires BSI entitlements.

NameRequiredDescriptionDefault
dateNoSnapshot date: 'now' (default, live BSI data) or 'YYYY-MM-DD' for historical data (404 if unavailable)

Output Schema

NameRequiredDescription
dateNo
statsNo
sourceNo

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint and openWorldHint, and the description adds the entitlement requirement. No further behavioral traits are needed; it does not contradict annotations.

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 sentence that conveys the purpose and a constraint. Every word is necessary and front-loaded.

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 (one parameter, output schema exists), the description adequately covers the purpose and a critical requirement. No gaps identified.

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

Parameters3/5

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

Schema description coverage is 100% and fully describes the `date` parameter. The description adds no additional parameter information, so baseline score of 3 is appropriate.

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 it counts BSI IPs and CIDRs grouped by company name, which is a specific verb and resource. It distinguishes from sibling tools like bsi-category-stats and bsi-trust-stats.

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?

It mentions a prerequisite (BSI entitlements) but does not provide explicit when-to-use or when-not-to-use guidance compared to alternatives. Usage is implied by the verb and grouping, but no sibling differentiation.

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

bsi-lookupBSI Single-IP LookupA
Read-only

Look up Business Service Intelligence provider matches for a single IPv4 address. Returns providers whose CIDRs contain the IP, in ascending precedence order (lower = higher priority). IPv6 is rejected. Requires a BSI license.

NameRequiredDescriptionDefault
ipYesIPv4 address to look up (IPv6 not supported)

Output Schema

NameRequiredDescription
ipNo
matchesNo

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already provide readOnlyHint (safe read) and openWorldHint (data not authoritative). The description adds valuable behavioral context: IPv6 is rejected, results are in ascending precedence order (lower = higher priority), and a license is required. 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.

Conciseness5/5

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

The description is extremely concise, consisting of three short sentences that convey purpose, ordering, constraint, and license requirement. Every sentence carries essential information with no padding.

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 the presence of an output schema, the description need not detail return values. It adequately covers input constraints, output ordering, and license requirement. It could optionally note error handling (e.g., invalid IP format), but the schema's pattern already handles validation hints. Overall, it is sufficiently complete for a simple lookup tool.

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

Parameters3/5

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

The input schema has 100% coverage with a clear description, format, and pattern for the 'ip' parameter. The description reiterates 'single IPv4 address' and mentions IPv6 rejection, but adds no new semantics beyond the schema. With full schema coverage, a baseline of 3 is appropriate.

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 'look up' and clearly defines the resource as 'Business Service Intelligence provider matches for a single IPv4 address'. It distinguishes from siblings like multi-ip-check (single vs. multiple IPs) and other bsi-*-stats tools (provider matches vs. aggregated stats).

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 states the tool requires a BSI license, providing a key precondition. It implicitly suggests usage for single IPv4 lookups, and by naming 'single IPv4 address' it hints not to use for multiple IPs (use multi-ip-check) or for category/company/trust stats. However, it does not explicitly list alternatives or state when not to use.

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

bsi-trust-statsBSI Trust-Level StatsA
Read-only

Counts of BSI IPs and CIDRs grouped by trust level. Requires BSI entitlements.

NameRequiredDescriptionDefault
dateNoSnapshot date: 'now' (default, live BSI data) or 'YYYY-MM-DD' for historical data (404 if unavailable)

Output Schema

NameRequiredDescription
dateNo
statsNo
sourceNo

TDQS

A3.8/5.0
Behavior3/5

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

Annotations provide readOnlyHint and openWorldHint, so the safety profile is covered. The description adds the requirement for BSI entitlements, which is beyond annotations. However, no other behavioral traits (e.g., rate limits, output format) are 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 extremely concise, consisting of two clear sentences with no extraneous information. It is front-loaded with the main purpose.

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 an output schema present and annotations covering safety, the description is sufficient for a simple read-only tool. It states the main function and a requirement. Some context about trust levels or data scope might be helpful but is not critical.

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

Parameters3/5

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

Schema coverage is 100%, so the baseline is 3. The description does not add meaning beyond the schema; the 'date' parameter is fully described in the schema, and the description makes no additional reference to parameters.

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 counts BSI IPs and CIDRs grouped by trust level, using a specific verb and resource. It distinguishes from sibling tools like bsi-category-stats and bsi-company-stats, which group by different dimensions.

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 mentions 'Requires BSI entitlements' as a prerequisite, but does not provide explicit guidance on when to use this tool versus alternatives. Usage is implied by the title and the existence of sibling tools, but no when-not-to-use or alternative suggestions are given.

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

callback-ip-lookupCallback IP LookupB
Read-only

Look up a single callback/C2 IP: attack stage, scanner associations, RIOT status, geo/network enrichment, and downloaded malware files.

NameRequiredDescriptionDefault
ipYesThe callback IP address to look up

Output Schema

NameRequiredDescription
ipNo
is_riotNo
last_seenNo
enrichmentNo
file_countNo
first_seenNo
is_stage_1No
is_stage_2No
scanner_ipsNo
active_filesNo
attack_stageNo
scanner_countNo
riot_trust_levelNo
source_workspacesNo

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety and external-data profile is covered. The description adds useful context about the enrichment dimensions returned, but does not discuss permissions, rate limits, or data freshness. Given annotation coverage, this is adequate but not rich.

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 front-loaded sentence that packs the resource, cardinality, and enrichment dimensions without waste. Every clause contributes useful information.

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?

An output schema exists, so return values need not be explained, and annotations cover the safety profile. However, among many similar IP/session enrichment tools, the description does not explain how this one differs from lookup-ip-context or quick-check-ip, leaving a meaningful selection gap.

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

Parameters3/5

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

Schema description coverage is 100%, and the schema already defines the single required 'ip' parameter. The description reinforces that only one IP is handled but adds no format or validation details beyond the schema, so the baseline of 3 applies.

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 gives a specific verb and resource ('Look up a single callback/C2 IP') and enumerates the enrichment categories returned, so the tool's function is clear. It does not, however, distinguish this from sibling tools like lookup-ip-context or quick-check-ip, which likely have overlapping purposes.

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

Usage Guidelines2/5

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

There is no explicit guidance on when to use this tool versus alternatives such as lookup-ip-context, quick-check-ip, multi-ip-check, or callback-overview. The 'single IP' wording implies cardinality but does not state selection criteria or exclusions.

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

callback-overviewCallback Overview StatisticsA
Read-only

Aggregate statistics for callback/C2 IPs matching the filters: counts by attack stage, file analysis status, RIOT trust levels, scanner associations, and top threat names. Bounded to a recent window (days: 1-7, default 1) — wider ranges overload the aggregation.

NameRequiredDescriptionDefault
ipsNoFilter to this specific set of callback IPs
daysNoLookback window in days (1-7, default 1)
file_hashNoFile SHA256 hash
file_nameNoFile name substring match
file_typeNoFile MIME type (e.g. "application/x-executable")
has_filesNotrue = only IPs with malware files; false = only IPs without files
is_stage_1Notrue = file was downloaded from this IP (stage 1)
is_stage_2Notrue = suspected C2 based on VT/sandbox analysis (stage 2)
scanner_ipsNoFilter to IPs associated with these scanner IPs

Output Schema

NameRequiredDescription
total_ipsNo
stage_1_ipsNo
stage_2_ipsNo
total_filesNo
not_riot_ipsNo
files_with_vtNo
ips_with_filesNo
unconfirmed_ipsNo
files_without_vtNo
riot_level_1_ipsNo
riot_level_2_ipsNo
riot_level_3_ipsNo
top_threat_namesNo
total_cross_refsNo
distinct_scannersNo
ips_with_scannersNo
ips_without_filesNo
total_scanner_linksNo
ips_without_scannersNo

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnly and openWorld hints. The description adds the explicit time window constraint (1-7 days) and the performance overload warning, which goes beyond 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.

Conciseness5/5

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

Two sentences: one summarizing the tool's function and output dimensions, the other stating the crucial time window constraint. No wasted words.

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 the complexity (9 optional params, no required) and the presence of an output schema, the description covers the key information: purpose, grouping dimensions, and important usage bound. Could benefit from noting that output is aggregate only, but overall sufficient.

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 100% with descriptions for all 9 parameters. The description reinforces the days constraint and lists the output dimensions, providing context beyond the parameter descriptions.

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 it aggregates statistics for callback/C2 IPs, listing the exact breakdown dimensions (attack stage, file analysis, etc.), which distinguishes it from listing tools like list-callback-ips.

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 aggregate stats with a recent window, but does not explicitly compare to siblings like list-callback-ips or bsi-trust-stats. The warning against wide ranges provides some guidance.

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

create-alertCreate AlertA

Create a scheduled alert that runs a GNQL query and notifies recipients (email/webhook) when it matches. Requires a plan entitled to alerts.

NameRequiredDescriptionDefault
nameYesAlert name
queryYesGNQL query the alert monitors
enabledNoWhether the alert is active (default: true)
scheduleYesWhen the alert query runs and notifies
recipientsYesWhere to send alert notifications
workspace_idNoWorkspace ID (UUID). Defaults to the workspace the API key is bound to.
query_workspace_idNoWorkspace to run the query against, if different

Output Schema

NameRequiredDescription
idYes
nameNo
typeNo
statusNo
enabledNo
scheduleNo
created_atNo
gnql_queryNo
parametersNo
recipientsNo
updated_atNo
workspace_idNo
query_workspace_idNo

TDQS

A4/5.0
Behavior3/5

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

Annotations already indicate this is a non-read-only, non-idempotent, non-destructive action. The description adds the plan requirement and the basic behavior (runs query, notifies), but does not provide deeper behavioral details such as rate limits, idempotency guarantees, or consequences of creating an alert. With annotations present, the description adds some value but is not extensive.

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 contains two sentences that are front-loaded and to the point. No extraneous information. Every word contributes to the purpose and prerequisite.

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 create tool with a rich schema (7 parameters, nested objects, output schema), the description covers the core purpose and prerequisite. The output schema documents return values, so the description does not need to elaborate. Minor omission: it does not mention that workspace_id defaults to the bound workspace, but that is in the schema.

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

Parameters3/5

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

The input schema has 100% description coverage, so the schema already documents each parameter. The description only restates that the alert 'runs a GNQL query', which is already in the schema. It adds no additional semantic meaning or examples beyond what the schema provides, so baseline score of 3 is appropriate.

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 verb 'Create', the resource 'scheduled alert', and what it does ('runs a GNQL query and notifies recipients'). It distinguishes itself from sibling tools like list-alerts, update-alert, etc., which perform different actions 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 mentions a prerequisite ('Requires a plan entitled to alerts'), which provides usage context. However, it does not explicitly state when to use this tool vs alternatives like update-alert or delete-alert, though the tool name and purpose imply its usage for creation only.

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

create-blocklistCreate BlocklistA

Create a dynamic blocklist from a GNQL query. The blocklist auto-populates with IPs matching the query. Requires a plan entitled to blocklists.

NameRequiredDescriptionDefault
nameNoHuman-friendly blocklist name
queryYesGNQL query whose matching IPs populate the blocklist
enabledNoWhether the blocklist is active (default: true)
ip_limitNoMax IPs to include
workspace_idNoWorkspace ID (UUID). Defaults to the workspace the API key is bound to.

Output Schema

NameRequiredDescription
idYes
nameNo
queryNo
tokenNo
enabledNo
ip_limitNo
created_atNo
updated_atNo
workspace_idNo
last_ip_countNo
entitlement_levelNo
query_workspace_idNo

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already establish that this is a non-read-only, non-idempotent, open-world operation. The description adds useful behavior beyond the annotations by explaining that the blocklist is dynamic, auto-populates from matching IPs, and requires a plan entitlement.

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 three short sentences with no wasted text. It is front-loaded with the core action and then adds the auto-population behavior and entitlement requirement.

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 an output schema present and annotations covering safety and idempotency, the description provides enough context to understand the tool's purpose and key requirement. It could be slightly more complete by referencing related update/delete tools, but nothing essential is missing for correct invocation.

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

Parameters3/5

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 all five parameters, including the GNQL query and optional fields. The description reinforces that the query drives IP population but does not add parameter-specific syntax, defaults, or constraints beyond the schema.

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 states a specific verb and resource: create a dynamic blocklist from a GNQL query. It clearly explains that matching IPs auto-populate the blocklist, but it does not explicitly distinguish this from sibling tools such as update-blocklist or list-blocklists.

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 when to use it by saying it creates a dynamic blocklist from a GNQL query, and it notes the plan entitlement requirement. However, it does not state when not to use it or explicitly compare it with alternatives like update-blocklist or create-alert.

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

delete-alertDelete AlertA
DestructiveIdempotent

Permanently delete an alert. This cannot be undone.

NameRequiredDescriptionDefault
alert_idYesAlert ID (UUID)
workspace_idNoWorkspace ID (UUID). Defaults to the workspace the API key is bound to.

Output Schema

NameRequiredDescription
idYes
deletedYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already indicate destructiveHint=true and idempotentHint=true. The description adds context by stating the deletion is permanent and cannot be undone, which reinforces the irreversible nature beyond what annotations provide.

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?

Two concise sentences that front-load the purpose and critical behavior. Every sentence is necessary and efficient.

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 delete tool with output schema present and comprehensive annotations, the description is sufficiently complete. It could mention what is returned, but output schema likely covers that.

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

Parameters3/5

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

Input schema has 100% description coverage, so the schema already explains parameters. The description adds no additional parameter details. Baseline score 3 is appropriate.

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 'Permanently delete an alert', clearly identifying the verb (delete) and resource (alert). It distinguishes from sibling tools like create-alert, update-alert, enable-alert, etc.

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 deleting alerts but does not explicitly state when to use this tool versus alternatives like disable-alert or update-alert. No guidance on prerequisites or when not to use.

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

delete-blocklistDelete BlocklistA
DestructiveIdempotent

Permanently delete a blocklist. This cannot be undone.

NameRequiredDescriptionDefault
blocklist_idYesBlocklist ID (UUID)
workspace_idNoWorkspace ID (UUID). Defaults to the workspace the API key is bound to.

Output Schema

NameRequiredDescription
idYes
deletedYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already provide destructiveHint=true and idempotentHint=true. The description adds valuable context about permanence ('cannot be undone'), which goes beyond annotations.

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, concise sentence that efficiently communicates the action and its permanence. No unnecessary information.

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 the tool's simplicity and the presence of annotations, the description covers essential behavioral aspects. However, it could mention side effects on related resources (e.g., blocklist entries) for completeness.

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

Parameters3/5

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

Schema description coverage is 100%, so parameters are already fully documented. The description adds no additional meaning to the parameters beyond what is in the 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 clearly states the verb (delete) and resource (blocklist), and distinguishes from siblings like create, get, update. The phrase 'Permanently delete' adds specificity.

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 does not provide explicit guidance on when to use this tool versus alternatives like disabling a blocklist. The warning 'This cannot be undone' implicitly advises caution but lacks explicit usage context.

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

disable-alertDisable AlertA
Idempotent

Disable (pause) an alert without deleting it.

NameRequiredDescriptionDefault
alert_idYesAlert ID (UUID)
workspace_idNoWorkspace ID (UUID). Defaults to the workspace the API key is bound to.

Output Schema

NameRequiredDescription
idYes
nameNo
typeNo
statusNo
enabledNo
scheduleNo
created_atNo
gnql_queryNo
parametersNo
recipientsNo
updated_atNo
workspace_idNo
query_workspace_idNo

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already indicate non-destructive and idempotent behavior. The description adds 'pause' and 'without deleting' but does not further elaborate on side effects or states. The bar is lowered due to annotations, but some extra context is provided.

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 single, clear sentence with no unnecessary words. Front-loaded with the action and resource.

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 simple mutation with good schema coverage and an output schema, the description is mostly complete. However, it does not mention that the alert must exist or what happens if already disabled, but this is minor given the annotations and schema.

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

Parameters3/5

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

Schema coverage is 100% with descriptive parameter names and descriptions. The tool description adds no additional meaning to the parameters, so baseline 3 is appropriate.

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 verb 'Disable (pause)' and the resource 'alert'. It distinguishes from the sibling tool 'delete-alert' by explicitly saying 'without deleting it'.

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 when to use (to pause an alert without deletion) but does not mention when not to use, such as when the alert is already disabled, nor does it list alternative tools like 'enable-alert' or 'update-alert'.

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

enable-alertEnable AlertA
Idempotent

Enable (resume) a previously disabled alert.

NameRequiredDescriptionDefault
alert_idYesAlert ID (UUID)
workspace_idNoWorkspace ID (UUID). Defaults to the workspace the API key is bound to.

Output Schema

NameRequiredDescription
idYes
nameNo
typeNo
statusNo
enabledNo
scheduleNo
created_atNo
gnql_queryNo
parametersNo
recipientsNo
updated_atNo
workspace_idNo
query_workspace_idNo

TDQS

A3.6/5.0
Behavior2/5

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

Annotations already indicate idempotent, not read-only, not destructive. Description adds minimal behavioral context, e.g., no mention of prerequisites or behavior if already enabled.

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?

Single sentence, front-loaded with key information, no wasted words.

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 simple toggle action with full param coverage and output schema present, the description is adequate though minimal. Missing context about idempotency? But annotations cover that.

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

Parameters3/5

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

Schema covers both parameters with descriptions (100% coverage). Description adds no extra meaning beyond the 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 clearly states the verb 'Enable' (or 'resume') and the resource 'alert', distinguishing it from siblings like get-alert, list-alerts, update-alert.

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?

Implies usage for previously disabled alerts, but lacks explicit when-to-use or when-not-to-use guidance compared to alternatives like update-alert.

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

export-callback-ipsExport Callback IPsA
Read-only

Export callback/C2 IPs matching the filters as a plain list. Same filters as List Callback IPs. Dates are YYYY-MM-DD.

NameRequiredDescriptionDefault
ipsNoFilter to this specific set of callback IPs
file_hashNoFile SHA256 hash
file_nameNoFile name substring match
file_typeNoFile MIME type (e.g. "application/x-executable")
has_filesNotrue = only IPs with malware files; false = only IPs without files
is_stage_1Notrue = file was downloaded from this IP (stage 1)
is_stage_2Notrue = suspected C2 based on VT/sandbox analysis (stage 2)
scanner_ipsNoFilter to IPs associated with these scanner IPs
last_seen_afterNoOnly IPs last seen after this date (YYYY-MM-DD)
first_seen_afterNoOnly IPs first seen after this date (YYYY-MM-DD)
last_seen_beforeNoOnly IPs last seen before this date (YYYY-MM-DD)
first_seen_beforeNoOnly IPs first seen before this date (YYYY-MM-DD)

Output Schema

NameRequiredDescription
ipsYes
countYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, indicating safe, standalone operation. The description adds that the output is a 'plain list', which is helpful but does not disclose additional behavioral traits (e.g., output format specifics, pagination, or limits). With annotations present, the description adds moderate context but not rich detail.

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 two sentences, front-loaded with the main action and output type. The reference to 'Same filters as List Callback IPs' is efficient but slightly dependent on external knowledge. Overall, it is concise and structured well, earning a high score.

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?

Given the tool has 12 optional parameters, many sibling tools, and an output schema (present but not detailed), the description provides basic context ('plain list', date format). However, it misses details on how the export is delivered (e.g., file or stream) and any limits. The output schema reduces the burden, leaving completeness adequate but with gaps.

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

Parameters3/5

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

The input schema covers all 12 parameters with descriptions (100% coverage). The description does not add any parameter-specific information beyond what the schema provides, so it meets the baseline for high coverage without enhancing semantics.

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 verb 'Export', the resource 'callback/C2 IPs', and the output format 'plain list'. It explicitly distinguishes from the sibling tool 'List Callback IPs' by mentioning shared filters, providing specific and actionable purpose.

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 exporting filtered IPs, referencing 'Same filters as List Callback IPs', but does not explicitly state when to use this tool versus alternatives like exporting sessions or searching. No when-not or alternative guidance is provided, leaving usage context implicit.

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

export-session-dataExport Session DataA

Download a single session's data for a given session ID as a PCAP or raw payload (type: pcap | rawSource | rawDestination; default pcap). Saves the binary to a temp file and returns its path. Not available when scope=demo.

NameRequiredDescriptionDefault
typeNoExport format: pcap | rawSource | rawDestination (default: pcap)
scopeNoData scope: workspace (default) or demo
session_idYesThe unique session identifier

Output Schema

NameRequiredDescription
typeNo
filePathNo
fileSizeNo
availableNo

TDQS

A3.8/5.0
Behavior4/5

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

The description discloses a side effect: 'Saves the binary to a temp file and returns its path'. This adds behavioral context beyond annotations (readOnlyHint=false, openWorldHint=true). No contradiction 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.

Conciseness5/5

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

The description is a single, well-structured sentence that covers all essential information: action, resource, options, side effect, and a constraint. No unnecessary words.

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 3 parameters and an output schema (assumed), the description adequately explains the output (temp file path) and the demo scope limitation. It could briefly mention the return format structure, but overall is complete.

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

Parameters3/5

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

Schema coverage is 100% with good descriptions for all parameters. The description adds minimal extra meaning, reaffirming the type enum and default pcap. It does not provide new semantic details beyond what the schema already offers.

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 action ('Download a single session's data'), the resource ('for a given session ID'), and the output formats ('PCAP or raw payload'). It distinguishes from sibling tools like 'export-sessions-pcap' by specifying 'single session'. The constraint 'Not available when scope=demo' adds specificity.

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

Usage Guidelines2/5

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

The description provides a constraint ('Not available when scope=demo') but does not explicitly state when to use this tool versus alternatives like 'export-sessions-pcap' or 'get-session'. No context on when to choose pcap vs raw formats or when to avoid this tool.

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

export-sessions-pcapExport Sessions PCAPA

Export a PCAP file containing packets from multiple GreyNoise sensor sessions matching query criteria. Saves the binary PCAP to a temporary directory and returns the file path. The file can be opened with Wireshark, tshark, or tcpdump.

Use Lucene query syntax to filter sessions (e.g., "destination.port:443", "source.ip:1.2.3.4").

NameRequiredDescriptionDefault
sizeNoMaximum number of sessions to include (default: 100)
queryNoLucene query string to filter sessions
scopeNoData scope for the query (default: workspace)
sort_byNoField to sort results by (default: lastPacket)lastPacket
end_timeYesEnd time for the query range (ISO 8601 format, e.g. 2026-01-07T23:59:59Z)
sort_descNoSort in descending order (default: true)
start_timeYesStart time for the query range (ISO 8601 format, e.g. 2026-01-01T00:00:00Z)

Output Schema

NameRequiredDescription
filePathNo
fileSizeNo
availableYes

TDQS

A3.9/5.0
Behavior4/5

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

The description discloses that the tool saves a binary PCAP to a temporary directory and returns the file path, which adds context beyond annotations. The annotations include readOnlyHint:false (indicating mutation) and openWorldHint:true, which align with the description. No contradictions found.

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 at three sentences, each serving a distinct purpose: stating the action, detailing the behavior, and providing usage examples. It is front-loaded and contains no unnecessary words.

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 the tool has an output schema (not shown but indicated), the description does not need to explain return values. It adequately covers the main purpose, output location, and query syntax. For a tool with 7 parameters and 2 required, the description is complete enough for effective usage.

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?

While the input schema already provides descriptions for all 7 parameters (100% coverage), the description adds value by giving concrete examples of Lucene query syntax for the 'query' parameter. This enhances understanding beyond the schema alone. Other parameters are not elaborated further, but the baseline is 3 due to high coverage.

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 clearly states it exports a PCAP file from GreyNoise sensor sessions and returns the file path. It uses a specific verb ('Export') and resource ('PCAP file from sessions'). However, it does not explicitly differentiate from sibling tools like 'export-session-data' or 'search-sessions', which limits clarity for selection.

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 explains when to use the tool (to export PCAP files matching query criteria) and provides guidance on using Lucene query syntax with examples. However, it does not mention when not to use it or suggest alternative tools for different needs, such as when only session data is needed instead of PCAP.

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

get-alertGet AlertA
Read-only

Retrieve a single alert's configuration by ID.

NameRequiredDescriptionDefault
alert_idYesAlert ID (UUID)
workspace_idNoWorkspace ID (UUID). Defaults to the workspace the API key is bound to.

Output Schema

NameRequiredDescription
idYes
nameNo
typeNo
statusNo
enabledNo
scheduleNo
created_atNo
gnql_queryNo
parametersNo
recipientsNo
updated_atNo
workspace_idNo
query_workspace_idNo

TDQS

A3.9/5.0
Behavior3/5

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

The description aligns with the readOnlyHint annotation, indicating a read-only operation. However, it adds no extra behavioral context beyond what annotations already provide (e.g., no mention of output format, pagination, or rate limits).

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, concise sentence that front-loads the key information. Every word earns its place with no 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 simple get-by-ID tool with an output schema, the description is sufficiently complete. It clearly communicates the tool's purpose and input requirements.

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

Parameters3/5

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

The schema covers 100% of parameters with descriptions. The description adds no additional meaning beyond 'by ID'. Baseline 3 is appropriate as the schema does the heavy lifting.

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 action (retrieve), the resource (alert configuration), and the method (by ID). It effectively distinguishes from sibling tools like list-alerts (which returns multiple) and update-alert (which modifies).

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 when you have an alert ID and need its configuration, but it does not explicitly state when to use this tool versus alternatives like list-alerts or update-alert. No when-not or exclusion criteria are provided.

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

get-blocklistGet BlocklistA
Read-only

Retrieve a single blocklist's configuration by ID.

NameRequiredDescriptionDefault
blocklist_idYesBlocklist ID (UUID)
workspace_idNoWorkspace ID (UUID). Defaults to the workspace the API key is bound to.

Output Schema

NameRequiredDescription
idYes
nameNo
queryNo
tokenNo
enabledNo
ip_limitNo
created_atNo
updated_atNo
workspace_idNo
last_ip_countNo
entitlement_levelNo
query_workspace_idNo

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered and nothing contradicts it. The description adds only one useful nuance — 'configuration' signals it returns the blocklist's settings rather than its IP entries — but says nothing about auth, scoping, or missing-record 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?

One sentence, front-loaded with the action and resource, with zero filler. Sized appropriately for a simple single-record getter.

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 tool is simple, fully documented parameters, and an output schema exists, so return values need not be explained. The only shortfall is that an agent must infer the boundary with get-blocklist-ips and list-blocklists.

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

Parameters3/5

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

Schema description coverage is 100% and both parameters (blocklist_id, workspace_id) are documented, including the workspace defaulting rule. The description only restates 'by ID' and adds no syntax or scoping detail beyond the schema, so baseline 3 applies.

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?

Specific verb+resource ('Retrieve a single blocklist's configuration by ID'), and the word 'single' implicitly separates it from list-blocklists and get-blocklist-ips. It stops short of naming those siblings, so differentiation is left partly to inference.

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 'by ID' framing implies this is for fetching a known blocklist, but there is no explicit when-to-use versus list-blocklists (browse) or get-blocklist-ips (the entries themselves). No prerequisites or exclusions are stated.

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

get-blocklist-ipsGet Blocklist IPsC
Read-only

Retrieve the current list of IPs in a blocklist.

NameRequiredDescriptionDefault
sizeNoMax IPs to return
blocklist_idYesBlocklist ID (UUID)
workspace_idNoWorkspace ID (UUID). Defaults to the workspace the API key is bound to.

Output Schema

NameRequiredDescription
ipsYes

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already provide readOnlyHint=true and openWorldHint=true. Description adds only 'current list', which is redundant with 'retrieve'. No disclosure of behavior beyond annotations (e.g., that the list may change, that size parameter limits results, or that results may be paginated). With annotations covering safety, the description contributes little.

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?

Single sentence, no wasted words. Front-loaded with verb and resource. However, it could be slightly more structured with a hint about required parameter or usage context.

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?

Given the presence of an output schema (not shown) and clear annotations, the description provides minimal but functional coverage. It omits when to use the tool relative to siblings and does not mention that a blocklist_id is required, which is critical context for a 3-parameter tool with one required field.

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

Parameters3/5

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

Schema coverage is 100%, with each parameter described (size maximum, blocklist_id type, workspace_id default). Description does not add any extra meaning or context for parameters. Baseline 3 is appropriate as schema does the heavy lifting.

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?

Description clearly states 'Retrieve the current list of IPs in a blocklist' – a specific verb and resource. It distinguishes from sibling 'list-blocklists' (which lists blocklists) and 'list-callback-ips' (which lists callback IPs). However, it does not mention the required blocklist_id parameter explicitly, missing an opportunity to reinforce purpose.

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

Usage Guidelines2/5

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

No guidance on when to use this tool versus alternatives. For example, it doesn't say 'Use this to get IPs for a specific blocklist; for listing all blocklists, use list-blocklists.' The agent must infer usage from sibling names and context.

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

get-cve-detailsGet CVE DetailsA
Read-only

Get GreyNoise vulnerability intelligence for one CVE: CVSS/EPSS scores, KEV status, exploitation stats, and observed benign/threat IP activity. cve_id must match 'CVE-YYYY-NNNNN' (e.g. CVE-2023-6549); case-insensitive.

NameRequiredDescriptionDefault
cve_idYesCVE ID in 'CVE-YYYY-NNNNN' format (e.g. CVE-2023-6549)

Output Schema

NameRequiredDescription
idYes
detailsYes
timelineYes
exploitation_statsNo
exploitation_detailsYes
exploitation_activityNo

TDQS

A4.7/5.0
Behavior5/5

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

The description discloses that the tool provides vulnerability intelligence (read-only operation) and lists returned data categories (scores, stats, IP activity). No contradictions with annotations (readOnlyHint, openWorldHint).

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?

Single sentence, front-loaded with the core purpose, followed by specific details. No redundant words; every clause adds value.

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 single parameter and presence of an output schema, the description fully covers what the tool does and how to invoke it. No additional details needed.

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 100% for the single parameter. The description adds format validation and case-insensitivity guidance, enhancing understanding beyond the schema's description.

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 identifies the tool's purpose: retrieving GreyNoise vulnerability intelligence for a single CVE. It lists specific data points (CVSS/EPSS scores, KEV status, etc.) and distinguishes itself from sibling tools that handle sessions, IP lookups, or bulk operations.

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 specifies the required format for cve_id ('CVE-YYYY-NNNNN') and notes case-insensitivity. It implies single-CVE usage but does not explicitly state when not to use it or mention alternatives, though sibling context makes the scope clear.

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

get-sessionGet SessionB
Read-only

Get full metadata and connection details for a single GreyNoise sensor session by its ID. Returns source/destination IPs and ports, timestamps, byte/packet counts, classification, and any additional enrichment fields.

NameRequiredDescriptionDefault
scopeNoData scope for the query (default: workspace)
session_idYesThe unique session identifier

Output Schema

NameRequiredDescription
idNo
_idNo
sourceNo
lastPacketNo
destinationNo
firstPacketNo
classificationNo

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety behavior is covered and the description's only added context is that it targets one session and touches external GreyNoise data. It says nothing about permissions, missing-ID behavior, or rate limits beyond the annotation. It also spends its behavioral budget restating return fields that the output schema already defines.

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?

Two sentences, action-first, with the identifying constraint in the opening clause. The second sentence is largely a restatement of the output schema, so one sentence does not fully earn its place.

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?

For a simple single-record read with a rich output schema and read-only annotations, this is adequate, but the unmentioned optional scope parameter and the redundant return-field enumeration leave the definition slightly misallocated. An agent knows how to call it but not how the scope parameter changes the result.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters are already documented, and the description only echoes the required session_id. The optional 'scope' parameter and its 'default: workspace' behavior are never mentioned in the description, so no meaning is added beyond the schema.

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?

Names a specific verb and resource ('Get full metadata and connection details for a single GreyNoise sensor session by its ID') and scopes it to one record, which implicitly separates it from search-sessions and the aggregation siblings. It stops short of explicitly contrasting with session-connections or session-fields, whose names overlap with the 'connection details' claim.

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 phrase 'a single ... session by its ID' implies this is the retrieval path when you already hold an identifier, versus the search/list siblings, but the description never states when to use it over alternatives such as search-sessions or session-fields. Use context is inferred rather than instructed.

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

get-session-pcapGet Session PCAPA

Download the raw PCAP capture for a single GreyNoise sensor session. Saves the binary PCAP file to a temporary directory and returns the file path. The file can be opened with Wireshark, tshark, or tcpdump.

NameRequiredDescriptionDefault
scopeNoData scope for the query (default: workspace)
session_idYesThe unique session identifier

Output Schema

NameRequiredDescription
filePathNo
fileSizeNo
availableYes

TDQS

A4.3/5.0
Behavior4/5

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

The description adds beyond annotations by explaining the side effect of saving to a temporary directory and returning a file path, and suggests tools to open the file. No contradiction with annotations, which indicate non-read-only and open-world hints.

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?

Three sentences, no wasted words. The key action is front-loaded, and the file format and usage context are efficiently provided.

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?

With an output schema present, the description correctly omits return value details. It covers the essential behavior: download, temporary storage, file path return, and compatibility with analysis tools. No gaps identified.

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

Parameters3/5

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

Schema coverage is 100%, so the description adds minimal extra meaning for parameters. It does not elaborate on 'scope' or 'session_id' beyond what the schema already describes.

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 verb 'Download' and the resource 'raw PCAP capture for a single GreyNoise sensor session', which distinguishes it from sibling tools like 'export-sessions-pcap' that likely handle multiple sessions.

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 implies when to use this tool (need a single session's PCAP) but does not explicitly state when not to use or list alternatives. The presence of sibling 'export-sessions-pcap' provides context but not direct guidance.

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

get-tag-activityGet Tag ActivityA
Read-only

Retrieve time-series unique-IP counts and intention activity for a tag (by id/slug) or by CVE, from v3/tags/{id}/activity. Provide exactly one of id_or_slug or cve. days must be 1, 10, or 30 (default 30); granularity is 1h for 1 day, else 24h.

NameRequiredDescriptionDefault
cveNoCVE identifier to retrieve activity for (matches associated tags)
daysNoDays of activity: 1, 10, or 3030
id_or_slugNoTag ID or slug to retrieve activity for

Output Schema

NameRequiredDescription
resultsYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnly and openWorld hints. The description adds value by detailing the output type (time-series IP counts and intention activity) and constraints on time range (days) and granularity (1h vs 24h). No contradictions.

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?

Two sentences, no filler. First sentence captures purpose and key constraint. Second sentence details parameter specifics. Well front-loaded.

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 three parameters (all described), high schema coverage, and presence of an output schema, the description sufficiently covers what the tool does, required inputs, and behavioral nuances. No gaps.

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 coverage is 100%, but the description adds critical usage semantics: the exclusivity constraint between 'id_or_slug' and 'cve', and the relationship between 'days' and 'granularity'. This goes beyond the schema's individual property descriptions.

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 verb 'Retrieve' and the specific resource 'time-series unique-IP counts and intention activity for a tag or by CVE'. It also highlights exclusivity of two parameters, distinguishing it from sibling tools like 'get-tag-details' or 'analyze-tags-activity'.

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?

Explicitly states 'Provide exactly one of id_or_slug or cve' and specifies allowed values for 'days' with default. However, it does not explicitly compare with alternatives or mention when not to use it.

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

get-tag-detailsGet Tag DetailsA
Read-only

Get the full record for a single GreyNoise tag, looked up by exact tag id or slug (slug matched case-insensitively) over the cached v3/tags list.

NameRequiredDescriptionDefault
id_or_slugYesTag ID or slug to retrieve details for

Output Schema

NameRequiredDescription
idYes
cvesNo
nameYes
slugYes
labelNo
categoryNo
intentionNo
created_atNo
referencesNo
descriptionNo
recommend_blockNo

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint; description adds behavioral context: uses a cached list for lookups, case-insensitive slug matching. No contradictions. Provides useful details beyond annotations.

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?

Single sentence that conveys all essential information without redundancy or extraneous detail. Efficient and well-structured.

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?

Output schema exists, so return values are covered. Description mentions caching, adding context for data freshness. Could include cache refresh timing but not necessary for completeness.

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 100% with a basic description. Description adds meaning: exact match for id, case-insensitive match for slug, and the lookup is over a cached list, providing context beyond the schema's minimal description.

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?

Description clearly states the verb 'Get', the resource 'full record for a single GreyNoise tag', and the lookup method (by id or slug, case-insensitive, from cached list). It distinguishes from sibling tools like 'get-tag-activity' by specifying it retrieves the full record for a single tag.

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?

Implies usage over a cached list but does not explicitly state when to use this tool versus alternatives (e.g., get-tag-activity). No guidance on when not to use or prerequisites.

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

get-tag-listGet Tag ListA
Read-only

Retrieve the complete list of GreyNoise tags (from v3/tags, cached 1h). Returns JSON with count and each tag's name and slug. Takes no parameters.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
tagsYes
countYes

TDQS

A3.9/5.0
Behavior4/5

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

Beyond the readOnlyHint/openWorldHint annotations, the description discloses the data source (v3/tags) and a 1-hour cache window, which is real behavioral context an agent needs for freshness decisions. It does not cover rate limits or error behavior, but the annotations already establish the safety profile.

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?

Three short sentences, all front-loaded: purpose first, then return shape, then the no-parameter note. No filler or repeated information.

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 parameterless read with an output schema, this is essentially complete; the source and cache note are useful extras. The only gap is routing guidance to search-tags when a caller actually wants a filtered subset rather than the whole catalog.

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?

Zero parameters, so the baseline is 4. The explicit 'Takes no parameters' line is redundant with the empty schema but harmlessly confirms there is nothing to supply.

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?

States a specific verb ('Retrieve') and resource ('complete list of GreyNoise tags') and names the backing endpoint (v3/tags), so the agent knows exactly what data comes back. The word 'complete' implicitly separates it from filtered siblings like search-tags, but it never names that sibling explicitly.

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?

Usage is only implied: fetch this when you need the full tag catalog. There is no explicit when-to-use, no exclusion, and no pointer to search-tags or get-tag-details for filtered or single-tag lookups, which are present among the siblings.

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

gnql-metadata-queryGNQL Metadata QueryA
Read-only

Search GreyNoise data using GNQL, returning IP metadata without raw scan data. Lighter and faster than gnql-query.

Supports the same GNQL query syntax as gnql-query. Use this when you need IP classification, tags, and metadata but not raw scan details (ports, fingerprints, HTTP paths).

Results are paginated via the scroll token. Set quick=true to return only IP and classification/trust level.

Set format="csv" for spreadsheet-friendly CSV output (columns: ip, classification, actor, organization, source_country, tags, ports, bsi_found, bsi_name, bsi_trust_level); default "json" renders a Markdown summary. structuredContent is always the full JSON regardless of format.

NameRequiredDescriptionDefault
sizeNoResults per page (default: 25, max: 10000)
queryYesGNQL query string
quickNoIf true, return only IP and classification/trust level
formatNoOutput format for the text response (default: json)json
scrollNoPagination scroll token from a previous response

Output Schema

NameRequiredDescription
dataYes
request_metadataYes

TDQS

A4.6/5.0
Behavior4/5

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

Adds substantial behavior beyond the readOnlyHint/openWorldHint annotations: pagination happens via a scroll token, quick=true truncates the payload, format='csv' changes only the text rendering, and structuredContent is invariant. It stops short of covering scroll-token expiry or error/rate-limit behavior, which would be the remaining useful disclosure for a paginated search tool.

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 differentiator against gnql-query is front-loaded in the first sentence, followed by short scoped paragraphs for pagination, quick mode, and format. No sentence is 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?

With an output schema present, return values need not be explained, and the description covers the non-obvious parts: pagination, truncation, and output-format invariance. The one gap is that 'GNQL query syntax' is only referenced by pointer to gnql-query rather than characterized, leaving an agent to infer query construction.

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 100%, so the baseline is 3; the description exceeds it by enumerating the exact CSV columns produced by format='csv' and clarifying that format affects only the text response while structuredContent stays JSON. That is meaning the schema's one-line enum description does not convey.

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?

States a specific verb and resource ('Search GreyNoise data using GNQL, returning IP metadata without raw scan data') and explicitly contrasts the result payload against the sibling gnql-query. The distinction is resolvable without opening either schema.

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?

Gives both the positive condition ('when you need IP classification, tags, and metadata but not raw scan details') and the excluded payload ('ports, fingerprints, HTTP paths'), plus names gnql-query as the heavier alternative. This is explicit when/when-not/alternative guidance.

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

gnql-queryGNQL QueryA
Read-only

Search GreyNoise data using GNQL (GreyNoise Query Language). Returns full IP context results including raw scan data.

GNQL is a domain-specific query language that uses Lucene deep under the hood.

Facets:

  • "ip" - The IP address of the scanning device

  • "classification" - Whether the device has been categorized as unknown, benign, or malicious

  • "first_seen" / "last_seen" - Date the device was first/most recently observed

  • "actor" - The benign actor the device has been associated with (Shodan, Censys, etc)

  • "tags" - Tags assigned to the device over the past 90 days

  • "cve" - CVEs associated with the device

  • "vpn" / "vpn_service" / "bot" / "tor" - Boolean/string indicators

  • "metadata.category" - Network category (business, isp, hosting, education, mobile)

  • "metadata.source_country" / "metadata.source_country_code" - Source location

  • "metadata.organization" / "metadata.asn" / "metadata.rdns" - Network info

  • "raw_data.scan.port" / "raw_data.scan.protocol" - Scan targets

  • "raw_data.web.paths" / "raw_data.web.useragents" - HTTP activity

  • "raw_data.ja3.fingerprint" / "raw_data.hassh.fingerprint" - TLS/SSH fingerprints

Examples:

  • "classification:malicious last_seen:1d" - Malicious IPs seen in last day

  • "tags:Mirai" - Devices tagged as Mirai

  • "raw_data.scan.port:445 metadata.os:Windows*" - Windows hosts scanning port 445

  • "cve:CVE-2021-30461" - Devices associated with a CVE

  • "source_country:Iran destination_country:Ukraine single_destination:true" - Targeted scanning

Results are paginated. Use the scroll parameter to retrieve additional pages.

NameRequiredDescriptionDefault
sizeNoResults per page (default: 25, max: 10000)
queryYesGNQL query string
scrollNoPagination scroll token from a previous response

Output Schema

NameRequiredDescription
dataYes
request_metadataYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds useful behavioral context: it returns full IP context with raw scan data and results are paginated via the scroll parameter. It does not discuss rate limits or authentication, but goes meaningfully beyond 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.

Conciseness4/5

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

The description is long but well structured: purpose first, then facets, examples, and pagination guidance. The facet list is extensive, but it is useful reference material for a query language rather than 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?

Given the output schema and annotations, the description supplies the key missing context an agent needs: GNQL syntax guidance, representative fields, examples, and pagination behavior. Nothing essential for correct invocation appears absent.

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 coverage is 100%, so the baseline is 3, but the description substantially enriches the query parameter by explaining GNQL facets and giving concrete query examples. It also reinforces the scroll parameter's pagination role, adding meaning beyond the schema's brief descriptions.

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 states a specific verb and resource: search GreyNoise data using GNQL, returning full IP context including raw scan data. It is clear what the tool does, though it does not explicitly distinguish itself from nearby query tools like gnql-metadata-query, gnql-stats, or lookup-ip-context.

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 examples imply when GNQL is useful for targeted IP-context searches, but the description does not explicitly say when to use this tool versus sibling query or lookup tools. It gives strong query examples but no explicit alternatives or exclusions.

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

gnql-statsGNQL StatsA
Read-only

Get aggregate statistics for results matching a GreyNoise GNQL query.

GNQL (GreyNoise Query Language) is a domain-specific query language that uses Lucene deep under the hood.

Facets:

  • "ip" - The IP address of the scanning device IP

  • "classification" - Whether the device has been categorized as unknown, benign, or malicious

  • "first_seen" - The date the device was first observed by GreyNoise

  • "last_seen" - The date the device was most recently observed by GreyNoise

  • "actor" - The benign actor the device has been associated with, such as Shodan, Censys, GoogleBot, etc

  • "tags" - A list of the tags the device has been assigned over the past 90 days

  • "spoofable" - This IP address has been opportunistically scanning the Internet, however has failed to complete a full TCP connection. Any reported activity could be spoofed.

  • "vpn" - This IP is associated with a VPN service. Activity, malicious or otherwise, should not be attributed to the VPN service provider.

  • "vpn_service" - The VPN service the IP is associated with

  • "cve" - A list of CVEs that the device has been associated with

  • "bot" - If the IP is known to belong to a known BOT

  • "single_destination" - A boolean parameter that filters source country IPs that have only been observed in a single destination country

  • "metadata.category" - Whether the device belongs to a business, isp, hosting, education, or mobile network

  • "metadata.country" - The full name of the country the device is geographically located in (This is the same data as "metadata.source_country". "metadata.source_country" is preferred)

  • "metadata.country_code" - The two-character country code of the country the device is geographically located in (This is the same data as "metadata.source_country_code". "metadata.source_country_code" is preferred)

  • "metadata.sensor_hits" - The amount of unique data that has been recorded by the sensor

  • "metadata.sensor_count" - The number of sensors the IP Address has been observed on

  • "metadata.city" - The city the device is geographically located in

  • "metadata.region" - The region the device is geographically located in

  • "metadata.organization" - The organization that owns the network that the IP address belongs to

  • "metadata.rdns" - The reverse DNS pointer of the IP

  • "metadata.asn" - The autonomous system the IP address belongs to

  • "metadata.tor" - Whether or not the device is a known Tor exit node

  • "metadata.destination_country" - The full name where the GreyNoise sensor is physically located

  • "metadata.destination_country_code" - The country code where GreyNoise sensor is physically located

  • "metadata.source_country_code" - The two-character country code of the country the device is geographically located in

  • "metadata.source_country" - The full name of the country the device is geographically located in

  • "raw_data.scan.port" - The port number(s) the devices has been observed scanning

  • "raw_data.scan.protocol" - The protocol of the port the device has been observed scanning

  • "raw_data.web.paths" - Any HTTP paths the device has been observed crawling the Internet for

  • "raw_data.web.useragents" - Any HTTP user-agents the device has been observed using while crawling the Internet

  • "raw_data.ja3.fingerprint" - The JA3 TLS/SSL fingerprint

  • "raw_data.ja3.port" - The corresponding TCP port for the given JA3 fingerprint

  • "raw_data.hassh.fingerprint" - The HASSH fingerprint

  • "raw_data.hassh.port" - The corresponding TCP port for the given HASSH fingerprint

Behavior:

  • You can subtract facets by prefacing the query with a minus character

  • The data that this endpoint queries refreshes once per hour

Shortcuts:

  • You can find interesting hosts by using the GNQL query term "interesting"

  • You can use the keyword "today" in the "first_seen" and "last_seen" parameters: "last_seen:today" or "first_seen:today"

Examples:

  • "last_seen:today" - Returns all IPs scanning/crawling the Internet today

  • "tags:Mirai" - Returns all devices with the "Mirai" tag

  • "tags:"RDP Scanner"" - Returns all devices with the "RDP Scanner" tag

  • "classification:malicious metadata.country:Belgium" — Returns all compromised devices located in Belgium

  • "classification:malicious metadata.rdns:.gov" - Returns all compromised devices that include .gov in their reverse DNS records

  • "metadata.organization:Microsoft classification:malicious" — Returns all compromised devices that belong to Microsoft

  • "(raw_data.scan.port:445 and raw_data.scan.protocol:TCP) metadata.os:Windows*" - Return all devices scanning the Internet for port 445/TCP running Windows operating systems (Conficker/EternalBlue/WannaCry)

  • "raw_data.scan.port:554" - Returns all devices scanning the Internet for port 554

  • "-metadata.organization:Google raw_data.web.useragents:GoogleBot" — Returns all devices crawling the Internet with "GoogleBot" in their useragent from a network that does NOT belong to Google

  • "tags:"Siemens PLC Scanner" -classification:benign" - Returns all devices scanning the Internet for SCADA devices who ARE NOT tagged by GreyNoise as "benign" (Shodan/Project Sonar/Censys/Google/Bing/etc)

  • "classification:benign" - Returns all "good guys" scanning the Internet

  • "raw_data.ja3.fingerprint:795bc7ce13f60d61e9ac03611dd36d90" — Returns all devices crawling the Internet with a matching client JA3 TLS/SSL fingerprint

  • "raw_data.hassh.fingerprint:51cba57125523ce4b9db67714a90bf6e" — Returns all devices crawling the Internet with a matching client HASSH fingerprint

  • "raw_data.web.paths:"/HNAP1/"" -Returns all devices crawling the Internet for the HTTP path "/HNAP1/"

  • "8.0.0.0/8" - Returns all devices scanning the Internet from the CIDR block 8.0.0.0/8

  • "cve:CVE-2021-30461" - Returns all devices associated with the supplied CVE

  • "source_country:Iran" - Returns all results originating from Iran

  • "destination_country:Ukraine single_destination:true" — Returns all results scanning in only Ukraine

NameRequiredDescriptionDefault
countNoNumber of top aggregate results to return (1-10000)
queryYesGNQL query string (e.g., 'classification:malicious last_seen:30d')

Output Schema

NameRequiredDescription
countYes
queryYes
statsYes
adjusted_queryNo

TDQS

A4.6/5.0
Behavior5/5

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

Annotations declare readOnlyHint=true and openWorldHint=true, and the description does not contradict these. It adds useful behavioral context: data refreshes hourly, and explains facet subtraction. No destructive behavior is implied.

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 sections (facets, behavior, shortcuts, examples) and front-loaded with the purpose. However, it is lengthy; some introductory sentences about GNQL could be trimmed for conciseness.

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 complexity and the presence of an output schema, the description covers query construction, facets, behavior, and examples thoroughly. It does not need to explain return values. No gaps are evident.

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 100% with clear descriptions for both parameters. The description adds significant context for the 'query' parameter by detailing GNQL syntax, facets, and examples, but for 'count' it only repeats schema info.

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?

Description states 'Get aggregate statistics for results matching a GreyNoise GNQL query.' This clearly specifies the verb (Get), resource (aggregate statistics), and context (GNQL query), distinguishing it from siblings like gnql-metadata-query.

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 includes a 'Behavior' section noting how to subtract facets, data refresh frequency, and 'Shortcuts' with keywords like 'today' and 'interesting'. It provides many examples, giving strong usage guidance, though it lacks explicit contrast with sibling tools.

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

gnql-timeseriesGNQL TimeseriesB
Read-only

Retrieve hourly GNQL records for a time range. Enables temporal analysis of IP activity matching any GNQL query (Recall).

Returns IP records bucketed by hour, useful for investigating when specific IPs were active and what they were doing.

Time bounds use ISO 8601 (e.g. 2025-01-15T00:00:00Z). size is results per hourly bucket (default: 25, max: 10000).

NameRequiredDescriptionDefault
sizeNoResults per hourly bucket (default: 25)
queryYesGNQL query string
end_timeNoEnd of time range (ISO 8601 format)
start_timeNoStart of time range (ISO 8601 format, e.g. 2025-01-15T00:00:00Z)

Output Schema

NameRequiredDescription
bucketsYes

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, which the description does not contradict. The description adds behavioral details such as hourly bucketing and ISO 8601 time format, but does not elaborate on the open-world nature or potential unknown results beyond what annotations imply.

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 highly concise with four sentences, each serving a distinct purpose: stating the action, explaining utility, specifying time format, and detailing the size parameter. No redundant information, and key points are front-loaded.

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 description covers the main purpose, time format, and size constraints, but it does not explain what happens when start_time or end_time are omitted (since they are optional). The output schema exists and may compensate, but the description leaves a gap in understanding default behavior for time bounds.

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

Parameters3/5

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

The input schema already has 100% coverage with descriptions for all four parameters. The description adds an example of ISO 8601 format and clarifies size constraints (default, max), but these are already present in the schema. The description does not add significant new semantic meaning.

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 clearly states the tool retrieves hourly GNQL records for a time range, specifying it is for temporal analysis of IP activity. It distinguishes the tool from its sibling 'gnql-timeseries-stats' by focusing on records rather than statistics, but does not explicitly name alternatives.

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

Usage Guidelines2/5

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

The description explains the tool is useful for investigating when IPs were active, but it does not provide guidance on when to avoid using it or compare it with other sibling tools like 'gnql-stats' or 'gnql-metadata-query'. No explicit when-to-use or when-not-to-use advice is given.

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

gnql-timeseries-statsGNQL Timeseries StatsA
Read-only

Get the number of unique IPs matching a GNQL query per hour/day over a time range (Recall Stats).

Returns aggregated counts of unique IPs per time bucket, useful for trend analysis and understanding how scanning/attack activity changes over time.

interval must be 'hour' or 'day'. Time bounds use ISO 8601 format.

NameRequiredDescriptionDefault
queryYesGNQL query string
end_timeNoEnd of time range (ISO 8601 format)
intervalYesTime bucket interval ('hour' or 'day')
start_timeNoStart of time range (ISO 8601 format)

Output Schema

NameRequiredDescription
maxYes
minYes
dataYes
countYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the description's job is lighter. It adds value by specifying that results are aggregated counts per time bucket, that the interval must be 'hour' or 'day', and that time bounds use ISO 8601 format. These details go beyond 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.

Conciseness5/5

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

The description is three short sentences: the first states the core purpose, the second elaborates on output and use case, and the third gives parameter constraints. Every sentence adds value; no wasted words. It is front-loaded and efficiently structured.

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 moderate complexity (4 parameters, output schema exists, annotations present), the description covers: purpose, use case, parameter constraints, and return value nature. It does not leave important gaps, and the output schema handles return details. The description is complete.

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

Parameters3/5

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 all parameters. The description adds minimal extra meaning: it reiterates that interval must be 'hour' or 'day' (already in schema as enum) and that time bounds use ISO 8601 (also in schema). This is adequate but not exceptional.

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 the number of unique IPs matching a GNQL query per hour/day over a time range', using a specific verb and resource. It distinguishes this tool from siblings like 'gnql-stats' and 'gnql-timeseries' by focusing on unique IP recall stats and trend analysis.

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 it is 'useful for trend analysis and understanding how scanning/attack activity changes over time', providing clear context for when to use it. However, it does not explicitly state when not to use it or suggest alternative tools.

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

list-alertsList AlertsA
Read-only

List the alerts configured in a workspace.

NameRequiredDescriptionDefault
workspace_idNoWorkspace ID (UUID). Defaults to the workspace the API key is bound to.

Output Schema

NameRequiredDescription
alertsYes

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already provide readOnlyHint=true and openWorldHint=true. Description adds little beyond the title, but no contradictions.

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?

Single sentence, zero waste. Perfectly sized for the tool's simplicity.

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?

Simple tool with one parameter and output schema. Description is sufficient given low complexity and rich annotations.

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

Parameters3/5

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

Only one parameter with full schema description coverage. Description adds no extra meaning beyond the 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?

Clear verb ('List') and resource ('alerts configured in a workspace'). Distinguishes from siblings like 'get-alert' (single alert) and mutation tools.

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?

No explicit when-to-use or alternatives mentioned, but simple read-only list context is implied by readOnlyHint annotation and sibling set.

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

list-blocklistsList BlocklistsB
Read-only

List the blocklists in a workspace.

NameRequiredDescriptionDefault
limitNoMax blocklists to return (1-100)
offsetNoPagination offset
workspace_idNoWorkspace ID (UUID). Defaults to the workspace the API key is bound to.

Output Schema

NameRequiredDescription
limitNo
totalNo
offsetNo
blocklistsYes

TDQS

B3.3/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered, but the description adds no context of its own: nothing about default result size, pagination behavior, or ordering. It neither contradicts nor enriches the structured metadata.

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?

A single front-loaded sentence with zero waste and no filler. It is appropriately sized, though its brevity borders on under-specification rather than crispness.

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 tool is simple: no required params, full schema coverage, an output schema that documents return values, and annotations covering the safety profile. The description is sufficient to invoke it correctly; only the relationship to get-blocklist and pagination expectations are left unstated.

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

Parameters3/5

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

Schema description coverage is 100% and all three parameters (limit, offset, workspace_id) carry their own descriptions including defaults and ranges, so the schema does the heavy lifting. The description contributes nothing about parameters, which is acceptable at baseline but no more.

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 states a specific verb ('List') and resource ('blocklists') with scope ('in a workspace'), so an agent knows exactly what it returns. It does not, however, distinguish itself from the sibling get-blocklist (single retrieval) or get-blocklist-ips, leaving the collection-vs-single distinction implicit.

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?

Usage is only implied by the verb 'List' and the workspace scope; there is no explicit when-to-use, no exclusion, and no pointer to get-blocklist for single-record lookups. An agent can infer it is the enumeration endpoint, but must reason about alternatives itself.

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

list-callback-ipsList Callback IPsB
Read-only

Paginated list of callback/C2 IPs filtered by attack stage, first/last seen date ranges, file attributes, and scanner associations. Dates are YYYY-MM-DD.

NameRequiredDescriptionDefault
ipsNoFilter to this specific set of callback IPs
pageNoZero-indexed page number (default 0)
file_hashNoFile SHA256 hash
file_nameNoFile name substring match
file_typeNoFile MIME type (e.g. "application/x-executable")
has_filesNotrue = only IPs with malware files; false = only IPs without files
page_sizeNoResults per page, 1-100 (default 20)
is_stage_1Notrue = file was downloaded from this IP (stage 1)
is_stage_2Notrue = suspected C2 based on VT/sandbox analysis (stage 2)
scanner_ipsNoFilter to IPs associated with these scanner IPs
last_seen_afterNoOnly IPs last seen after this date (YYYY-MM-DD)
first_seen_afterNoOnly IPs first seen after this date (YYYY-MM-DD)
last_seen_beforeNoOnly IPs last seen before this date (YYYY-MM-DD)
first_seen_beforeNoOnly IPs first seen before this date (YYYY-MM-DD)

Output Schema

NameRequiredDescription
pageNo
itemsNo
totalNo
page_sizeNo

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds pagination and date-format context, but does not mention authentication, rate limits, or return behavior; the output schema covers return values.

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?

Two sentences, front-loaded with the core purpose and followed by the key date-format constraint. No wasted wording.

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 the rich schema, output schema, and annotations, the description is sufficient for an agent to understand the tool's scope. It is slightly incomplete because it does not route the agent among closely related callback-IP siblings.

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

Parameters3/5

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

Schema description coverage is 100%, so all 14 parameters are already documented in the schema. The description only restates filter categories and the YYYY-MM-DD date format, adding little semantic meaning beyond the schema.

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?

States a specific verb and resource: "Paginated list of callback/C2 IPs," and names the filter dimensions. It is clearly a listing tool, but it does not explicitly distinguish itself from siblings such as callback-ip-lookup, export-callback-ips, or callback-overview.

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

Usage Guidelines2/5

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

The description explains what can be filtered but gives no guidance on when to use this tool versus callback-ip-lookup, export-callback-ips, or callback-overview. There are no exclusions or alternative-selection cues.

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

lookup-ip-contextLook Up IP ContextA
Read-only

Get detailed GreyNoise context for a single IP: classification, tags, Internet Scanner Intelligence (scan/HTTP/TLS/SSH/TCP raw data), Business Service Intelligence, geo, and network metadata.

NameRequiredDescriptionDefault
ipYesIP address to look up (IPv4 or IPv6)

Output Schema

NameRequiredDescription
ipYes
request_metadataNo
business_service_intelligenceYes
internet_scanner_intelligenceYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint. The description adds value by detailing the specific data categories returned (classification, tags, raw scan data, business service intelligence, geo, network metadata), which are not covered by annotations. 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.

Conciseness5/5

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

The description is a single, well-structured sentence that front-loads the core action and lists all relevant data types. No redundant information; every part earns its place.

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 the simple single-parameter input, read-only annotations, and existence of an output schema, the description provides a comprehensive overview of the return data. Minor omission: could mention potential rate limits or authentication requirements, but these are likely covered by the API context.

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

Parameters3/5

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

Schema coverage is 100% with a single required 'ip' parameter and a clear description in schema. The tool description does not add parameter-specific details beyond what the schema provides, so the baseline score of 3 applies.

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 verb 'Get' and the resource 'detailed GreyNoise context for a single IP', and explicitly lists the types of data included (classification, tags, intelligence, geo, network). This sets it apart from sibling tools like 'multi-ip-check' which handles multiple IPs, and session/alert tools which serve different purposes.

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 a single IP lookup and hints at the rich data returned, but does not explicitly instruct when to use this tool over siblings like 'multi-ip-check' or 'get-session'. There are no 'when-not' or alternative recommendations, leaving the agent to infer context from sibling names.

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

multi-ip-checkMulti-IP CheckA
Read-only

Check up to 10,000 IP addresses at once. Returns classification, business-service status, and trust level for each, plus a summary breakdown.

NameRequiredDescriptionDefault
ipsYesList of IP addresses to check (1-10,000, IPv4 or IPv6)

Output Schema

NameRequiredDescription
dataYes
request_metadataYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the description adds value by specifying the batch size limit (10,000) and the return structure. However, it does not disclose potential errors, rate limits, or how invalid IPs are handled, which would be useful for an agent.

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 with no fluff, front-loading the key capability (batch check) and then listing outputs. Every word adds 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?

Given that an output schema exists (context signal true), the description adequately covers inputs and expected outputs. It could be improved by mentioning error handling or performance considerations for large batches, but overall it is sufficient.

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

Parameters3/5

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

The input schema already describes the only parameter ('ips') thoroughly, including format and constraints. The description adds no additional meaning beyond what the schema provides, so baseline score of 3 is appropriate.

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 action ('Check up to 10,000 IP addresses'), the resource ('IP addresses'), and the specific outputs ('classification, business-service status, trust level, summary breakdown'). This uniquely distinguishes it from sibling IP tools like 'lookup-ip-context' which handles single IPs.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives (e.g., 'lookup-ip-context' for single IPs). It does not mention circumstances where this batch check is appropriate or any prerequisite actions.

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

quick-check-ipQuick Check IPA
Read-only

Get a fast, lightweight classification and business-service check for a single IP address.

NameRequiredDescriptionDefault
ipYesIP address to look up (IPv4 or IPv6)

Output Schema

NameRequiredDescription
ipYes
business_service_intelligenceYes
internet_scanner_intelligenceYes

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds 'fast, lightweight' but does not disclose additional behavioral traits such as rate limits, data sources, or any side effects beyond what annotations convey.

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?

Single sentence, no unnecessary words, front-loaded with key information. Every word earns its place.

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 the tool's simplicity, output schema exists (not shown but present), and annotations cover read behavior, the description is sufficient. It could mention the return type but is not required due to output schema.

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

Parameters3/5

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

Schema coverage is 100% and the parameter 'ip' is thoroughly defined with format, pattern, and description. The description adds no extra meaning beyond 'single IP address', so the schema carries the load.

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?

Description clearly states verb 'Get' and resource 'classification and business-service check for a single IP address'. It is specific and distinguishes from siblings like multi-ip-check (multiple IPs) and callback-ip-lookup (different purpose).

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 with 'fast, lightweight' but does not explicitly state when to use this tool versus alternatives like lookup-ip-context or bsi-lookup. No exclusions or criteria provided.

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

search-sessionsSearch SessionsA
Read-only

Query and filter GreyNoise sensor network sessions over a time range. Returns a paginated list with source/destination IPs and ports, timestamps, byte/packet counts, and classification. Use Lucene query syntax (e.g. destination.port:443).

NameRequiredDescriptionDefault
pageNoPage number (default: 1)
queryNoLucene query string to filter sessions
scopeNoData scope: workspace (default) or demo
sort_byNoField to sort by (default: lastPacket)
end_timeYesEnd time, ISO 8601 (e.g. 2025-01-07T23:59:59Z)
page_sizeNoResults per page, 1-100 (default: 25)
sort_descNoSort descending (default: true)
start_timeYesStart time, ISO 8601 (e.g. 2025-01-01T00:00:00Z)

Output Schema

NameRequiredDescription
totalNo
sessionsNo
paginationNo
request_metadataNo

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds the paginated result shape and the Lucene-syntax requirement, which is genuinely useful behavior context, but says nothing about time-range limits, rate limits, or result caps beyond what the schema states.

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?

Three sentences, front-loaded with purpose, then return shape, then the query-syntax hint. The field enumeration in sentence two overlaps with the output schema, so it earns slightly less than a perfect score, but nothing is padded.

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 an output schema, 100% parameter coverage, and annotations present, the description covers the remaining gaps (purpose, query syntax, result nature). Minor omissions such as scope=workspace vs demo and sort behavior are already handled by the schema, so the description is complete enough to call the tool correctly.

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 100%, so the baseline is 3. The description goes beyond the schema by specifying Lucene query syntax and giving a concrete example ('destination.port:443'), which meaningfully constrains how the `query` parameter should be formed.

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?

States a specific verb and resource — 'Query and filter GreyNoise sensor network sessions over a time range' — plus what a result contains (IPs, ports, timestamps, byte/packet counts, classification). That is enough to distinguish it from single-session or export siblings, though no sibling is named explicitly.

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?

Usage is implied by 'over a time range' and 'paginated list', which suggests exploratory/browsing use rather than fetching one session or exporting. However, the description never says when to prefer this over get-session, session-counts, gnql-query, or export-session-data, all of which sit adjacent in the tool list.

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

search-tagsSearch TagsA
Read-only

Search GreyNoise tags (client-side over the cached v3/tags list). query substring-matches name/description/slug/label; category and intention are exact (case-insensitive) matches; cve substring-matches associated CVEs. All params optional; omitting all returns every tag.

NameRequiredDescriptionDefault
cveNoCVE identifier to match against a tag's associated CVEs
queryNoSubstring to match in name, description, slug, or label
categoryNoExact category match, e.g. 'activity'
intentionNoExact intention match, e.g. 'malicious', 'benign'

Output Schema

NameRequiredDescription
tagsYes
countYes

TDQS

A4/5.0
Behavior4/5

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

The description adds meaningful behavior beyond the annotations: it discloses that searching is client-side over a cached list, explains the matching modes, and notes that no filters returns the full tag set. Annotations already declare read-only/open-world behavior, and the description does not need to repeat that.

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 front-loaded, moving from the operation and data source to per-parameter matching semantics and default behavior. Every sentence carries useful information with no redundant restatement.

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 simple four-optional-parameter search surface, the presence of an output schema, and annotations covering safety behavior, the description supplies everything needed to invoke the tool correctly. It covers the data source, all matching semantics, and the no-parameter default.

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 already 100%, but the description adds matching semantics that the schema does not fully convey: query is a substring match across name/description/slug/label, category and intention are exact case-insensitive matches, and cve substring-matches associated CVEs. It also clarifies that all parameters are optional.

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 states a specific verb and resource: search GreyNoise tags, operating client-side over the cached v3/tags list. This clearly separates it from a generic tag-list or tag-detail tool, though it does not explicitly name a sibling alternative.

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?

It explains that all parameters are optional and that omitting them returns every tag, which gives useful usage context. However, it does not explicitly say when to use this instead of siblings such as get-tag-list or get-tag-details, so the guidance is implied rather than explicit.

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

session-connectionsSession ConnectionsA
Read-only

Build a connection graph (nodes + links) between a source field and a destination field over a time range. Useful for visualizing communication relationships.

NameRequiredDescriptionDefault
queryNoLucene query string to filter sessions
scopeNoData scope: workspace (default) or demo
end_timeYesEnd time, ISO 8601 (e.g. 2025-01-07T23:59:59Z)
max_nodesNoMax nodes to return, 1-10000 (default: 100)
src_fieldNoSource field to aggregate on (default: source.ip)
dest_fieldNoDestination field to aggregate on (default: destination.ip)
start_timeYesStart time, ISO 8601 (e.g. 2025-01-01T00:00:00Z)
min_connectionsNoMin connections to include a node (default: 1)

Output Schema

NameRequiredDescription
linksNo
nodesNo
totalNo
request_metadataNo

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds that the tool returns 'nodes + links', which is consistent and provides some output context. However, it does not disclose any additional behavioral traits such as aggregation behavior, cardinality limits, or that it operates on aggregated data rather than raw sessions.

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 primary action, and contains no redundant or verbose language. Every sentence adds 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?

Given the tool's complexity (8 parameters, graph output), the description covers the core concept well. The presence of an output schema reduces the need to explain return values. However, it lacks details on default parameters (e.g., max_nodes=100, src_field=source.ip) and aggregation semantics, which would be helpful for full completeness.

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

Parameters3/5

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

Schema coverage is 100%, so the baseline is 3. The description does not add meaning beyond the schema; it only mentions 'source field and destination field' in general terms. No additional parameter guidance or examples are provided.

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 builds a connection graph between source and destination fields over a time range, using a specific verb ('build') and resource ('connection graph'), and adds the use case 'visualizing communication relationships'. This distinguishes it from sibling tools like session-unique-values or search-sessions.

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 visualizing communication relationships but does not explicitly state when to use this tool versus alternatives, nor does it provide conditions when not to use it. No exclusions or sibling references are given.

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

session-countsSession CountsA
Read-only

Aggregate session counts grouped by one or more fields over a time range. Multiple fields produce nested (drill-down) buckets.

NameRequiredDescriptionDefault
sizeNoBuckets per aggregation level, 1-100 (default: 10)
queryNoLucene query string to filter sessions
scopeNoData scope: workspace (default) or demo
fieldsYesComma-separated fields to aggregate on (e.g. source.ip,destination.port)
end_timeYesEnd time, ISO 8601 (e.g. 2025-01-07T23:59:59Z)
start_timeYesStart time, ISO 8601 (e.g. 2025-01-01T00:00:00Z)

Output Schema

NameRequiredDescription
itemsNo
totalNo
request_metadataNo

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint and openWorldHint. Description adds the nested bucketing behavior but does not disclose pagination, result format, or any side effects. Adequate but not rich beyond annotations.

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?

Two concise sentences front-loaded with purpose. 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?

Given output schema exists, description need not detail return values. Covers core behavior and constraints (time range, fields). Could mention optional filters, but schema covers that. Adequate.

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 covers all parameters with descriptions (100% coverage). Description adds value by explaining that multiple fields produce nested buckets, which is not in schema. Justification for grouping behavior is helpful.

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?

Description clearly states it aggregates session counts grouped by fields, with nested bucketing for multiple fields. This distinguishes it from siblings like session-timeseries or search-sessions.

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?

Implies usage for aggregating counts by fields, but lacks explicit when-not-to-use or alternative tool references. Sibling tools exist but are not contrasted.

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

session-fieldsList Session FieldsA
Read-only

Discover the queryable session field schema: field identifiers, types, groups, and whether each is sortable. Use these field names when building session queries, counts, connections, timeseries, and unique-value requests.

NameRequiredDescriptionDefault
scopeNoData scope: workspace (default) or demo

Output Schema

NameRequiredDescription
fieldsNo

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, and the description adds behavioral context by specifying what is returned (field identifiers, types, groups, sortability). No contradictions or hidden side effects are present, and the disclosure is adequate.

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, and every word adds value. No redundancy or fluff; it efficiently conveys the tool's function and usage.

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 (one optional param, read-only, with an output schema), the description fully covers purpose, when to use, and what to expect. No gaps remain for an agent to misuse the tool.

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

Parameters3/5

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

Schema coverage is 100%, with the 'scope' parameter described in the schema itself. The description does not repeat parameter details, which is acceptable. It adds no semantic value beyond the schema, earning the baseline 3.

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: to discover the queryable session field schema, including identifiers, types, groups, and sortability. It distinguishes itself from sibling tools that perform actual queries (e.g., search-sessions) by being a metadata discovery 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 instructs when to use the tool: 'Use these field names when building session queries, counts, connections, timeseries, and unique-value requests.' This provides clear guidance on its role as a prerequisite for constructing queries, leaving no ambiguity about context.

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

session-timeseriesSession TimeseriesA
Read-only

Return session volume over time, optionally grouped by a field. Without a field, returns a single timeseries; with a field, returns per-group timeseries.

NameRequiredDescriptionDefault
sizeNoGroups to return when field is set, 1-100 (default: 10)
fieldNoField to group the timeseries by
queryNoLucene query string to filter sessions
scopeNoData scope: workspace (default) or demo
end_timeYesEnd time, ISO 8601 (e.g. 2025-01-07T23:59:59Z)
intervalNoTime bucket interval (default: auto)
start_timeYesStart time, ISO 8601 (e.g. 2025-01-01T00:00:00Z)

Output Schema

NameRequiredDescription
itemsNo
totalNo
timeseriesNo
request_metadataNo

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the description adds value by explaining the dynamic behavior based on the 'field' parameter. No contradictions.

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?

Two sentences, front-loaded with the core purpose and key distinction. Every word serves a purpose with no 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 schema coverage is 100% and an output schema exists, the description completes the picture by explaining the optional grouping behavior. Minor gap: does not detail the default sizing behavior when field is set.

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

Parameters3/5

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 minimal value beyond schema by explaining the effect of the 'field' parameter on the output structure.

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?

Description clearly states the tool returns session volume over time, with optional grouping by a field. This distinguishes it from sibling tools like gnql-timeseries which return different metric timeseries.

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 differentiates between use without field (single timeseries) and with field (per-group timeseries), giving clear context. However, it does not directly address when to use this tool versus siblings like gnql-timeseries or search-sessions.

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

session-unique-valuesSession Unique ValuesA
Read-only

Return the distinct values of a single session field over a time range (server produces a CSV). Optionally include per-value counts. Useful for extracting distinct IPs, ports, or other field values matching a query.

NameRequiredDescriptionDefault
fieldYesField to get unique values for (e.g. source.ip)
queryNoLucene query string to filter sessions
scopeNoData scope: workspace (default) or demo
end_timeYesEnd time, ISO 8601 (e.g. 2025-01-07T23:59:59Z)
start_timeYesStart time, ISO 8601 (e.g. 2025-01-01T00:00:00Z)
include_countsNoInclude per-value counts in the output (default: false)

Output Schema

NameRequiredDescription
rowsNo
fieldYes
totalNo
valuesYes
include_countsNo

TDQS

A4.2/5.0
Behavior4/5

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

The description adds behavioral context beyond the readOnlyHint and openWorldHint annotations by stating that the server produces a CSV and optionally includes per-value counts. It does not contradict annotations and provides useful output format information.

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 with no wasted words. It front-loads the core function and output format in the first sentence and adds optional features and examples in the second. Perfectly concise.

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 the schema coverage and presence of an output schema, the description adequately covers the main use case. However, it could explicitly mention the scope parameter and provide more detail on the query usage to be fully complete.

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

Parameters3/5

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

The schema already covers all parameters with full descriptions, so the description does not add significant new meaning. While it reinforces the role of start/end_time and query, it does not explain nuances like scope or include_counts beyond the 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 clearly specifies the action ('Return the distinct values'), the resource ('a single session field'), and constraints ('over a time range'). It also mentions optional per-value counts. This distinguishes it from sibling tools like search-sessions or session-fields, which return different results.

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 concrete use cases ('extracting distinct IPs, ports, or other field values matching a query'), but does not explicitly state when not to use this tool or compare it to alternatives. The guidance is helpful but not exhaustive.

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

test-alert-webhookTest Alert WebhookA
Idempotent

Send a test payload to a webhook URL to verify delivery before wiring it to an alert.

NameRequiredDescriptionDefault
urlYesWebhook URL to test
typeNoWebhook type, if applicable
headersNoCustom headers to send
workspace_idNoWorkspace ID (UUID). Defaults to the workspace the API key is bound to.

Output Schema

NameRequiredDescription
successYes
status_codeNo
response_bodyNo

TDQS

A4.2/5.0
Behavior4/5

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

The description states the tool sends a test payload to verify delivery, which is consistent with the annotations (idempotentHint=true, destructiveHint=false). It adds context about verification without contradicting annotations. No additional behavioral details like auth or rate limits are provided, but annotations already cover safety.

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, front-loaded sentence that effectively communicates the tool's purpose. No filler or redundant information is present.

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 the tool's simplicity, the description adequately explains the purpose. An output schema exists (not shown), so return values are covered elsewhere. Minor gaps exist, such as what the test payload contains or how verification is reported, but overall it's sufficient for a test tool.

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

Parameters3/5

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

The input schema has 100% coverage with descriptions for all 4 parameters. The tool description does not add any additional meaning beyond the schema; it is a concise one-liner. With high schema coverage, baseline 3 is appropriate.

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 sends a test payload to a webhook URL to verify delivery before wiring it to an alert. The verb 'send test payload' and resource 'webhook URL' are specific, and the purpose is distinguished from sibling tools like create-alert which actually creates an alert.

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 mentions 'before wiring it to an alert', which implies the tool should be used to test webhook delivery prior to finalizing alert configuration. No explicit alternatives or exclusions are given, but the context is clear enough given the tool's specific purpose.

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

update-alertUpdate AlertA
Idempotent

Update an alert's query, schedule, recipients, name, or enabled state.

NameRequiredDescriptionDefault
nameYesAlert name
queryYesGNQL query the alert monitors
enabledNoWhether the alert is active
alert_idYesAlert ID (UUID)
scheduleYesWhen the alert query runs and notifies
recipientsYesWhere to send alert notifications
workspace_idNoWorkspace ID (UUID). Defaults to the workspace the API key is bound to.
query_workspace_idNoWorkspace to run the query against, if different

Output Schema

NameRequiredDescription
idYes
nameNo
typeNo
statusNo
enabledNo
scheduleNo
created_atNo
gnql_queryNo
parametersNo
recipientsNo
updated_atNo
workspace_idNo
query_workspace_idNo

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already indicate readOnlyHint=false, destructiveHint=false, idempotentHint=true, and openWorldHint=true. The description adds no additional behavioral context beyond listing updatable fields. It does not contradict annotations, but it does not enrich the agent's understanding of side effects (e.g., whether updates trigger notifications).

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 sentence of 14 words, front-loading the action and objects. No extraneous information. Highly efficient.

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 tool has a complex nested schema (schedule, recipients) and an output schema (context indicates presence). The description is minimal, but the schema fully covers parameters and return values. It adequately informs the agent about the tool's scope, though it could mention that all required fields (alert_id, name, query, schedule, recipients) must be provided.

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

Parameters3/5

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

Schema description coverage is 100%, so each parameter is already described in the input schema. The tool description adds no new meaning beyond the schema, merely echoing field names (query, schedule, etc.). Baseline 3 is appropriate.

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 'Update an alert's query, schedule, recipients, name, or enabled state' clearly states the verb (update) and the specific resources (alert fields). It distinguishes from sibling tools like 'enable-alert' (which likely only toggles enabled state) and 'get-alert' (read-only).

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 lists what fields can be updated but does not explicitly state when to use this tool vs. alternatives like 'enable-alert' or 'get-alert'. It lacks guidance on context or prerequisites, leaving the agent to infer from the field list.

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

update-blocklistUpdate BlocklistB
Idempotent

Update a blocklist's query, name, IP limit, or enabled state.

NameRequiredDescriptionDefault
nameNoHuman-friendly blocklist name
queryYesGNQL query whose matching IPs populate the blocklist
enabledNoWhether the blocklist is active
ip_limitNoMax IPs to include
blocklist_idYesBlocklist ID (UUID)
workspace_idNoWorkspace ID (UUID). Defaults to the workspace the API key is bound to.

Output Schema

NameRequiredDescription
idYes
nameNo
queryNo
tokenNo
enabledNo
ip_limitNo
created_atNo
updated_atNo
workspace_idNo
last_ip_countNo
entitlement_levelNo
query_workspace_idNo

TDQS

B3.2/5.0
Behavior2/5

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

Annotations already declare readOnly=false, idempotent=true, destructive=false, so the safety profile is covered. The description adds nothing beyond that — it does not say whether changing the query repopulates the blocklist's IPs, whether omitted fields are preserved or reset, or whether the API key's bound workspace scoping matters; the 'or' phrasing also suggests a partial update while query is in fact required.

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?

A single short sentence, front-loaded with the verb and resource, with no wasted words. The field list is redundant against the schema but not harmful.

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?

With annotations, a full output schema, and 100% parameter coverage, the structured fields carry most of the load. Still, for a mutation whose query change likely rewrites the blocklist contents, the description should disclose that effect and the required-query constraint.

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

Parameters3/5

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

Schema description coverage is 100%, so every field including GNQL query syntax and workspace_id default is already documented, and the description only restates those field names. Baseline 3 applies; the 'or' enumeration slightly misrepresents the required query parameter rather than clarifying it.

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?

States a specific verb (update) and resource (blocklist) and enumerates the mutable fields, so the operation is unambiguous. It never differentiates itself from siblings such as create-blocklist, delete-blocklist, or get-blocklist, so an agent must infer that this modifies an existing blocklist.

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?

Usage is only implied: 'update' signals modifying an existing blocklist versus creating one, but the description gives no explicit when-to-use, no prerequisites, and does not name alternatives. An agent can guess correctly but gets no routing help.

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. 12 tool updatesv0.5.5
    • Changedcallback-ip-lookup6 fields changed
      • removedOutput schema / properties / attack_stage / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / attack_stage / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / first_seen / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / first_seen / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / last_seen / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / last_seen / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedcreate-blocklist4 fields changed
      • removedOutput schema / properties / ip_limit / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / ip_limit / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / name / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedget-blocklist4 fields changed
      • removedOutput schema / properties / ip_limit / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / ip_limit / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / name / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedget-session4 fields changed
      • removedOutput schema / properties / firstPacket / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  }
        -]
      • addedOutput schema / properties / firstPacket / type
        Added value: +[
        +  "string",
        +  "number"
        +]
      • removedOutput schema / properties / lastPacket / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  }
        -]
      • addedOutput schema / properties / lastPacket / type
        Added value: +[
        +  "string",
        +  "number"
        +]
    • Addedget-tag-list
    • Changedgnql-metadata-query1 field changed
      • changedOutput schema / properties / data / items / properties / business_service_intelligence / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": {},
        -    "properties": {
        -      "found": {
        -        "anyOf": [
        -          {
        -            "type": "boolean"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "name": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "trust_level": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      }
        -    },
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {
        +      "found": {
        +        "type": [
        +          "boolean",
        +          "null"
        +        ]
        +      },
        +      "name": {
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "trust_level": {
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      }
        +    },
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedgnql-query1 field changed
      • changedOutput schema / properties / data / items / properties / business_service_intelligence / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": {},
        -    "properties": {
        -      "found": {
        -        "anyOf": [
        -          {
        -            "type": "boolean"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "name": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "trust_level": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      }
        -    },
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {
        +      "found": {
        +        "type": [
        +          "boolean",
        +          "null"
        +        ]
        +      },
        +      "name": {
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "trust_level": {
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      }
        +    },
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedlist-blocklists4 fields changed
      • removedOutput schema / properties / blocklists / items / properties / ip_limit / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / blocklists / items / properties / ip_limit / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / blocklists / items / properties / name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / blocklists / items / properties / name / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedlist-callback-ips6 fields changed
      • removedOutput schema / properties / items / items / properties / attack_stage / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / items / items / properties / attack_stage / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / items / items / properties / first_seen / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / items / items / properties / first_seen / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / items / items / properties / last_seen / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / items / items / properties / last_seen / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedsearch-sessions4 fields changed
      • removedOutput schema / properties / sessions / items / properties / firstPacket / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  }
        -]
      • addedOutput schema / properties / sessions / items / properties / firstPacket / type
        Added value: +[
        +  "string",
        +  "number"
        +]
      • removedOutput schema / properties / sessions / items / properties / lastPacket / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  }
        -]
      • addedOutput schema / properties / sessions / items / properties / lastPacket / type
        Added value: +[
        +  "string",
        +  "number"
        +]
    • Addedsearch-tags
    • Changedupdate-blocklist4 fields changed
      • removedOutput schema / properties / ip_limit / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / ip_limit / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / name / type
        Added value: +[
        +  "string",
        +  "null"
        +]
  2. 20 tool updatesv0.5.4
    • Addedanalyze-tags-activity
    • Addedbsi-bulk-lookup
    • Addedcallback-ip-lookup
    • Addedcreate-alert
    • Addedcreate-blocklist
    • Addeddelete-alert
    • Addeddelete-blocklist
    • Addeddisable-alert
    • Addedexport-callback-ips
    • Addedget-blocklist
    • Addedget-cve-details
    • Addedget-session-pcap
    • Changedget-tag-activity2 fields changed
      • addedOutput schema / properties / results / items / properties / activity / properties / activity
        Added value: +{
        +  "additionalProperties": {
        +    "items": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "active_ips": {
        +          "type": "number"
        +        },
        +        "timestamp": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "timestamp",
        +        "active_ips"
        +      ],
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "propertyNames": {
        +    "type": "string"
        +  },
        +  "type": "object"
        +}
      • removedOutput schema / properties / results / items / properties / activity / properties / timeline
        Removed value: -{
        -  "items": {
        -    "additionalProperties": {},
        -    "properties": {
        -      "bucket": {
        -        "type": "string"
        -      },
        -      "metrics": {
        -        "additionalProperties": {},
        -        "properties": {
        -          "total_ips": {
        -            "type": "number"
        -          }
        -        },
        -        "required": [
        -          "total_ips"
        -        ],
        -        "type": "object"
        -      }
        -    },
        -    "required": [
        -      "bucket",
        -      "metrics"
        -    ],
        -    "type": "object"
        -  },
        -  "type": "array"
        -}
    • Addedget-tag-details
    • Changedgnql-metadata-query4 fields changed
      • removedOutput schema / properties / data / items / properties / business_service_intelligence / additionalProperties
        Removed value: -{}
      • addedOutput schema / properties / data / items / properties / business_service_intelligence / anyOf
        Added value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {
        +      "found": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "name": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "trust_level": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      }
        +    },
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / data / items / properties / business_service_intelligence / properties
        Removed value: -{
        -  "found": {
        -    "type": "boolean"
        -  },
        -  "name": {
        -    "type": "string"
        -  },
        -  "trust_level": {
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / properties / data / items / properties / business_service_intelligence / type
        Removed value: -"object"
    • Addedgnql-query
    • Addedquick-check-ip
    • Addedsession-connections
    • Addedsession-counts
    • Addedtest-alert-webhook
  3. 36 tool updatesv0.5.3
    • Removedanalyze-tags-activity
    • Addedbsi-category-stats
    • Addedbsi-company-stats
    • Addedbsi-lookup
    • Addedbsi-trust-stats
    • Addedcallback-overview
    • Addedenable-alert
    • Addedexport-session-data
    • Changedexport-sessions-pcap2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "available": {
        +      "type": "boolean"
        +    },
        +    "filePath": {
        +      "type": "string"
        +    },
        +    "fileSize": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "available"
        +  ],
        +  "type": "object"
        +}
    • Addedget-alert
    • Addedget-blocklist-ips
    • Removedget-cve-details
    • Changedget-session2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "_id": {
        +      "type": "string"
        +    },
        +    "classification": {
        +      "type": "string"
        +    },
        +    "destination": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "bytes": {
        +          "type": "number"
        +        },
        +        "ip": {
        +          "type": "string"
        +        },
        +        "packets": {
        +          "type": "number"
        +        },
        +        "port": {
        +          "type": "number"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "firstPacket": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "number"
        +        }
        +      ]
        +    },
        +    "id": {
        +      "type": "string"
        +    },
        +    "lastPacket": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "number"
        +        }
        +      ]
        +    },
        +    "source": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "bytes": {
        +          "type": "number"
        +        },
        +        "ip": {
        +          "type": "string"
        +        },
        +        "packets": {
        +          "type": "number"
        +        },
        +        "port": {
        +          "type": "number"
        +        }
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "type": "object"
        +}
    • Removedget-session-pcap
    • Changedget-tag-activity4 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedInput schema / properties / cve / description
        Previous value: -"CVE identifier to retrieve activity for"New value: +"CVE identifier to retrieve activity for (matches associated tags)"
      • changedInput schema / properties / days / description
        Previous value: -"Number of days of activity to retrieve (must be 1, 10, or 30)"New value: +"Days of activity: 1, 10, or 30"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "results": {
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "activity": {
        +            "additionalProperties": {},
        +            "properties": {
        +              "aggregations": {
        +                "additionalProperties": {},
        +                "properties": {
        +                  "classification": {
        +                    "additionalProperties": {
        +                      "type": "number"
        +                    },
        +                    "propertyNames": {
        +                      "type": "string"
        +                    },
        +                    "type": "object"
        +                  },
        +                  "total_ips": {
        +                    "type": "number"
        +                  }
        +                },
        +                "type": "object"
        +              },
        +              "slug": {
        +                "type": "string"
        +              },
        +              "timeline": {
        +                "items": {
        +                  "additionalProperties": {},
        +                  "properties": {
        +                    "bucket": {
        +                      "type": "string"
        +                    },
        +                    "metrics": {
        +                      "additionalProperties": {},
        +                      "properties": {
        +                        "total_ips": {
        +                          "type": "number"
        +                        }
        +                      },
        +                      "required": [
        +                        "total_ips"
        +                      ],
        +                      "type": "object"
        +                    }
        +                  },
        +                  "required": [
        +                    "bucket",
        +                    "metrics"
        +                  ],
        +                  "type": "object"
        +                },
        +                "type": "array"
        +              }
        +            },
        +            "type": "object"
        +          },
        +          "tag": {
        +            "additionalProperties": {},
        +            "properties": {
        +              "category": {
        +                "type": "string"
        +              },
        +              "cves": {
        +                "items": {
        +                  "type": "string"
        +                },
        +                "type": "array"
        +              },
        +              "id": {
        +                "type": "string"
        +              },
        +              "intention": {
        +                "type": "string"
        +              },
        +              "name": {
        +                "type": "string"
        +              },
        +              "slug": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "id",
        +              "name",
        +              "slug"
        +            ],
        +            "type": "object"
        +          }
        +        },
        +        "required": [
        +          "tag",
        +          "activity"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "results"
        +  ],
        +  "type": "object"
        +}
    • Removedget-tag-details
    • Removedget-tag-list
    • Changedget-trending-vulnerabilities1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "count": {
        +      "type": "number"
        +    },
        +    "tags": {
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "category": {
        +            "type": "string"
        +          },
        +          "created_at": {
        +            "type": "string"
        +          },
        +          "cves": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "intention": {
        +            "type": "string"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "score": {
        +            "type": "number"
        +          },
        +          "slug": {
        +            "type": "string"
        +          },
        +          "source": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "name",
        +          "category",
        +          "intention",
        +          "created_at",
        +          "score",
        +          "source"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "count",
        +    "tags"
        +  ],
        +  "type": "object"
        +}
    • Changedgnql-metadata-query4 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / format / default
        Added value: +"json"
      • changedInput schema / properties / format / description
        Previous value: -"Output format (default: json)"New value: +"Output format for the text response (default: json)"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "data": {
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "business_service_intelligence": {
        +            "additionalProperties": {},
        +            "properties": {
        +              "found": {
        +                "type": "boolean"
        +              },
        +              "name": {
        +                "type": "string"
        +              },
        +              "trust_level": {
        +                "type": "string"
        +              }
        +            },
        +            "type": "object"
        +          },
        +          "internet_scanner_intelligence": {
        +            "additionalProperties": {},
        +            "properties": {
        +              "actor": {
        +                "type": "string"
        +              },
        +              "classification": {
        +                "type": "string"
        +              },
        +              "metadata": {
        +                "additionalProperties": {},
        +                "properties": {
        +                  "organization": {
        +                    "type": "string"
        +                  },
        +                  "source_country": {
        +                    "type": "string"
        +                  }
        +                },
        +                "type": "object"
        +              },
        +              "raw_data": {
        +                "additionalProperties": {},
        +                "properties": {
        +                  "scan": {
        +                    "items": {
        +                      "additionalProperties": {},
        +                      "properties": {
        +                        "port": {
        +                          "type": "number"
        +                        },
        +                        "protocol": {
        +                          "type": "string"
        +                        }
        +                      },
        +                      "required": [
        +                        "port",
        +                        "protocol"
        +                      ],
        +                      "type": "object"
        +                    },
        +                    "type": "array"
        +                  }
        +                },
        +                "type": "object"
        +              },
        +              "tags": {
        +                "items": {
        +                  "additionalProperties": {},
        +                  "properties": {
        +                    "intention": {
        +                      "type": "string"
        +                    },
        +                    "name": {
        +                      "type": "string"
        +                    }
        +                  },
        +                  "required": [
        +                    "name",
        +                    "intention"
        +                  ],
        +                  "type": "object"
        +                },
        +                "type": "array"
        +              }
        +            },
        +            "type": "object"
        +          },
        +          "ip": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "ip"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "request_metadata": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "adjusted_query": {
        +          "type": "string"
        +        },
        +        "complete": {
        +          "type": "boolean"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "query": {
        +          "type": "string"
        +        },
        +        "restricted_fields": {
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "scroll": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "complete",
        +        "query"
        +      ],
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "data",
        +    "request_metadata"
        +  ],
        +  "type": "object"
        +}
    • Removedgnql-query
    • Changedgnql-stats2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "adjusted_query": {
        +      "type": "string"
        +    },
        +    "count": {
        +      "type": "number"
        +    },
        +    "query": {
        +      "type": "string"
        +    },
        +    "stats": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "actors": {
        +          "anyOf": [
        +            {
        +              "items": {
        +                "additionalProperties": {},
        +                "properties": {
        +                  "actor": {
        +                    "type": "string"
        +                  },
        +                  "count": {
        +                    "type": "number"
        +                  }
        +                },
        +                "required": [
        +                  "count",
        +                  "actor"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "asns": {
        +          "anyOf": [
        +            {
        +              "items": {
        +                "additionalProperties": {},
        +                "properties": {
        +                  "asn": {
        +                    "type": "string"
        +                  },
        +                  "count": {
        +                    "type": "number"
        +                  }
        +                },
        +                "required": [
        +                  "count",
        +                  "asn"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "categories": {
        +          "anyOf": [
        +            {
        +              "items": {
        +                "additionalProperties": {},
        +                "properties": {
        +                  "category": {
        +                    "type": "string"
        +                  },
        +                  "count": {
        +                    "type": "number"
        +                  }
        +                },
        +                "required": [
        +                  "count",
        +                  "category"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "classifications": {
        +          "anyOf": [
        +            {
        +              "items": {
        +                "additionalProperties": {},
        +                "properties": {
        +                  "classification": {
        +                    "type": "string"
        +                  },
        +                  "count": {
        +                    "type": "number"
        +                  }
        +                },
        +                "required": [
        +                  "count",
        +                  "classification"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "countries": {
        +          "anyOf": [
        +            {
        +              "items": {
        +                "additionalProperties": {},
        +                "properties": {
        +                  "count": {
        +                    "type": "number"
        +                  },
        +                  "country": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "count",
        +                  "country"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "destination_countries": {
        +          "anyOf": [
        +            {
        +              "items": {
        +                "additionalProperties": {},
        +                "properties": {
        +                  "count": {
        +                    "type": "number"
        +                  },
        +                  "country": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "count",
        +                  "country"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "operating_systems": {
        +          "anyOf": [
        +            {
        +              "items": {
        +                "additionalProperties": {},
        +                "properties": {
        +                  "count": {
        +                    "type": "number"
        +                  },
        +                  "operating_system": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "count",
        +                  "operating_system"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "organizations": {
        +          "anyOf": [
        +            {
        +              "items": {
        +                "additionalProperties": {},
        +                "properties": {
        +                  "count": {
        +                    "type": "number"
        +                  },
        +                  "organization": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "count",
        +                  "organization"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "source_countries": {
        +          "anyOf": [
        +            {
        +              "items": {
        +                "additionalProperties": {},
        +                "properties": {
        +                  "count": {
        +                    "type": "number"
        +                  },
        +                  "country": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "count",
        +                  "country"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "spoofable": {
        +          "anyOf": [
        +            {
        +              "items": {
        +                "additionalProperties": {},
        +                "properties": {
        +                  "count": {
        +                    "type": "number"
        +                  },
        +                  "spoofable": {
        +                    "type": "boolean"
        +                  }
        +                },
        +                "required": [
        +                  "count",
        +                  "spoofable"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "tags": {
        +          "anyOf": [
        +            {
        +              "items": {
        +                "additionalProperties": {},
        +                "properties": {
        +                  "count": {
        +                    "type": "number"
        +                  },
        +                  "id": {
        +                    "type": "string"
        +                  },
        +                  "tag": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "count",
        +                  "tag",
        +                  "id"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        }
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "count",
        +    "query",
        +    "stats"
        +  ],
        +  "type": "object"
        +}
    • Changedgnql-timeseries2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "buckets": {
        +      "additionalProperties": {
        +        "items": {
        +          "additionalProperties": {},
        +          "properties": {
        +            "internet_scanner_intelligence": {
        +              "additionalProperties": {},
        +              "properties": {
        +                "classification": {
        +                  "type": "string"
        +                },
        +                "tags": {
        +                  "items": {
        +                    "type": "string"
        +                  },
        +                  "type": "array"
        +                }
        +              },
        +              "type": "object"
        +            },
        +            "ip": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "ip"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "buckets"
        +  ],
        +  "type": "object"
        +}
    • Changedgnql-timeseries-stats2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "count": {
        +      "type": "number"
        +    },
        +    "data": {
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "count": {
        +            "type": "number"
        +          },
        +          "date": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "date",
        +          "count"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "max": {
        +      "type": "number"
        +    },
        +    "min": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "count",
        +    "max",
        +    "min",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Addedlist-alerts
    • Addedlist-blocklists
    • Addedlist-callback-ips
    • Changedlookup-ip-context5 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedInput schema / properties / ip / anyOf
        Previous value: -[
        -  {
        -    "format": "ipv4"
        -  },
        -  {
        -    "format": "ipv6"
        -  }
        -]New value: +[
        +  {
        +    "format": "ipv4",
        +    "pattern": "^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$",
        +    "type": "string"
        +  },
        +  {
        +    "format": "ipv6",
        +    "pattern": "^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))$",
        +    "type": "string"
        +  }
        +]
      • changedInput schema / properties / ip / description
        Previous value: -"IP address to look up"New value: +"IP address to look up (IPv4 or IPv6)"
      • removedInput schema / properties / ip / type
        Removed value: -"string"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "business_service_intelligence": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "category": {
        +          "type": "string"
        +        },
        +        "description": {
        +          "type": "string"
        +        },
        +        "explanation": {
        +          "type": "string"
        +        },
        +        "found": {
        +          "type": "boolean"
        +        },
        +        "last_updated": {
        +          "type": "string"
        +        },
        +        "name": {
        +          "type": "string"
        +        },
        +        "reference": {
        +          "type": "string"
        +        },
        +        "trust_level": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "found"
        +      ],
        +      "type": "object"
        +    },
        +    "internet_scanner_intelligence": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "actor": {
        +          "type": "string"
        +        },
        +        "bot": {
        +          "type": "boolean"
        +        },
        +        "classification": {
        +          "type": "string"
        +        },
        +        "cves": {
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "first_seen": {
        +          "type": "string"
        +        },
        +        "found": {
        +          "type": "boolean"
        +        },
        +        "ip": {
        +          "type": "string"
        +        },
        +        "last_seen": {
        +          "type": "string"
        +        },
        +        "metadata": {
        +          "additionalProperties": {},
        +          "properties": {
        +            "asn": {
        +              "type": "string"
        +            },
        +            "carrier": {
        +              "type": "string"
        +            },
        +            "category": {
        +              "type": "string"
        +            },
        +            "datacenter": {
        +              "type": "string"
        +            },
        +            "destination_countries": {
        +              "items": {
        +                "type": "string"
        +              },
        +              "type": "array"
        +            },
        +            "destination_country_codes": {
        +              "items": {
        +                "type": "string"
        +              },
        +              "type": "array"
        +            },
        +            "domain": {
        +              "type": "string"
        +            },
        +            "latitude": {
        +              "type": "number"
        +            },
        +            "longitude": {
        +              "type": "number"
        +            },
        +            "mobile": {
        +              "type": "boolean"
        +            },
        +            "organization": {
        +              "type": "string"
        +            },
        +            "os": {
        +              "type": "string"
        +            },
        +            "rdns": {
        +              "type": "string"
        +            },
        +            "rdns_parent": {
        +              "type": "string"
        +            },
        +            "rdns_validated": {
        +              "type": "boolean"
        +            },
        +            "region": {
        +              "type": "string"
        +            },
        +            "sensor_count": {
        +              "type": "number"
        +            },
        +            "sensor_hits": {
        +              "type": "number"
        +            },
        +            "single_destination": {
        +              "type": "boolean"
        +            },
        +            "source_city": {
        +              "type": "string"
        +            },
        +            "source_country": {
        +              "type": "string"
        +            },
        +            "source_country_code": {
        +              "type": "string"
        +            }
        +          },
        +          "type": "object"
        +        },
        +        "raw_data": {
        +          "additionalProperties": {},
        +          "properties": {
        +            "hassh": {
        +              "items": {
        +                "additionalProperties": {},
        +                "properties": {
        +                  "fingerprint": {
        +                    "type": "string"
        +                  },
        +                  "port": {
        +                    "type": "number"
        +                  }
        +                },
        +                "required": [
        +                  "fingerprint",
        +                  "port"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            "http": {
        +              "additionalProperties": {},
        +              "properties": {
        +                "host": {
        +                  "items": {
        +                    "type": "string"
        +                  },
        +                  "type": "array"
        +                },
        +                "ja4h": {
        +                  "items": {
        +                    "type": "string"
        +                  },
        +                  "type": "array"
        +                },
        +                "method": {
        +                  "items": {
        +                    "type": "string"
        +                  },
        +                  "type": "array"
        +                },
        +                "path": {
        +                  "items": {
        +                    "type": "string"
        +                  },
        +                  "type": "array"
        +                },
        +                "useragent": {
        +                  "items": {
        +                    "type": "string"
        +                  },
        +                  "type": "array"
        +                }
        +              },
        +              "type": "object"
        +            },
        +            "ja3": {
        +              "items": {
        +                "additionalProperties": {},
        +                "properties": {
        +                  "fingerprint": {
        +                    "type": "string"
        +                  },
        +                  "port": {
        +                    "type": "number"
        +                  }
        +                },
        +                "required": [
        +                  "fingerprint",
        +                  "port"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            "scan": {
        +              "items": {
        +                "additionalProperties": {},
        +                "properties": {
        +                  "port": {
        +                    "type": "number"
        +                  },
        +                  "protocol": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "port",
        +                  "protocol"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            "source": {
        +              "additionalProperties": {},
        +              "properties": {
        +                "bytes": {
        +                  "type": "number"
        +                }
        +              },
        +              "type": "object"
        +            },
        +            "ssh": {
        +              "additionalProperties": {},
        +              "properties": {
        +                "ja4ssh": {
        +                  "items": {
        +                    "type": "string"
        +                  },
        +                  "type": "array"
        +                },
        +                "key": {
        +                  "items": {
        +                    "type": "string"
        +                  },
        +                  "type": "array"
        +                }
        +              },
        +              "type": "object"
        +            },
        +            "tcp": {
        +              "additionalProperties": {},
        +              "properties": {
        +                "ja4l": {
        +                  "anyOf": [
        +                    {
        +                      "type": "string"
        +                    },
        +                    {
        +                      "items": {
        +                        "type": "string"
        +                      },
        +                      "type": "array"
        +                    }
        +                  ]
        +                },
        +                "ja4t": {
        +                  "items": {
        +                    "type": "string"
        +                  },
        +                  "type": "array"
        +                }
        +              },
        +              "type": "object"
        +            },
        +            "tls": {
        +              "additionalProperties": {},
        +              "properties": {
        +                "cipher": {
        +                  "anyOf": [
        +                    {
        +                      "type": "string"
        +                    },
        +                    {
        +                      "items": {
        +                        "type": "string"
        +                      },
        +                      "type": "array"
        +                    }
        +                  ]
        +                },
        +                "ja4": {
        +                  "items": {
        +                    "type": "string"
        +                  },
        +                  "type": "array"
        +                }
        +              },
        +              "type": "object"
        +            }
        +          },
        +          "type": "object"
        +        },
        +        "seen": {
        +          "type": "boolean"
        +        },
        +        "spoofable": {
        +          "type": "boolean"
        +        },
        +        "tags": {
        +          "items": {
        +            "additionalProperties": {},
        +            "properties": {
        +              "category": {
        +                "type": "string"
        +              },
        +              "created": {
        +                "type": "string"
        +              },
        +              "created_at": {
        +                "type": "string"
        +              },
        +              "cves": {
        +                "items": {
        +                  "type": "string"
        +                },
        +                "type": "array"
        +              },
        +              "description": {
        +                "type": "string"
        +              },
        +              "id": {
        +                "type": "string"
        +              },
        +              "intention": {
        +                "type": "string"
        +              },
        +              "name": {
        +                "type": "string"
        +              },
        +              "recommend_block": {
        +                "type": "boolean"
        +              },
        +              "references": {
        +                "items": {
        +                  "type": "string"
        +                },
        +                "type": "array"
        +              },
        +              "slug": {
        +                "type": "string"
        +              },
        +              "updated_at": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "id",
        +              "slug",
        +              "name",
        +              "category",
        +              "intention",
        +              "description",
        +              "references",
        +              "recommend_block",
        +              "cves"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "tor": {
        +          "type": "boolean"
        +        },
        +        "vpn": {
        +          "type": "boolean"
        +        },
        +        "vpn_service": {
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "ip": {
        +      "type": "string"
        +    },
        +    "request_metadata": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "message": {
        +          "type": "string"
        +        },
        +        "restricted_fields": {
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        }
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "ip",
        +    "business_service_intelligence",
        +    "internet_scanner_intelligence"
        +  ],
        +  "type": "object"
        +}
    • Changedmulti-ip-check5 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedInput schema / properties / ips / description
        Previous value: -"List of IP addresses to check (max 10,000)"New value: +"List of IP addresses to check (1-10,000, IPv4 or IPv6)"
      • changedInput schema / properties / ips / items / anyOf
        Previous value: -[
        -  {
        -    "format": "ipv4"
        -  },
        -  {
        -    "format": "ipv6"
        -  }
        -]New value: +[
        +  {
        +    "format": "ipv4",
        +    "pattern": "^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$",
        +    "type": "string"
        +  },
        +  {
        +    "format": "ipv6",
        +    "pattern": "^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))$",
        +    "type": "string"
        +  }
        +]
      • removedInput schema / properties / ips / items / type
        Removed value: -"string"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "data": {
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "business_service_intelligence": {
        +            "additionalProperties": {},
        +            "properties": {
        +              "category": {
        +                "type": "string"
        +              },
        +              "description": {
        +                "type": "string"
        +              },
        +              "explanation": {
        +                "type": "string"
        +              },
        +              "found": {
        +                "type": "boolean"
        +              },
        +              "last_updated": {
        +                "type": "string"
        +              },
        +              "name": {
        +                "type": "string"
        +              },
        +              "reference": {
        +                "type": "string"
        +              },
        +              "trust_level": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "found"
        +            ],
        +            "type": "object"
        +          },
        +          "internet_scanner_intelligence": {
        +            "additionalProperties": {},
        +            "properties": {
        +              "actor": {
        +                "type": "string"
        +              },
        +              "bot": {
        +                "type": "boolean"
        +              },
        +              "classification": {
        +                "type": "string"
        +              },
        +              "cves": {
        +                "items": {
        +                  "type": "string"
        +                },
        +                "type": "array"
        +              },
        +              "first_seen": {
        +                "type": "string"
        +              },
        +              "found": {
        +                "type": "boolean"
        +              },
        +              "ip": {
        +                "type": "string"
        +              },
        +              "last_seen": {
        +                "type": "string"
        +              },
        +              "metadata": {
        +                "additionalProperties": {},
        +                "properties": {
        +                  "asn": {
        +                    "type": "string"
        +                  },
        +                  "carrier": {
        +                    "type": "string"
        +                  },
        +                  "category": {
        +                    "type": "string"
        +                  },
        +                  "datacenter": {
        +                    "type": "string"
        +                  },
        +                  "destination_countries": {
        +                    "items": {
        +                      "type": "string"
        +                    },
        +                    "type": "array"
        +                  },
        +                  "destination_country_codes": {
        +                    "items": {
        +                      "type": "string"
        +                    },
        +                    "type": "array"
        +                  },
        +                  "domain": {
        +                    "type": "string"
        +                  },
        +                  "latitude": {
        +                    "type": "number"
        +                  },
        +                  "longitude": {
        +                    "type": "number"
        +                  },
        +                  "mobile": {
        +                    "type": "boolean"
        +                  },
        +                  "organization": {
        +                    "type": "string"
        +                  },
        +                  "os": {
        +                    "type": "string"
        +                  },
        +                  "rdns": {
        +                    "type": "string"
        +                  },
        +                  "rdns_parent": {
        +                    "type": "string"
        +                  },
        +                  "rdns_validated": {
        +                    "type": "boolean"
        +                  },
        +                  "region": {
        +                    "type": "string"
        +                  },
        +                  "sensor_count": {
        +                    "type": "number"
        +                  },
        +                  "sensor_hits": {
        +                    "type": "number"
        +                  },
        +                  "single_destination": {
        +                    "type": "boolean"
        +                  },
        +                  "source_city": {
        +                    "type": "string"
        +                  },
        +                  "source_country": {
        +                    "type": "string"
        +                  },
        +                  "source_country_code": {
        +                    "type": "string"
        +                  }
        +                },
        +                "type": "object"
        +              },
        +              "raw_data": {
        +                "additionalProperties": {},
        +                "properties": {
        +                  "hassh": {
        +                    "items": {
        +                      "additionalProperties": {},
        +                      "properties": {
        +                        "fingerprint": {
        +                          "type": "string"
        +                        },
        +                        "port": {
        +                          "type": "number"
        +                        }
        +                      },
        +                      "required": [
        +                        "fingerprint",
        +                        "port"
        +                      ],
        +                      "type": "object"
        +                    },
        +                    "type": "array"
        +                  },
        +                  "http": {
        +                    "additionalProperties": {},
        +                    "properties": {
        +                      "host": {
        +                        "items": {
        +                          "type": "string"
        +                        },
        +                        "type": "array"
        +                      },
        +                      "ja4h": {
        +                        "items": {
        +                          "type": "string"
        +                        },
        +                        "type": "array"
        +                      },
        +                      "method": {
        +                        "items": {
        +                          "type": "string"
        +                        },
        +                        "type": "array"
        +                      },
        +                      "path": {
        +                        "items": {
        +                          "type": "string"
        +                        },
        +                        "type": "array"
        +                      },
        +                      "useragent": {
        +                        "items": {
        +                          "type": "string"
        +                        },
        +                        "type": "array"
        +                      }
        +                    },
        +                    "type": "object"
        +                  },
        +                  "ja3": {
        +                    "items": {
        +                      "additionalProperties": {},
        +                      "properties": {
        +                        "fingerprint": {
        +                          "type": "string"
        +                        },
        +                        "port": {
        +                          "type": "number"
        +                        }
        +                      },
        +                      "required": [
        +                        "fingerprint",
        +                        "port"
        +                      ],
        +                      "type": "object"
        +                    },
        +                    "type": "array"
        +                  },
        +                  "scan": {
        +                    "items": {
        +                      "additionalProperties": {},
        +                      "properties": {
        +                        "port": {
        +                          "type": "number"
        +                        },
        +                        "protocol": {
        +                          "type": "string"
        +                        }
        +                      },
        +                      "required": [
        +                        "port",
        +                        "protocol"
        +                      ],
        +                      "type": "object"
        +                    },
        +                    "type": "array"
        +                  },
        +                  "source": {
        +                    "additionalProperties": {},
        +                    "properties": {
        +                      "bytes": {
        +                        "type": "number"
        +                      }
        +                    },
        +                    "type": "object"
        +                  },
        +                  "ssh": {
        +                    "additionalProperties": {},
        +                    "properties": {
        +                      "ja4ssh": {
        +                        "items": {
        +                          "type": "string"
        +                        },
        +                        "type": "array"
        +                      },
        +                      "key": {
        +                        "items": {
        +                          "type": "string"
        +                        },
        +                        "type": "array"
        +                      }
        +                    },
        +                    "type": "object"
        +                  },
        +                  "tcp": {
        +                    "additionalProperties": {},
        +                    "properties": {
        +                      "ja4l": {
        +                        "anyOf": [
        +                          {
        +                            "type": "string"
        +                          },
        +                          {
        +                            "items": {
        +                              "type": "string"
        +                            },
        +                            "type": "array"
        +                          }
        +                        ]
        +                      },
        +                      "ja4t": {
        +                        "items": {
        +                          "type": "string"
        +                        },
        +                        "type": "array"
        +                      }
        +                    },
        +                    "type": "object"
        +                  },
        +                  "tls": {
        +                    "additionalProperties": {},
        +                    "properties": {
        +                      "cipher": {
        +                        "anyOf": [
        +                          {
        +                            "type": "string"
        +                          },
        +                          {
        +                            "items": {
        +                              "type": "string"
        +                            },
        +                            "type": "array"
        +                          }
        +                        ]
        +                      },
        +                      "ja4": {
        +                        "items": {
        +                          "type": "string"
        +                        },
        +                        "type": "array"
        +                      }
        +                    },
        +                    "type": "object"
        +                  }
        +                },
        +                "type": "object"
        +              },
        +              "seen": {
        +                "type": "boolean"
        +              },
        +              "spoofable": {
        +                "type": "boolean"
        +              },
        +              "tags": {
        +                "items": {
        +                  "additionalProperties": {},
        +                  "properties": {
        +                    "category": {
        +                      "type": "string"
        +                    },
        +                    "created": {
        +                      "type": "string"
        +                    },
        +                    "created_at": {
        +                      "type": "string"
        +                    },
        +                    "cves": {
        +                      "items": {
        +                        "type": "string"
        +                      },
        +                      "type": "array"
        +                    },
        +                    "description": {
        +                      "type": "string"
        +                    },
        +                    "id": {
        +                      "type": "string"
        +                    },
        +                    "intention": {
        +                      "type": "string"
        +                    },
        +                    "name": {
        +                      "type": "string"
        +                    },
        +                    "recommend_block": {
        +                      "type": "boolean"
        +                    },
        +                    "references": {
        +                      "items": {
        +                        "type": "string"
        +                      },
        +                      "type": "array"
        +                    },
        +                    "slug": {
        +                      "type": "string"
        +                    },
        +                    "updated_at": {
        +                      "type": "string"
        +                    }
        +                  },
        +                  "required": [
        +                    "id",
        +                    "slug",
        +                    "name",
        +                    "category",
        +                    "intention",
        +                    "description",
        +                    "references",
        +                    "recommend_block",
        +                    "cves"
        +                  ],
        +                  "type": "object"
        +                },
        +                "type": "array"
        +              },
        +              "tor": {
        +                "type": "boolean"
        +              },
        +              "vpn": {
        +                "type": "boolean"
        +              },
        +              "vpn_service": {
        +                "type": "string"
        +              }
        +            },
        +            "type": "object"
        +          },
        +          "ip": {
        +            "type": "string"
        +          },
        +          "request_metadata": {
        +            "additionalProperties": {},
        +            "properties": {
        +              "message": {
        +                "type": "string"
        +              },
        +              "restricted_fields": {
        +                "items": {
        +                  "type": "string"
        +                },
        +                "type": "array"
        +              }
        +            },
        +            "type": "object"
        +          }
        +        },
        +        "required": [
        +          "ip",
        +          "business_service_intelligence",
        +          "internet_scanner_intelligence"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "request_metadata": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "ips_not_found": {
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "restricted_fields": {
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        }
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "data",
        +    "request_metadata"
        +  ],
        +  "type": "object"
        +}
    • Removedquick-check-ip
    • Addedsearch-sessions
    • Removedsearch-tags
    • Addedsession-fields
    • Addedsession-timeseries
    • Addedsession-unique-values
    • Addedupdate-alert
    • Addedupdate-blocklist
  4. 18 tool updatesv0.4.0
    • First observedanalyze-tags-activity
    • First observedexport-sessions-pcap
    • First observedget-cve-details
    • First observedget-session
    • First observedget-session-pcap
    • First observedget-tag-activity
    • First observedget-tag-details
    • First observedget-tag-list
    • First observedget-trending-vulnerabilities
    • First observedgnql-metadata-query
    • First observedgnql-query
    • First observedgnql-stats
    • First observedgnql-timeseries
    • First observedgnql-timeseries-stats
    • First observedlookup-ip-context
    • First observedmulti-ip-check
    • First observedquick-check-ip
    • First observedsearch-tags

TDQS

B3.4/5.0

Scored across 48 tools

Disambiguation3/5

Most tool families are distinct (blocklists, alerts, BSI, callbacks, sessions), but there is meaningful overlap between gnql-query, gnql-metadata-query, gnql-stats, gnql-timeseries, and gnql-timeseries-stats, as well as between lookup-ip-context, quick-check-ip, multi-ip-check, and bsi-lookup. Session PCAP export also appears in three forms (get-session-pcap, export-sessions-pcap, export-session-data). Detailed descriptions mitigate most confusion, but an agent must read carefully to pick the right variant.

Naming Consistency3/5

All names are lowercase kebab-case, which is consistent, but the verb/noun ordering is mixed: verb-first (get-session, list-alerts, create-blocklist) coexists with noun-first or noun-only names (session-fields, session-counts, callback-overview, gnql-timeseries-stats, bsi-trust-stats). The result is readable but not predictable enough to infer a tool's shape from its name alone.

Tool Count2/5

48 tools is heavy for a single-domain threat-intelligence server and far exceeds the typical 3-15 range. While the domain is broad (GNQL, sessions, tags, CVEs, blocklists, alerts, BSI, callbacks), many tools are near-duplicate query/export variants that could be consolidated into parameterized endpoints.

Completeness4/5

Coverage is strong: full CRUD plus enable/disable for both blocklists and alerts, rich session analytics, tag discovery/activity, BSI lookups, callback/C2 endpoints, and multi-format IP and GNQL queries. Minor gaps exist — there is no general CVE list/search (only get-cve-details and trending vulnerabilities) and little workspace/account context — but core workflows are well supported.

Maintenance

ActivityMaintained
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    An MCP server that extracts Indicators of Compromise (IoCs) from unstructured text and checks their reputation across multiple threat intelligence services. It enables real-time analysis of IPs, domains, hashes, and URLs, providing enriched context for security workflows within LLMs.
    5
    35 PyPI
    19
    MIT
  • A
    license
    D
    quality
    D
    maintenance
    A comprehensive MCP server providing tools for IP, domain, email, and image-based open-source intelligence. It integrates services like Shodan, VirusTotal, and HaveIBeenPwned to facilitate advanced security research and data gathering.
    56
    40 npm
    ISC
  • A
    license
    Not graded
    quality
    A
    maintenance
    An MCP server that exposes a 60+ tool security and threat-intel stack to AI agents, enabling secret scanning, Sigma rule generation, ransomware lookup, OSINT, and deep research.
    1
    MIT
  • A
    license
    B
    quality
    C
    maintenance
    A professional-grade network analysis MCP server that integrates Wireshark/TShark, Nmap, and threat intelligence to enable packet capture, network scanning, threat detection, and credential extraction through natural language.
    41
    2
    MIT