# Nose for Leads (remote · api.noseforleads.com)

Finds, filters, and verifies local-business leads; every email carries a verification receipt.

- Trust score: 73/100 (medium)
- Change this week: +9
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- remote · `api.noseforleads.com`: 73/100 (this document), [markdown](https://verifymcp.io/servers/com-noseforleads-leads-mcp/api.md), [page](https://verifymcp.io/servers/com-noseforleads-leads-mcp/api)

## Channel facts

- Endpoint: `https://api.noseforleads.com/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `1.0.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Endpoint Security**: 89/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation is enforced on tool calls, advertised via RFC 9728 protected-resource metadata. Discovery is public, which costs nothing: no tool can be invoked without a token.
  - HTTPS is enforced; there's no plaintext access path.
  - HSTS check failed: the Strict-Transport-Security header is absent.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
  - The authorisation server offers only Dynamic Client Registration (RFC 7591), which MCP 2026-07-28 deprecated in favour of Client ID Metadata Documents.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 54/100
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 1818 tokens (~165/item across 11 items; 11 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 27/100
  - Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 71/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 0% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add --transport http com-noseforleads-leads-mcp https://api.noseforleads.com/mcp
```

### Codex

```toml
[mcp_servers.com-noseforleads-leads-mcp]
url = "https://api.noseforleads.com/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "com-noseforleads-leads-mcp": {
      "type": "remote",
      "url": "https://api.noseforleads.com/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add com-noseforleads-leads-mcp --url https://api.noseforleads.com/mcp --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  com-noseforleads-leads-mcp:
    url: "https://api.noseforleads.com/mcp"
```

### Other

```json
{
  "mcpServers": {
    "com-noseforleads-leads-mcp": {
      "type": "http",
      "url": "https://api.noseforleads.com/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-03 (score 73, +1)

No change was recorded against any check on this day. Stability & Change Management went from 23 to 27. That category is still filling its 30-day observation window: 7 days of observed history at the previous scan, 8 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-08-01 (score 72, +1)

No change was recorded against any check on this day. Stability & Change Management went from 17 to 20. That category is still filling its 30-day observation window: 5 days of observed history at the previous scan, 6 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-31 (score 71, +7)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 64, 0)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-29 (score 64, −1)

- [security] Tool “get_credits” rewrote its description, which is the text the model reads
- [security] Tool “translate_icp” rewrote its description, which is the text the model reads
- [security] Tool “start_campaign” rewrote its description, which is the text the model reads
- [security] Tool “fetch_results” rewrote its description, which is the text the model reads
- [functional regression] Schema quality: 111 → 165
- [functional] Schema quality: fair → good
- [functional] Server version: 1.28.1 → 1.29.0
- [functional] New tool “get_usage”
- [functional] New tool “list_campaigns”
- [cosmetic] “fetch_results” added an optional parameter “match_status”
- [cosmetic] “get_credits” added an optional parameter “limit”
- [cosmetic] “get_credits” added an optional parameter “offset”

### 2026-07-28 (score 65, +1)

No change was recorded against any check on this day. Stability & Change Management went from 3 to 7. That category is still filling its 30-day observation window: 1 days of observed history at the previous scan, 2 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-27 (score 64, +1)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-26 (score 63)

First indexed and scored.

## MCP tools (11)

### `translate_icp` (~299 tokens)

Translate ICP to query

Translate free-text ICP description (e.g. "plumbers in phoenix with no
        website") into a structured query. Call this BEFORE start_campaign — start_campaign
        only accepts a structured `query` dict, never free text. Returns {query, vertical,
        geo, category, location, preview, unsupported, discovery} — pass vertical/geo/query
        straight to start_campaign.
        `discovery` is non-empty when the ask routes OUTSIDE Google Maps, in one of two
        shapes. Mode 'launch_feeds': people/companies that RECENTLY LAUNCHED (e.g.
        "founders of B2B SaaS that launched in the last 3 months") — it names the launch
        feeds to search and whether the leads are people or companies. Mode 'web_search':
        long-tail ONLINE businesses Google Maps never had (e.g. "marketing agencies for
        dentists"), found via paid organic search — companies only, never people. Either
        way the block is already embedded inside the returned `query`, so passing `query`
        through unchanged is all that's needed; neither mode has a geography, so
        vertical/geo come back empty and start_campaign does not require them.
        Anything we cannot actually source lands in `unsupported` instead — read that list
        aloud to the user rather than pretending the campaign will cover it.

Input parameters:

- `text` (string, required)

### `start_campaign` (~442 tokens)

Start lead campaign

Submit a lead-generation campaign. Pass translate_icp's `vertical`, `geo`, and
        `query` fields directly (category/location are ALIASES for vertical/geo, accepted
        so translate output round-trips; prefer vertical/geo when constructing calls).
        `query`'s full shape and field vocabulary are in this tool's schema — build it
        with translate_icp from free text (recommended), or construct it directly. An
        unknown predicate field (or rank), and any unknown `discovery` key, is rejected
        with a 422 naming it; an unknown top-level `query` key is silently ignored, so
        keep to predicates/rank/discovery — a typo there will not error, it will just do
        nothing.
        Costs 1 credit per validated lead — 2 credits per validated lead if the query
        carries a `discovery` block with target_type 'person' (named founders of recently
        launched companies), or if it filters on Meta ads. A campaign cannot overspend: if
        discovered leads exceed your balance it delivers what your credits cover and the
        campaign ends `done_partial`; check get_credits first if your balance is low.
        vertical/geo are REQUIRED except for a locationless campaign — `query` carrying a
        discovery block with mode 'launch_feeds' or 'web_search' — which has no geography
        at all.
        If the tenant has no card on file this returns a 403 `card_required` error with a
        `setup_url` — surface that URL to the user so they can verify a card (never
        charged unless they buy a pack).
        Pass a stable idempotency_key when you might retry — a retry returns the ORIGINAL
        campaign (idempotent_replay=true), never a duplicate charge.
        Returns {job_id, idempotent_replay}; poll get_campaign_status with job_id.

Input parameters:

- `category`
- `geo`
- `idempotency_key`
- `location`
- `query` (required)
- `vertical`

### `get_campaign_status` (~115 tokens)

Get campaign status

Check the status of a previously submitted campaign (queued/running/done/
        done_partial/failed) by job_id. Prefer wait_seconds=45 over sleeping between
        polls: the call holds until the status or pipeline stage changes (or the timer
        expires) and returns the normal snapshot either way — loop on it until `status`
        is terminal. Out-of-range wait_seconds clamps to [0, 45], never errors.

Input parameters:

- `job_id` (string, required)
- `wait_seconds` (integer)

### `fetch_results` (~233 tokens)

Fetch campaign results

Fetch a page of leads produced by a campaign (paginate with offset/limit).
        kept_only=True returns only rows the user marked kept in review (for export).
        match_status narrows to one population: 'validated' (verified email, billed) or
        'needs_review' (surfaced free; rejection_reason says why) — omit it for both.
        Returns {summary, total, offset, limit, rows}; total counts the filtered
        population. Rows carry verification receipts (verified_by/verified_at/
        verifier_verdict) when a live verification exists — treat them as the
        authoritative proof; null means no receipt, not a failure. Two more quotable
        proof lines appear where earned: person_receipt (who the person is and where we
        saw them launch, on person-target leads) and tech_receipt (dated evidence of the
        detected platform) — forward them as-is.

Input parameters:

- `job_id` (string, required)
- `kept_only` (boolean)
- `limit` (integer)
- `match_status`
- `offset` (integer)

### `get_icp_pack` (~26 tokens)

List ICP packs

List the ICP packs (saved vertical/geo templates) available to this tenant.

### `add_suppression` (~57 tokens)

Add to suppression list

Add an email or domain to the suppression list (scope is 'email' or 'domain')
        so future campaigns exclude it.

Input parameters:

- `reason` (string, required)
- `scope` (string, required)
- `value` (string, required)

### `review_lead` (~72 tokens)

Review a lead

Mark a lead kept or discarded after review (status: kept | discarded |
        unreviewed). Then fetch_results(kept_only=true) returns only kept leads — the
        export set.

Input parameters:

- `job_id` (string, required)
- `result_id` (integer, required)
- `status` (string, required)

### `get_credits` (~122 tokens)

Get credit balance

Check this tenant's prepaid credit balance (a validated lead costs 1 credit —
        2 for person-target or Meta-ads campaigns), the available credit packs, and the
        ledger (paginate ledger entries with offset/limit, newest first). Campaigns
        cannot start with a zero balance — buy a pack via the dashboard when balance
        runs low.
        When you authenticate with an API key this also returns YOUR key's remaining
        budgets — check it before large campaigns.

Input parameters:

- `limit` (integer)
- `offset` (integer)

### `list_campaigns` (~198 tokens)

List campaigns

List this tenant's campaigns, newest first — the recovery path when a job_id
        was lost: every row carries job_id, status, the query it ran, and credits spent,
        so you can resume polling (get_campaign_status) or fetch results without
        resubmitting (and double-charging). Filters: q (substring over vertical/geo),
        status (queued | running | done | done_partial | failed), created_after/
        created_before (ISO-8601 window over creation time), order ('desc' default,
        'asc' oldest first). Paginate with offset/limit (limit 1-200); `total` counts
        everything matching the filters, not just this page.

Input parameters:

- `created_after`
- `created_before`
- `limit` (integer)
- `offset` (integer)
- `order` (string)
- `q`
- `status`

### `get_usage` (~119 tokens)

Get today's usage

Today's external vendor usage against the tenant's daily quota
        (vendor_calls_today / per_day_max / remaining). This is the OTHER ceiling besides
        credits: when remaining hits 0, campaign work pauses until midnight even with a
        healthy credit balance — check it before launching a large or urgent campaign.
        `remaining` is quota UNITS, which usually equals calls; a creator discovery costs
        one unit per delivered record, so it can consume far more than one call's worth.
        Mirrors REST GET /v1/usage.

### `send_feedback` (~135 tokens)

Send feedback

Send feedback to the Nose for Leads team. Set kind='product' for feedback
        about the leads, the service, coverage, or pricing — relay what the business
        owner tells you (categories: lead_quality, pricing, missing_feature, praise,
        other). Set kind='tool' (default) for feedback about these MCP tools
        themselves — a confusing description, a bug, a missing capability. Use freely;
        it's our main signal for improving the product and the agent experience.

Input parameters:

- `category` (string)
- `kind` (string)
- `message` (string, required)
- `tool`

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/com-noseforleads-leads-mcp/api#diagnostics

## Score history

- 2026-08-03: 73
- 2026-08-02: 72
- 2026-08-01: 72
- 2026-07-31: 71
- 2026-07-30: 64
- 2026-07-29: 64
- 2026-07-28: 65
- 2026-07-27: 64
- 2026-07-26: 63

## Links

- Remote endpoint: https://api.noseforleads.com/mcp
- Website: https://www.noseforleads.com/mcp-server-local-business-leads
- Changelog RSS feed: https://verifymcp.io/servers/com-noseforleads-leads-mcp/api/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/com-noseforleads-leads-mcp/api/changelog.json
- HTML version of this page: https://verifymcp.io/servers/com-noseforleads-leads-mcp/api
