Skip to main content
Glama

Validate UK VAT Number (HMRC)

vat_validate
Read-onlyIdempotent

Validate a UK (GB) VAT number against the HMRC register. UK numbers only.

Returns the trading name and address as registered with HMRC for VAT purposes. The VAT-registered trading address often differs from the Companies House registered address — that discrepancy is a due diligence signal worth noting.

Non-UK (EU) VAT numbers cannot be validated here — use the EU VIES service for other member states.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
vat_numberYesUK (GB) VAT registration number — this tool validates UK numbers only. Accepts: 'GB123456789', '123456789', 'GB 123 456 789'. GB prefix and spaces normalised automatically.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
validYesTrue if HMRC confirmed the VAT number is currently registered. False means HMRC returned 404 (not registered / deregistered).
vat_numberYesCanonical VAT number in 'GB<9 digits>' format.
trading_nameNoTrading name registered with HMRC for VAT. Compare with the Companies House name — discrepancies are a due diligence signal.
registered_addressNoVAT-registered trading address. May differ from the Companies House registered office address.
consultation_numberNoHMRC consultation reference number for this lookup.

Schema Changelog

Changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. Changed1 schema field changed
    • changedInput schema / properties / vat_number / description
      Previous value: -"UK VAT registration number. Accepts: 'GB123456789', '123456789', 'GB 123 456 789'. GB prefix and spaces normalised automatically."New value: +"UK (GB) VAT registration number — this tool validates UK numbers only. Accepts: 'GB123456789', '123456789', 'GB 123 456 789'. GB prefix and spaces normalised automatically."
  2. Added
  3. Removed
  4. Changed10 schema fields changed
    • removedInput schema / properties / response_format
      Removed value: -{
      -  "default": "markdown",
      -  "description": "Output format: 'markdown' or 'json'",
      -  "type": "string"
      -}
    • changedOutput schema / description
      Previous value: -"Generic wrapper for non-object return types."New value: +"HMRC VAT validation result."
    • addedOutput schema / properties / consultation_number
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "HMRC consultation reference number for this lookup."
      +}
    • addedOutput schema / properties / registered_address
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "VAT-registered trading address. May differ from the Companies House registered office address."
      +}
    • removedOutput schema / properties / result
      Removed value: -{
      -  "type": "string"
      -}
    • addedOutput schema / properties / trading_name
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Trading name registered with HMRC for VAT. Compare with the Companies House name — discrepancies are a due diligence signal."
      +}
    • addedOutput schema / properties / valid
      Added value: +{
      +  "description": "True if HMRC confirmed the VAT number is currently registered. False means HMRC returned 404 (not registered / deregistered).",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / vat_number
      Added value: +{
      +  "description": "Canonical VAT number in 'GB<9 digits>' format.",
      +  "type": "string"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "result"
      -]New value: +[
      +  "valid",
      +  "vat_number"
      +]
    • removedOutput schema / x-fastmcp-wrap-result
      Removed value: -true
  5. First observed

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false. The description adds meaningful context: it returns the trading name and address, and notes that this often differs from the Companies House registered address, framing it as a due diligence signal. This goes beyond what annotations alone convey.

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

Conciseness5/5

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

The description is three short paragraphs, each earning its place: core purpose, return-value detail with a practical caveat, and an explicit scope limitation with an alternative. It is front-loaded, efficient, and free of 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?

This is a simple one-parameter tool with an output schema present. The description covers the return values, the UK-only scope, the external alternative, and a subtle due-diligence nuance. Nothing important is missing for correct selection and invocation.

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

Parameters3/5

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

The input schema has 100% description coverage for the single parameter, including accepted formats and normalization behavior. The description itself adds no additional parameter-specific meaning, so the baseline score of 3 is appropriate; the schema already 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 opens with 'Validate a UK (GB) VAT number against the HMRC register,' using a specific verb and resource while immediately clarifying the UK-only scope. This clearly distinguishes it from sibling search/profile tools that focus on company or charity data.

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

Usage Guidelines5/5

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

The description explicitly states 'Non-UK (EU) VAT numbers cannot be validated here — use the EU VIES service for other member states,' providing both an exclusion and a concrete alternative. For UK numbers, the implied use case is clear and unambiguous.

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.

TDQS

A4.2/5.0
Disambiguation4/5

The domain-specific tools are clearly distinct (search vs profile for each register), and the generic search/fetch tools are designed to route across them. Potential overlap between company_officers and company_psc is resolved by clear descriptions of officers vs beneficial ownership. Slight ambiguity exists between generic fetch/search and the domain-specific counterparts, but the routing logic is well-documented.

Naming Consistency4/5

Most tools follow a consistent resource_action pattern with clear prefixes (charity_, company_, disqualified_, gazette_). Exceptions like company_officers, company_psc, sanctions_screen, and vat_validate deviate from the verb-first convention, and generic tools (fetch, search, get_prompt, list_prompts) do not follow the pattern. Overall, the naming is readable and predictable despite a few outliers.

Tool Count4/5

With 17 tools, the server sits slightly above the typical 3-15 well-scoped range, but the breadth of the domain (Companies House, Charity Commission, disqualifications, Gazette insolvency, sanctions, land registry, VAT) justifies the count. Each tool serves a distinct data source or action, and the two prompt-management tools are standard MCP utilities. The count feels appropriate rather than excessive.

Completeness4/5

The server covers the core due diligence workflow: searching and retrieving profiles for companies, charities, and disqualified directors, plus insolvency notices, sanctions screening, land transactions, and VAT validation. Minor gaps exist, such as no direct tool for company accounts or court judgments, but these are not core to the apparent purpose and can be worked around.