Skip to main content
Glama

Check identifiers

hallux_check
Read-onlyIdempotent

Does this identifier actually exist? Call before acting on any name you recalled rather than read: a package to install, a module to import, a DOI to cite.

Returns one of: exists, deprecated, absent, phantom, squat, unknown. exists - proceed deprecated - proceed, but use successor absent - not in the registry. Do not proceed phantom - does not exist AND models repeatedly invent it. Do not proceed squat - was invented by models, then registered by someone. Treat as hostile unknown - could not verify. Never treat this as permission

Live namespaces: cite.doi, pkg.crates, pkg.go, pkg.maven, pkg.npm, pkg.nuget, pkg.pypi. An unsupported namespace returns unknown, never an error, so it is safe to ask.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
identifiersYesUp to 100 identifiers.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
blockedNoThe absent, phantom and squat results.
checkedNoHow many identifiers were checked.
resultsYesEvery result, in input order.
decisionYesBLOCK: do not proceed. REVIEW: something could not be verified. PROCEED: every identifier exists. NOTHING_TO_CHECK: no identifier was recognised.
unverifiedNoThe unknown results.
safeToProceedYesFalse whenever anything was blocked.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changed
    • addedInput schema / properties / identifiers / items / properties / namespace / description
      Added value: +"Where the identifier lives: pkg.npm, pkg.pypi, pkg.crates, pkg.go, pkg.maven or pkg.nuget for a package, cite.doi for a DOI."
    • addedInput schema / properties / identifiers / items / properties / value / description
      Added value: +"The identifier exactly as written, e.g. requests, @types/node, github.com/spf13/cobra, 10.1038/nature12373."
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "properties": {
      +    "blocked": {
      +      "description": "The absent, phantom and squat results.",
      +      "items": {
      +        "properties": {
      +          "confidence": {
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "evidence": {
      +            "description": "What the verdict rests on: registry status and time, attestations, model families, nearest existing names.",
      +            "type": "object"
      +          },
      +          "namespace": {
      +            "description": "The namespace checked.",
      +            "type": "string"
      +          },
      +          "reason": {
      +            "description": "Why the verdict is unknown.",
      +            "type": "string"
      +          },
      +          "recommendation": {
      +            "description": "What to do next.",
      +            "type": "string"
      +          },
      +          "successor": {
      +            "description": "The name to use instead, when one is known.",
      +            "type": "string"
      +          },
      +          "value": {
      +            "description": "The identifier checked.",
      +            "type": "string"
      +          },
      +          "verdict": {
      +            "description": "exists and deprecated may proceed; absent, phantom and squat must not; unknown is never permission.",
      +            "enum": [
      +              "exists",
      +              "deprecated",
      +              "absent",
      +              "phantom",
      +              "squat",
      +              "unknown"
      +            ],
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "namespace",
      +          "value",
      +          "verdict",
      +          "confidence"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "checked": {
      +      "description": "How many identifiers were checked.",
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "decision": {
      +      "description": "BLOCK: do not proceed. REVIEW: something could not be verified. PROCEED: every identifier exists. NOTHING_TO_CHECK: no identifier was recognised.",
      +      "enum": [
      +        "PROCEED",
      +        "REVIEW",
      +        "BLOCK",
      +        "NOTHING_TO_CHECK"
      +      ],
      +      "type": "string"
      +    },
      +    "results": {
      +      "description": "Every result, in input order.",
      +      "items": {
      +        "properties": {
      +          "confidence": {
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "evidence": {
      +            "description": "What the verdict rests on: registry status and time, attestations, model families, nearest existing names.",
      +            "type": "object"
      +          },
      +          "namespace": {
      +            "description": "The namespace checked.",
      +            "type": "string"
      +          },
      +          "reason": {
      +            "description": "Why the verdict is unknown.",
      +            "type": "string"
      +          },
      +          "recommendation": {
      +            "description": "What to do next.",
      +            "type": "string"
      +          },
      +          "successor": {
      +            "description": "The name to use instead, when one is known.",
      +            "type": "string"
      +          },
      +          "value": {
      +            "description": "The identifier checked.",
      +            "type": "string"
      +          },
      +          "verdict": {
      +            "description": "exists and deprecated may proceed; absent, phantom and squat must not; unknown is never permission.",
      +            "enum": [
      +              "exists",
      +              "deprecated",
      +              "absent",
      +              "phantom",
      +              "squat",
      +              "unknown"
      +            ],
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "namespace",
      +          "value",
      +          "verdict",
      +          "confidence"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "safeToProceed": {
      +      "description": "False whenever anything was blocked.",
      +      "type": "boolean"
      +    },
      +    "unverified": {
      +      "description": "The unknown results.",
      +      "items": {
      +        "properties": {
      +          "confidence": {
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "evidence": {
      +            "description": "What the verdict rests on: registry status and time, attestations, model families, nearest existing names.",
      +            "type": "object"
      +          },
      +          "namespace": {
      +            "description": "The namespace checked.",
      +            "type": "string"
      +          },
      +          "reason": {
      +            "description": "Why the verdict is unknown.",
      +            "type": "string"
      +          },
      +          "recommendation": {
      +            "description": "What to do next.",
      +            "type": "string"
      +          },
      +          "successor": {
      +            "description": "The name to use instead, when one is known.",
      +            "type": "string"
      +          },
      +          "value": {
      +            "description": "The identifier checked.",
      +            "type": "string"
      +          },
      +          "verdict": {
      +            "description": "exists and deprecated may proceed; absent, phantom and squat must not; unknown is never permission.",
      +            "enum": [
      +              "exists",
      +              "deprecated",
      +              "absent",
      +              "phantom",
      +              "squat",
      +              "unknown"
      +            ],
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "namespace",
      +          "value",
      +          "verdict",
      +          "confidence"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "required": [
      +    "decision",
      +    "safeToProceed",
      +    "results"
      +  ],
      +  "type": "object"
      +}
  2. First observed

TDQS

A4.7/5.0
Behavior5/5

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

The description fully discloses the return classification (exists, deprecated, absent, phantom, squat, unknown) and the operational meaning of each value, including that unknown must never be treated as permission. It also states that unsupported namespaces return unknown rather than an error. This goes well beyond the readOnly, openWorld, and idempotent 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 well-organized and front-loaded: a one-line purpose, followed by return-value semantics in an easily scannable list, then namespace coverage. Every sentence earns its place and no filler is present.

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 read-only checking tool with a rich output schema, the description covers purpose, when to call, return statuses, safety semantics for unknown, supported namespaces, and error behavior for unsupported namespaces. Nothing essential is missing for an agent to invoke it 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 schema already documents the identifiers array and each namespace. The description adds value by explaining what a value represents, listing live namespaces, and clarifying the behavior for unsupported namespaces. It reinforces but does not merely duplicate 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 opening line states a specific action and resource: verifying whether an identifier actually exists. The scope is further clarified with concrete examples (package to install, module to import, DOI to cite) and the supported namespaces, which differentiates it from sibling tools like hallux_check_command and hallux_check_manifest.

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

Usage Guidelines4/5

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

The description gives explicit when-to-use guidance: call before acting on any recalled name rather than a name read directly. It does not name alternative sibling tools or provide explicit when-not-to-use scenarios, but the recalled-vs-read distinction is a clear contextual rule.

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.

Resources