Tollkit

Extract product data, or notarize what a page said. Paid per call in USDC, no signup or API key.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
84%
Naming quality
93%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~4,722Tokens (tool definitions)
~4.3 KBTypical response size
Significant attention impact (3.69% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "x402-extract": {
      "command": "npx",
      "args": [
        "x402-extract-mcp"
      ]
    }
  }
}

Runnable packages

npmx402-extract-mcp0.1.2stdio

Remote endpoints

https://extract.tollkit.dev/mcpstreamable-http

What it can do

Tool inventory

Tools (9)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟡get_product_details(url, allow_redirect, payment)

Find out what a product is and what it costs, from its page URL. USE THIS WHEN you have the URL of ONE specific product — a store listing, a marketplace item, a manufacturer's page — and you need its fields rather than its prose. Typical jobs: comparing the same item across several stores, tracking a price over time, checking whether something is in stock, ingesting a catalogue, or getting a product photo URL. DO NOT USE THIS FOR search-results or category pages (it returns one product, not a list), pages behind a login or paywall, or pages that are not about a product. It also cannot reach private or internal addresses. RETURNS name, description, brand, sku, price (a number), currency (ISO 4217), availability (in_stock | out_of_stock | preorder | unknown), images (up to 5 absolute URLs copied from the page, never invented) and variants. See the output schema for the exact shape. Any field the page does not state comes back null rather than guessed. HOW: the page is rendered in a real headless browser before extraction, so JavaScript-built pages work where a plain fetch returns an empty shell. COST $0.05 USDC per call over x402 on Base. No account, no API key, nothing to install, and no gas — the facilitator sponsors it. Call once WITHOUT the payment argument to get back the payment requirements, sign an EIP-3009 transferWithAuthorization with your own wallet for the quoted amount, base64-encode the x402 payload, and call again with that string as `payment`. EVERY RESPONSE SAYS WHERE EACH FIELD CAME FROM. `provenance.declared` lists the fields whose values match what the merchant published in schema.org JSON-LD — their own number, the one they publish for Google. `provenance.inferred` lists the ones a model read off the page, which might be a strikethrough price or a neighbouring product. Act on declared values; verify inferred ones if the decision matters. A URL that redirects to what looks like a DIFFERENT page — a discontinued item bouncing to its category listing — is refused free of charge rather than answered with the wrong product. Retry with `allow_redirect: true` if you want whatever the URL resolves to. A failed extraction is not charged. Repeat calls for the same URL within 300 seconds are re-served from a recent render and marked `cached: true` with the render's original `fetchedAt`. Call `try_it_free` first if you want to see real output before spending anything.

Input Schema

{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "description": "Absolute https:// URL of a single product page. Not a search or category page."
    },
    "allow_redirect": {
      "type": "boolean",
      "description": "Default false. By default a URL that redirects to what looks like a different page (a discontinued item bouncing to its category listing) is refused free of charge, because extracting it would return a real product that is not the one you asked for. Set true if you want whatever the URL resolves to."
    },
    "payment": {
      "type": "string",
      "description": "Base64-encoded x402 payment payload. Omit on the first call to receive payment requirements."
    }
  },
  "required": [
    "url"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "status": {
      "type": "string",
      "const": "ok"
    },
    "product": {
      "type": "object",
      "properties": {
        "name": {
          "type": [
            "string",
            "null"
          ],
          "description": "Product title as shown on the page."
        },
        "description": {
          "type": [
            "string",
            "null"
          ],
          "description": "One to three sentences."
        },
        "brand": {
          "type": [
            "string",
            "null"
          ]
        },
        "sku": {
          "type": [
            "string",
            "null"
          ],
          "description": "SKU or model number, if the page shows one."
        },
        "price": {
          "type": [
            "number",
            "null"
          ],
          "description": "Numeric price. No currency symbol, no thousands separator."
        },
        "currency": {
          "type": [
            "string",
            "null"
          ],
          "description": "ISO 4217 code, e.g. USD. Always null when price is null."
        },
        "availability": {
          "type": "string",
          "enum": [
            "in_stock",
            "out_of_stock",
            "preorder",
            "unknown"
          ],
          "description": "`unknown` when the page does not say — never guessed."
        },
        "images": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Up to 5 absolute image URLs copied verbatim from the page. Never invented. Empty when the page carries no usable product image."
        },
        "variants": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string"
              },
              "values": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            },
            "required": [
              "name",
              "values"
            ],
            "additionalProperties": false
          },
          "description": "e.g. [{ name: \"Size\", values: [\"S\", \"M\", \"L\"] }]"
        },
        "url": {
          "type": "string",
          "description": "The page the data came from, after any redirects."
        }
      },
      "required": [
        "name",
        "description",
        "brand",
        "sku",
        "price",
        "currency",
        "availability",
        "images",
        "variants",
        "url"
      ],
      "additionalProperties": false
    },
    "page": {
      "type": "object",
      "properties": {
        "url": {
          "type": "string",
          "description": "The URL as submitted."
        },
        "finalUrl": {
          "type": "string",
          "description": "Where it ended up after redirects."
        },
        "title": {
          "type": [
            "string",
            "null"
          ]
        },
        "status": {
          "type": "number",
          "description": "HTTP status of the rendered page."
        },
        "fetchedAt": {
          "type": "string",
          "description": "ISO timestamp of the RENDER, not of this call. On a cached result this is older than now — check it before treating a price as live."
        },
        "render_ms": {
          "type": [
            "number",
            "null"
          ]
        }
      },
      "required": [
        "url",
        "finalUrl",
        "title",
        "status",
        "fetchedAt",
        "render_ms"
      ],
      "additionalProperties": false
    },
    "cached": {
      "type": "boolean",
      "description": "True when this answer was re-served from a recent render rather than produced now. Re-serving is still a paid call; it is faster, and the data is as old as cache_age_seconds says."
    },
    "cache_age_seconds": {
      "type": "number"
    },
    "provenance": {
      "type": "object",
      "properties": {
        "source": {
          "type": "string",
          "enum": [
            "json-ld",
            "meta",
            "json-ld+meta",
            "none"
          ]
        },
        "declared": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "inferred": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      },
      "required": [
        "source",
        "declared",
        "inferred"
      ],
      "additionalProperties": false,
      "description": "Where each field came from. `declared` matches what the merchant published in schema.org data — their own number. `inferred` was read off the page by a model. Null fields appear in neither. Treat a declared price as a fact and an inferred one as a reading."
    },
    "redirect": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "requested": {
              "type": "string"
            },
            "final": {
              "type": "string"
            }
          },
          "required": [
            "requested",
            "final"
          ],
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Present only when the browser landed somewhere other than the URL you gave. The data describes `final`, not `requested`."
    },
    "settlement": {
      "type": [
        "string",
        "null"
      ],
      "description": "Base64 x402 settlement receipt, when the facilitator returned one."
    }
  },
  "required": [
    "status",
    "product",
    "page",
    "cached",
    "cache_age_seconds",
    "provenance",
    "redirect",
    "settlement"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢try_it_free

Free. Run a real extraction against one fixed sample product page and return the result. USE THIS to decide whether the paid tools are worth paying for. It returns the identical shape get_product_details returns, produced by the identical code — not a hand-written example — so what you see is what you get. It takes no arguments and costs nothing. You cannot choose the page: pointing a free endpoint at arbitrary URLs would just be the paid tool with no toll. Use get_product_details for the URL you actually care about.

Input Schema

{
  "type": "object",
  "properties": {},
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "status": {
      "type": "string",
      "const": "ok"
    },
    "preview": {
      "type": "boolean",
      "const": true
    },
    "free": {
      "type": "boolean",
      "const": true
    },
    "sample_url": {
      "type": "string"
    },
    "product": {
      "type": "object",
      "properties": {
        "name": {
          "type": [
            "string",
            "null"
          ],
          "description": "Product title as shown on the page."
        },
        "description": {
          "type": [
            "string",
            "null"
          ],
          "description": "One to three sentences."
        },
        "brand": {
          "type": [
            "string",
            "null"
          ]
        },
        "sku": {
          "type": [
            "string",
            "null"
          ],
          "description": "SKU or model number, if the page shows one."
        },
        "price": {
          "type": [
            "number",
            "null"
          ],
          "description": "Numeric price. No currency symbol, no thousands separator."
        },
        "currency": {
          "type": [
            "string",
            "null"
          ],
          "description": "ISO 4217 code, e.g. USD. Always null when price is null."
        },
        "availability": {
          "type": "string",
          "enum": [
            "in_stock",
            "out_of_stock",
            "preorder",
            "unknown"
          ],
          "description": "`unknown` when the page does not say — never guessed."
        },
        "images": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Up to 5 absolute image URLs copied verbatim from the page. Never invented. Empty when the page carries no usable product image."
        },
        "variants": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string"
              },
              "values": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            },
            "required": [
              "name",
              "values"
            ],
            "additionalProperties": false
          },
          "description": "e.g. [{ name: \"Size\", values: [\"S\", \"M\", \"L\"] }]"
        },
        "url": {
          "type": "string",
          "description": "The page the data came from, after any redirects."
        }
      },
      "required": [
        "name",
        "description",
        "brand",
        "sku",
        "price",
        "currency",
        "availability",
        "images",
        "variants",
        "url"
      ],
      "additionalProperties": false
    },
    "page": {
      "type": "object",
      "properties": {
        "url": {
          "type": "string",
          "description": "The URL as submitted."
        },
        "finalUrl": {
          "type": "string",
          "description": "Where it ended up after redirects."
        },
        "title": {
          "type": [
            "string",
            "null"
          ]
        },
        "status": {
          "type": "number",
          "description": "HTTP status of the rendered page."
        },
        "fetchedAt": {
          "type": "string",
          "description": "ISO timestamp of the RENDER, not of this call. On a cached result this is older than now — check it before treating a price as live."
        },
        "render_ms": {
          "type": [
            "number",
            "null"
          ]
        }
      },
      "required": [
        "url",
        "finalUrl",
        "title",
        "status",
        "fetchedAt",
        "render_ms"
      ],
      "additionalProperties": false
    },
    "stale": {
      "type": "boolean",
      "description": "True if the sample could not be refreshed and is an older render."
    },
    "cache_age_seconds": {
      "type": "number"
    },
    "note": {
      "type": "string"
    }
  },
  "required": [
    "status",
    "preview",
    "free",
    "sample_url",
    "product",
    "page",
    "stale",
    "cache_age_seconds",
    "note"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢compare_products(urls, allow_redirect, payment)

Price the same product at several stores — up to 5 URLs in ONE call and ONE payment. USE THIS WHENEVER YOU HAVE MORE THAN ONE URL. Comparing an item across stores, checking a short list, or refreshing a handful of tracked prices. It returns full details for each URL so YOU can compare them; it does not rank them or pick a winner. Through get_product_details that is one EIP-3009 signature, one settlement and one round trip PER URL; this is one of each for the whole set. RETURNS one entry per URL in the order given, each with the same product and page objects get_product_details returns, plus ok/error so a single dead URL does not cost you the rest. COST $0.15 flat for up to 5 URLs — cheaper per page than calling get_product_details 5 times. BILLING, stated plainly: the price is flat, so a batch where only SOME URLs succeed is charged in full. A batch where NO url succeeds returns an error and is not charged. If you have one URL and are unsure it is live, get_product_details is the cheaper bet. Duplicate URLs are removed and not billed twice.

Input Schema

{
  "type": "object",
  "properties": {
    "urls": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Up to 5 absolute https:// product page URLs. Duplicates are removed and not billed twice."
    },
    "allow_redirect": {
      "type": "boolean",
      "description": "Applies to every URL. See get_product_details for what it does."
    },
    "payment": {
      "type": "string",
      "description": "Base64-encoded x402 payment payload. Omit on the first call to receive payment requirements."
    }
  },
  "required": [
    "urls"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "status": {
      "type": "string",
      "const": "ok"
    },
    "requested": {
      "type": "number"
    },
    "succeeded": {
      "type": "number"
    },
    "failed": {
      "type": "number"
    },
    "billing": {
      "type": "string",
      "description": "The billing rule, restated on every response rather than only in the docs."
    },
    "results": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string"
          },
          "ok": {
            "type": "boolean"
          },
          "product": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Product title as shown on the page."
                  },
                  "description": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "One to three sentences."
                  },
                  "brand": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "sku": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "SKU or model number, if the page shows one."
                  },
                  "price": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Numeric price. No currency symbol, no thousands separator."
                  },
                  "currency": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "ISO 4217 code, e.g. USD. Always null when price is null."
                  },
                  "availability": {
                    "type": "string",
                    "enum": [
                      "in_stock",
                      "out_of_stock",
                      "preorder",
                      "unknown"
                    ],
                    "description": "`unknown` when the page does not say — never guessed."
                  },
                  "images": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Up to 5 absolute image URLs copied verbatim from the page. Never invented. Empty when the page carries no usable product image."
                  },
                  "variants": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string"
                        },
                        "values": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        }
                      },
                      "required": [
                        "name",
                        "values"
                      ],
                      "additionalProperties": false
                    },
                    "description": "e.g. [{ name: \"Size\", values: [\"S\", \"M\", \"L\"] }]"
                  },
                  "url": {
                    "type": "string",
                    "description": "The page the data came from, after any redirects."
                  }
                },
                "required": [
                  "name",
                  "description",
                  "brand",
                  "sku",
                  "price",
                  "currency",
                  "availability",
                  "images",
                  "variants",
                  "url"
                ],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "page": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "url": {
                    "type": "string",
                    "description": "The URL as submitted."
                  },
                  "finalUrl": {
                    "type": "string",
                    "description": "Where it ended up after redirects."
                  },
                  "title": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "status": {
                    "type": "number",
                    "description": "HTTP status of the rendered page."
                  },
                  "fetchedAt": {
                    "type": "string",
                    "description": "ISO timestamp of the RENDER, not of this call. On a cached result this is older than now — check it before treating a price as live."
                  },
                  "render_ms": {
                    "type": [
                      "number",
                      "null"
                    ]
                  }
                },
                "required": [
                  "url",
                  "finalUrl",
                  "title",
                  "status",
                  "fetchedAt",
                  "render_ms"
                ],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "provenance": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "source": {
                    "type": "string",
                    "enum": [
                      "json-ld",
                      "meta",
                      "json-ld+meta",
                      "none"
                    ]
                  },
                  "declared": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "inferred": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "required": [
                  "source",
                  "declared",
                  "inferred"
                ],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ],
            "description": "Per-URL: which fields the merchant declared vs the model inferred."
          },
          "cached": {
            "type": "boolean"
          },
          "cache_age_seconds": {
            "type": "number"
          },
          "error": {
            "type": [
              "string",
              "null"
            ]
          },
          "message": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "url",
          "ok",
          "product",
          "page",
          "provenance",
          "cached",
          "cache_age_seconds",
          "error",
          "message"
        ],
        "additionalProperties": false
      }
    },
    "settlement": {
      "type": [
        "string",
        "null"
      ]
    }
  },
  "required": [
    "status",
    "requested",
    "succeeded",
    "failed",
    "billing",
    "results",
    "settlement"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢attest_page(url, screenshot, payment)

Prove what a web page said, at a time, in a way someone who distrusts you can check. Renders the page and returns a signed, timestamped record of it: the text and its SHA-256, the HTTP status, the response headers, the serving IP, and the TLS certificate the site presented. Optionally a screenshot and its hash. All of it hashed into one claim and signed, so any single altered byte breaks the signature. Use it when a page might change or be denied later: terms of service before you agree, a price before you act on it, a policy you are relying on, a claim a competitor published, a listing that can be edited. Verification is free, needs no account, and does not depend on this service continuing to exist — the math is public and `verify_attestation` explains how to redo it yourself. We keep no copy, so the response you receive IS the evidence. Store it. $0.25 USDC per call over x402. A render that fails costs nothing.

Input Schema

{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "description": "Absolute https:// URL of the page to attest to. Anything a dispute could turn on: terms of service, a price, a published policy, a competitor's claim, a listing that may be edited later."
    },
    "screenshot": {
      "type": "boolean",
      "description": "Default false in MCP. A screenshot makes the evidence much stronger, but the image comes back inline as roughly 55,000 characters of base64. With it false the attestation is text-only and internally complete: it claims no screenshot and commits to no hash you cannot check. Set true when the visual appearance is the thing in dispute and you can afford the bytes."
    },
    "payment": {
      "type": "string",
      "description": "Base64 x402 payment payload. Omit it to receive a quote instead of an attestation; sign that and call again."
    }
  },
  "required": [
    "url"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢verify_attestation(attestation)

Free, forever, no account. Hand back an attestation -- yours or one someone else gave you -- and find out whether the signature holds and whether we issued it. Works on attestations this service did not produce: the answer for those is a clear no, which is the point. Holds no database, so it keeps working whoever is running it.

Input Schema

{
  "type": "object",
  "properties": {
    "attestation": {
      "type": "string",
      "description": "The attestation as JSON text: either the whole response from attest_page or just its `attestation` object."
    }
  },
  "required": [
    "attestation"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢check_my_balance(address, network, low_below)

Free. Check how much USDC is left in your own wallet on Base, so you can tell your human before you run out. Returns the balance and a link your human can use to refill you from their own wallet. Tollkit never holds anyone's funds or keys.

Input Schema

{
  "type": "object",
  "properties": {
    "address": {
      "type": "string",
      "description": "Your wallet address (0x...). The address you pay from."
    },
    "network": {
      "type": "string",
      "enum": [
        "base",
        "sepolia"
      ],
      "description": "Default base. Use sepolia for test money."
    },
    "low_below": {
      "type": "number",
      "exclusiveMinimum": 0,
      "description": "USDC amount you consider low. Default 1."
    }
  },
  "required": [
    "address"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢check_service(url, method)

Free. Probes any x402 endpoint WITHOUT paying and reports what it actually charges, to which wallet, on which network, and how that compares with its public Coinbase Bazaar listing (price, recipient, distinct payers in the last 30 days). Returns facts and named signals such as pay_to_differs_from_listing; it does not score or recommend. Works for services that have nothing to do with Tollkit.

Input Schema

{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "description": "The x402 endpoint, e.g. https://api.example.com/v1/thing"
    },
    "method": {
      "type": "string",
      "enum": [
        "GET",
        "POST"
      ],
      "description": "Force a method. By default the listed method is tried first."
    }
  },
  "required": [
    "url"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢find_service(query, limit)

Free. Searches Coinbase's public x402 discovery index for services that do a task (e.g. 'product price lookup', 'send sms', 'web page screenshot'), then checks each result live without paying. Results are ordered by whether they returned a live price quote, then by distinct paying wallets; nobody pays for placement. Descriptions are the sellers' own words.

Input Schema

{
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "minLength": 2,
      "maxLength": 200,
      "description": "What you need done, in plain words."
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 8,
      "description": "How many results to check, default 5."
    }
  },
  "required": [
    "query"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢get_service_info

Free. Price, network, and what this service returns. For a sample of the actual output rather than a description of it, call try_it_free instead.

Input Schema

{
  "type": "object",
  "properties": {},
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Recommended Prompts

search_research
Search for information about [topic] using Tollkit
Expected tools: find_service
find_specific
Find [specific item] using Tollkit
Expected tools: find_service
retrieve_data
Get details about [item] from Tollkit
Expected tools: get_product_details
fetch_info
Fetch [information type] using Tollkit
Expected tools: get_product_details
research_workflow
Search for [topic], then get detailed information about the top results using Tollkit
Expected tools: find_serviceget_product_details

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded9 tools
verifiedversion not recorded9 tools