Skip to main content
Glama

PG1 Sovereign Threat Intelligence

check_domain_age

PG1 Sovereign Threat Intelligence: looks up a domain's registration age via RDAP (the IANA-standardized WHOIS successor), resolved through the IANA bootstrap registry for the correct per-TLD RDAP server. No payment required — this tool is always free. SIBLING DIFFERENTIATION: Use for domain registration/age checks only. Do NOT use for reputation/threat-feed lookups (use get_ioc_context) or sanctions screening (use check_wallet_sanctions). BEHAVIOR: Returns { found: true, available: true, registration_date, age_days, expiration_date, registrar, newly_registered, source } when available, or { found: false, available: false, reason, reason_code } when the lookup does not resolve — this tool never estimates or guesses an age. "available" is a deprecated alias of "found", kept for backward compatibility. reason_code is "unsupported_tld" when the TLD has no RDAP server in the IANA bootstrap registry, or "timeout" / "lookup_failed" for other lookup failures. A newly registered domain (age_days < 30) is reported as a common phishing signal, not as proof of malicious intent.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
domainYesMandatory domain name or URL to check, e.g. 'example.com' or 'https://example.com/path'. The registrable domain is extracted automatically.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
noteNo
foundYesWhether a registration record was found. Same meaning as the deprecated "available" field.
checksNoWhich underlying sources were checked for this result and whether each one completed.
domainYes
reasonNo
sourceNo
statusNo"unknown" whenever a source needed for this answer timed out, errored, or was skipped - never "no_flags" in that case.
reasonsNoMachine-readable reason codes for anything flagged in this result. Empty when nothing was flagged.
age_daysNo
availableYesDeprecated — use "found" instead. Kept for backward compatibility.
registrarNo
request_idNoUUID for this request, also sent as the X-Request-Id response header.
reason_codeNo
test_fixtureNotrue only when the input was a documented integration test fixture and this response is canned; absent on real results.
expiration_dateNo
newly_registeredNo
registration_dateNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed5 schema fields changed
    • addedOutput schema / properties / checks
      Added value: +{
      +  "description": "Which underlying sources were checked for this result and whether each one completed.",
      +  "items": {
      +    "properties": {
      +      "checked_at": {
      +        "type": "string"
      +      },
      +      "data_as_of": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "result": {
      +        "enum": [
      +          "ok",
      +          "timeout",
      +          "error",
      +          "skipped"
      +        ],
      +        "type": "string"
      +      },
      +      "source": {
      +        "description": "Generic label for the data source checked, never a vendor name.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "source",
      +      "result",
      +      "checked_at",
      +      "data_as_of"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / reasons
      Added value: +{
      +  "description": "Machine-readable reason codes for anything flagged in this result. Empty when nothing was flagged.",
      +  "items": {
      +    "properties": {
      +      "code": {
      +        "type": "string"
      +      },
      +      "message": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "code",
      +      "message"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / request_id
      Added value: +{
      +  "description": "UUID for this request, also sent as the X-Request-Id response header.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / status
      Added value: +{
      +  "description": "\"unknown\" whenever a source needed for this answer timed out, errored, or was skipped - never \"no_flags\" in that case.",
      +  "enum": [
      +    "flagged",
      +    "no_flags",
      +    "unknown"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / test_fixture
      Added value: +{
      +  "description": "true only when the input was a documented integration test fixture and this response is canned; absent on real results.",
      +  "type": "boolean"
      +}
  2. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "properties": {
      +    "age_days": {
      +      "type": [
      +        "integer",
      +        "null"
      +      ]
      +    },
      +    "available": {
      +      "description": "Deprecated — use \"found\" instead. Kept for backward compatibility.",
      +      "type": "boolean"
      +    },
      +    "domain": {
      +      "type": "string"
      +    },
      +    "expiration_date": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "found": {
      +      "description": "Whether a registration record was found. Same meaning as the deprecated \"available\" field.",
      +      "type": "boolean"
      +    },
      +    "newly_registered": {
      +      "type": [
      +        "boolean",
      +        "null"
      +      ]
      +    },
      +    "note": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "reason": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "reason_code": {
      +      "enum": [
      +        "invalid_domain",
      +        "bootstrap_unavailable",
      +        "unsupported_tld",
      +        "timeout",
      +        "lookup_failed",
      +        null
      +      ],
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "registrar": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "registration_date": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "source": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    }
      +  },
      +  "required": [
      +    "found",
      +    "available",
      +    "domain"
      +  ],
      +  "type": "object"
      +}
  3. Added

TDQS

A4.6/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so: it documents both success and failure response shapes, enumerates reason_code values ('unsupported_tld', 'timeout', 'lookup_failed'), flags 'available' as a deprecated alias, and commits to never estimating an age. It also frames newly_registered as a signal, not proof of malice.

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?

Front-loaded with the operation and uses clear SIBLING DIFFERENTIATION / BEHAVIOR labels to make scanning easy. Slightly padded by branding ('PG1 Sovereign Threat Intelligence') and the 'No payment required — always free' line, which is useful pricing context but costs space.

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?

Despite having an output schema, the description still explains both return branches and reason codes, and it covers failure modes an agent must handle. Nothing needed to call this tool correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100% and the single parameter is fully documented in the schema, including the URL form and automatic registrable-domain extraction. The description adds nothing beyond that on the parameter side, so the 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?

States a specific verb+resource (looks up a domain's registration age) plus the mechanism (RDAP via IANA bootstrap), and explicitly distinguishes itself from get_ioc_context and check_wallet_sanctions. An agent can route correctly without opening any 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?

Contains an explicit 'Use for ... only' scope plus two named exclusions with the exact sibling to use instead ('Do NOT use for reputation/threat-feed lookups (use get_ioc_context) or sanctions screening (use check_wallet_sanctions)'). This is the when/when-not/alternative pattern at full strength.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.