# io.github.jdw2111/propraven (npm · @propraven/mcp)

Property intelligence: 180M+ US parcels — lookup, search, owners, hazards, permits, deeds.

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

## Components

- remote · `mcp.propraven.com`: 39/100, [markdown](https://verifymcp.io/servers/jdw2111-propraven/mcp.md), [page](https://verifymcp.io/servers/jdw2111-propraven/mcp)
- npm · `@propraven/mcp`: 77/100 (this document), [markdown](https://verifymcp.io/servers/jdw2111-propraven/propraven-mcp.md), [page](https://verifymcp.io/servers/jdw2111-propraven/propraven-mcp)

## Channel facts

- Registry: `npm`
- Package: `@propraven/mcp`
- Version: `0.1.1`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, 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.

- **Supply Chain Security**: 86/100
  - No malware found by supply-chain analysis.
  - Only part of the dependency tree could be resolved (94 of 98), so this covers what we could see, not the whole tree.
  - No install/post-install scripts declared.
  - Only part of the dependency tree could be resolved (94 of 98), so this covers what we could see, not the whole tree.
- **Provenance & Transparency**: 97/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to jdw2111/propraven-mcp).
  - Clear OSI-approved license (Apache-2.0).
  - Actively maintained (last published 78 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 65/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 1613 tokens (~201/item across 8 items; 8 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**: 94/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 83% of tool parameters carry a description.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add jdw2111-propraven -- npx -y @propraven/mcp
```

### Codex

```bash
codex mcp add jdw2111-propraven -- npx -y @propraven/mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "jdw2111-propraven": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@propraven/mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add jdw2111-propraven --command npx --arg -y --arg @propraven/mcp
```

### Hermes

```yaml
mcp_servers:
  jdw2111-propraven:
    command: "npx"
    args: ["-y", "@propraven/mcp"]
```

### Other

```json
{
  "mcpServers": {
    "jdw2111-propraven": {
      "command": "npx",
      "args": [
        "-y",
        "@propraven/mcp"
      ]
    }
  }
}
```

## 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 77, +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-02 (score 76, +68)

- [security improvement] Install scripts: unverified → pass
- [security improvement] Provenance: unverified → pass
- [security improvement] Known CVEs: unverified → partial
- [security improvement] Malware scan: unverified → pass
- [security] The attested source repository moved: jdw2111/propraven-mcp
- [functional regression] Dependency health: partial → unverified
- [functional regression] Security disclosure: fail → unverified
- [functional improvement] Maintenance: unverified → pass
- [functional improvement] License: unverified → pass
- [functional improvement] Tool coverage: unverified → 100
- [functional improvement] MCP protocol: unverified → pass
- [functional improvement] Stability: unverified → 0.23
- [functional improvement] Schema quality: unverified → excellent
- [functional] Licence: Apache-2.0

### 2026-08-01 (score 8, −10)

- [functional regression] Tool coverage: 100 → unverified
- [functional improvement] Dependency health: unverified → partial

### 2026-07-31 (score 18, +12)

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

### 2026-07-30 (score 6, −18)

- [security regression] Malware scan: pass → unverified

### 2026-07-28 (score 24, −18)

- [functional regression] Security disclosure: unverified → fail
- [functional regression] Tool coverage: 100 → unverified
- [functional] First check of Schema quality: unverified

### 2026-07-27 (score 42)

First indexed and scored.

## MCP tools (8)

### `parcel.lookup` (~183 tokens)

Resolve a single US parcel by identifier (composite county_fips:parcel_id, street address, or APN). Returns the canonical PropRaven record: identity, current owner, valuation, geography, and source provenance. Use when the user names one specific property. Do NOT use when ranking multiple parcels (use parcel.compare) or when filtering by criteria (use parcel.search). Example: `parcel.lookup({ query: "37183:0012345" })` or `parcel.lookup({ query: "420 S Tryon St, Charlotte NC" })`.

Input parameters:

- `query` (string, required): Parcel identifier in any of three forms: (1) composite ID like "37183:0012345" — preferred, direct lookup; (2) full street address with state — uses fuzzy search, top 5 returned; (3) raw APN — search…

### `parcel.search` (~229 tokens)

Filter US parcels by geography + attributes. Returns a ranked list (default 50, max 200) of matches with summary fields (id, address, owner, assessed value, last sale). Use when the user wants properties matching criteria ("absentee-owned SFR in Mecklenburg County over $400k", "flipped properties in Phoenix since 2024"). Do NOT use when looking up a single known property (use parcel.lookup) or ranking a known set (use parcel.compare). Backed by the /api/v1/search/full text+attribute index; pass `q` as either a city, owner name, or address fragment.

Input parameters:

- `city` (string): City filter (when q is non-city).
- `dir` (string)
- `field` (string): Restrict the q match to one field.
- `limit` (integer)
- `page` (integer)
- `q` (string, required): Text query — owner name, address fragment, or city. Min 2 chars.
- `sort` (string)
- `state` (string): 2-letter state filter.

### `parcel.compare` (~207 tokens)

Fetch reports for 2–25 parcels so they can be ranked against criteria. Returns each parcel's full report (identity, owner, valuation, risks, permits, deeds) in a single payload — the calling agent does the per-criterion scoring and final ranking. This is the underwriting / shortlist loop. Use when the user has identified candidate properties (often from parcel.search) and wants them ranked. Do NOT use to discover new candidates (use parcel.search) or for a single property (use parcel.lookup + hazard.score). The `criteria` argument is returned verbatim in the response so the agent can pin its scoring to the user's intent.

Input parameters:

- `criteria` (array, required): 1–8 ranking criteria, free-form natural language. Echoed back in the response to anchor the agent's scoring.
- `parcel_ids` (array, required): Composite parcel IDs to compare (e.g. "37183:0012345"). 2–25 parcels. Get IDs via parcel.search or parcel.lookup.

### `owner.pierce` (~254 tokens)

Resolve an owner name or entity to its full property portfolio. Pierces LLC/Trust veils where PropRaven has linked the entity to its parent (via SEC Ex 21, sponsor parent-rollup, and county-level filings). Returns: canonical owner name, entity type, portfolio summary (count, total value, geographic distribution), and a list of parcels owned. Use when the user names a person, LLC, trust, or public company and wants to see what they own. Do NOT use when starting from a parcel (use parcel.lookup, which returns owner inline). If `ticker` is provided, the tool searches owner records for the company name first (best-effort). Tier-1 portfolios (SEC-tracked public companies — DHI, INVH, AMH, PHM, etc.) have higher confidence on cross-state attribution.

Input parameters:

- `name` (string): Owner name or entity name. Free-form — PropRaven normalizes (trims suffixes, handles trust/LLC variants).
- `state` (string): Optional 2-letter state filter to scope the portfolio.
- `ticker` (string): Public-company ticker. The tool attempts to resolve to a company name via owner search first.

### `hazard.score` (~194 tokens)

Composite hazard score for a parcel: flood (FEMA NFIP zone), wildfire (USFS WUI), seismic (USGS ASCE7), windstorm, air quality (EPA AQS), and crime (composite tier). Each sub-score includes source citations. Use when the user asks about a property's risk profile — insurance pricing, underwriting, or due diligence. Do NOT use to compare multiple parcels (use parcel.compare with a hazard criterion). Backed by /api/v1/parcels/{id}/risks. Coverage varies by hazard: flood and crime are widely available; wildfire is strongest in CA/OR/WA/ID/MT/CO; seismic strongest on the West Coast.

Input parameters:

- `include` (array): Subset of hazards to keep in the response. Default: return all.
- `parcel_id` (string, required): Composite parcel ID (county_fips:parcel_id). Use parcel.lookup to obtain.

### `valuation.estimate` (~153 tokens)

Estimated market value for a parcel: market estimate, assessed value, last sale price, and the underlying assessment + improvement breakdown. Use when the user asks for a property's value, market estimate, AVM, or wants to compare assessed vs market. Do NOT use as a substitute for an appraisal — PropRaven AVM has ±10–15% MAE in normal markets, wider in tail. Historical AVM (as_of) is not yet supported in v1; tool returns the current snapshot.

Input parameters:

- `as_of` (string): ISO date — historical AVM. NOT YET SUPPORTED in v1; ignored.
- `parcel_id` (string, required): Composite parcel ID (county_fips:parcel_id).

### `permits.history` (~174 tokens)

Timeline of building / construction / demolition permits filed against a parcel. Each permit includes type, status, declared value, issued date, completion date, contractor (where disclosed), and the originating jurisdiction's permit ID. Use when the user asks about construction activity, recent renovations, planned work, or wants to detect a property that's actively changing. Do NOT use to find properties WITH recent permits across a market (use parcel.search). Coverage varies by county: top-100 metros have near-complete permit feeds; smaller jurisdictions may be empty.

Input parameters:

- `parcel_id` (string, required): Composite parcel ID.
- `since` (string): ISO date — only return permits issued on or after this date (client-side filter).
- `types` (array): Filter by permit type substring (e.g. ["Building", "Demolition"]). Case-insensitive.

### `sales.history` (~219 tokens)

Deed / transaction timeline for a parcel: every recorded sale, transfer, refinance. Each event includes date, sale price (where disclosed; flagged when withheld by state), buyer, seller, and deed type. Use when the user asks about a property's transaction history, flip activity, or holding period. Do NOT use to find properties with recent sales market-wide (use parcel.search with `sold_since`) or to estimate current market value (use valuation.estimate, which incorporates this data plus comps). Note: 13 states do not disclose sale prices on deeds (KS, MS, TX, UT, WY, etc.); PropRaven flags these explicitly. If `include_liens=true`, the tool ALSO fetches UCC liens via the parcel report — two API calls.

Input parameters:

- `include_liens` (boolean): Include UCC liens. Default false. Adds one extra API call.
- `parcel_id` (string, required): Composite parcel ID.
- `since` (string): ISO date — only return events on or after this date (client-side filter).

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/jdw2111-propraven/propraven-mcp#diagnostics

## Score history

- 2026-08-03: 77
- 2026-08-02: 76
- 2026-08-01: 8
- 2026-07-31: 18
- 2026-07-30: 6
- 2026-07-28: 24
- 2026-07-27: 42

## Links

- npm package: https://www.npmjs.com/package/@propraven/mcp
- Socket report: https://socket.dev/npm/package/@propraven/mcp
- Repository: https://github.com/jdw2111/propraven-mcp
- Changelog RSS feed: https://verifymcp.io/servers/jdw2111-propraven/propraven-mcp/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/jdw2111-propraven/propraven-mcp/changelog.json
- HTML version of this page: https://verifymcp.io/servers/jdw2111-propraven/propraven-mcp
