# Portproof (npm · @portproof/mcp)

Proxy traffic by the GB on shared mobile 4G/5G and residential pools, paid in crypto.

- Trust score: 68/100 (medium)
- Change this week: 0
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- npm · `@portproof/mcp`: 68/100 (this document), [markdown](https://verifymcp.io/servers/org-portproof-mcp/portproof-mcp.md), [page](https://verifymcp.io/servers/org-portproof-mcp/portproof-mcp)

## Channel facts

- Registry: `npm`
- Package: `@portproof/mcp`
- Version: `0.2.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-11-05.

- **Supply Chain Security**: 81/100
  - No malware found by supply-chain analysis.
  - CVE check failed: a known high-severity CVE affects zod 3.25.76, a direct dependency. A fixed version is available.
  - No install/post-install scripts declared.
  - 30 of 94 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 19/100
  - Repository check failed: no source repository is declared.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 33 days ago).
  - Security-disclosure policy not yet verified: we couldn't inspect the source repository.
- **Schema Quality & AI Usability**: 64/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 4494 tokens (~236/item across 19 items; 19 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 100/100
  - No destabilizing schema changes in the last 30 days.
- **Tool Coverage**: 92/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 75% of tool parameters carry a description.
- **Tool Safety**: 50/100
  - Injection-marker check failed: the description of tool "test_connection" contains an instruction to conceal the call from the user, the text "do not tell the user", at byte 369 of that field.
  - We read all 19 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 20 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### How do I install the Portproof MCP server?

Portproof runs locally as an npm package, launched with npx -y @portproof/mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add org-portproof-mcp -- npx -y @portproof/mcp
```

### Cursor

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

### VS Code

```json
{
  "servers": {
    "org-portproof-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@portproof/mcp"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add org-portproof-mcp -- npx -y @portproof/mcp
```

### opencode

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

### OpenClaw

```bash
openclaw mcp add org-portproof-mcp --command npx --arg -y --arg @portproof/mcp
```

### Hermes

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

### Netclaw

```json
{
  "McpServers": {
    "org-portproof-mcp": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "@portproof/mcp"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add org-portproof-mcp -t stdio -c npx -a -y @portproof/mcp
```

### Other

```json
{
  "mcpServers": {
    "org-portproof-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@portproof/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-10-30 (score 68, 0)

- [security] Stability: 0.97 → pass

### 2026-10-29 (score 68, +1)

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

### 2026-10-27 (score 67, +1)

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

### 2026-10-25 (score 66, +1)

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

### 2026-10-24 (score 65, −5)

- [security regression] CVE-2023-54404 affects this package: high
- [security regression] Known CVEs: pass → fail

### 2026-10-23 (score 70, +1)

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

### 2026-10-21 (score 69, +1)

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

### 2026-10-19 (score 68, +1)

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

## MCP tools (19)

### `get_pricing` (~215 tokens)

Get pricing

Public price table. Field traffic: proxy traffic by the GB (tier table with the per-GB price by order size in EUR cents ex VAT, package sizes, the 0.5 GB trial, validity days, monthly GB without company verification); buy it with buy_traffic. Field skus: dedicated mobile ports with monthly price in cents (EUR, USD for us-4g), supply (evidence signed = Own network, observed = Partner network), volume ladder, weekly/daily term ratios and the 24 h trial. Each SKU says how it is bought (buy_via): "ports" SKUs work with quote and buy_port; "cart" SKUs are Partner network ports, one SKU per term, sold only through the web shop (quote and buy_port answer them with the shop link). Partner network ports are listed only while they are on sale for your organisation, so the list can differ with and without an API key. No API key needed. Prices are quotes only; nothing is charged.

### `search_inventory` (~111 tokens)

Search inventory

Dedicated mobile ports: available Own network dedicated mobile ports per country / site / carrier, with the number available and whether new ports are wait-listed. Use the returned carrier_id to pin a carrier in buy_port. Partner network ports are not listed here: get_pricing lists the ones on sale for you. No API key needed.

Input parameters:

- `carrier` (string): Carrier name filter, exactly as search_inventory returns it
- `country` (string): ISO-3166 alpha-2, e.g. "LT"

### `quote` (~129 tokens)

Quote a purchase

Price a purchase before buying: unit price, volume discount and total in cents for a SKU, term (monthly | weekly | daily) and quantity. For a Partner network SKU (buy_via "cart") the answer is its listed price per port and the web shop link, where the cart shows the total; not_on_sale when it is not on sale for your organisation. Read-only, nothing is charged.

Input parameters:

- `quantity` (integer, required)
- `sku` (string, required): SKU from get_pricing (field skus), e.g. "lt-4g"
- `term` (string, required)

### `buy_port` (~289 tokens)

Buy a port

Dedicated mobile ports: buy one dedicated mobile port (one modem, one SIM, one customer) for a SKU and term; check search_inventory first. For proxies by the GB use buy_traffic instead. CHARGES MONEY: requires confirm: true and an idempotency_key; refused otherwise. Fails with kyb_required (402) until the org has passed KYB tier t1, and no_inventory (409) when the SKU is sold out. Returns the Port with credentials and cost_cents. Partner network SKUs (buy_via "cart" in get_pricing) are bought in the web shop: for them nothing is charged and the answer is purchased: false with shop_url, or not_on_sale when they are not on sale for your organisation.

Input parameters:

- `auto_renew` (boolean)
- `carrier_id` (string): Pin a carrier (from search_inventory); omit for any
- `confirm` (boolean, required): Must be exactly true. Set it only after the user has agreed to this specific action.
- `idempotency_key` (string, required): Caller-chosen unique key (e.g. a UUID). Re-sending the same key with the same input replays the stored result instead of acting twice.
- `sku` (string, required): SKU from get_pricing (field skus), e.g. "lt-4g"
- `term` (string, required)

### `list_ports` (~105 tokens)

List ports

List the ports owned by this API key as compact summaries: label (country, carrier, port id), network (own = Own network, partner = Partner network), state, egress IPs, rotation, usage, subscription end and auto_renew. No credentials: use get_port for those. Paginated: pass next_cursor as cursor to continue.

Input parameters:

- `cursor` (string): next_cursor from the previous page
- `limit` (integer): Page size, default 50

### `get_port` (~146 tokens)

Get port

Full detail for one port: label, network, state, carrier, listeners, credentials (only if you own it), allowlist, egress IPs, rotation settings, usage today, uptime and subscription. Partner network ports also carry credentials.http and credentials.socks5 (each with its own host, port, login and password), capabilities (controls the port supports), renewal (price_cents, ends_at, auto_renew, can_renew) and rotation_url: the Portproof link that rotates the IP when fetched (60 s cooldown). proxy_urls gives ready-to-use http and socks5 URLs, each built from its own credential set.

Input parameters:

- `port_id` (string, required)

### `rotate` (~226 tokens)

Rotate IP

Rotate IP: request a new egress IP for a port and wait (up to 180 s in all) for the rotation record, signed on the device for Own network ports (evidence: signed) or recorded by our monitoring for Partner network ports (evidence: observed). A rotation still running after the API's first answer is followed on its status link. Changes live proxy state: requires confirm: true and an idempotency_key; refused otherwise. Carriers sometimes return the same IP (rotated: false, reason carrier_sticky); a rotation record is written either way. 429 port_cooldown (with retry_after seconds) inside the 60 s cooldown. Included in the subscription: no charge.

Input parameters:

- `confirm` (boolean, required): Must be exactly true. Set it only after the user has agreed to this specific action.
- `idempotency_key` (string, required): Caller-chosen unique key (e.g. a UUID). Re-sending the same key with the same input replays the stored result instead of acting twice.
- `port_id` (string, required)

### `set_rotation_schedule` (~199 tokens)

Set rotation schedule

Set the automatic rotation interval for a port: 0 = sticky (never rotate on a schedule), otherwise 60..86400 seconds. The schedule keeps running between API calls. When get_port shows capabilities.rotation_interval: false the port has no schedule control. A change the network has not confirmed yet answers conflict (409); try again later. Changes live proxy state: requires confirm: true and an idempotency_key; refused otherwise. No charge.

Input parameters:

- `confirm` (boolean, required): Must be exactly true. Set it only after the user has agreed to this specific action.
- `idempotency_key` (string, required): Caller-chosen unique key (e.g. a UUID). Re-sending the same key with the same input replays the stored result instead of acting twice.
- `interval_s` (integer, required): 0 = sticky (no scheduled rotation), otherwise seconds between rotations (60..86400)
- `port_id` (string, required)

### `renew_port` (~228 tokens)

Renew a port

Dedicated ports: renew one port for one more term now, paid from the account balance. Read get_port first: renewal.can_renew says whether it can be renewed now and renewal.price_cents what one more term costs. A Partner network port is renewed on the network first and ends_at is the end it confirmed; there is no grace period after a term ends. CHARGES MONEY: requires confirm: true and an idempotency_key; refused otherwise. Errors: insufficient_funds (402, nothing charged: top up the balance), conflict (409, for example while an earlier renewal is still being confirmed), supply_source_error (502, the renewal was refused and the charge refunded). Returns ends_at and cost_cents.

Input parameters:

- `confirm` (boolean, required): Must be exactly true. Set it only after the user has agreed to this specific action.
- `idempotency_key` (string, required): Caller-chosen unique key (e.g. a UUID). Re-sending the same key with the same input replays the stored result instead of acting twice.
- `port_id` (string, required)

### `set_auto_renew` (~189 tokens)

Set auto-renew

Dedicated ports: switch auto-renew of one port on or off. On: the port is renewed from the account balance shortly before its term ends (a short balance means it ends). Off: the port ends at the end of its current term, with no refund. Changes the subscription: requires confirm: true and an idempotency_key; refused otherwise. No charge now.

Input parameters:

- `confirm` (boolean, required): Must be exactly true. Set it only after the user has agreed to this specific action.
- `enabled` (boolean, required): true = renew from the account balance before the term ends; false = the port ends at the end of its term
- `idempotency_key` (string, required): Caller-chosen unique key (e.g. a UUID). Re-sending the same key with the same input replays the stored result instead of acting twice.
- `port_id` (string, required)

### `get_passport` (~116 tokens)

Get port details

Port details (API object: passport): label (country, carrier, port id), network (own = Own network, partner = Partner network), carrier, egress IPs, geo consensus, reputation, rotation and uptime statistics, throughput and exclusivity. Own network ports add the SIM contract class, usage against the daily cap and concurrent sessions (proof the port is not shared); a Partner network port has none of these, because nothing of ours runs on its device. Credentials are never included.

Input parameters:

- `port_id` (string, required)

### `get_receipt` (~132 tokens)

Get rotation record

Fetch one rotation record from the rotation log by id (rot_...): old/new IPs, whether the IP actually changed, attempts, timing, carrier, geo and reputation snapshot, plus the Ed25519 signature. Records of Own network ports (evidence: signed) are signed on the device; records of Partner network ports (evidence: observed) are recorded by our monitoring and signed by the control plane key cp-2026. The server also verifies the signature against the published keys and reports the result.

Input parameters:

- `receipt_id` (string, required): Rotation record id (equals the rotation id, rot_...)

### `get_usage` (~99 tokens)

Get usage

Traffic for one port over a time window: bytes in/out, peak concurrent sessions, new connections and rotations per bucket, plus totals. Default granularity is hour; use day for long windows to keep the response small.

Input parameters:

- `from` (string): ISO 8601 UTC, default: API default window
- `granularity` (string): minute | hour | day (default hour)
- `port_id` (string, required)
- `to`

### `get_status` (~62 tokens)

Get platform status

Public status page data: platform state, per-site uptime and live port counts, per-carrier uptime / first-attempt rotation success / p50 rotation time / published rotation floor, public incidents from the last 30 days and support response time. No API key needed.

### `get_traffic` (~112 tokens)

Get the traffic balance

Proxy traffic balance of the organisation: GB total / used / left, expiry, whether the key is enabled, daily usage and the purchase limits (validity days, monthly GB without company verification, whether the trial is still available). Connection details (host, ports, username base) are included when the API key holds ports:write (credentials is null otherwise); the password is masked here, use build_proxy_url with reveal_password: true when the user needs a working URL. Usage is synced every 5 minutes.

### `list_countries` (~103 tokens)

List countries online now

Countries with devices online now, per pool: mobile (4G/5G carrier modems, only in US, GB, FR, NL, PL, GE = Georgia (country)) and residential (opt-in peer devices), with totals. Coverage changes through the day: quote the numbers this tool returns and never an older or rounded count. Counts only; exit addresses are never listed. Empty lists mean the numbers are not available right now. No API key needed.

### `build_proxy_url` (~357 tokens)

Build a proxy URL

Build the proxy username and URL for one connection: pool, country, rotation and an optional session name are encoded in the username (validated by the server: an ISO 3166-1 alpha-2 country or "any", and the mobile pool only in US, GB, FR, NL, PL, GE = Georgia (country)). Returns host, port, username, the URL and curl / Python / Node / Playwright snippets. The password is masked unless reveal_password is true. A sticky session keeps the same device, and the carrier may still change its IP; never promise a fixed IP. Needs a traffic balance (buy_traffic first) and an API key with ports:write.

Input parameters:

- `country` (string, required): ISO-3166 alpha-2 (e.g. "GB") or "any"; see list_countries for what is online now
- `pool` (string, required): mobile = 4G/5G carrier modems (US, GB, FR, NL, PL, GE = Georgia (country)); residential = opt-in peer devices in the countries list_countries reports online now; best = whichever is available
- `protocol` (string): Default http
- `reveal_password` (boolean): Default false: the URL comes back with the password masked. Set true only when the user needs the working URL.
- `rotation` (string, required): auto5|auto10|auto20|auto60 = new IP every N minutes; ondemand = new IP on every connection; sticky = keep the same device for the session (the carrier may still change its IP)
- `session` (string): Session name, a-z 0-9 _ only. Optional: a stable one is derived for sticky.

### `buy_traffic` (~416 tokens)

Buy proxy traffic

Buy whole GB of proxy traffic (or the one-off 0.5 GB trial) from the wallet balance. CHARGES MONEY: requires confirm: true, accept_terms: true (the user accepts the terms, the acceptable-use policy and the immediate start of the service; ask them) and an idempotency_key; refused otherwise. Needs an API key with ports:write. The server prices the order from the tier table (see get_pricing, field traffic); the GB are added to the same balance and credentials. Validity is what get_traffic reports: limits.validity_days 0 means GB never expire. Fails with insufficient_funds (402) when the wallet is too low, kyb_required_for_volume (402) above the monthly volume for unverified organisations, trial_already_used (409), idempotency_conflict (409) when the idempotency_key was already used for a different purchase. A refused purchase stays stored under its idempotency_key for 24 h: after fixing the cause (for example a wallet top-up), buy with a new key. Returns the order with gb and cost_cents as the server recorded them.

Input parameters:

- `accept_terms` (boolean): Must be exactly true: the user accepts the terms (https://portproof.org/legal/terms), the acceptable-use policy (https://portproof.org/legal/aup) and the immediate start of the service. Ask the user;…
- `confirm` (boolean, required): Must be exactly true. Set it only after the user has agreed to this specific action.
- `gb` (integer): Whole GB to add to the balance. Omit when trial is true.
- `idempotency_key` (string, required): Caller-chosen unique key (e.g. a UUID). Re-sending the same key with the same input replays the stored result instead of acting twice.
- `trial` (boolean): Buy the one-off 0.5 GB trial instead (once per customer).

### `test_connection` (~282 tokens)

Test a proxy connection

The API sends one request through the gateway with the given pool, country and rotation and reports ok, the exit IP it saw, the latency and, on failure, the gateway error_code (for example E_NO_STOCK_COUNTRY, E_CAP_EXCEEDED, timeout). exit_country is only a country that was observed for the exit, never the requested one: when country_verified is false it is null, so do not tell the user the country was confirmed. Uses a few kilobytes of the balance; limited to 6 per minute; needs an API key with ports:write. With the development mock the result is simulated (simulated: true).

Input parameters:

- `country` (string): ISO-3166 alpha-2 (e.g. "GB") or "any"; see list_countries for what is online now
- `pool` (string): mobile = 4G/5G carrier modems (US, GB, FR, NL, PL, GE = Georgia (country)); residential = opt-in peer devices in the countries list_countries reports online now; best = whichever is available
- `rotation` (string): auto5|auto10|auto20|auto60 = new IP every N minutes; ondemand = new IP on every connection; sticky = keep the same device for the session (the carrier may still change its IP)

## Diagnostics

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

## Score history

- 2026-11-05: 68
- 2026-11-04: 68
- 2026-11-03: 68
- 2026-11-02: 68
- 2026-11-01: 68
- 2026-10-31: 68
- 2026-10-30: 68
- 2026-10-29: 68
- 2026-10-28: 67
- 2026-10-27: 67
- 2026-10-26: 66
- 2026-10-25: 66
- 2026-10-24: 65
- 2026-10-23: 70
- 2026-10-22: 69
- 2026-10-21: 69
- 2026-10-20: 68
- 2026-10-19: 68
- 2026-10-18: 67
- 2026-10-17: 67
- 2026-10-16: 67
- 2026-10-15: 66
- 2026-10-14: 66
- 2026-10-13: 65
- 2026-10-12: 65
- 2026-10-11: 64
- 2026-10-04: 61
- 2026-10-03: 60
- 2026-10-02: 45
- 2026-10-01: 60

## Common questions

### What is the Portproof MCP server?

Portproof is an MCP server listed in the public MCP registry as org.portproof/mcp. Proxy traffic by the GB on shared mobile 4G/5G and residential pools, paid in crypto. This page covers its npm package (@portproof/mcp).

### Is the Portproof MCP server safe to use?

Portproof scores 68 out of 100 on VerifyMCP. We recorded 1 known advisory against it as of 5 November 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Portproof MCP server expose?

Portproof exposes 19 tools: get_pricing, search_inventory, quote, buy_port, list_ports, and 14 more. Their descriptions and schemas cost roughly 3,516 tokens of context every time the server is loaded.

### Is the Portproof MCP server still maintained?

Portproof is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the Portproof MCP server under?

Portproof declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

### What did VerifyMCP test on the Portproof MCP server?

VerifyMCP ran 15 checks on Portproof, covering Malware scan, Known CVEs, Install scripts, Dependency health and 11 more. One item could not be completed, a gap on our side rather than a finding about Portproof: Security disclosure. Endpoint Security and Transport & Reachability do not apply to an npm package, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.

## Links

- npm package: https://www.npmjs.com/package/@portproof/mcp
- Socket report: https://socket.dev/npm/package/@portproof/mcp
- Website: https://portproof.org/
- Changelog RSS feed: https://verifymcp.io/servers/org-portproof-mcp/portproof-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/org-portproof-mcp/portproof-mcp/changelog.json
- Trust report (JSON): https://verifymcp.io/servers/org-portproof-mcp/portproof-mcp.json
- HTML version of this page: https://verifymcp.io/servers/org-portproof-mcp/portproof-mcp
