Portproof
NPM · @PORTPROOF/MCP
Proxy traffic by the GB on shared mobile 4G/5G and residential pools, paid in crypto.
Available components
Last scanned (8 hours ago)
Scores higher than 36% of npm servers
Category Cloud Infrastructure
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. How we score → Why this is hard to score →
Supply Chain Security81
- No malware found by supply-chain analysis.Pass
- CVE check failed: a known high-severity CVE affects zod 3.25.76, a direct dependency. A fixed version is available. View diagnostics → Fail
- No install/post-install scripts declared.Pass
- 30 of 94 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency19
- Repository check failed: no source repository is declared. See how to fix → View diagnostics → Fail
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 33 days ago).Pass
- Security-disclosure policy not yet verified: we couldn't inspect the source repository.Unverified
Schema Quality & AI Usability64
- AI-judged instruction clarity (excellent).Pass
- 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. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
- No destabilizing schema changes in the last 30 days.Pass
Tool Coverage92
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 75% of tool parameters carry a description.Partial
Tool Safety50
- 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. See how to fix → Fail
- We read all 19 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 20 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 30 Oct 26 0
- Stability: 0.97 → pass security
- 29 Oct 26 +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.
- 27 Oct 26 +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.
- 25 Oct 26 +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.
- 24 Oct 26 −5
- CVE-2023-54404 affects this package: high ▼ security
- Known CVEs: pass → fail ▼ security
- 23 Oct 26 +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.
- 21 Oct 26 +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.
- 19 Oct 26 +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.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 5 Nov 2026 · Analysed npm/@portproof/mcp@0.2.1
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | npm |
Background: How many MCP packages publish verified provenance →
Vulnerabilities 1 finding
| ID | CVE | Severity | Vector | Fix available |
|---|---|---|---|---|
| GHSA-mrhx-c7xc-m3w5 | CVE-2023-54404 | high | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H | yes |
Background: What a vulnerability scan can and cannot prove →
Dependencies 94 packages
| Packages resolved | 94 |
|---|---|
| Stale | 30 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
build_proxy_url Build a proxy URL ~357
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.
| Name | Type | Req | Description |
|---|---|---|---|
| country | string | yes | ISO-3166 alpha-2 (e.g. "GB") or "any"; see list_countries for what is online now |
| pool | string | yes | 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 | yes | 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. |
No output schema declared.
No examples provided.
buy_port Buy a port ~289
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.
| Name | Type | Req | Description |
|---|---|---|---|
| auto_renew | boolean | – | – |
| carrier_id | string | – | Pin a carrier (from search_inventory); omit for any |
| confirm | boolean | yes | Must be exactly true. Set it only after the user has agreed to this specific action. |
| idempotency_key | string | yes | 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 | yes | SKU from get_pricing (field skus), e.g. "lt-4g" |
| term | string | yes | – |
No output schema declared.
No examples provided.
buy_traffic Buy proxy traffic ~416
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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 | yes | 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 | yes | 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). |
No output schema declared.
No examples provided.
get_passport Get port details ~116
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.
| Name | Type | Req | Description |
|---|---|---|---|
| port_id | string | yes | – |
No output schema declared.
No examples provided.
get_port Get port ~146
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.
| Name | Type | Req | Description |
|---|---|---|---|
| port_id | string | yes | – |
No output schema declared.
No examples provided.
get_pricing Get pricing ~215
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.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
get_receipt Get rotation record ~132
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.
| Name | Type | Req | Description |
|---|---|---|---|
| receipt_id | string | yes | Rotation record id (equals the rotation id, rot_...) |
No output schema declared.
No examples provided.
get_status Get platform status ~62
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.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
get_traffic Get the traffic balance ~112
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.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
get_usage Get usage ~99
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.
| Name | Type | Req | Description |
|---|---|---|---|
| from | string | – | ISO 8601 UTC, default: API default window |
| granularity | string | – | minute | hour | day (default hour) |
| port_id | string | yes | – |
| to | – | – | – |
No output schema declared.
No examples provided.
list_countries List countries online now ~103
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.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
list_ports List ports ~105
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.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | next_cursor from the previous page |
| limit | integer | – | Page size, default 50 |
No output schema declared.
No examples provided.
quote Quote a purchase ~129
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.
| Name | Type | Req | Description |
|---|---|---|---|
| quantity | integer | yes | – |
| sku | string | yes | SKU from get_pricing (field skus), e.g. "lt-4g" |
| term | string | yes | – |
No output schema declared.
No examples provided.
renew_port Renew a port ~228
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.
| Name | Type | Req | Description |
|---|---|---|---|
| confirm | boolean | yes | Must be exactly true. Set it only after the user has agreed to this specific action. |
| idempotency_key | string | yes | 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 | yes | – |
No output schema declared.
No examples provided.
rotate Rotate IP ~226
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.
| Name | Type | Req | Description |
|---|---|---|---|
| confirm | boolean | yes | Must be exactly true. Set it only after the user has agreed to this specific action. |
| idempotency_key | string | yes | 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 | yes | – |
No output schema declared.
No examples provided.
search_inventory Search inventory ~111
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.
| Name | Type | Req | Description |
|---|---|---|---|
| carrier | string | – | Carrier name filter, exactly as search_inventory returns it |
| country | string | – | ISO-3166 alpha-2, e.g. "LT" |
No output schema declared.
No examples provided.
set_auto_renew Set auto-renew ~189
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.
| Name | Type | Req | Description |
|---|---|---|---|
| confirm | boolean | yes | Must be exactly true. Set it only after the user has agreed to this specific action. |
| enabled | boolean | yes | true = renew from the account balance before the term ends; false = the port ends at the end of its term |
| idempotency_key | string | yes | 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 | yes | – |
No output schema declared.
No examples provided.
set_rotation_schedule Set rotation schedule ~199
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.
| Name | Type | Req | Description |
|---|---|---|---|
| confirm | boolean | yes | Must be exactly true. Set it only after the user has agreed to this specific action. |
| idempotency_key | string | yes | 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 | yes | 0 = sticky (no scheduled rotation), otherwise seconds between rotations (60..86400) |
| port_id | string | yes | – |
No output schema declared.
No examples provided.
test_connection Test a proxy connection ~282
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).
| Name | Type | Req | Description |
|---|---|---|---|
| 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) |
No output schema declared.
No examples provided.
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.
npm · @portproof/mcp
claude mcp add org-portproof-mcp -- npx -y @portproof/mcp
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.