@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 +3 -2
- package/dist/index.js +6 -6
- package/llms.txt +2 -2
- package/package.json +1 -1
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
|
|
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
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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