@portproof/mcp 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -120,12 +120,13 @@ is `http` or `socks5`. Which countries have devices online changes through the d
120
120
  `get_traffic` shows connection details only to a key with `ports:write`. A key without the scope a tool needs gets
121
121
  `insufficient_scope`.
122
122
 
123
- ### Dedicated ports (coming soon, not on sale yet)
123
+ ### Dedicated ports
124
124
 
125
125
  `search_inventory`, `quote`, `buy_port`, `list_ports`, `get_port`, `rotate`, `set_rotation_schedule`,
126
126
  `renew_port` (one more term from your account balance), `set_auto_renew`, `get_passport` (port details),
127
127
  `get_receipt` (a rotation record, with its signature checked against the published keys) and `get_usage` work on
128
- dedicated ports for organisations that already hold one. The server tells the model not to offer them.
128
+ dedicated mobile ports (one modem, one SIM, one customer per port), sold by the day, week or month. `get_pricing`
129
+ (field `skus`) lists the SKUs your organisation may buy.
129
130
 
130
131
  Every port has a `label` (country, carrier and port id) and a `network`: `own` (Own network) or `partner` (Partner
131
132
  network). Partner network ports are bought in the web shop, one SKU per term: `quote` and `buy_port` answer such a
package/dist/index.js CHANGED
@@ -685,7 +685,7 @@ function verifyReceiptWithKeys(receipt, keys) {
685
685
  }
686
686
 
687
687
  var SERVER_NAME = "portproof";
688
- var SERVER_VERSION = "0.2.0";
688
+ var SERVER_VERSION = "0.2.1";
689
689
  var USER_AGENT = `portproof-mcp/${SERVER_VERSION}`;
690
690
  var DEFAULT_API_URL = "https://api.portproof.org";
691
691
  var DEFAULT_TIMEOUT_MS = 3e4;
@@ -1352,7 +1352,7 @@ function shopAnswer(listing, requestedTerm, ctx) {
1352
1352
  next_step: steps.join(" ")
1353
1353
  };
1354
1354
  }
1355
- var NOT_ON_SALE_DETAIL = "This SKU is not on sale for your organisation right now. get_pricing (field skus) lists what can be bought; dedicated ports are coming soon.";
1355
+ var NOT_ON_SALE_DETAIL = "This SKU is not on sale for your organisation right now. get_pricing (field skus) lists what can be bought.";
1356
1356
  function notOnSale() {
1357
1357
  return localError("not_on_sale", "Not on sale", NOT_ON_SALE_DETAIL);
1358
1358
  }
@@ -1380,7 +1380,7 @@ async function answerCatalogueBuy(args, ctx) {
1380
1380
  var buyPort = defineTool({
1381
1381
  name: "buy_port",
1382
1382
  title: "Buy a port",
1383
- description: 'Dedicated ports (coming soon, not on sale yet; do not offer them): 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.',
1383
+ description: '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.',
1384
1384
  inputSchema: BuyPortInput,
1385
1385
  annotations: MUTATING,
1386
1386
  run: async (args, ctx) => {
@@ -1537,7 +1537,7 @@ var setAutoRenew = defineTool({
1537
1537
  var getPricing = defineTool({
1538
1538
  name: "get_pricing",
1539
1539
  title: "Get pricing",
1540
- description: '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 ports (coming soon, not on sale yet) 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.',
1540
+ description: '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.',
1541
1541
  inputSchema: EmptyInput,
1542
1542
  annotations: READ_ONLY,
1543
1543
  run: async (_args, ctx) => jsonResult(await ctx.api.getPricing())
@@ -1545,7 +1545,7 @@ var getPricing = defineTool({
1545
1545
  var searchInventory = defineTool({
1546
1546
  name: "search_inventory",
1547
1547
  title: "Search inventory",
1548
- description: "Dedicated ports (coming soon, not on sale yet): 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.",
1548
+ description: "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.",
1549
1549
  inputSchema: SearchInventoryInput,
1550
1550
  annotations: READ_ONLY,
1551
1551
  run: async (args, ctx) => {
@@ -1753,7 +1753,7 @@ if (registered.size !== TOOL_NAMES.length)
1753
1753
  var INSTRUCTIONS = [
1754
1754
  `Portproof sells proxy traffic by the GB: one prepaid GB balance per organisation, usable on two shared pools, mobile 4G/5G (carrier modems in ${MOBILE_COUNTRIES_TEXT}) and residential (opt-in peer devices; the countries online now come from list_countries, so never state a country count from memory). Pool, country, rotation (new IP every 5 / 10 / 20 / 60 minutes, on every connection, or a sticky session) and the session name are chosen in the proxy username, so one credential serves everything. Be precise: the pools are shared, a sticky session keeps the same device and the carrier may still change its IP; never call this traffic dedicated, private, static or unlimited, and never list pool exit addresses. Validity is what get_traffic reports: limits.validity_days 0 (and expires_at null) means GB never expire; a positive number is the days of validity every purchase guarantees for the whole balance.`,
1755
1755
  "Traffic tools: get_traffic (balance, expiry, limits), list_countries (devices online now per pool), build_proxy_url (username, URL and code snippets; the password stays masked unless reveal_password is true), test_connection (one request through the gateway: exit IP and latency; exit_country is normally null because the exit country is not checked; never report the requested country as the exit country), buy_traffic (wallet purchase of whole GB or the one-off 0.5 GB trial; prices come from the tier table in get_pricing, field traffic).",
1756
- 'Dedicated ports are coming soon and not on sale yet: do not offer them. get_pricing (field skus), search_inventory, quote, buy_port, list_ports, get_port, rotate, set_rotation_schedule, renew_port, set_auto_renew, get_passport, get_receipt and get_usage work on dedicated mobile ports (one modem, one SIM, one customer per port) for organisations that already have one. Every port states its supply: "signed" evidence means Own network (each rotation record is signed on the device), "observed" evidence means Partner network (recorded by our monitoring and signed by the control plane key); never describe a Partner network port as signed on the device. Name a port by its label (country, carrier, port id) and say only "Partner network" about where a Partner network port runs.',
1756
+ 'Dedicated mobile ports (one modem, one SIM, one customer per port; sold by the day, week or month) are on sale: get_pricing (field skus) lists the SKUs the caller may buy, search_inventory and quote work without a key, and list_ports, get_port, rotate, set_rotation_schedule, renew_port, set_auto_renew, get_passport, get_receipt and get_usage work on the ports the organisation holds. Every port states its supply: "signed" evidence means Own network (each rotation record is signed on the device), "observed" evidence means Partner network (recorded by our monitoring and signed by the control plane key); never describe a Partner network port as signed on the device. Name a port by its label (country, carrier, port id) and say only "Partner network" about where a Partner network port runs.',
1757
1757
  'Partner network ports are bought in the web shop, one SKU per term (buy_via "cart" in get_pricing): quote and buy_port answer them with shop_url and never charge. Their HTTP and SOCKS5 connections may differ in host, port, login and password: give the user proxy_urls from get_port, never a URL assembled from one set. rotation_url is the Portproof link that rotates the IP when fetched. They renew from the account balance: renewal in get_port says what one more term costs and whether it can be renewed now; auto-renew off means the port ends at the end of its term.',
1758
1758
  "Read tools (get_pricing, search_inventory, quote, list_ports, get_port, get_passport, get_receipt, get_usage, get_status, get_traffic, list_countries, build_proxy_url) are safe to call freely; test_connection uses a few kilobytes of the balance and is limited to 6 per minute.",
1759
1759
  "buy_traffic, buy_port and renew_port charge money, rotate and set_rotation_schedule change live proxy state and set_auto_renew changes the subscription: they are refused unless called with confirm: true and an idempotency_key. buy_traffic also needs accept_terms: true, which records that the user accepts the terms, the acceptable-use policy and the immediate start of the service. Ask the user before setting confirm: true or accept_terms: true, and reuse the same idempotency_key only to retry the identical request.",
package/llms.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  # Portproof MCP server
2
2
 
3
- > Proxy traffic by the GB: one prepaid GB balance per organisation, usable on two shared pools, mobile 4G/5G (carrier modems) and residential (opt-in peer devices). Pool, country, rotation and session are chosen in the proxy username, so one credential serves everything. The pools are shared: the traffic is never dedicated, private, static or unlimited, and a sticky session keeps the same device while the carrier may still change its IP. Countries online now come from list_countries; never state a country count from memory. Dedicated ports are coming soon and not on sale yet. Paid in cryptocurrency. This stdio MCP server (npm package @portproof/mcp) exposes the Portproof API (base `PORTPROOF_API_URL` + `/v1`, default https://api.portproof.org; key `PORTPROOF_API_KEY`) as nineteen tools.
3
+ > Proxy traffic by the GB: one prepaid GB balance per organisation, usable on two shared pools, mobile 4G/5G (carrier modems) and residential (opt-in peer devices). Pool, country, rotation and session are chosen in the proxy username, so one credential serves everything. The pools are shared: the traffic is never dedicated, private, static or unlimited, and a sticky session keeps the same device while the carrier may still change its IP. Countries online now come from list_countries; never state a country count from memory. Dedicated mobile ports (one modem, one SIM, one customer; by the day, week or month) are sold beside the pools: get_pricing lists the SKUs on sale. Paid in cryptocurrency. This stdio MCP server (npm package @portproof/mcp) exposes the Portproof API (base `PORTPROOF_API_URL` + `/v1`, default https://api.portproof.org; key `PORTPROOF_API_KEY`) as nineteen tools.
4
4
 
5
5
  ## Traffic tools
6
6
 
@@ -10,7 +10,7 @@
10
10
  - test_connection { pool?, country?, rotation? } -> ok, exit IP, latency, error_code; exit_country is normally null (no country check); never report the requested country as the exit country. 6 per minute. Key scope ports:write.
11
11
  - buy_traffic { gb | trial:true, accept_terms:true, confirm:true, idempotency_key } -> order with gb and cost_cents as the server recorded them. Charges the wallet. accept_terms records that the user accepts the terms, the acceptable-use policy and the immediate start of the service. Key scope ports:write.
12
12
 
13
- ## Port tools (dedicated ports: coming soon, not on sale yet)
13
+ ## Port tools (dedicated mobile ports)
14
14
 
15
15
  - get_pricing {} -> field traffic (per-GB tier table, packages, trial, validity) and field skus (port price table; buy_via ports or cart; Partner network SKUs only while on sale for the caller's organisation). Public.
16
16
  - search_inventory { country?, carrier? } -> available Own network ports per site/carrier with carrier_id. Public.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@portproof/mcp",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "type": "module",
5
5
  "description": "MCP server for Portproof: proxy traffic by the GB on shared mobile 4G/5G and residential pools, paid in crypto, as tools for AI agents",
6
6
  "keywords": [