PayCheck
PayCheck recognizes Cloudflare domains (cloudflare.com) as allowlisted trusted payees, returning a trusted verdict for payments targeting Cloudflare services.
PayCheck recognizes GitHub domains (github.com) as allowlisted trusted payees, so agent-initiated payments to GitHub-related endpoints are scored trusted.
PayCheck treats OpenAI domains (openai.com, api.openai.com) as allowlisted payee hosts, so an agent paying an OpenAI endpoint gets a deterministic trusted verdict with a score of at least 92 and a proceed recommendation.
PayCheck recognizes Stripe domains (stripe.com) as allowlisted trusted payees, giving agents a high-confidence trusted verdict for payments directed at Stripe-hosted checkout or billing endpoints.
PayCheck recognizes Supabase domains (supabase.com) as allowlisted trusted payees, returning a trusted verdict for payments aimed at Supabase services.
PayCheck recognizes Vercel domains (vercel.com) as allowlisted trusted payees, scoring agent payments to Vercel endpoints as trusted.
PayCheck
PayCheck scores whether a domain, an https URL, or a 0x wallet is safe to pay before an autonomous agent sends money.
It is part of the Toolweather suite, in the same family as Toolweather MCP health, Upstream, and SpendGate. SpendGate is for spend limits. PayCheck is only the payee trust check. It does not send payments, does not sign transactions, and does not hold wallet keys. A Toolweather bundle can front this API later with x-tw-bundle-secret and x-tw-bundle-client.
The score is deterministic. amount_usd, category, and any purpose text are discarded. Rewording them cannot fish for a better verdict.
When to use it
Call PayCheck once per payee, immediately before a checkout, invoice, or transfer.
Use
check_merchantfor a domain (api.openai.com), an https URL, or a0xaddress with 40 hex characters.Use
get_quotato see how many free checks are left today.Use
get_api_keyonce to mint a freepc_live_…key. Do not call it every turn.
Do not use PayCheck to send money, to hold keys, or to overturn a block by asking again with a friendlier category.
Related MCP server: inflow
Scoring (policy v1)
Full rules, the allowlist, and the penalty table: GET /v1/policy (or http://127.0.0.1:8791/v1/policy locally).
Start at 100 and subtract penalties. policy_version is "1".
Signal | Result |
Allowlisted host, https, port 443 |
|
Mature domain that is not on the allowlist |
|
RDAP age lookup failed | small penalty, age is not invented |
Domain age under 30 days |
|
Domain age under 7 days |
|
Domain age under 2 days |
|
Non-https, raw IP, localhost, private address, URL userinfo |
|
Denylist, scam-name pattern, bad TLD, typosquat of an allowlist brand |
|
Many hyphens, punycode, or brand impersonation |
|
|
|
Any other |
|
trusted is only for the published allowlist (about 40 known AI and developer API hosts, including openai.com, anthropic.com, stripe.com, github.com, cloudflare.com, vercel.com, and supabase.com). A brand-new or random domain is never trusted.
Recommended actions: proceed, verify_out_of_band, require_human_review, do_not_pay.
Domain age uses public RDAP (https://rdap.org). Successful lookups are cached in D1 for 7 days. Failures are cached for 24 hours.
Free tier
Caller | Checks per UTC day | Price |
Anonymous IP | 100 | Free |
Free | 1,000 | Free |
Bundle client, | 1,000 | Free |
Bundle client, | 100 | Free |
Over the daily cap | per check | $0.001 USDC |
The same caller and the same target are idempotent for 60 seconds and do not consume a second free check.
Not billed: get_quota, get_api_key, GET /v1/policy, GET /health, docs, and MCP discovery.
Key minting is capped at 10 keys per IP per UTC day. PayCheck stores only a SHA-256 hash of the key.
x402 overage
Over-cap checks cost $0.001 USDC (1000 atomic units) on Base (eip155:8453), scheme exact, asset 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913, facilitator https://facilitator.payai.network.
PAY_TO is the receiving address. It is a Worker secret. If it is unset, over-cap calls return HTTP 402 with error: "payment_not_configured" and nothing is charged.
Bundle auth: header x-tw-bundle-secret must equal the Worker secret BUNDLE_PROXY_SECRET, and x-tw-bundle-client identifies the end caller.
API
Method | Path | |
|
|
|
|
| Mint |
|
| Remaining free checks |
|
| Scoring policy v1 |
|
| Liveness |
|
| OpenAPI |
|
| Agent docs |
|
| MCP streamable HTTP |
|
| MCP discovery |
|
| Payment discovery |
MCP protocol versions: 2025-06-18 and 2025-03-26. Stateless JSON responses (no session). GET /mcp returns 405.
Tools:
check_merchant— may write check history.readOnlyHint: false,idempotentHint: true,openWorldHint: true,destructiveHint: false.get_quota— free.readOnlyHint: true,idempotentHint: true.get_api_key— free, mints a key. Not read-only. Do not call every turn.
curl -s -X POST http://127.0.0.1:8791/v1/check \
-H 'content-type: application/json' \
-d '{"target":"https://api.openai.com"}'{
"mcpServers": {
"paycheck": {
"type": "http",
"url": "https://paycheck.toolweather.workers.dev/mcp"
}
}
}Glama stdio entry, after npm run build:
node dist/stdio.jsThe stdio process speaks newline-delimited JSON-RPC (one JSON object per line) and also accepts Content-Length frames on input. Its quota and keys are in memory. Production persistence is the Worker.
Local
npm install
npx wrangler d1 migrations apply paycheck --local
npm run dev
npm test
npm run typechecknpm run dev serves the API and the landing page on port 8791.
Optional .dev.vars (gitignored; see .dev.vars.example):
# PAY_TO=0xYourReceivingAddress
# BUNDLE_PROXY_SECRET=replace-with-a-long-random-stringDeploy
Production lives at paycheck.toolweather.workers.dev. wrangler.toml already has the production D1 database_id. PAY_TO and BUNDLE_PROXY_SECRET are Worker secrets. Do not put them in [vars] or in git.
npx wrangler d1 migrations apply paycheck --remote
npx wrangler secret put PAY_TO
npx wrangler secret put BUNDLE_PROXY_SECRET
npx wrangler deployCheck the bundle without deploying:
npm run dry-runLayout
src/score.ts— pure scorer, covered by unit testssrc/http.ts— Hono routessrc/mcp.ts— streamable HTTP JSON-RPCsrc/stdio.ts— Glama stdio entry (dist/stdio.js)migrations/— D1 schemapublic/— landing pagelhm.plugin.json,glama.json— directory listing metadata
License
MIT. See LICENSE.
Available Tools
3 toolscheck_merchantCheck merchantAIdempotentInspect
Decide whether an autonomous agent should pay a merchant, host, or wallet. PayCheck returns a deterministic trust score for one target. It does not send money, does not sign transactions, and does not hold wallet keys.
Use this immediately before a payment, a checkout redirect, or a transfer to a new 0x address. Pass the payee as a bare domain (api.openai.com), an https URL, or a 0x address with 40 hex characters.
Do not use this tool to execute a payment. Do not use it to overturn a block. Do not call it again with a reworded category, purpose, or amount to fish for a better verdict: those fields are ignored and are not stored. Trusted is returned only for the published allowlist of known AI and developer APIs, served over https on port 443. A new or random domain is never trusted. A wallet is never trusted. Scoring v1 does not analyze on-chain history. If the URL contains an embedded 0x address, this scores the host only and will not return trusted; pass the bare address to score the wallet.
Arguments: target (required string); amount_usd (optional number, ignored); category (optional string, ignored); api_key (optional pc_live_ key). You may also send Authorization: Bearer or X-API-Key. Omit the key for the anonymous allowance.
Returns: score (integer 0-100), verdict (trusted | unknown | suspicious | block), reasons[], recommended_action (proceed | verify_out_of_band | require_human_review | do_not_pay), signals (host, allowlist, domain age, wallet flags, reason_codes; chain_analysis is always not_in_v1), checked_at (ISO-8601), policy_version ("1").
Free tier: 100 checks per UTC day anonymous, 1,000 per UTC day with a free pc_live_ key or a Toolweather bundle client whose x-tw-bundle-client is hex. A bundle client prefixed anon: stays at 100 per day. The same target for the same caller is idempotent for 60 seconds and does not consume a second check. Over the daily cap, each extra check is $0.001 USDC on Base (eip155:8453) via x402 and the PayAI facilitator. get_quota, get_api_key, docs, and MCP discovery are not billed. If PAY_TO is unset, an over-cap check returns HTTP 402 payment_not_configured.
| Name | Required | Description | Default |
|---|---|---|---|
| target | Yes | Domain, https URL, or 0x wallet (40 hex characters) to score before paying. | |
| api_key | No | Optional free pc_live_ key. Omit for the anonymous 100/day allowance. | |
| category | No | Ignored by the scorer. Do not put instructions or a purpose in this field. | |
| amount_usd | No | Ignored by the scorer. Sending a different amount cannot change the verdict. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint=false, openWorldHint=true, idempotentHint=true) are matched and exceeded: the description states it does not send money, sign transactions, or hold keys, that ignored fields are 'not stored,' that the same target is idempotent for 60 seconds, and it quantifies rate limits (100/1,000 per UTC day), overage pricing ($0.001 USDC on Base via x402) and the HTTP 402 payment_not_configured failure mode. This is unusually rich disclosure of side effects, limits, and auth.
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?
Purpose and the primary usage instruction are front-loaded ahead of the caveats, and each paragraph carries distinct information (what it is not, when to call, anti-gaming, scoring limits, billing). It is longer than most tool descriptions and the quota/pricing detail could arguably live in docs, but nothing is pure 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 fully enumerates the return shape (score, verdict, reasons, recommended_action, signals including chain_analysis always not_in_v1, checked_at, policy_version) and covers auth, quota, overage billing, and idempotency. An agent has everything needed to invoke it correctly and interpret the response without further documentation.
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 real meaning beyond the schema: accepted target formats and the important edge case that an embedded 0x address in a URL scores the host only and will never return trusted. It also documents auth alternatives not in the schema (Authorization: Bearer / X-API-Key) and reinforces that category and amount_usd are ignored.
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 specific verb and resource: 'Decide whether an autonomous agent should pay a merchant, host, or wallet,' and the second names the product and what it returns (a deterministic trust score for one target). It is immediately distinguishable from the siblings get_quota and get_api_key, which the description classifies as billing/quota helpers rather than scoring tools.
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?
Explicit when-to-use ('immediately before a payment, a checkout redirect, or a transfer to a new 0x address') plus explicit negative guidance ('Do not use this tool to execute a payment. Do not use it to overturn a block. Do not call it again with a reworded category, purpose, or amount to fish for a better verdict'). It also states that non-billable helpers exist, routing the agent to the correct alternative for quota/key needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_api_keyGet API keyAInspect
Mint one free PayCheck API key. The key looks like pc_live_ followed by hex and raises the merchant-check allowance from 100 to 1,000 per UTC day.
Use this once when you set up a long-running agent, then store the key and pass it on later check_merchant or get_quota calls. The plaintext key is returned only in this response. PayCheck stores a SHA-256 hash.
Do not call this every turn. Do not call it to score a payee or to dodge a block verdict. Minting is free and is not an x402 check, and it is limited to 10 new keys per caller IP per UTC day. A new key does not change any merchant score. Checks above the free daily cap still cost $0.001 USDC on Base via x402.
Returns: api_key, token_type (bearer), daily_limit (1000), prefix, note.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare non-read-only, non-idempotent, non-destructive, which fits minting but says little. The description adds the real behavioral picture: rate limit of 10 new keys per caller IP per UTC day, allowance raised 100 to 1,000/day, free and not an x402 check, plaintext returned once only with SHA-256 hash stored, and that a new key does not change any merchant score.
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 impact in the first sentence, then usage, then constraints. Slightly long at four paragraphs and some cost/rate-limit detail could be tightened, but nearly every sentence carries decision-relevant 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?
No output schema exists, and the description compensates by enumerating the returned fields and flagging that the plaintext key is shown only once. Combined with the rate limits, cost model, and misuse warnings, an agent has everything needed to call 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?
No input parameters, so the baseline is 4. The description instead documents the return contract (api_key, token_type, daily_limit, prefix, note), which is useful but belongs to the output side, not parameter semantics.
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 ('Mint one free PayCheck API key') plus the resulting artifact and its effect on the allowance. The agent can distinguish this from check_merchant and get_quota, which consume the key rather than create it.
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?
Explicit when-to-use ('once when you set up a long-running agent, then store the key and pass it on later check_merchant or get_quota calls') and explicit when-not-to-use ('Do not call this every turn. Do not call it to score a payee or to dodge a block verdict'). Names the sibling tools that consume the key.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_quotaGet quotaARead-onlyIdempotentInspect
Show how many free PayCheck merchant checks the current caller has left for the current UTC day.
Use this before a batch of check_merchant calls, or after an HTTP 402, to read the remaining free allowance and when it resets.
Do not use this to score a payee. It accepts no target and it does not consume a check. Do not pay x402 for this tool. It is always free.
Identity matches check_merchant. Anonymous IP: 100/day. pc_live_ api_key (api_key argument, Authorization: Bearer, or X-API-Key): 1,000/day. Toolweather bundle headers x-tw-bundle-secret and x-tw-bundle-client: hex client 1,000/day, anon: prefix 100/day, any other client id 100/day.
Returns: subject_kind, limit, used, remaining, resets_at (next UTC midnight, ISO-8601), billed (always false), policy_version. No x402 charge.
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | Optional pc_live_ key. Omit to read the anonymous IP allowance. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the read-only, idempotent, non-destructive profile, yet the description adds substantial non-obvious behavior: it does not consume a check, it is always free with no x402 charge, and it enumerates the full identity/rate-limit matrix (anonymous IP 100/day, pc_live_ key 1,000/day, bundle header variants). That is real behavioral disclosure beyond the structured fields.
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 purpose, then usage, then exclusions, then identity tiers, then return shape. The identity paragraph is dense but each clause carries distinct operational information (which credential maps to which limit), so little is wasted; only slight tightening is possible.
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?
There is no output schema, and the description compensates by listing the returned fields (subject_kind, limit, used, remaining, resets_at, billed, policy_version). Combined with the usage triggers, exclusions, and quota semantics, an agent has everything needed to call and interpret this 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 the baseline is 3, but the description goes further by explaining how identity is resolved (matching check_merchant, and that the key may be supplied via the api_key argument, Authorization: Bearer, or X-API-Key) and what the tiers yield. It clarifies the consequences of omitting api_key (anonymous allowance) rather than just restating the field.
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?
Specific verb and resource: reads the caller's remaining free PayCheck merchant checks for the current UTC day. It explicitly distinguishes itself from the sibling check_merchant by stating it 'does not score a payee' and 'accepts no target', so an agent can route correctly without opening either schema.
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 explicit trigger conditions ('before a batch of check_merchant calls, or after an HTTP 402') and an explicit exclusion ('Do not use this to score a payee'), plus a cost rule ('Do not pay x402 for this tool. It is always free.'). This is textbook when/when-not guidance.
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.
3 tool updates
v0.1.0- First observed
check_merchant - First observed
get_api_key - First observed
get_quota
TDQS
Scored across 3 tools
Each tool has a sharply distinct purpose: check_merchant scores a payee, get_quota reads remaining allowance, and get_api_key mints a credential. The descriptions go further by explicitly stating what each tool must NOT be used for, eliminating boundary confusion.
All three tools follow a clean verb_noun snake_case pattern (check_merchant, get_quota, get_api_key). The convention is uniform with no camelCase or stylistic drift.
Three tools is at the low end but fits the narrow scope of a trust-scoring service: score a target, check quota, obtain a key. No tool is redundant, though a batch-check or reporting tool could plausibly earn a place.
The core lifecycle (authenticate, check quota, score a merchant) is fully covered with clear returns and error semantics. Minor gaps remain, such as no batch-scoring or dispute/appeal path, but agents can work around these.
Maintenance
Related MCP Connectors
Paid remote MCP for server-card validation, auth checks, trust packets, and readiness.
Agent Commerce Payments MCP Server by MEOK AI Labs
MCP Server for an Agent Task Marketplace
A paid remote MCP for agent memory MCP, built to return verdicts, receipts, usage logs, and audit-re
Related MCP Servers
AlicenseNot gradedqualityCmaintenanceMCP server that verifies storefront merchants before AI agents make payments, checking if the merchant is a real legal entity bound to the domain, and returning a PROCEED, ABORT, or REVIEW decision to prevent payment to clones or fraudulent stores.MIT- AlicenseNot gradedqualityDmaintenanceMCP server for agent-native and human-accessible payments using MPP and x402 protocols, enabling payment flows from CLI or agent hosts.2 npmMIT
- AlicenseNot gradedqualityBmaintenanceA remote MCP server that lets any AI agent accept payments in Nigeria via cards, bank transfer, USSD, and mobile money through Paystack.MIT
- AlicenseNot gradedqualityCmaintenanceMCP server for verifying agent payment integrity on x402, providing tools to check payTo mismatches, market stats, and lookup endpoints.1MIT