Skip to main content
Glama

Plumbline - Contractor License Checks

Server Details

Free contractor-license checks from official state records; a no-match never proves unlicensed.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
100.0% over 68 days
Last Tested
Transport
Streamable HTTP · MCP 2025-06-18
URL

TDQS

A4.4/5.0

Scored across 1 tool

Disambiguation5/5

With only one tool there is no possibility of misselection between tools; the tool has a single, clearly stated purpose (look up a contractor credential record). The absence of competing tools means an agent cannot pick the wrong one.

Naming Consistency5/5

check_contractor is a clear verb_noun snake_case name, and with a single tool there is no convention mixing to worry about. The name directly reflects the domain action.

Tool Count3/5

The domain is a single lookup operation, so one tool is defensible, but the surface is thin: everything (search, paging, jurisdiction checks, freshness) is crammed into one oversized tool signature. A couple of companion tools would make the set easier to use.

Completeness3/5

Core lookup with match/candidates/no-match/not-covered outcomes is covered, but there is no way to list covered jurisdictions or sources, which the description implies is dynamic and important. Batch/bulk verification and a coverage-discovery operation are notable gaps.

Available Tools

1 tool
check_contractorCheck a contractor's license recordA
Read-onlyIdempotent
Inspect

Looks up a contractor's public credential in indexed state and local licensing records. Licenses, registrations and bond records mean different things. Each record carries a credential object (kind, label, note): kind is license, registration, business_license or bond when the source makes that clear; otherwise it is the generic "credential", and the note says what to verify with the issuing agency. The set of covered jurisdictions changes as sources are added, so this description does not list it. Inputs: a record number (license) or business name, with optional jurisdiction and exact listed city, or an entity_id from an earlier result, which selects that one record. Results: match (the credential record with its status and provenance); candidates (several records fit; each page holds up to 20 rows, total_candidates is the full count, offset pages through the rest, and entity_id selects one; a field with the same value on every row of a page is given once, in same_for_all_rows, and each row's entity block omits what the row already states); no_match_in_index (the index holds no record for that input, which does not mean the contractor is unlicensed; for a search across all jurisdictions, the message states how many covered jurisdictions were searched); or jurisdiction_not_covered (the requested jurisdiction is outside the index, with an official pointer URL where one is on file; the response message states exactly what the link is, or that none is on file, and for some jurisdictions the link is a consumer-protection or licensing-board page, not a license lookup). A name or city search sent with no jurisdiction that names a state outside the index ("Smith Plumbing Atlanta GA") answers candidates carrying not_covered (that state's not-covered answer, which also opens the message) when covered records fit the rest, and jurisdiction_not_covered when none do; those rows are records from other places. A name ending in a covered state's code that is also a word or short form ("Smith Plumbing Co", "Smith Plumbing LA") is not limited to that state; did_you_mean gives the name and jurisdiction to send for that state's search. Each record carries as_of_date: the publisher's own last-updated date where we have read one, else the day of our fetch. The freshness field on a match, and freshness_notes on candidates and on a no-match with a jurisdiction, state when a source's copy is behind its normal update schedule, slow to refresh by design, or still on its first full pass, with a plain note, the dates, and the issuing body's own lookup.

NameRequiredDescriptionDefault
cityNoOptional exact record-city filter, case-insensitive. Filters before pagination; does not represent service area or silently drop terms.
nameNoBusiness name, e.g. "Bayside Plumbing"
offsetNoPagination offset into the candidates list, a whole number, default 0. Each page holds up to 20 candidates; total_candidates in a candidates result is the full count. An offset past the end returns an empty candidates list with a message saying so; a negative or fractional offset returns an error.
licenseNoLicense number as printed on the license, truck, ad or contract, e.g. "1000002", "CCC 1332267", "MHIC 123872", "TECL40892"
entity_idNoThe exact entity.id from a previous response. It selects that one record, keeping records that share a number distinct, and overrides name and license. An id no record carries, or a jurisdiction or city that is not the record's own, returns an error that names the problem.
jurisdictionNoState or local jurisdiction: a state code ("CA" or "US-CA", any case), a full state name ("California", "District of Columbia"), or a local code such as "NYC". A state also covers the local jurisdictions inside it that the index holds (IL includes CHI, MD includes MD-HOWARD); each record states its own jurisdiction. Coverage spans dozens of US jurisdictions; a recognized place outside coverage returns jurisdiction_not_covered, and text that names no US state or local code returns an error listing the accepted forms.

TDQS

A4.5/5.0
Behavior5/5

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

Adds substantial behavior beyond the readOnly/idempotent/openWorld annotations: `no_match_in_index` does not mean the contractor is unlicensed, coverage is a growing set of jurisdictions, `jurisdiction_not_covered` links may point to consumer-protection pages rather than lookups, and freshness/as_of_date semantics are disclosed. Error behavior (negative offset, foreign jurisdiction, unknown entity_id) is also spelled out.

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

Conciseness3/5

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

Purpose is front-loaded, and with no output schema most of the result-shape text earns its place. But it is delivered as a single ~450-word paragraph mixing input guidance, result variants, pagination, and freshness semantics, making it hard to scan for the one behavior an agent needs at call time.

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 no output schema and six optional parameters, the description carries the full burden of explaining returns and does so: match, candidates (pagination, total_candidates, same_for_all_rows, entity blocks), no_match_in_index, and jurisdiction_not_covered. An agent can interpret every response shape from this text alone.

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 baseline already carries the parameters; the description still adds value by explaining precedence (entity_id overrides name and license), jurisdiction-to-local expansion examples, and the `did_you_mean` case for names ending in a state code. It does not restate every parameter's syntax, which is correct since the schema handles that.

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?

Opens with a specific verb+resource ('Looks up a contractor's public credential in indexed state and local licensing records') and then distinguishes the credential kinds the tool returns (license, registration, business_license, bond, generic credential). An agent knows exactly what class of data this returns without opening the schema.

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 enumerates the input combinations that drive the call: a license number, a business name with optional jurisdiction/city, or an entity_id from an earlier result that selects exactly one record. It also explains when a name/city search without jurisdiction yields `not_covered` rows vs `jurisdiction_not_covered`. There are no sibling tools, so no alternative-tool routing is needed, and no explicit 'do not use for X' exclusion is stated.

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. 1 tool update
    • Changedcheck_contractor1 field changed
      • changedInput schema / properties / license / description
        Previous value: -"License number, e.g. \"1000002\""New value: +"License number as printed on the license, truck, ad or contract, e.g. \"1000002\", \"CCC 1332267\", \"MHIC 123872\", \"TECL40892\""
  2. 1 tool update
    • Changedcheck_contractor1 field changed
      • changedInput schema / properties / jurisdiction / description
        Previous value: -"State or local jurisdiction: a state code (\"CA\" or \"US-CA\", any case), a full state name (\"California\", \"District of Columbia\"), or a local code such as \"NYC\". Coverage spans dozens of US jurisdictions; a recognized place outside coverage returns jurisdiction_not_covered, and text that names no US state or local code returns an error listing the accepted forms."New value: +"State or local jurisdiction: a state code (\"CA\" or \"US-CA\", any case), a full state name (\"California\", \"District of Columbia\"), or a local code such as \"NYC\". A state also covers the local jurisdictions inside it that the index holds (IL includes CHI, MD includes MD-HOWARD); each record states its own jurisdiction. Coverage spans dozens of US jurisdictions; a recognized place outside coverage returns jurisdiction_not_covered, and text that names no US state or local code returns an error listing the accepted forms."
  3. 1 tool update
    • Changedcheck_contractor4 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • changedInput schema / properties / entity_id / description
        Previous value: -"Select the exact entity.id from a previous response, preserving same-number record distinctions. Overrides name/license; supplied jurisdiction and city still constrain selection."New value: +"The exact entity.id from a previous response. It selects that one record, keeping records that share a number distinct, and overrides name and license. An id no record carries, or a jurisdiction or city that is not the record's own, returns an error that names the problem."
      • changedInput schema / properties / jurisdiction / description
        Previous value: -"State or local jurisdiction code, e.g. \"CA\" (\"US-CA\" style also accepted) or \"NYC\". Coverage spans dozens of US jurisdictions; GET /v1/coverage for the exact current list."New value: +"State or local jurisdiction: a state code (\"CA\" or \"US-CA\", any case), a full state name (\"California\", \"District of Columbia\"), or a local code such as \"NYC\". Coverage spans dozens of US jurisdictions; a recognized place outside coverage returns jurisdiction_not_covered, and text that names no US state or local code returns an error listing the accepted forms."
      • changedInput schema / properties / offset / description
        Previous value: -"Pagination offset into the candidates list, default 0. Use with total_candidates from a prior call to page through large candidate sets."New value: +"Pagination offset into the candidates list, a whole number, default 0. Each page holds up to 20 candidates; total_candidates in a candidates result is the full count. An offset past the end returns an empty candidates list with a message saying so; a negative or fractional offset returns an error."
  4. 1 tool update
    • Changedcheck_contractor2 fields changed
      • addedInput schema / properties / city
        Added value: +{
        +  "description": "Optional exact record-city filter, case-insensitive. Filters before pagination; does not represent service area or silently drop terms.",
        +  "type": "string"
        +}
      • addedInput schema / properties / entity_id
        Added value: +{
        +  "description": "Select the exact entity.id from a previous response, preserving same-number record distinctions. Overrides name/license; supplied jurisdiction and city still constrain selection.",
        +  "type": "string"
        +}
  5. 1 tool update
    • First observedcheck_contractor

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Real-time contractor license verification across 45 US states. Verifies license status, expiration, and disciplinary history directly against state licensing board portals.
    4
    22 npm
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables listing and verifying licensed contractors across California, Texas, Washington, Oregon, and Louisiana by state, trade, city, county, license number, or business name, returning license status, expiration, classifications, owners, address, and phone.
    1
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI agents and procurement systems to verify contractor licenses against official state boards, search contractors by trade and location, audit workers' comp, surety bonds and OSHA safety records, and check SAM.gov federal debarment status. It returns a deterministic ALLOW/WARN/BLOCK compliance decision plus registry health metrics for US trade contractors.
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Verifies contractor license status mid-task, returning normalized JSON with active/expired/suspended/revoked status, bond details, and insurance for WA (reliable) and CA (beta) jurisdictions.
    2
    33 npm
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources