GBG Loqate - Reach

io.github.gbgplc由 GitHub 账号 gbgplc 发布v0.6.2更新于 Oct 24, 2026

Verify addresses, email addresses, and phone numbers with confidence scores.

已验证Streamable HTTP可网页运行数据与分析商业与电商

概览

AI 生成的概览

GBG Loqate 提供的远程 MCP 服务器,让助手核验地址、邮箱和电话号码,并获得置信度分数与接受/复核/拒绝建议。

可以做什么
核验单个地址、邮箱或电话号码,或核验组合联系人,对照 Loqate 参考数据返回置信度分数和基于策略的建议,可选返回备选地址建议,并按建议 id 解析出完整地址组成部分。每次批量调用最多核验 100 条地址、邮箱、电话或联系人,单条出错不影响其他记录,结果带输入索引。列出并查看内置决策策略(strict、shipping、standard、permissive)及其阈值。
适用场景
适合助手处理联系人数据的场景:在保存前检查收货或账单地址、筛查邮箱和电话号码风险、批量清洗记录,或向用户提供更正后的地址候选。
运行要求
远程 streamable HTTP 端点,无需本地安装。邮箱和电话核验需要 Loqate API 密钥,通过工具的 key 字段传入。地址建议需要账户已开通单独授权的 Loqate 功能,按建议 id 解析会消耗一次 Loqate 额度。
安装前请注意
Loqate API 密钥作为工具参数传入,会随每次请求传输,应视为机密。核验调用会消耗 Loqate 额度,解析建议 id 会计费。地址、邮箱和电话数据会发送到 Loqate 服务。建议只是候选而非核验结果,写入业务系统前应重新核验。

安装

在 SourceWeft 中

  1. 打开 控制台中的 GBG Loqate - Reach,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Web executable,通过 Streamable HTTP。 远程服务在工作区中配置后即可从网页运行时运行。

交给智能体安装

把这段提示词粘贴到 Claude Code、Codex、Cursor 等智能体,或 SourceWeft 对话中。智能体会读取该服务器的安装指南,先向你展示发布者、端点和登录方式,经你同意后再把它添加到你的客户端。密钥不会写进任何命令。

阅读 https://sourceweft.com/mcp/io.github.gbgplc%2Flqt/install.md,并按其中说明把这个 MCP 服务器接入我的客户端。修改任何配置之前,先告诉我它的发布者、端点和登录方式,等我确认。不要把 API 密钥写进命令或我会提交的文件;问我密钥应从哪里获取。

查看智能体所依据的安装指南

其他 MCP 客户端

把它添加到你客户端的 mcpServers 配置中。

{
  "mcpServers": {
    "gbg-loqate-reach": {
      "type": "http",
      "url": "https://reach.prod.fabric.gbgplatforms.com/mcp"
    }
  }
}

README

[Loqate CLI]

Loqate CLI

Verify addresses, emails, and phone numbers against Loqate's APIs.
Get confidence scores, policy-aware recommendations, and full auditability — in one command.
Real-time verification decisioning for agents that need to know whether contact data is good enough for the job.
Part of GBG Reach.

lqt verify  ·  lqt parse  ·  lqt mcp


Install

macOS

bash
# Apple Silicon (M1/M2/M3/M4)curl -sL https://github.com/gbgplc/lqt/releases/latest/download/lqt_darwin_arm64.tar.gz | tar xzsudo mv lqt /usr/local/bin/
# Intelcurl -sL https://github.com/gbgplc/lqt/releases/latest/download/lqt_darwin_amd64.tar.gz | tar xzsudo mv lqt /usr/local/bin/

Linux

bash
# x86_64curl -sL https://github.com/gbgplc/lqt/releases/latest/download/lqt_linux_amd64.tar.gz | tar xzsudo mv lqt /usr/local/bin/
# ARM64curl -sL https://github.com/gbgplc/lqt/releases/latest/download/lqt_linux_arm64.tar.gz | tar xzsudo mv lqt /usr/local/bin/

Windows

  1. Download lqt_windows_amd64.zip from the latest release
  2. Extract lqt.exe
  3. Move it to a directory on your PATH, or run it directly

Verify Installation

bash
lqt version

All Downloads

See Releases for all versions and platforms. Each release includes SHA-256 checksums.

PlatformArchive
macOS (Apple Silicon)lqt_*_darwin_arm64.tar.gz
macOS (Intel)lqt_*_darwin_amd64.tar.gz
Linux (x86_64)lqt_*_linux_amd64.tar.gz
Linux (ARM64)lqt_*_linux_arm64.tar.gz
Windows (x86_64)lqt_*_windows_amd64.zip

Quick Start

API Keys

You need a Loqate API key for verification. Optionally, an Anthropic API key for the parse command.

macOS / Linux:

bash
export LOQATE_API_KEY=your-key-here
# Optional — for lqt parseexport ANTHROPIC_API_KEY=your-key-here

Windows (PowerShell):

powershell
$env:LOQATE_API_KEY="your-key-here"
# Optional — for lqt parse$env:ANTHROPIC_API_KEY="your-key-here"

Your First Verification

macOS / Linux:

bash
# Verify an addresslqt verify --address "125 Summer Street, Boston, MA 02110, US"
# Verify address + email + phone with a policylqt verify -a "10 Downing St, London, GB" \           -e "[email protected]" \           -p "+442071234567" \           --policy shipping
# Parse and standardize without calling Loqate (uses Claude)lqt parse --address "125 summer street boston ma 02110 us"

Windows (PowerShell):

powershell
# Verify an address.\lqt.exe verify --address "125 Summer Street, Boston, MA 02110, US"
# Verify address + email + phone with a policy.\lqt.exe verify -a "10 Downing St, London, GB" -e "[email protected]" -p "+442071234567" --policy shipping
# Parse and standardize without calling Loqate (uses Claude).\lqt.exe parse --address "125 summer street boston ma 02110 us"

Commands

verify

Verify addresses, emails, and/or phone numbers against Loqate's APIs. Returns a confidence score and a policy-driven recommendation (accept, review, or reject).

bash
lqt verify [flags]

Flags:

FlagShortDescription
--address-aFull address to verify
--localityCity/town
--admin-areaState/province
--postcodePostal/ZIP code
--country-cISO 2-letter country code
--detect-countryWhen no country is supplied, guess it from the address and flag the guess in the result. Address-only; off by default.
--suggestWhen the address does not clear the policy (review or reject), look up alternative addresses suggested by Loqate and return them under address.suggestions. Not called for an accepted address. Requires a separately licensed Loqate feature enabled on your account. Address-only; off by default; not available with --batch.
--suggest-limitMaximum suggestions to return, 1–10 (default 5). Requires --suggest.
--suggest-belowConfidence floor for suggestions: an accepted address scoring below it still gets suggestions. Defaults to the active policy's value (standard 0.85). 0 disables the floor. Requires --suggest.
--suggestion-idVerify a suggestion the user chose, by its id from address.suggestions. Resolves the id to its cleansed components and verifies those. Use instead of --address. Consumes a Loqate credit. Not available with --batch or --dry-run.
--email-eEmail address to verify
--phone-pPhone number (E.164 format)
--key-kLoqate API key (overrides env)
--policyPolicy name: strict, shipping, standard, permissive
--policy-filePath to custom policy JSON file
--batch-bCSV/TSV/pipe-delimited file path (or - for stdin)
--delimiter-dBatch delimiter: comma, tab, pipe (auto-detected if omitted)
--output-oOutput format: json, jsonl, table
--summary-sShow batch summary statistics
--fieldExtra Loqate input field Key=Value (repeatable)
--optionLoqate API option Key=Value (repeatable, dot notation for nesting)
--jsonlJSON Lines output (one object per line)
--no-colorDisable color output
--verify-urlCustom address verification endpoint URL (overrides LOQATE_VERIFY_URL env var)
--verify-keyCustom address verification API key (overrides LOQATE_VERIFY_KEY env var). When set, --key is not required for address-only verification.
--verbose-vShow reasoning log

Examples:

bash
# Simple address verificationlqt verify -a "1600 Amphitheatre Parkway, Mountain View, CA 94043, US"
# Multi-field verification with strict policylqt verify -a "221B Baker St, London, GB" \           -e "[email protected]" \           -p "+442071234567" \           --policy strict
# Email-only or phone-only (no address required)lqt verify -e "[email protected]"lqt verify -p "+442071234567"
# Guess a missing country from the address (opt-in, address-only)lqt verify -a "10 Downing St, London SW1A 2AA" --detect-country# → result includes: country_guessed, detected_country, country_confidence
# Suggest alternatives when the address does not clear the policy (opt-in, address-only)lqt verify -a "10 downin st london" -c GB --suggestlqt verify -a "10 downin st london" -c GB --suggest --suggest-limit 3# → result includes: address.suggestions with a list of candidate addresses
# Accepted but not confident: a street-level match accepted at 0.55 still gets alternativeslqt verify -a "marsh wall, E14 9TN" -c GB --suggest# Move or disable the confidence floorlqt verify -a "marsh wall, E14 9TN" -c GB --suggest --suggest-below 0.95lqt verify -a "marsh wall, E14 9TN" -c GB --suggest --suggest-below 0
# JSON output for piping to other toolslqt verify -a "10 Downing St, London, GB" -o json | jq '.address.confidence'
# Extended input fieldslqt verify -a "125 Summer St" --field Organization="Acme Corp" --field Building="Suite 200"
# API options (dot notation for nesting)# GeoCode is sent at the request root as a JSON boolean (where Loqate expects it);# ServerOptions values are sent as strings (use Loqate's exact casing).lqt verify -a "125 Summer St, Boston, MA 02110, US" --option GeoCode=truelqt verify -a "125 Summer St, Boston, MA 02110, US" --option ServerOptions.OutputCasing=Upper

Full list of input fields and API options: Loqate International Batch Cleanse API

Address suggestions (--suggest)

Licensing. Suggestions use a Loqate feature that is licensed separately from address verification and must be enabled on your account. If it isn't, nothing breaks: the verification still returns its normal result and exit code, and the reason appears in suggestions.error (typically an unknown-key or licence message from Loqate). Talk to your Loqate account contact to have it enabled.

Verification tells you an address is wrong. Suggestions tell you what the right one probably is. Add --suggest and lqt asks Loqate for real addresses matching what was typed, returning them with the decision.

The lookup runs when either:

  1. the address was not accepted (review or reject), or
  2. the address was accepted but scored below the policy's suggestion floor (0.85 on standard — see the Policies table).

The second case is the one that catches near-misses. A policy accepts anything at or above its minimum confidence, so accepted is not the same as confident: on standard the input marsh wall, E14 9TN matches a street and scores exactly 0.55, which is accepted — yet the house number is missing and better addresses exist. Use --suggest-below to move that line (--suggest-below 0 turns the confidence check off and only suggests on review/reject).

json
{  "address": {    "verified_address": "Downing Street, London",    "confidence": 0.5,    "recommendation": "review",    "suggestions": {      "requested": true,      "triggered": true,      "reason": "accepted but confidence 0.55 is below the 0.85 floor",      "floor": 0.85,      "source": "loqate",      "count": 2,      "items": [        {          "id": "GB|RM|A|52509479",          "type": "Address",          "text": "10 Downing Street",          "description": "London, SW1A 2AA",          "address": "10 Downing Street, London, SW1A 2AA"        },        {          "id": "GB|RM|A|52509480",          "type": "Address",          "text": "11 Downing Street",          "description": "London, SW1A 2AB",          "address": "11 Downing Street, London, SW1A 2AB"        }      ]    }  }}

Things worth knowing:

  • Off by default, so existing output is unchanged unless you ask for suggestions.
  • No lookup for a confidently accepted address — you pay the extra latency only where it helps. The suggestions block is still returned with "triggered": false and a reason, so you can tell "no alternatives needed" from "suggestions were never requested".
  • floor reports the threshold that was applied, so you can see why a lookup ran (or didn't) without knowing the policy's configuration.
  • Suggestions never change the decision. If the lookup fails, the reason appears in suggestions.error and the verification result stands.
  • Address-only. With verify --email / --phone, or verify_contact, only the address block is decorated.
  • An entry with "expandable": true is a street, postcode, or building holding several addresses rather than one deliverable address. Search within it for a specific premise.
  • Suggestion lookups do not consume Loqate verification credits, but the feature must be licensed on your account (see the note above).
  • Suggestions need a standard Loqate key (--key / LOQATE_API_KEY); --verify-key alone covers address verification only.
  • Not available with --batch. A large file would fan out into an unbounded number of lookups, so the combination is rejected. Verify the file, then re-run the flagged rows individually with --suggest.

Available on the MCP verify_address / verify_contact tools and the REST /v1/verify/address / /v1/verify/contact endpoints as suggest: true, with optional suggest_limit (1–10, default 5) and suggest_below (0–1).

Closing the loop: offer, choose, re-verify

A suggestion is a candidate, not a verdict. Items carry no confidence score, no match level, and no AVC — they are what the reference data thinks the address might have been. Don't write one into your system of record on faith. Close the loop in three steps:

  1. Verify with --suggest. A non-empty suggestions.items means alternatives exist.
  2. Offer items[].address to whoever can decide — the customer in a checkout or support flow, the agent in an automated one. That field is the ready-to-display line.
  3. Confirm the choice by its id (--suggestion-id). That result — its confidence, match level, and standardized fields — is the one you keep. Full flow below.
bash
# 1. verify, asking for alternativeslqt verify -a "marsh wall, E14 9TN" -c GB --suggest -o json > result.json
# 2. show the candidatesjq -r '.address.suggestions.items[] | .address' result.json#   1 Marsh Wall, London, E14 9TN#   2 Marsh Wall, London, E14 9TN
# 3. re-verify the chosen one — this is the decision of recordlqt verify -a "1 Marsh Wall, London, E14 9TN" -c GB -o json

Over REST it's the same shape — one call with suggest, then a plain call with the choice:

bash
curl -s -X POST https://your-host/v1/verify/address \  -H "Authorization: Bearer $LOQATE_API_KEY" -H 'Content-Type: application/json' \  -d '{"address":"marsh wall, E14 9TN","country":"GB","suggest":true}'
curl -s -X POST https://your-host/v1/verify/address \  -H "Authorization: Bearer $LOQATE_API_KEY" -H 'Content-Type: application/json' \  -d '{"address":"1 Marsh Wall, London, E14 9TN","country":"GB"}'
The full flow, end to end
  1. Verify with --suggest — get candidates for an address that didn't come back clean.
  2. Offer items[].address to whoever decides.
  3. Confirm with --suggestion-id, using the chosen item's id. That result is the one you keep.
bash
# 1 + 2lqt verify -a "marsh wall london" -c GB --suggest -o json > r.jsonjq -r '.address.suggestions.items[] | "\(.id)\t\(.address)"' r.json
# 3 — confirm the chosen one by id, not by re-typing the textlqt verify --suggestion-id "GB|RM|B|55782678" -o json

Passing the id rather than the text is what makes step 3 accurate: lqt fetches that address's cleansed components (company, sub-building, number, street, city, postcode, country) and verifies those, so nothing is re-parsed. It matters for suggestions carrying a company name — London Lash, 56 Marsh Wall, London — where re-reading the text can misplace the company as part of the street.

The result records what it resolved from, so you can audit it without resolving again:

json
{  "verified_address": "56 Marsh Wall, London, E14 9TP",  "confidence": 0.95,  "recommendation": "accept",  "resolved_from": {    "suggestion_id": "GB|RM|B|55782678",    "address": "London Lash, Unit 7, Hampton Tower, 56 Marsh Wall, LONDON, E14 9TP"  }}

Over REST, the same two steps:

bash
curl -s -X POST https://your-host/v1/verify/address \  -H "Authorization: Bearer $LOQATE_API_KEY" -H 'Content-Type: application/json' \  -d '{"address":"marsh wall london","country":"GB","suggest":true}'
curl -s -X POST https://your-host/v1/verify/address \  -H "Authorization: Bearer $LOQATE_API_KEY" -H 'Content-Type: application/json' \  -d '{"suggestion_id":"GB|RM|B|55782678"}'

What to know:

  • Step 3 consumes a Loqate credit to resolve the id (the search in step 1 does not). Resolve the one address that was chosen — not the whole list to compare.
  • suggestion_id replaces address; sending both is a 400.
  • Not available with --batch, and not with --dry-run (resolving needs a live billable call).
  • A stale id returns SUGGESTION_NOT_FOUND / 404. Ids change over time — search again rather than retrying the same id.

Just want the address, not a decision? Resolve it on its own:

bash
lqt retrieve --id "GB|RM|B|55782678"           # components as JSONlqt retrieve --id "GB|RM|B|55782678" -o table  # human-readable

GET /v1/address/{id} over REST, or the retrieve_address MCP tool. This returns reference data, not a verification — no confidence, no recommendation — so don't treat it as checked.

Four rules that keep the loop safe:

  • Omit suggest on the confirmation call. If the chosen address still doesn't clear the policy you'd get a fresh set of suggestions, and an automated flow could bounce between them. One round of suggestions, then a plain verify.
  • Let the re-verify decide — not the fact that a suggestion existed. If the confirmation returns review or reject, the record still needs a human. You've narrowed it, not fixed it.
  • Don't re-verify an expandable item as-is. It's a street, postcode, or building, so verifying it lands at street level at best. Use it to ask for the missing piece ("which number on Marsh Wall?") and verify the completed address.
  • Never store id. It's a Loqate-assigned identifier that changes over time. Key off the verified address returned in step 3.

Keep the country from the original request on the confirmation call — dropping it can change the match.

Suggestion ranking comes from Loqate

lqt returns suggestions in the order Loqate provides them — no re-ranking or filtering is applied. Loqate matches across the whole address record, including organisation names, so a query like marsh wall london ranks businesses with "London" in their name above plain residential addresses on that street:

London Lash, 56 Marsh Wall, London, E14 9TPLondon Metropolis Ltd, 77 Marsh Wall, London, E14 9SH

That's standard address-autocomplete behaviour, but it means suggestion quality tracks input quality. Where you know the country, pass it as --country rather than leaving it in the address text — that moves the token out of the fuzzy match and into a filter:

bash
lqt verify -a "marsh wall london" --suggest      # "london" is matchable textlqt verify -a "marsh wall" -c GB --suggest       # cleaner: country is a filter

parse

Parse and standardize contact data using Claude (Haiku). Extracts address components, validates email syntax, and normalizes phone numbers with awareness of 250+ country-specific postal formats. No Loqate API calls — no credits spent.

bash
lqt parse [flags]

Flags:

FlagShortDescription
--address-aFull address to parse
--email-eEmail address to validate
--phone-pPhone number to normalize
--country-cISO 2-letter country code hint
--batch-bCSV/TSV/pipe-delimited file path (or - for stdin)
--delimiter-dBatch delimiter: comma, tab, pipe (auto-detected if omitted)
--output-oOutput format: json, jsonl, table
--jsonlJSON Lines output
--no-colorDisable color output
--anthropic-keyAnthropic API key (overrides env)

Examples:

bash
# Parse a messy address into structured componentslqt parse -a "125 summer street boston ma 02110 us"
# Parse address + validate email + normalize phonelqt parse -a "10 downing st london" -e "[email protected]" -p "02071234567"
# Batch parse from CSVlqt parse --batch messy-data.csv --output json

policy

List, inspect, and validate verification policies.

bash
lqt policy list                  # List all built-in policieslqt policy show <name>           # Show full JSON for a policylqt policy validate <file>       # Validate a custom policy JSON file

mcp

Start an MCP (Model Context Protocol) server. Exposes LQT as tools for AI agents.

bash
lqt mcp                    # Stdio transport (launched by clients)lqt mcp --http :8080       # HTTP transport (deployed as a service)lqt mcp --smoke-test       # Verify the server starts correctly and exit

Flags:

FlagDefaultDescription
--httpListen address (e.g. :8080, 127.0.0.1:8080)
--rate-limit10Max requests/sec per IP (0 to disable)
--rate-burst20Max burst size for rate limiter
--smoke-testSelf-test the MCP server (checks tools and prompts register) and exit
--disable-custom-endpointBlock per-request custom verify endpoint fields
--restAlso serve the REST API at /v1 (HTTP mode only)

REST API

For clients that don't speak MCP, the HTTP server can also expose a plain REST API — opt-in with --rest, mounted at /v1 on the same port. Same result data as the CLI and MCP.

bash
lqt mcp --http :8080 --rest

Authentication: your Loqate API key as a bearer token — Authorization: Bearer <LOQATE_API_KEY> (or key in the request body).

MethodPathDescription
POST/v1/verify/addressVerify an address (supports detect_country, suggest, suggestion_id)
POST/v1/verify/emailVerify an email
POST/v1/verify/phoneVerify a phone number
POST/v1/verify/contactVerify any combination + overall recommendation (supports detect_country, suggest)
GET/v1/address/{id}Resolve a suggestion id to a cleansed address (consumes a credit)
GET/v1/policiesList decisioning policies
GET/v1/policies/{name}Show one policy
GET/v1/openapi.jsonOpenAPI 3.1 specification
GET/v1/docsInteractive API reference

A recommendation (accept / review / reject) is always returned as HTTP 200 with the decision in the body. Errors use standard status codes: 400 invalid input, 401 missing/invalid key, 429 rate limited, 502 upstream error.

bash
curl -s -X POST https://your-host/v1/verify/address \  -H "Authorization: Bearer $LOQATE_API_KEY" \  -H "Content-Type: application/json" \  -d '{"address":"125 Summer St, Boston, MA 02110, US","policy":"standard"}'
# Ask for alternatives when the address does not clear the policycurl -s -X POST https://your-host/v1/verify/address \  -H "Authorization: Bearer $LOQATE_API_KEY" \  -H "Content-Type: application/json" \  -d '{"address":"10 downin st london","country":"GB","suggest":true,"suggest_limit":5}'

Full request/response schemas are documented in the OpenAPI spec at /v1/openapi.json (browse it at /v1/docs).


Explaining a result

Every address verification also returns detail that explains the score without changing it:

FieldWhat it tells you
matchscore0-100, how closely the returned address resembles what you sent. Surfaced so you need not parse it out of avc.
coverage_level + coverage_level_labelThe country's maximum Loqate verification level, as a number and a name: 5 delivery_point, 4 premise, 3 street, 2 locality. The label uses the same vocabulary as match_level, so when the two are equal the address matched as precisely as that country's data allows.
coverage_boostThe level shift applied because that country's data tops out below premise. This is the number that explains why a street-level match in a low-coverage country still scores highly.
changesWhat Loqate altered, in words. Opt-in — see below.

To get changes, ask Loqate for its per-field status codes:

bash
lqt verify -a "125 Summer St, Boston, MA 02110, US" \  --option ServerOptions.FieldStatus=true -o json
json
"changes": [  { "field": "country_name",            "change": "added",       "value": "United States", "code": "5" },  { "field": "postal_code",             "change": "reformatted", "value": "02110-1634",    "code": "2" },  { "field": "postal_code_secondary",   "change": "added",       "value": "1634",          "code": "5" },  { "field": "sub_administrative_area", "change": "added",       "value": "Suffolk",       "code": "5" }]

Nothing was wrong with that address; three things were added (ZIP+4, county, country name) and the postcode was reformatted. Fields Loqate verified without touching are not listed, so a short list means a clean address.

change is one of added, corrected, reformatted or unrecognised. code is Loqate's original status code, kept so the categorisation is not lossy — the codes are Loqate's own, documented at docs.loqate.com/report-codes/fieldstatus.

Absent changes means you did not ask for the codes. An empty array means you asked and nothing changed. The option also adds a <field>_status key per component to fields, since that passthrough returns everything Loqate sends.

This detail appears on every address verification — single, batch (per row), MCP and REST — because all four go through the same result builder.

Policies

Policies control what gets accepted, reviewed, or rejected. Every verification runs through a policy — there are no hardcoded thresholds.

PolicyAddr ConfidenceMatch LevelEmail ConfidencePhone RequiredSuggest BelowUse Case
strict0.90premise0.85yes0.90KYC, fraud prevention, regulated
shipping0.85street0.50no0.85Physical delivery, ecommerce
standard0.55street0.45no0.85General verification (default)
permissive0.30locality0.30no0.70Lead capture, early funnel

Suggest Below is not an acceptance threshold — it never changes accept/review/reject. It is the confidence below which --suggest looks up alternatives even for an accepted address. See Address suggestions. Custom policies can set their own value, and the recommend_policy MCP tool proposes one for the use case you describe.

Custom Policies

Create a JSON file:

json
{  "name": "my-custom-policy",  "description": "Tuned for my use case",  "address": {    "min_confidence": 0.65,    "min_match_level": "street",    "reject_verification_status": ["U", "R"]  },  "email": {    "min_confidence": 0.50,    "allow_catch_all": true,    "reject_disposable": true  },  "phone": {    "min_confidence": 0.40,    "required": false  }}
bash
lqt policy validate my-policy.json    # Validate firstlqt verify -a "..." --policy-file my-policy.json

Batch Processing

Batch endpoints (up to 100 records per call)

lqt batch verifies up to 100 records in a single call — the same thing the verify_*_batch MCP tools and the /v1/verify/*/batch REST endpoints do. One record per input line, from a file or stdin:

bash
lqt batch address --file addresses.txt --country GBlqt batch email   --file emails.txt --policy strictlqt batch phone   --file phones.txt --country GB -o tablelqt batch contact --file contacts.jsoncat emails.txt | lqt batch email

contact is the exception to one-record-per-line: a contact has several fields, so it reads a JSON array — the same shape the MCP tool and REST endpoint take. Each contact may carry any combination of address, email and phone and gets an overall recommendation drawn from whichever fields were verified. The three types run concurrently, so a full batch is paced by email.

Results come back in submission order and each carries its input index, so they can be zipped back onto rows without relying on order. One bad record fails only itself — it carries an error while the rest are verified — and the summary reports count, succeeded and failed.

Exit codes reflect the batch, not any one record: 0 all verified, 1 some failed, 2 none succeeded, 3 the request never ran.

A batch record takes the same fields as a single verification. All 38 structured inputs — premise, thoroughfare, organization, sub_building, the address2–address8 and delivery_address lines, and the recipient fields (contact, function, department, forename, surname, middle_name, full_name, id) — are accepted per record by verify_address_batch, verify_contact_batch and their REST equivalents, and are listed once as AddressComponents in the OpenAPI document. The recipient fields name who a delivery is for rather than where it goes; they are passed to Loqate unchanged and do not affect the decision. The only fields left out are the ones that mean nothing in bulk: the suggestion fields, and the request-level settings (key, policy, options, detect_country) that apply to the whole batch. lqt batch address reads one free-form address per line; to send structured columns from a file, use lqt verify --batch.

Three things worth knowing:

  • Addresses are grouped by country before being sent, which is what Loqate recommends. The cost is therefore one upstream call per distinct country in the batch, not one per call.
  • Email batch returns less detail than single verification: risk, is_complainer_or_fraud_risk and reason are absent. The accept/review/reject recommendation and the disposable-mailbox flag are identical.
  • Phone has no bulk endpoint upstream, so numbers are checked concurrently against a process-wide limit. Measured over 100 records: address ~3s, phone ~2.6s, email ~7s. Email is the slowest of the three, because it probes mail servers — phone is quicker than its lack of a bulk endpoint suggests.

Records without a country. An address with no country verifies poorly — the same Boston address scores 0.03 without one and 0.95 with it — so lqt batch address warns when neither --country nor --detect-country is given. With --detect-country, the country is guessed per record from its address text and the guess is flagged in that record's result. Detection runs before grouping, so a batch spanning several countries still sends each group with its own default rather than one wrong default for everything.

Suggestions are not available in batch, for the same reason they are not available with --batch. Rate limiting on the hosted server. Batch endpoints are charged by record, not by request — a 100-record batch costs 100 against a per-caller budget, because that is what it costs upstream. The default is 100 records/second with a burst of 600, so two full contact batches run back to back and further ones are paced. A batch that would wait more than --record-max-wait (2s) is refused with 429 and a retry hint rather than holding the connection open. Tune with --record-rate, --record-burst and --record-max-wait, or set --record-rate 0 to disable. The burst must be at least 300 or the server refuses to start: a contact is charged per field verified, so a full contact batch costs 300, and a smaller burst could never accept one. The CLI is not rate limited.

For files larger than 100 records, or delimited files with named columns, use lqt verify --batch <file>, which walks a file of any size in chunks of 100.

Large files with verify --batch

Process files with address, email, and phone columns. Supports comma, tab, and pipe delimited input.

verify --batch reads a file of any size and sends it through the same batch endpoints as lqt batch — up to 100 records per call, grouped by country, streamed in chunks so memory does not grow with the file. It used to verify one row per request; a 10,000-row file was 10,000 sequential round trips.

Three things follow from that, none of them visible in a result:

  • Rows travel together. The upstream cost is one call per distinct country per chunk of 100, not one per row.
  • A chunk is one transaction. The pca-source session id is shared by the rows sent together, as it is for every other batch surface. Per-row correlation was a property of sending one request per row, and no batch endpoint can offer it.
  • Email carries less detail, exactly as it does for lqt batch email: risk, is_complainer_or_fraud_risk and reason are absent, because the bulk email endpoint does not return them. The accept/review/reject recommendation is computed the same way.

A file needs at least one address column, or an email or phone column. One bad row fails only itself; a whole chunk that fails upstream leaves the rest of the file running.

bash
# CSV (auto-detected)lqt verify --batch addresses.csv --policy shipping -o json > results.json
# Tab-delimitedlqt verify --batch addresses.tsv -o json
# Pipe-delimitedlqt verify --batch addresses.txt --delimiter pipe -o json
# From stdincat addresses.csv | lqt verify --batch - --policy standard
# With summary statisticslqt verify --batch addresses.csv --summary

Windows (PowerShell):

powershell
.\lqt.exe verify --batch addresses.csv --policy shipping -o json > results.jsonGet-Content addresses.csv | .\lqt.exe verify --batch - --policy standard

Delimiters

Auto-detected from the first line. Override explicitly with --delimiter:

ValueAliasesDescription
commacsvComma-separated (default)
tabtsvTab-separated
pipePipe-separated

Supported Columns

Use a single address column or structured fields — or both. All column names are case-insensitive. Every field from the Loqate International Batch Cleanse API is supported.

Address lines:

FieldAccepted column names
Address (line 1)address, address1, street, address_line_1
Address lines 2-8address2-address8, address_line_2-address_line_8
Delivery addressdeliveryaddress, delivery_address
Delivery lines 1-8deliveryaddress1-deliveryaddress8, delivery_address_1-delivery_address_8

Geography:

FieldAccepted column names
Citycity, locality, town
State/Provincestate, admin_area, province, region, administrative_area
Countycounty, sub_admin_area, sub_administrative_area
Postal codepostcode, postal_code, zip, zipcode
Countrycountry, country_code

Street / building / premise:

FieldAccepted column names
Street namethoroughfare, street_name
Buildingbuilding, building_name
House numberpremise, house_number, building_number
Apartment/Suitesub_building, apartment, suite, unit, flat

Organization / postal:

FieldAccepted column names
Organizationorganization, organisation, company, company_name
PO Boxpost_box, postbox, po_box, pobox

Contact / person:

FieldAccepted column names
First nameforename, first_name
Last namesurname, last_name
Full namefull_name, name

Non-address fields:

FieldAccepted column names
Emailemail, email_address
Phonephone, telephone, phone_number, mobile

Example CSV

csv
address,email,phone,country"125 Summer St, Boston, MA 02110",[email protected],+16175551234,US"10 Downing St, London",[email protected],+442071234567,GB

MCP Integration

The lqt mcp command exposes LQT as tools for AI agents via the Model Context Protocol. Connecting the MCP server also provides a built-in usage guide prompt that teaches the AI how to use the tools effectively.

Claude Code / Cursor

Add to your project's .mcp.json:

json
{  "mcpServers": {    "loqate": {      "command": "lqt",      "args": ["mcp"],      "env": {        "LOQATE_API_KEY": "your-key-here",        "ANTHROPIC_API_KEY": "your-key-here"      }    }  }}

Claude Desktop

Add to Claude Desktop's MCP settings:

json
{  "mcpServers": {    "lqt": {      "command": "/usr/local/bin/lqt",      "args": ["mcp"],      "env": {        "LOQATE_API_KEY": "your-key-here",        "ANTHROPIC_API_KEY": "your-key-here"      }    }  }}

GBG-hosted endpoint (recommended)

The fastest way to use Loqate over MCP is the GBG-hosted endpoint — no install, no infrastructure. Point any MCP client at:

https://reach.prod.fabric.gbgplatforms.com/mcp

Claude Code / Cursor / any MCP client — .mcp.json:

json
{  "mcpServers": {    "loqate": {      "url": "https://reach.prod.fabric.gbgplatforms.com/mcp"    }  }}

Restart your client, then ask it to "verify 125 Summer St, Boston, MA 02110, US". It will discover the tools, call them, and explain the result.

Authenticate with your Loqate API key — pick one:

  1. Per-call — pass key in the tool arguments ({"key": "YOUR-KEY", "address": "..."}).
  2. Connection-wide — set Authorization: Bearer <YOUR-LOQATE-KEY> on the HTTP connection. Applies to every tool call.
  3. Out of band (Claude only) — put <loqate_api_key>YOUR-KEY</loqate_api_key> in org / project / user instructions; the model injects it as key automatically.

If you supply none of the three, the server returns a NO_API_KEY error. The Bearer header only supplies the standard Loqate key; verify_key for a custom address-verify endpoint is separate.

Sanity check from your terminal (no client needed):

bash
# List tools (no auth required)curl -s -X POST https://reach.prod.fabric.gbgplatforms.com/mcp \  -H 'Content-Type: application/json' \  -H 'Accept: application/json, text/event-stream' \  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
# Verify an address (Bearer auth)curl -s -X POST https://reach.prod.fabric.gbgplatforms.com/mcp \  -H 'Authorization: Bearer YOUR-LOQATE-KEY' \  -H 'Content-Type: application/json' \  -H 'Accept: application/json, text/event-stream' \  -d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"verify_address","arguments":{"address":"125 Summer St, Boston, MA 02110, US"}}}'

Hosted deployments disable custom verify endpoints for security. If you receive a CUSTOM_ENDPOINT_DISABLED error, remove verify_url and verify_key from your tool arguments.

GBG-hosted REST endpoint

Prefer plain REST? The same hosted service also exposes the REST API — no MCP client required. Authenticate with your Loqate API key as a bearer token.

bash
# Verify an addresscurl -s -X POST https://reach.prod.fabric.gbgplatforms.com/v1/verify/address \  -H 'Authorization: Bearer YOUR-LOQATE-KEY' \  -H 'Content-Type: application/json' \  -d '{"address":"125 Summer St, Boston, MA 02110, US","policy":"standard"}'
# Browse the interactive API reference (no key required)open https://reach.prod.fabric.gbgplatforms.com/v1/docs

The OpenAPI spec (/v1/openapi.json) and reference page (/v1/docs) are unauthenticated, so you can explore the full API before you have a key.

Remote HTTP (self-hosted)

If you'd rather run the server yourself, deploy lqt mcp --http as a service:

json
{  "mcpServers": {    "loqate": {      "url": "https://lqt.your-company.com/mcp"    }  }}

Same three-tier key resolution applies (body key → Authorization: Bearer → server env LOQATE_API_KEY).

Available Tools

10 tools in stdio mode, 7 in HTTP mode (tools marked stdio mode only are not available over HTTP).

ToolDescription
verify_addressVerify an address with confidence score and recommendation (supports detect_country, suggest, suggestion_id)
verify_emailVerify an email with risk level and recommendation
verify_phoneVerify a phone number with type/carrier and recommendation
verify_contactVerify all fields together with overall recommendation (supports detect_country, suggest, suggestion_id)
retrieve_addressResolve a suggestion id to a cleansed address (consumes a credit; not a verification)
parse_addressParse and standardize an address via Claude (stdio mode only)
list_policiesList available decisioning policies
show_policyShow details for a specific policy
set_policyRegister a custom policy (stdio mode only)
recommend_policyGet a recommended policy for your use case, including its suggestion confidence floor (stdio mode only)

Exit Codes

Designed for scripting and CI/CD:

CodeMeaning
0ACCEPT — all fields passed verification
1REVIEW — manual review recommended
2REJECT — verification failed
3ERROR — missing key, invalid input, API failure

macOS / Linux:

bash
lqt verify -a "125 Summer St, Boston, MA 02110, US" --policy shipping -o jsoncase $? in  0) echo "Ship it" ;;  1) echo "Queue for review" ;;  2) echo "Bad address" ;;  3) echo "Something broke" ;;esac

Windows (PowerShell):

powershell
.\lqt.exe verify -a "125 Summer St, Boston, MA 02110, US" --policy shipping -o jsonswitch ($LASTEXITCODE) {  0 { Write-Host "Ship it" }  1 { Write-Host "Queue for review" }  2 { Write-Host "Bad address" }  3 { Write-Host "Something broke" }}

API Keys

Loqate API Key (for verify)

macOS / Linux:

bash
# Environment variableexport LOQATE_API_KEY=your-key-here
# Key file (add to .gitignore)echo "your-key-here" > .loqate-key
# Per-command flaglqt verify -a "..." --key your-key-here

Windows (PowerShell):

powershell
# Current session$env:LOQATE_API_KEY="your-key-here"
# Persistent (survives restarts)[System.Environment]::SetEnvironmentVariable("LOQATE_API_KEY", "your-key-here", "User")
# Per-command flag.\lqt.exe verify -a "..." --key your-key-here

Anthropic API Key (for parse)

macOS / Linux:

bash
export ANTHROPIC_API_KEY=your-key-here

Windows (PowerShell):

powershell
$env:ANTHROPIC_API_KEY="your-key-here"

Resolution order: flag > environment variable > key file

Custom Verify Endpoint (optional)

If you need to route address verification through a different endpoint (e.g., an on-premises or partner-hosted Loqate instance):

macOS / Linux:

bash
# Environment variablesexport LOQATE_VERIFY_URL=https://custom-verify.example.com/v1/batchexport LOQATE_VERIFY_KEY=your-custom-key
# Or use flags (override env vars)lqt verify -a "..." --verify-url https://custom-verify.example.com/v1/batch --verify-key your-custom-key

Windows (PowerShell):

powershell
$env:LOQATE_VERIFY_URL="https://custom-verify.example.com/v1/batch"$env:LOQATE_VERIFY_KEY="your-custom-key"

Resolution order: flag > environment variable > default Loqate endpoint

When --verify-key is set, the standard --key / LOQATE_API_KEY is not required for address-only verification. If you also verify email (-e) or phone (-p), the standard key is still needed for those.

These flags only affect address verification. Email and phone always use the standard Loqate endpoints.

In MCP mode, clients can pass verify_url and verify_key per-request in verify_address and verify_contact tool inputs.


Support

When reporting a bug, please include:

  • lqt version (lqt --version)
  • OS and architecture (e.g., macOS ARM64, Linux x86_64)
  • The command you ran (redact any API keys)
  • Expected vs actual behavior

License

Proprietary — see LICENSE. Use requires an active Loqate subscription.


Built by GBG.

来源:README.md,提交 edfaa45

工具

11

list_policies

List Policies

List available decisioning policies (strict, shipping, standard, permissive) with their thresholds.

无需输入参数。

retrieve_address

Retrieve Address Details

Resolve a suggestion id from address.suggestions into its full cleansed address components (organisation, sub-building, number, street, city, province, postcode, country). Use this when you need the address itself — to fill a form or show a confirmation — rather than a decision; to verify a chosen suggestion instead, pass 'suggestion_id' to verify_address. CONSUMES A LOQATE CREDIT per call, so resolve only the one suggestion the user chose. The result is reference data, NOT a verification. Requires a Loqate API key.

输入参数keysuggestion_id必填

show_policy

Show Policy

Show full details for a specific decisioning policy.

输入参数name必填

verify_address

Verify Address

Verify an address against Loqate's global reference data. Returns a confidence score (0-1), verification status, and a policy-driven accept/review/reject recommendation. Set 'suggest' to also get alternative addresses suggested by Loqate whenever the address does not clear the policy; offer them to the user and verify the chosen one in a second call before treating it as good. Suggestions require a separately licensed Loqate feature enabled on the account — without it, verification still succeeds and the problem is reported in suggestions.error. Requires a Loqate API key — pass it via the 'key' field (get one at account.loqate.com).

输入参数idkeypolicyaddresscontactcountryoptionspremisesuggestsurnameaddress2address3另有 41 个

verify_address_batch

Verify Addresses (Batch)

Verify up to 100 addresses in one call. Up to 100 records per call; the results array is in submission order and each entry carries its input index, so results can be zipped back onto rows without relying on order. One bad record fails only itself — it carries an error while the rest are verified. Suggestions are not available in batch. Records are grouped by country before being sent, as Loqate recommends, so the cost is one upstream call per distinct country in the batch rather than one per call. Set detect_country to guess the country of records that do not supply one — detection runs per record, before grouping, so a mixed batch still sends each group with the right default. Requires a Loqate API key — pass it via the 'key' field.

输入参数keypolicyoptionsaddresses必填verify_keyverify_urldetect_country

verify_contact

Verify Contact

Verify address, email, and/or phone together. Returns individual results plus an overall recommendation (most conservative of all provided fields). Set 'suggest' to also get alternative addresses suggested by Loqate whenever the address does not clear the policy; offer them to the user and verify the chosen one in a second call before treating it as good. Suggestions require a separately licensed Loqate feature enabled on the account — without it, verification still succeeds and the problem is reported in suggestions.error. Requires a Loqate API key — pass it via the 'key' field.

输入参数idkeyemailphonepolicyaddresscontactcountryoptionspremisesuggestsurname另有 43 个

verify_contact_batch

Verify Contacts (Batch)

Verify up to 100 contacts in one call, each with any combination of address, email and phone, returning an overall recommendation per contact. Results are in submission order and each carries its input index. One bad record fails only itself, and a field that cannot be verified does not remove the contact — the overall recommendation is drawn from whichever fields were checked. The three types run concurrently, so a full batch is paced by email at roughly 7 seconds per 100. Requires a Loqate API key — pass it via the 'key' field.

输入参数keypolicyoptionscontacts必填verify_keyverify_urldetect_country

verify_email

Verify Email

Verify an email address via Loqate. Returns confidence, risk level, and accept/review/reject recommendation. Requires a Loqate API key — pass it via the 'key' field.

输入参数keyemail必填policy

verify_email_batch

Verify Emails (Batch)

Verify up to 100 email addresses in one call. Up to 100 records per call; the results array is in submission order and each entry carries its input index, so results can be zipped back onto rows without relying on order. One bad record fails only itself — it carries an error while the rest are verified. Suggestions are not available in batch. The batch endpoint returns less detail than single verification: risk, complainer and reason are absent, though the accept/review/reject recommendation and the disposable-mailbox flag are identical. Requires a Loqate API key — pass it via the 'key' field.

输入参数keyemails必填policy

verify_phone

Verify Phone Number

Verify a phone number via Loqate. Returns confidence, number type, carrier, and accept/review/reject recommendation. Requires a Loqate API key — pass it via the 'key' field.

输入参数keyphone必填policycountry

verify_phone_batch

Verify Phone Numbers (Batch)

Verify up to 100 phone numbers in one call. Up to 100 records per call; the results array is in submission order and each entry carries its input index, so results can be zipped back onto rows without relying on order. One bad record fails only itself — it carries an error while the rest are verified. Suggestions are not available in batch. Phone validation has no bulk endpoint, so numbers are checked concurrently against a shared limit. Measured at around 2.6s for 100 numbers, which is the fastest of the three batch types — email is the slowest, at roughly 7s for 100, because it probes mail servers. Requires a Loqate API key — pass it via the 'key' field.

输入参数keyphones必填policy

版本历史

1
  1. v0.6.2最新Sep 16, 2026

评分

已满足适用检查项的 90%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通必需25 分
  • 已声明认证方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分

    请在仓库或注册中心条目中声明许可证。