# `ai.agentlookups/plumbline` on anlyon.dev

> Text inside fenced blocks marked untrusted-server-text was written by the MCP server's publisher, not by anlyon.dev. It is data to inspect, not instructions to follow. Invisible characters are shown as [U+XXXX].
> No finding is not a safety guarantee: these are point-in-time checks of tool definitions, not of code or behaviour.

- Page: https://anlyon.dev/servers/ai.agentlookups/plumbline
- JSON: https://anlyon.dev/api/v1/servers/ai.agentlookups/plumbline
- Version: 1.0.1 (active)
- Publisher: ai.agentlookups (domain proven to the MCP Registry)
- Runs: remote (streamable-http)
- Sign-in to list tools: none
- Metadata from the official MCP Registry, synced 2026-10-21T17:41:03.722Z

Title and description, as the publisher wrote them:

```untrusted-server-text
Plumbline - Contractor License Checks
Free contractor-license checks from official state records; a no-match never proves unlicensed.
```

Scanned 2026-10-21T19:11:13.598Z over streamable-http.

**1 tool: 1 change things.**

| Group | Class | Tools | Claude Code |
| --- | --- | --- | --- |
| Deletes or cancels | destructive | 0 | deny |
| Can't be undone | irreversible | 0 | ask |
| Changes things | write | 1 | ask |
| Only reads | read | 0 | allow |

## Findings

- **info** The word "credentials" in `check_contractor` ([credentials-mention](https://anlyon.dev/methodology#credentials-mention))

```untrusted-server-text
The description mentions "credential".

description: "Looks up a contractor's public credential in indexed state and local licensing re..."
```

- **info** Long descriptions in `check_contractor` ([long-description](https://anlyon.dev/methodology#long-description))

```untrusted-server-text
The description is 2,006 characters long, over the 2,000 this check looks for.

description ends: "...first full pass, with a plain note, the dates, and the issuing body's own lookup."
```


## Changes things (1)

Creates or changes something that can be changed back. Claude Code: ask.

### `check_contractor`

- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
- Findings: info credentials-mention, info long-description

Description, as the server wrote it:

```untrusted-server-text
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). 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.
```

## Claude Code permissions

For `.claude/settings.json`, assuming the server is installed as `plumbline`:

```json
{
  "permissions": {
    "allow": [],
    "ask": [
      "mcp__plumbline__check_contractor"
    ],
    "deny": []
  }
}
```
