baconservices-mcp
MCP server for buying Bacon Services image and web-analysis work with USDC on Base over x402 from a local wallet under configurable spending limits, plus free catalog, quote, and wallet-check tools.
list_services: list Bacon’s live catalog, prices, limits, and whether this package can run each service.quote: get the current price for one service and check whether limits/wallet allow it, without signing.wallet_status: show network, wallet configuration, remaining spending limits, and affordability by service.remove_background: remove a photo background and return a transparent PNG download link.optimize_image: resize to a max longest side and encode as WebP at a chosen quality.image_palette: extract up to 12 dominant colors as JSON, with shares and neutral flags.brand_from_url: read a public page and return brand JSON: name, description, logos, colors, fonts, social profiles.page_metadata: return SEO/link-preview metadata JSON for a public page, including issues.accessibility_check: run an axe-core WCAG check on a public page and return failing rules, examples, and manual-test criteria.vectorize_image: trace an image into a flat-color SVG, best for logos/icons/flat artwork.Paid tools use x402 USDC payments from the buyer’s wallet after per-call, per-session, optional max-price, and rolling daily limit checks. Image tools accept public URLs or local paths and can save outputs locally.
baconservices-mcp
An MCP server that lets an AI agent buy image work from Bacon Services, one call at a time, paid in USDC on Base over x402 from your own wallet, within spending limits you set. There's no account and no API key: the agent calls a tool, the server checks the price against your limits, signs a USDC payment for exactly that price, and returns the result.
Also listed in the MCP Registry as io.github.afmontoya/baconservices-mcp.
Wallet safety
Your wallet private key stays on your machine. Bacon Services never receives or stores it. Payments are signed locally and are subject to configurable per-call, session, and daily spending limits.
Related MCP server: @bridgenode/mcp
What it sells
Tool | Does | Price (2026-10-17) |
| Removes the background from one photo; returns a transparent PNG at the photo's size | 0.05 USDC |
| Resizes so the longest side ≤ | 0.01 USDC |
| The colours one image is mostly made of, as JSON: up to | 0.01 USDC |
| Reads one public web page ( | 0.03 USDC |
| Reads one public web page ( | 0.01 USDC |
| An automated WCAG check of one public web page ( | 0.05 USDC |
| Traces one image into an SVG of flat-colour paths: | 0.05 USDC |
| Cleans and simplifies one SVG ( | 0.01 USDC |
Image tools take PNG, JPEG or WebP up to 8 MB, as image_url (public https) or image_path (a
local file). remove_background, optimize_image and vectorize_image return a signed download
link (valid 24 hours); image_palette, brand_from_url, page_metadata, accessibility_check and clean_svg return their JSON result in the tool result. Add
save_to to write either kind to disk. A JSON result over 256 KB (a large cleaned SVG, say) is not shown, so pass save_to for one. Prices come from Bacon's live catalog, and each paid tool
states its current price in its description.
image_palette, brand_from_url, page_metadata, accessibility_check, vectorize_image and clean_svg appear once Bacon's catalog publishes
them with contract versions. A service the installed package doesn't understand is listed by list_services but
can't be called until you update the package.
Free tools:
list_services: everything Bacon sells right now, with prices, limits, and whether this version of the package can run it.quote: Bacon's current price for one service, and whether your limits and wallet allow it. Nothing is signed.wallet_status: network, whether a wallet is configured, your limits and what's left of them, and whether you can afford each service (yes/no).
Before you start
Node.js 20 or newer.
A dedicated wallet holding only what you're willing to spend. Fund it with USDC on Base. You don't need ETH: x402 payments are signed authorizations (EIP-3009), and the facilitator pays the gas.
Put the private key in a file that only you can read, for example
~/.bacon/buyer.key. PointingBACON_WALLET_KEY_FILEat that file keeps the key out of MCP host configs, which are often synced or shared.BACON_WALLET_PRIVATE_KEYalso works.
The key never leaves your machine. Only signatures are sent, and only to Bacon. The key is never logged, never written to the spend ledger, and never accepted as a tool argument.
Install
Claude Code
claude mcp add bacon -e BACON_WALLET_KEY_FILE=/home/you/.bacon/buyer.key -- npx -y baconservices-mcpAdd more -e NAME=value pairs for the limits below. Check it with claude mcp list.
Claude Desktop
Settings → Developer → Edit Config (claude_desktop_config.json):
{
"mcpServers": {
"bacon": {
"command": "npx",
"args": ["-y", "baconservices-mcp"],
"env": {
"BACON_WALLET_KEY_FILE": "/Users/you/.bacon/buyer.key",
"BACON_MAX_PER_CALL": "0.50",
"BACON_MAX_PER_SESSION": "1.00",
"BACON_MAX_PER_DAY": "5.00"
}
}
}
}On Windows, if npx isn't found, use "command": "cmd" with
"args": ["/c", "npx", "-y", "baconservices-mcp"], and write paths as
"C:\\Users\\you\\.bacon\\buyer.key". Restart Claude Desktop afterwards.
Cursor, Windsurf and other clients with an mcpServers file
Use the same command / args / env block as Claude Desktop (for Cursor:
~/.cursor/mcp.json or .cursor/mcp.json in a project).
VS Code (.vscode/mcp.json)
VS Code can prompt for the key once and store it securely:
{
"inputs": [
{ "type": "promptString", "id": "bacon-key", "description": "Bacon buyer wallet private key", "password": true }
],
"servers": {
"bacon": {
"type": "stdio",
"command": "npx",
"args": ["-y", "baconservices-mcp"],
"env": { "BACON_WALLET_PRIVATE_KEY": "${input:bacon-key}" }
}
}
}Any other MCP client
It's a stdio server: run npx -y baconservices-mcp with the environment below.
Configuration
Variable | Default | Meaning |
| — | Path to a file containing the buyer wallet's private key. |
| — | The key itself (set only one of the two). Without either, the free tools still work. |
|
| Largest single payment, in USDC. |
|
| Most this server process may spend. |
|
| Most spent in any rolling 24 hours, across all processes and restarts. |
|
|
|
|
|
|
| — | Only with |
| — | Only with |
|
| RPC used to check your USDC balance before paying. |
|
| Where the spend ledger lives. |
|
|
|
How your money is protected
All of these checks happen before anything is signed:
The price is Bacon's own. Bacon answers each request with an x402 402 that names the price. The server pays only if that price equals Bacon's live catalog price, for that exact endpoint, in Base USDC, to Bacon's receiving address (which is pinned in the package). If any of these can't be verified, it doesn't pay.
Your limits. It checks the per-call limit, an optional
max_price_usdcon the call, the per-session limit, and the 24-hour limit. The 24-hour total is kept in a local ledger file shared by every process, so restarting the MCP server or running it twice doesn't open a new budget. If the ledger can't be read, nothing is paid. The x402 library's own per-payment cap is set to your per-call limit as a second lock.Funds. It reads your USDC balance first. If it's too low, or the balance can't be read, you get a plain message and nothing is signed.
Your approval, where possible. If the MCP host supports it, you're asked "Pay 0.05 USDC on Base to Bacon Services to run remove_background?" Not every host can ask, so the limits are the real boundary.
No double payments. Each purchase signs one payment for one request. If the connection drops, the server resends that same signed payment once (Bacon answers a repeat with the same result) and never signs a new one. Asking for the same thing again within 10 minutes returns the earlier result for free, unless you pass
allow_repeat: true.Only known services run. New services in Bacon's catalog show up in
list_services. They become callable tools only once a version of this package that understands their contract (inputs, outputs, version) is installed.
If Bacon refuses a payment before taking it, the result says "You have not been charged" and the amount goes back to your limits. If the outcome is unknown (for example the connection was lost twice), the result says so and gives Bacon's request id. That amount keeps counting against your limits.
Test money
Production Bacon sells only for real USDC. To try things without real money, run against a local or test copy of Bacon that sells on Base Sepolia:
BACON_NETWORK=base-sepolia BACON_API_URL=http://127.0.0.1:8000 BACON_PAY_TO=0xYourTestPayTo npx -y baconservices-mcpThe package refuses mismatched setups and pays nothing in each case: test money pointed at baconservices.com, real money pointed anywhere else, or a Bacon whose catalog is on a different network.
Develop
npm install
npm testThe tests run against a fake Bacon that checks every payment signature for real. Nothing reaches a network.
Hosted services
This MCP client is open source under the MIT License. Bacon Services' hosted APIs, Agent Commerce services, x402-paid capabilities, infrastructure, and backend implementations are separate services and are not licensed under the MIT License. Use of Bacon Services' hosted APIs and x402 services is governed by the Bacon Services terms.
Support
For MCP, x402, or Agent Commerce support, contact Bacon Services: https://baconservices.com/contact?topic=mcp. Please never send a wallet private key. Bugs in this package can also be reported as issues on its repository.
Trademark notice
The MIT License applies to the source code in this repository only. "Bacon Services," the Bacon Services name, logos, and associated branding are not licensed under the MIT License. No permission is granted to use Bacon Services trademarks, logos, or branding in a way that suggests endorsement, sponsorship, or affiliation. See TRADEMARKS.md.
License
MIT. See LICENSE.
Available Tools
10 toolsaccessibility_checkAccessibility checkA
An automated WCAG check of one public web page (axe-core), as JSON: each failing rule with its impact, WCAG criteria, element count and examples; what needs review; and the criteria a person must test. Not a certification of WCAG or ADA conformance. Scripts on the page do not run; robots.txt is respected. Costs 0.05 USDC per call (real money) on Base, paid from the buyer's wallet over x402 after the buyer's spending limits are checked. Give url: one public web page (http or https, standard ports). Output: JSON, returned in the tool result.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | A public web page, usually the homepage. | |
| save_to | No | Optional local file path to save the result to (JSON). | |
| standard | No | wcag22aa: WCAG 2.2 A and AA. wcag21aa: WCAG 2.1 A and AA. | wcag22aa |
| viewport | No | desktop: 1280 x 800. mobile: 390 x 844, touch. | desktop |
| overwrite | No | Replace save_to if it exists. Default false. | |
| allow_repeat | No | Buy again even if the same request was bought in the last 10 minutes. Default false: the earlier result is returned and nothing is charged. | |
| max_price_usdc | No | Optional: refuse if Bacon asks more than this, in USDC. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations it discloses the real cost and payment rail, that scripts on the page do not execute, that robots.txt is respected, that the result is not a conformance certification, and how duplicate requests within 10 minutes are handled. This is exactly the operational context the annotations do not carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The output shape and caveats are front-loaded, then the cost, then the input instruction, so the most decision-relevant facts come first. It is dense rather than padded, though the payment sentence packs several clauses into one line.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a paid, single-purpose scanner with no output schema, the description covers what is returned, what is not done, and what it costs. The only real gap is the lack of explicit guidance on when another tool (e.g. page_metadata) is the better choice.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds meaning on top by constraining url to a single public page on standard ports and confirming the result is JSON. The other parameters (standard, viewport, save_to, overwrite, allow_repeat, max_price_usdc) are left entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: an automated WCAG check of one public web page, with the engine (axe-core) and the JSON contents spelled out. It is unmistakably different from every sibling in the list, though it never names a sibling to route against.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the input constraint (one public web page, http or https, standard ports) and the payment prerequisite (0.05 USDC on Base via x402 after spending limits are checked). It also sets expectations with 'not a certification of WCAG or ADA conformance', but gives no explicit when-to-use-vs-alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brand_from_urlBrand from URLA
Reads one public web page and returns the brand it publishes about itself, as JSON: name, description, logo image URLs, colours, fonts and social profiles. No JavaScript runs; robots.txt is respected. Costs 0.03 USDC per call (real money) on Base, paid from the buyer's wallet over x402 after the buyer's spending limits are checked. Give url: one public web page (http or https, standard ports). Output: JSON, returned in the tool result.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | A public web page, usually the homepage. | |
| save_to | No | Optional local file path to save the result to (JSON). | |
| overwrite | No | Replace save_to if it exists. Default false. | |
| allow_repeat | No | Buy again even if the same request was bought in the last 10 minutes. Default false: the earlier result is returned and nothing is charged. | |
| max_price_usdc | No | Optional: refuse if Bacon asks more than this, in USDC. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses behavior the annotations cannot: a real 0.03 USDC charge per call on Base, paid via x402 from the buyer's wallet only after spending limits are checked, plus the repeat-purchase caching rule (allow_repeat=false returns the earlier result and charges nothing). It also states no JS execution and robots.txt compliance. Nothing here conflicts with readOnlyHint=false / destructiveHint=false / idempotentHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads what the tool returns, then cost/safety behavior, then the single required input, then output placement. Dense but every sentence carries information; the only slight redundancy is restating that the result is JSON in both the first and last sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly spells out the return shape, and it covers pricing, caching and input eligibility. It stops short of failure behavior an agent would want — what happens when the page is unreachable, not HTML, or the wallet/price check fails, and how max_price_usdc and the save_to/overwrite options interact with a paid call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all five parameters and the baseline would be 3. The description adds value beyond it by pinning the url contract (public page, http or https, standard ports) and by explaining the practical consequence of allow_repeat in money terms, which the schema only states mechanically.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource (reads one public web page, returns the brand it publishes about itself) and enumerates the exact return fields: name, description, logo image URLs, colours, fonts, social profiles. That is enough to separate it from siblings like image_palette (which extracts colours from an image) or quote (which prices a call).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete applicability conditions: the target must be a public page over http/https on standard ports, no JavaScript is executed, and robots.txt is respected. It never names an alternative sibling tool or states a when-not, but the input constraints effectively communicate where the tool will and won't work.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
image_paletteImage paletteA
Returns the colours one image is mostly made of, as JSON: up to count colours, most common first, each a hex value with its share of the image and whether it is a neutral. Costs 0.01 USDC per call (real money) on Base, paid from the buyer's wallet over x402 after the buyer's spending limits are checked. Input: PNG, JPEG, WEBP, up to 8 MB, at most 4096 px. Give exactly one of image_url or image_path. Output: JSON, returned in the tool result.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | The most colours to return. | |
| save_to | No | Optional local file path to save the result to (JSON). | |
| image_url | No | A public https URL of the image. | |
| overwrite | No | Replace save_to if it exists. Default false. | |
| image_path | No | A local image file to send (read by this server, sent base64). | |
| allow_repeat | No | Buy again even if the same request was bought in the last 10 minutes. Default false: the earlier result is returned and nothing is charged. | |
| max_price_usdc | No | Optional: refuse if Bacon asks more than this, in USDC. | |
| include_neutrals | No | Count near-whites, near-blacks and greys too. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: a fixed 0.01 USDC real-money charge on Base, the x402 payment path, that spending limits are checked before charging, accepted formats and size/pixel caps, and the 10-minute dedup behavior that returns a prior result without charging. This also explains why readOnlyHint is false for a non-mutating tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then cost, then input constraints, then output format. Four dense sentences with no filler; each clause carries a fact the agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still tells the agent what comes back (JSON with hex values, share, neutral flag), how it is delivered (tool result), what the call costs, and the input constraints. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds meaning the schema lacks: the returned colours are the most common first, capped by count, and each carries its share and a neutral flag, which ties the output back to include_neutrals. That is modest but real added value over the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Returns the colours one image is mostly made of'), and the schema/description together make it clearly distinct from sibling image tools like remove_background, optimize_image and brand_from_url. An agent can tell what this tool produces without inspecting anything else.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives operational constraints ('Give exactly one of image_url or image_path') and discloses cost, but never says when to prefer this tool over siblings or in what scenario it is appropriate. Usage is implied by the description of what it returns rather than explicitly guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_servicesA
Lists what Bacon Services sells to agents right now, from its live catalog: each service's price in USDC, network, output, input limits, and whether this installed package can run it (and as which tool). Free.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations the description carries the full burden, and it does disclose useful behavior: the listing is free, live/current, and reports per-installed-package runnability. It stops short of stating read-only nature or any freshness/pagination caveats, but for a zero-param listing the safety profile is unambiguous and the cost disclosure adds real value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence, front-loaded with the verb and resource, with every clause (price, network, output, limits, runnability, free) carrying distinct information. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating the returned fields (price in USDC, network, output, input limits, tool mapping) and the cost. For a simple discovery tool with no inputs, this is sufficient for an agent to call and interpret it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters and the schema describes none, so there is nothing for the description to clarify. Baseline of 4 applies per the no-parameter rule.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Lists) and resource (Bacon Services catalog) and enumerates exactly what each entry contains: USDC price, network, output, input limits, and runnability. The mention of 'as which tool' implicitly ties entries back to the sibling tools, so an agent can distinguish it from quote or the task-specific siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The catalog-discovery intent is implied ('Lists what Bacon Services sells... right now'), and 'Free' hints at a cost-free probe, but there is no explicit 'use this before X' or named alternative. The agent must infer that this is the entry point for discovering available services.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
optimize_imageOptimize image for the webA
Resizes one image so its longest side is at most max_width pixels (never enlarging it) and encodes it as WebP at the given quality. Transparency is kept; metadata is not carried over. Costs 0.01 USDC per call (real money) on Base, paid from the buyer's wallet over x402 after the buyer's spending limits are checked. Input: PNG, JPEG, WEBP, up to 8 MB, at most 8000 px. Give exactly one of image_url or image_path. Output: image/webp, as a download link (and a file with save_to).
| Name | Required | Description | Default |
|---|---|---|---|
| quality | No | WebP quality. | |
| save_to | No | Optional local file path to save the result to (image/webp). | |
| image_url | No | A public https URL of the image. | |
| max_width | No | Longest side of the output, in pixels. | |
| overwrite | No | Replace save_to if it exists. Default false. | |
| image_path | No | A local image file to send (read by this server, sent base64). | |
| allow_repeat | No | Buy again even if the same request was bought in the last 10 minutes. Default false: the earlier result is returned and nothing is charged. | |
| max_price_usdc | No | Optional: refuse if Bacon asks more than this, in USDC. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, idempotentHint=false, openWorldHint=true), the description discloses the paid x402 flow, that spending limits are checked before charge, the exact price, that metadata is dropped, that transparency is preserved, and that images are never upscaled. These are material behaviors an agent cannot infer from the schema or annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core operation is front-loaded in the first sentence, followed by cost, constraints, and output. It is dense but every clause carries load; the single run-on paragraph with mixed input/output/cost facts costs it a point on structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter, no-output-schema tool this covers what an agent needs: accepted formats, size and pixel limits, required parameter exclusivity, output MIME type and delivery mode, and the payment model. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning the schema does not: the mutual exclusivity constraint 'give exactly one of image_url or image_path', the never-enlarge semantics of max_width, and the download-link/save_to output pairing. It does not clarify quality or max_price_usdc behavior beyond what the schema already says.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a precise verb, resource and transformation: resize so the longest side is at most max_width (never enlarging) and re-encode as WebP at the given quality. This is clearly distinguishable from siblings like remove_background, brand_from_url, and image_palette, which perform different image operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives strong context for deciding to call it: real-money cost of 0.01 USDC, accepted input formats and size limits, and the exactly-one-of image_url/image_path rule. It never names an alternative tool or an explicit 'do not use this when' condition, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
page_metadataPage metadataA
Reads one public web page and returns what it tells search engines and link previews, as JSON: title and description with lengths, canonical, redirects, robots rules, Open Graph and Twitter cards, headings, JSON-LD types and a list of SEO issues. No JavaScript runs; robots.txt is respected. Costs 0.01 USDC per call (real money) on Base, paid from the buyer's wallet over x402 after the buyer's spending limits are checked. Give url: one public web page (http or https, standard ports). Output: JSON, returned in the tool result.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | A public web page, usually the homepage. | |
| save_to | No | Optional local file path to save the result to (JSON). | |
| overwrite | No | Replace save_to if it exists. Default false. | |
| allow_repeat | No | Buy again even if the same request was bought in the last 10 minutes. Default false: the earlier result is returned and nothing is charged. | |
| max_price_usdc | No | Optional: refuse if Bacon asks more than this, in USDC. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Strong on economics and mechanics: real-money cost, x402 payment on Base, spending-limit check before charging, and the 10-minute dedupe that returns the earlier result for free (echoed in the schema). It does not explain what happens on failure (refund, partial charge) or how save_to interacts with the paid call, which matters for an irreversible spend; the readOnlyHint=false annotation already signals side effects, so a 3 fits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and output shape, then constraints, then cost, then a short usage instruction. The closing "Output: JSON, returned in the tool result" restates what the first sentence already said, a small redundancy in an otherwise tight block.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Since there is no output schema, the description carries the return-shape burden and does so with a field inventory. Missing edge is failure/refund behavior and how save_to/overwrite interact with the charged call, which an agent needs for safe invocation of a paid tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all five parameters are already documented, and the description mostly repeats that. It does add one real constraint the schema lacks — standard ports and http/https scheme for url — plus the spending context for max_price_usdc, but not enough to lift it above the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource ("Reads one public web page and returns what it tells search engines and link previews") and enumerates the returned fields (title/description lengths, canonical, redirects, robots rules, OG/Twitter cards, headings, JSON-LD types, SEO issues). That output inventory makes it clearly distinct from siblings like accessibility_check, brand_from_url and image_palette.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives usable preconditions: one public page, http or https, standard ports, no JavaScript execution, robots.txt respected, and 0.01 USDC per call. It never explicitly names a sibling to use instead (e.g. accessibility_check for audits or brand_from_url for branding), so routing guidance is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
quoteA
Gets Bacon's current price for one service without paying, and says whether your spending limits and wallet allow it. Free; nothing is signed.
| Name | Required | Description | Default |
|---|---|---|---|
| service | Yes | A tool name (e.g. remove_background) or service id (e.g. remove-background). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does well: it discloses that it is free, that nothing is signed, and that it reports whether spending limits and wallet allow the call — real behavioral value beyond a bare 'quote'. It doesn't cover return format, but that is minor for a preview tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the verb and resource, then the key behavioral guarantees. Nothing wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-param preview tool with no output schema or annotations, the description supplies the essential safety and eligibility context. Return-value detail is missing but not critical.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description adds that a 'service' is the target of the quote and ties it to the pricing check, reinforcing the schema's examples. No extra syntax detail, so not a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
'Gets Bacon's current price for one service' names a specific verb and resource, and distinguishes it from siblings like wallet_status and remove_background by being explicitly a price query.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'without paying' and 'Free; nothing is signed' clarify the safe read context and implicitly distinguish it from the actual paid execution sibling tools. It doesn't name an alternative explicitly, but the when-to-use context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_backgroundRemove backgroundA
Removes the background from one photo and returns the subject on a transparent background as a PNG, at the photo's own size. Costs 0.05 USDC per call (real money) on Base, paid from the buyer's wallet over x402 after the buyer's spending limits are checked. Input: PNG, JPEG, WEBP, up to 8 MB, at most 4096 px. Give exactly one of image_url or image_path. Output: image/png, as a download link (and a file with save_to).
| Name | Required | Description | Default |
|---|---|---|---|
| save_to | No | Optional local file path to save the result to (image/png). | |
| image_url | No | A public https URL of the image. | |
| overwrite | No | Replace save_to if it exists. Default false. | |
| image_path | No | A local image file to send (read by this server, sent base64). | |
| allow_repeat | No | Buy again even if the same request was bought in the last 10 minutes. Default false: the earlier result is returned and nothing is charged. | |
| max_price_usdc | No | Optional: refuse if Bacon asks more than this, in USDC. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only flag a non-idempotent open-world write; the description goes well beyond them by disclosing real monetary cost (0.05 USDC per call on Base), the x402 payment flow, and that spending limits are checked before charging. Combined with the explicit input limits (8 MB, 4096 px) and output format, an agent can predict cost and failure modes before invoking.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then cost, then constraints, then output — a sensible order with little waste. It is dense and slightly run-on in the input-limits clause, but nearly every sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter tool with no output schema, the description covers purpose, cost, input constraints, mutual exclusivity, and return shape (download link plus optional save_to file). It omits only error/max_price behavior, which is a minor gap given the schema documents those parameters directly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline would be 3, but the description adds a cross-parameter constraint the schema cannot express: exactly one of image_url or image_path must be supplied. That constraint is meaningful and not repeated anywhere in the structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (removes the background from a photo) plus the exact output contract: subject on a transparent PNG at the photo's own size. That is distinguishable from every sibling (optimize_image, vectorize_image, image_palette), which transform differently and produce different artifacts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete selection rules: 'Give exactly one of image_url or image_path' and accepted formats/size limits, which tells the agent when the tool is applicable. It does not explicitly route away from alternatives (e.g. optimize_image for compression) or state when not to call it, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vectorize_imageVectorize imageA
Traces one PNG, JPEG or WebP image into an SVG of filled paths with up to colors flat colours. Best for logos, icons and flat artwork; a photo comes back as a stylised poster. The SVG keeps the image's width and height (capped at 4096). Costs 0.05 USDC per call (real money) on Base, paid from the buyer's wallet over x402 after the buyer's spending limits are checked. Input: PNG, JPEG, WEBP, up to 8 MB, at most 8000 px. Give exactly one of image_url or image_path. Output: image/svg+xml, as a download link (and a file with save_to).
| Name | Required | Description | Default |
|---|---|---|---|
| colors | No | How many flat colours to trace with. 2 is black and white. | |
| detail | No | smooth: fewer, simpler shapes. detailed: closer to the source, larger file. | balanced |
| save_to | No | Optional local file path to save the result to (image/svg+xml). | |
| image_url | No | A public https URL of the image. | |
| overwrite | No | Replace save_to if it exists. Default false. | |
| image_path | No | A local image file to send (read by this server, sent base64). | |
| allow_repeat | No | Buy again even if the same request was bought in the last 10 minutes. Default false: the earlier result is returned and nothing is charged. | |
| max_price_usdc | No | Optional: refuse if Bacon asks more than this, in USDC. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations only covering safety hints, the description carries real weight: it discloses a 0.05 USDC charge on Base via x402, spending-limit checks, output dimension capping at 4096, and the 10-minute repeat-purchase short-circuit. These are exactly the non-obvious side effects an agent needs before invoking a paid, non-idempotent tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and use case, followed by a compact input/output block — nearly every sentence carries new information. It is dense and slightly long, but nothing is redundant enough to cut.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description names the return type (image/svg+xml), the delivery form (download link plus optional saved file), and the payment/size constraints. An agent can decide, pay, and handle the result without further discovery.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description adds the mutual-exclusion constraint ('Give exactly one of image_url or image_path') and input limits (8 MB, 8000 px) that the schema does not encode. That is genuine value beyond the per-parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Traces ... image into an SVG of filled paths') plus scope (colour count, format). It is clearly distinct from siblings like remove_background, optimize_image and image_palette, which do different transformations on the same input types.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit fit statement — 'Best for logos, icons and flat artwork; a photo comes back as a stylised poster' — which tells the agent when the tool is appropriate and what quality to expect otherwise. It does not name which sibling to use instead for non-vector needs (e.g. optimize_image), so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wallet_statusA
Shows the payment network, whether a wallet is configured, your spending limits and what is left of them, and whether the wallet can afford each service (yes/no). Free. The exact balance is shown only if the buyer enabled BACON_DISCLOSE_BALANCE.
| Name | Required | Description | Default |
|---|---|---|---|
| service | No | Optional: only check this service. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It usefully discloses cost (free) and a non-obvious conditional behavior (balance hidden unless BACON_DISCLOSE_BALANCE is enabled), which explains a potentially confusing omission, but it says nothing about auth requirements, error behavior, or explicitly confirming it is a read-only operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, each carrying distinct information (reported fields, cost, conditional balance disclosure), with the most decision-relevant content front-loaded. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, the description does the job of enumerating the returned signals, so an agent knows what to expect. It stops short of covering failure modes or permission requirements for a tool whose results depend on configuration state.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
One optional parameter with 100% schema description coverage, so the schema already documents the 'service' filter. The description adds only mild context by implying that omitting it checks affordability across all services; no format or syntax detail is added.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a concrete verb-and-resource (shows wallet status) and enumerates exactly what is reported: payment network, configuration state, spending limits and remaining amounts, and per-service affordability. Siblings (quote, list_services, image tools) are unrelated domains, so no differentiation is needed and none is missing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies a pre-flight use case by reporting whether the wallet can afford each service, and 'Free' tells the agent this check costs nothing, but it never states when to call this versus the sibling 'quote', nor any prerequisites. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
v0.3.0- Added
accessibility_check - Added
page_metadata
1 tool update
v0.2.0- Added
vectorize_image
7 tool updates
v0.1.0- First observed
brand_from_url - First observed
image_palette - First observed
list_services - First observed
optimize_image - First observed
quote - First observed
remove_background - First observed
wallet_status
TDQS
Scored across 10 tools
Each tool maps to a distinct operation: four clearly separate image transforms (palette extraction, optimization, background removal, vectorization) and three distinct page analyses (brand data, SEO metadata, WCAG checks). The one soft overlap is brand_from_url vs page_metadata, since both fetch the same page and return overlapping metadata, but their stated outputs (brand assets vs SEO/preview signals) are different enough for correct selection.
All names use consistent snake_case, but the conventions are mixed: about half are verb_noun (list_services, optimize_image, remove_background, vectorize_image) and half are noun_phrases (image_palette, page_metadata, wallet_status, accessibility_check). Names remain readable and largely self-explanatory, but an agent cannot infer the pattern from one name to another.
Ten tools is well within the ideal range and each one earns its place: four image services, three page-analysis services, plus catalog/quote/wallet tooling. No tool looks like filler or a near-duplicate.
The payment lifecycle is well covered (list_services, quote, wallet_status plus per-call pricing) and the service surface is coherent for an image/web analysis catalog. Minor gaps: no way to set or adjust spending limits, no transaction history/receipts, and result retrieval depends on save_to rather than a job-status tool, but these are workable.
Maintenance
Related MCP Connectors
Let an AI agent find and pay for x402 APIs and products in USDC on Base, within owner-set limits.
Pay-per-call tools for autonomous agents, settled in USDC on Base via x402.
Pay-per-call AI and media tools over x402. USDC on Base, no signup, no API key.
AI dev tools + image generation, paid per-use with USDC on Base (x402).
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to access 21 mazzagrp.com AI endpoints with x402 USDC micropayments on Base, paying per call without API keys.MIT

@bridgenode/mcpofficial
AlicenseAqualityCmaintenanceEnables AI agents to make pay-as-you-go AI inference requests through x402 with automatic Solana USDC payments, no API keys or registration, while enforcing configurable spending limits.3196 npm1MIT No Attribution- FlicenseNot gradedqualityBmaintenanceEnables AI agents to discover and invoke x402-monetized computational engines for media geometry, measurements, JSON hygiene, and ComfyUI preflight audits, with USDC settlement on Base Mainnet.-
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to discover, pay for, and invoke x402-priced services such as document OCR, document analysis, media transcription, remote browser sessions, and receive-only email inboxes using USDC on Base, with no API keys and receipt-backed results.38MIT