depix-mcp
OfficialThe depix-mcp server is an MCP gateway for the DePix non-custodial Pix payment platform, enabling AI agents to receive Brazilian Pix payments, manage products, monitor transactions, and handle support — without ever holding funds or private keys.
Checkouts (Pix Payment Requests)
Create a Pix charge with a hosted payment page
Fetch a specific checkout by ID or list checkouts with filters (status, date range, product, pagination)
Wait server-side for a checkout to reach a terminal state (no client-side polling needed)
Simulate a payment in sandbox mode to test the full flow
Products (Reusable Payment Templates)
Create fixed-price, reusable products with public payment pages
List, get, and update products
Activate or deactivate products
Set and order featured products on the public merchant page (up to 50)
List all checkouts generated from a specific product
Account
Get authenticated merchant details and verify the connection (also confirms sandbox vs. live mode)
Wallet Status (Read-Only)
Check the status of an existing deposit or withdrawal (cannot create them)
Support Tickets
Open, retrieve, list, reply to, attach files to (~3 MB max, base64), and close support tickets
Provides tools for creating Pix checkouts, managing products, and reading transaction status for the DePix payment gateway.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@depix-mcpCreate a Pix checkout for amount 1500 with payer tax number 52998224725"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
depix-mcp
The MCP (Model Context Protocol) server for DePix App — the agent-facing interface of the non-custodial Pix↔DePix payment gateway and of a non-custodial Liquid wallet.
One MCP, two levels of access. Same package, same registry entry; what works depends only on whether the running instance has a seed:
Level 1 — hosted | Level 2 — local | |
How |
|
|
Runs on | DePix App's servers | your machine |
Tools | 26 — receive Pix, status reads, onboarding/vault/webhook reads, support | 62 — the 26 plus 29 |
Seed | none, ever | yours, never leaves the machine |
Install | zero (claude.ai, ChatGPT) | Node.js ≥ 22.4 |
Custody is decided by who holds the seed, not by the transport. Every spend materializes a signer in-process, and there is no remote-signing path — so DePix App cannot host working wallet tools without becoming custodial, and does not. That is physics, not a product tier.
What it is (and isn't)
Both levels:
A pure client of the public DePix API (
https://api.depixapp.com/api/*) for the 26 gateway tools. It holds zero critical credentials — no provider token, no database, no webhook HMAC. Yoursk_key is passed verbatim to the API on each call and lives only in memory for that request.Same door as everyone. No privileged path: the same auth, scopes and rate limits as any external agent.
Level 1 (mcp.depixapp.com) only: it never signs, never holds funds, never
stores your key. It has no wallet code at all — the wallet engine is not merely
disabled there, it is structurally absent from that deployment's import graph,
and a CI guard (npm run guard:hosted) fails the build if that ever changes.
Level 2 (npx) only: the 29 wallet_* tools hold, send, convert and pay —
signing locally, inside your own process, under guardrails (per-transaction and
rolling-24h BRL caps, optional allowlist) that no tool call can raise. There is
no tool that exports the seed, edits guardrails, or pays a merchant checkout QR.
Related MCP server: brazil-payments-mcp
Related — @depixapp/sdk
The wallet engine started life as the standalone
@depixapp/sdk. It lives here
now (src/wallet-engine/), and this package is where it is developed and
released. The 1.2.x line of @depixapp/sdk stays on npm and keeps working; it
is frozen, not deprecated. If what you want is an agent with a wallet, you
want this package: it exposes the engine over MCP, so nothing has to be written.
Quickstart 1 — Connect Claude Code (remote, HTTP)
Pass your DePix API key as a Bearer header. Always start with a sandbox key.
claude mcp add --transport http depix https://mcp.depixapp.com/mcp \
--header "Authorization: Bearer sk_test_YOUR_KEY"Then test the connection by asking Claude to run get_account. It should return
your merchant with is_live: false (sandbox).
Cursor — add to ~/.cursor/mcp.json (or a project .cursor/mcp.json):
{
"mcpServers": {
"depix": {
"url": "https://mcp.depixapp.com/mcp",
"headers": { "Authorization": "Bearer sk_test_YOUR_KEY" }
}
}
}Or use the one-click deeplink. The key placeholder lives INSIDE the base64
config= value, so re-encode it with your real key first:
node -e 'const cfg={url:"https://mcp.depixapp.com/mcp",headers:{Authorization:"Bearer sk_test_YOUR_KEY"}};console.log(Buffer.from(JSON.stringify(cfg)).toString("base64"))'cursor://anysphere.cursor-deeplink/mcp/install?name=depix&config=<base64 from the command above>The claude.ai web UI custom-connector only supports OAuth (no custom header). This server is an OAuth 2.1 Resource Server (WorkOS AuthKit): the web connector signs you in, and the session forwards your verified login to the API as the bearer. To operate you must first link that login to your DePix account (dashboard → connector settings); until then the tools return a typed "not linked yet" message. OAuth sessions are read + merchant only and can never move money (
wallet_write) — use ansk_key for withdrawals. The whole OAuth surface is feature-flagged (AUTHKIT_DOMAIN): with it unset, only thesk_header/stdio paths above are active. Terminal clients keep usingsk_keys.
Quickstart 2 — Local stdio, 62 tools (Claude Desktop / Claude Code / Cursor)
Requires Node.js ≥ 22.4. The only official npm package is @depixapp/mcp —
the @depixapp scope is organization-owned; do not install any similarly-named
unscoped package. Secrets come from the environment, never from a flag.
2a. Gateway only (no wallet)
Exactly the 26 tools of level 1, running locally:
{
"mcpServers": {
"depix": {
"command": "npx",
"args": ["-y", "@depixapp/mcp"],
"env": { "DEPIX_API_KEY": "sk_test_YOUR_KEY" }
}
}
}All 62 tools are still listed — the 29 wallet_* ones answer with a typed
wallet_not_configured error telling the agent to ask you to run init. That is
deliberate: MCP hosts snapshot the tool list when they connect, so a catalog that
grew later would mean "restart your client".
2b. First run — create the wallet
init is a human ceremony at a terminal, never an MCP tool. It prints your
12-word seed backup, so it refuses to run when stdin/stdout are not a real TTY,
and no agent can invoke it:
npx -y @depixapp/mcp init # create a new wallet
npx -y @depixapp/mcp init --restore # import an existing 12-word mnemonicIt asks for (or generates) a passphrase — never echoed — walks you through the backup ritual, asks for your spending limits, and then wires the AI hosts it finds on the machine (Claude Code, Claude Desktop, Cursor) to this wallet by itself. The unlock key goes into the OS keychain, so the passphrase is never written into a host config. For a host it does not detect it prints the block to paste instead — and that block carries no secret:
{
"mcpServers": {
"depix": {
"command": "npx",
"args": ["-y", "@depixapp/mcp"],
"env": {
"DEPIX_WALLET_DIR": "/Users/you/.depix-wallet",
"DEPIX_GUARDRAIL_PER_TX_BRL_CENTS": "10000",
"DEPIX_GUARDRAIL_DAILY_BRL_CENTS": "50000"
}
}
}
}Clear your terminal scrollback afterwards. Restart your MCP client and ask it to
run wallet_status.
2c. Reading the 12 words again
npx -y @depixapp/mcp backup # show this wallet's 12 words againSame rules as init: a real terminal or nothing. It asks for your passphrase
every time, even on a machine that unlocks the wallet by itself — the
keychain unlock key exists so the server can start, not so anyone at the keyboard
can read the seed. When you confirm you have copied the words, it wipes the
screen and the scrollback. Quit your MCP client first: the wallet dir takes an
exclusive lock, and a running server holds it.
Run the server directly to sanity-check:
DEPIX_API_KEY=sk_test_YOUR_KEY npx -y @depixapp/mcpSelf-hosting over HTTP is NOT trivially safe. The wallet tools have no auth of their own and the seed is loaded process-wide. Over local stdio that is fine. Exposed over HTTP, anyone who reaches the port can drain the wallet — bind to localhost and add your own bearer/mTLS + network isolation, or don't.
CLI subcommands
One bin, depix-mcp, with five subcommands — all of them acts for the human at
the keyboard. npx -y @depixapp/mcp --help prints the same list.
None of the five is an MCP tool, and that is deliberate. Two of them (init,
backup) display a 12-word seed, which must never transit model context or a
conversation log. The other three choose which account the server acts as: as
tools, an agent that read a poisoned web page could promote itself from its own
sandbox account to yours.
Command | What it does | When you run it | The safety property |
| Creates the local wallet ( | Once, before any | Refuses unless stdin and stdout are a real terminal; the passphrase is never echoed and never written into a host config |
| Shows this wallet's 12 words again | When you need to copy the seed onto paper again | A real terminal or nothing; your passphrase is typed every time, even on a machine that unlocks the wallet by itself; the screen is wiped afterwards |
| Signs you in to your own DePix account in the browser (Google or GitHub) and seals the session on this machine | When you want the server to act as you, not as an account the agent registered for itself | The browser does the sign-in and the reply lands on this same computer; no token is ever printed, logged, or put in an error message |
| Removes that login from this machine | When you are done with it, or on a machine you no longer control | Undoes |
| Prints which account the server acts as and why / picks one | Whenever you are unsure who is spending, and after | Reading and choosing happen at your terminal, so no agent can switch identity; |
Signing in as yourself — login / logout
npx -y @depixapp/mcp login # choose Google or GitHub in the browser
npx -y @depixapp/mcp login --provider github # skip the chooser
npx -y @depixapp/mcp logoutlogin opens your browser on the DePix App sign-in and waits for the answer at
http://127.0.0.1:47617/callback — this computer, never a remote one. The
listener binds before the browser opens, so a second login running at the same
time fails right there instead of sending your sign-in to whatever else holds
that port. What comes back is exchanged for a session and sealed on disk with
your wallet passphrase; the terminal prints who you signed in as, never the
credential. On a headless or remote box there is no browser to open — use
DEPIX_API_KEY there, or let the agent register its own account.
On 2.8.0 and 2.8.1,
loginneedsDEPIX_WORKOS_CLIENT_IDset to the DePix App sign-in application — the id baked into those two versions points at an older client. From 2.8.2 the right one ships baked in and the command needs no configuration.
If an agent account is already registered on this machine, logging in changes
nothing by default: the agent's account still wins, and login says so
loudly. account use owner is what switches. logout removes the stored
session and, when you had selected owner, drops that selection too — it would
otherwise point at a login that no longer exists.
Which account acts — account status / account use
Two identities can live on one machine: the account the agent registered for
itself (register_account) and your own login. Exactly one of them
authenticates each call, and the order is fixed:
DEPIX_API_KEY > an explicit `account use` > the agent's own account > your loginThe agent's own account carries two keys — sandbox (sk_test_) and the
production starter (sk_live_) — and starts on the sandbox one. The agent
switches with activate_key ({ "mode": "live" }): the choice is saved in
the encrypted vault, survives restarts, and the wallet picks it up on its next
call. Under live, deposits are real Pix charges.
npx -y @depixapp/mcp account status # who is acting, and why
npx -y @depixapp/mcp account use owner # act as your own DePix login
npx -y @depixapp/mcp account use agent # act as the account the agent registered here
DEPIX_API_KEYin the server's environment beats everything below it. With that variable set,account usedecides nothing —account statusprints that warning in place. Unset it (and restart the server) to let your selection win.
account status prints labels only — a provider, an email, an expiry — never a
token and never your passphrase.
Quickstart 3 — Sandbox testing (the full loop)
Always test with an sk_test_ key before sk_live_. Sandbox QRs are
non-payable placeholders (SANDBOX-…-DO-NOT-PAY).
create_checkout—amountis always required; on the default Pix railpayer_tax_numberis too (the CPF/CNPJ is required even in sandbox). Use a test CPF like52998224725:{ "amount": 1500, "payer_tax_number": "52998224725" }Returns a
chk_…id, apayment_url, a sandboxpix.qr_code, andis_live: false.simulate_checkout_payment—{ "checkout_id": "chk_…" }marks the sandbox checkout paid (sandbox-only; live checkouts returnsandbox_only).wait_for_checkout—{ "checkout_id": "chk_…" }. The server polls internally and streams progress; you make one call and it returns{ "status": "completed", "terminal": true }— no client-side polling loop.
You can also read a synthetic deposit: get_deposit_status with a
sandbox_… id returns depix_sent.
Charging on the DePix rail instead of Pix
create_checkout takes payment_method. The default "pix" is the flow above.
With "depix" the payer sends DePix wallet-to-wallet on Liquid to the
merchant's dedicated address — there is no Pix QR and no payer document:
{ "amount": 9990, "payment_method": "depix", "expected_discount_pct": 10 }The response carries depix instead of pix: address, the exact
amount_cents to send (face amount minus the merchant's discount, minus a
sub-cent-window adjustment that makes the value unique — that uniqueness is how
the payment is matched), the decimal amount a wallet signs, asset_id and a
ready-to-scan uri. Send any other amount or any other asset and the payment
cannot be credited automatically, and an on-chain payment is irreversible.
Settlement is observed on-chain: approved at the first confirmation (~1 min),
completed at the second. expires_in accepts 300–3600 s here (default 1800)
instead of the Pix rail's 300–1200. The rail must be enabled by the merchant —
otherwise the API answers depix_not_enabled. On the local level, a registered
agent account turns it on with configure_depix_rail ({ "enabled": true }):
the tool derives a dedicated address from your own wallet and registers it, so
you keep custody and the backend only gains a per-address viewing key. Sandbox
DePix checkouts are deliberately unpayable (placeholder address, uri: null);
drive them with simulate_checkout_payment.
Tools
26 gateway tools — available at both levels. Amounts are BRL cents.
Tool | API | Scope |
| POST /api/checkouts |
|
| GET /api/checkouts/:id |
|
| GET /api/checkouts |
|
| POST /api/checkouts/:id/simulate-payment |
|
| GET /api/checkouts/:id (server-side loop) |
|
| POST /api/products |
|
| GET /api/products |
|
| GET /api/products/:id |
|
| PATCH /api/products/:id |
|
| POST /api/products/:id/activate |
|
| POST /api/products/:id/deactivate |
|
| POST /api/products/featured |
|
| GET /api/products/:id/checkouts |
|
| GET /api/me |
|
| GET /api/verification + GET /api/me probe (self-heals via POST when every step is done) |
|
| PATCH /api/merchants/me |
|
| GET /api/vault/status |
|
| GET /api/webhook-logs, /api/webhook-logs/:id |
|
| GET /api/deposits/:id |
|
| GET /api/withdrawals/:id |
|
| POST /api/tickets | any key (scope-less) |
| GET /api/tickets/:id | any key (scope-less) |
| GET /api/tickets | any key (scope-less) |
| POST /api/tickets/:id/messages | any key (scope-less) |
| POST /api/tickets/:id/attachments | any key (scope-less) |
| POST /api/tickets/:id/close | any key (scope-less) |
Charges (cobranças). create_product with kind: "charge" creates a payment link with a due date and optional late fine/interest — rent, tuition, an instalment. It is served at pay.depixapp.com/c/{id}, never appears on the merchant's public store, and the amount is recomputed on each visit (base + fine + pro-rata interest for the current cycle). With recurrence the same link keeps working month after month, settling the oldest unpaid cycle first. list_products does not return charges unless you pass kind: "charge" (or "all"); charge rows then carry charge_state — current cycle, days late, today's total.
Do not confuse it with create_checkout, which mints a one-off payment that is paid once and is short-lived. A charge is the standing one.
The last six are the support channel: open a ticket, poll for the human reply,
reply back, attach a screenshot or diagnostic/log file (base64, ~3 MB), or close
it (up to 5 open per account). Replies are not pushed —
poll get_support_ticket. Amounts are BRL cents. A tool call whose key lacks the required scope returns an
insufficient_scope tool error naming the missing scope — that is the only way
to discover a missing scope (the API never lists a key's scopes).
29 wallet_* tools — the local (npx) level only. They sign in-process with
your seed; without one they return wallet_not_configured.
Group | Tools |
Status & reads |
|
Sync |
|
Move money |
|
Convert |
|
Lightning |
|
Gift cards |
|
Recovery |
|
wallet_convert is the primary conversion surface (wallet_quote enumerates the
routes); the provider-level tools are the escape hatch. wallet_shift_usdt is the
one custodial route (SideShift) and says so. Amounts carry their unit in the
field name: amount_cents is BRL cents, amount_sats is the asset's base units.
There is deliberately no tool to export the seed, change guardrails, edit the payout addresses, or pay a merchant checkout QR — not even from a fully injected model.
Configuration (public, no secrets)
Env | Meaning | Default |
| API base URL (allowlisted origins only) |
|
| Max |
|
| Version reported in the handshake | package version |
| Comma-separated Host allowlist (DNS-rebinding protection). Matched exactly — no wildcards. Vercel preview deploys add their own hostnames automatically, so this is normally unset |
|
| stdio mode only — your | — |
Local (npx) level only — the wallet half:
Env | Meaning | Default |
| Unlocks the encrypted local wallet, and seals the stored API keys and the | — |
| Optional. When set it seals and opens the stored API keys and the | — |
| Where the encrypted wallet lives |
|
| Per-transaction / rolling-24h BRL caps and allowlist. Immutable at runtime: set here + restart | R$100/tx, R$500/day |
| Ceiling for the wallet wait tools |
|
There is deliberately no env for an API key, provider token, HMAC or DB
credential in the remote server. In HTTP mode the key arrives per-request in the
Authorization header. The wallet passphrase and seed exist only on the
operator's machine — the hosted deployment reads neither and has no code that
could.
Endpoints
POST /mcp— the MCP Streamable HTTP endpoint (DELETEends a session;GETreturns 405 — this stateless server offers no standalone SSE stream).GET /.well-known/mcp.json— minimal discovery document.GET /api/health(also/) — service status.
Development
npm install
npm test # vitest
npm run typecheck # tsc --noEmit
npm run lint # eslint
npm run build # compile src (incl. the wallet engine) → dist
npm run smoke # run the compiled dist: wasm init, address goldens, seed roundtrip
npm run guard:hosted # the hosted deployment has no path to the wallet engine
npm run licenses:check # THIRD_PARTY_LICENSES matches the prod dep treeSet DEPIX_TEST_KEY=sk_test_… to run the real-sandbox e2e test
(test/e2e/sandbox.test.ts), otherwise it is skipped. Set DEPIX_SDK_OFFLINE=1
(CI does) to skip the one engine test that reads mainnet Esplora for real.
The wallet engine (src/wallet-engine/)
The 29 wallet tools come from the DePix App wallet engine. It used to be vendored
here from a pinned commit of a second repository; it is now simply part of this
package's source, developed and released with it. Its tests live in
test/wallet-engine/, mirroring the layout.
Two settings the engine brings with it:
tsconfig.wallet-engine.jsontypecheckssrc/wallet-engine/+test/wallet-engine/under the stricter options the engine was written with (noUncheckedIndexedAccessand friends).npm run typecheckruns the repo-wide pass and then this one; tsc has no per-directory options.floor-smokein CI runs the compiled artifact on Node 22.4 exactly — theenginesfloor. The test matrix's "22" is whateverlatest-22resolves to, which never proves the floor.
Why the hosted deployment cannot sign
api/mcp.ts → src/http.ts → src/server.ts has zero import path to
src/wallet-engine/**. Neither this repo nor Vercel runs a tree-shaking bundler,
so that import graph is the whole guarantee. scripts/check-hosted-isolation.mjs
enforces it twice — a static walk of the TypeScript sources and a @vercel/nft
trace of the compiled entries — and its --self-test proves both checks reject a
poisoned entry. Only src/stdio.ts → src/unified.ts may reach the engine.
CI (.github/workflows/ci.yml) runs typecheck + lint + test + build + smoke +
both guards on every push to main and every PR, on Node 22 and 24, plus the
Node 22.4 floor smoke — that is the correctness gate.
Releasing
Publishing is automated via GitHub Actions using npm Trusted Publishing
(OIDC) — no npm token, no 2FA prompt, and every release carries build
provenance. .github/workflows/publish-mcp.yml (on a v* tag) publishes the
npm package and then the MCP Registry entry (registry/server.json).
To cut a release:
Bump the version in
package.json,registry/server.json(both the top-levelversionandpackages[].version) and theresolveServerVersionfallback insrc/config.ts— they must match, and CI fails the release if the tag,package.jsonand the registry npm entry disagree (a unit test pins the config fallback). The MCP Registry is immutable per version, so anything that publishes from the tagged tree has to be right before the tag.Commit to
main.Tag and push:
git tag v2.0.0 && git push origin v2.0.0
The workflow verifies the versions, re-runs typecheck + lint + tests + both
guards (ci.yml is not triggered by tags), publishes to npm with provenance,
then publishes the registry entry (idempotent — re-running a tag is a safe
no-op).
Re-tagging an already-published version skips both publishes.
One-time setup (already done): the package is registered as an npm Trusted
Publisher for this repo with workflow filename publish-mcp.yml (npmjs.com →
package → Settings → Trusted Publisher). No secrets are stored in the repo.
Release smoke test
After a preview/production deploy:
claude mcp add --transport http depix <url>/mcp --header "Authorization: Bearer sk_test_…"Ask Claude to run
get_account→ returns the merchant,is_live: false.create_checkout(sandbox) →simulate_checkout_payment→wait_for_checkout→completed.
Pushing to
maindeploys to production (mcp.depixapp.com). Validate on a Vercel preview deploy before merging. Previews are reachable out of the box: a non-production deployment adds its ownVERCEL_URLandVERCEL_BRANCH_URLto the DNS-rebinding allowlist (resolveAllowedHosts), and production widens by nothing. If you ever need to allow another host, setMCP_ALLOWED_HOSTSto the exact hostname — the allowlist is an exact match, so*.vercel.appmatches nothing and would leave the preview unreachable.
Available Tools
16 toolsactivate_productActivate productAInspect
Make a product purchasable again. Requires scope merchant_write.
| Name | Required | Description | Default |
|---|---|---|---|
| product_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| success | Yes | |
| product_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false. The description adds the 'Requires scope merchant_write' auth requirement and clarifies the effect (making purchasable again), adding value beyond 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?
Two sentences with no waste. The first sentence states the action, the second adds critical scope info. Front-loaded and efficient.
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 simple tool with one parameter, plus annotations and an output schema (not shown but present), the description provides the core purpose and auth requirement. Lacks details on idempotency or error cases, but overall sufficient.
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 0%, so the description should describe parameters. It does not mention product_id, but it is the only required parameter and its role is obvious from the tool name. Adequate but could be explicit.
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 clearly states the tool's purpose: 'Make a product purchasable again.' This is a specific verb-resource combination that distinguishes it from siblings like deactivate_product (reverse action) and create_product (new creation).
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 description implies usage when a product needs to be reactivated for purchase, and the sibling deactivate_product provides contrast. However, it does not explicitly state when not to use or mention alternatives, but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_checkoutCreate checkoutAInspect
Create a Pix charge (checkout) with a hosted payment page. Requires scope merchant_write. Amount is BRL cents.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | No | Amount in BRL cents (R$5.00–R$3000.00). Wire field is `amount`. | |
| metadata | No | Optional arbitrary key/value bag echoed back on reads/webhooks. | |
| image_url | No | Optional image on the hosted payment page. | |
| expires_in | No | QR lifetime in seconds (300–1200, default 1200). | |
| description | No | Description shown to the payer. | |
| amount_cents | No | Alias of `amount` (BRL cents). Provide either `amount` or `amount_cents`. | |
| callback_url | No | Optional per-checkout webhook URL. | |
| redirect_url | No | Optional post-payment redirect URL. | |
| idempotency_key | No | Optional. If omitted, the server generates one. Reuse to safely retry. | |
| payer_tax_number | Yes | Payer CPF/CNPJ (digits). Required in all modes, including sandbox, while the platform tax-number gate is on. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Checkout id (chk_…). |
| pix | Yes | PIX payload; present while pending. |
| amount | Yes | Charge amount in BRL cents. |
| status | Yes | Always `pending` at creation. |
| is_live | Yes | false when created with sk_test_. |
| replayed | No | true when the API replayed a prior response for the same Idempotency-Key. |
| image_url | Yes | |
| expires_at | Yes | QR expiry timestamp (UTC). |
| description | Yes | |
| payment_url | Yes | Hosted payment page URL to hand to the payer. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false (mutation) and openWorldHint=true (potential side effects). The description adds the scope requirement but does not elaborate on other behavioral traits like idempotency handling or payment page behavior beyond creation. It does not contradict 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?
Two sentences, front-loaded with the primary purpose, no wasted words. Efficient and clear.
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?
Given the complexity (10 parameters, nested objects, output schema), the description is minimal but sufficient for a creation tool. It covers core purpose and scope, but omits details like idempotency behavior or payment page flow, which are partially covered by schema. Adequate but not comprehensive.
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 parameters are already well-documented. The description adds no new meaning beyond the schema; the mention of 'BRL cents' is redundant with the param descriptions. Baseline of 3 is appropriate.
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 clearly states the action ('Create') and resource ('Pix charge (checkout) with a hosted payment page'), distinguishing it from sibling tools like get_checkout and list_checkouts.
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 description mentions required scope and currency unit, but lacks explicit guidance on when to use vs. alternatives such as get_checkout or simulate_checkout_payment. The context of sibling tools implies usage, but no direct comparisons are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_productCreate productAInspect
Create a reusable product (fixed-price checkout template with a public page). Requires scope merchant_write.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Product name (2–80 chars). | |
| slug | No | URL slug (auto-generated from name when omitted). | |
| amount | No | Amount in BRL cents (R$5.00–R$3000.00). Wire field is `amount`. | |
| metadata | No | ||
| image_url | No | ||
| expires_in | No | ||
| description | No | ||
| amount_cents | No | Alias of `amount` (BRL cents). Provide either `amount` or `amount_cents`. | |
| callback_url | No | ||
| redirect_url | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| product | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds behavioral context beyond annotations by stating 'Requires scope merchant_write', indicating authorization needs. It does not contradict annotations; the openWorldHint vs schema conflict is between annotations and schema, not the description.
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 description is concise, front-loading the purpose. However, it could include brief parameter guidance without becoming verbose.
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?
Given the tool has 10 parameters, an output schema, and nested objects, the description is too brief. It lacks explanation of return values, parameter constraints (e.g., BRL cents), and how to use it effectively.
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?
With schema description coverage at 40%, the description does not compensate by adding meaning to the parameters. It only mentions the scope requirement, leaving 10 parameters with no additional context.
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 clearly states 'Create a reusable product (fixed-price checkout template with a public page)', specifying the verb 'create' and resource 'product'. It also mentions the required scope, distinguishing it from sibling tools like update_product or deactivate_product.
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 description provides clear context for creating a product and the required scope, but it does not explicitly state when not to use this tool or mention alternatives like update_product for existing products.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deactivate_productDeactivate productAInspect
Hide a product from the public page and block new checkouts. Requires scope merchant_write.
| Name | Required | Description | Default |
|---|---|---|---|
| product_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| success | Yes | |
| product_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate write operation (readOnlyHint=false) and open-world side effects. The description adds specific behavioral traits: hiding from public page and blocking new checkouts. It does not disclose reversibility or impact on existing checkouts, but provides sufficient transparency beyond 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?
Two concise sentences: first states the effect, second states a prerequisite. No unnecessary words, front-loaded with key 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?
Given a single parameter and existing output schema, the description covers purpose and a requirement. It could mention reversibility (via activate_product) or effect on existing checkouts, but overall is adequate for the tool's simplicity.
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 0%, and the tool description does not explain the product_id parameter or its pattern. While the parameter is self-evident, the description adds no semantic value beyond the schema, resulting in a gap for parameter understanding.
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 clearly states the tool hides a product from the public page and blocks new checkouts, using a specific action verb and resource. It effectively distinguishes from siblings like activate_product and create_product.
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 description mentions a required scope (merchant_write) but does not explicitly state when to use this tool versus alternatives or provide when-not-to-use guidance. Usage context is implied from the name and sibling tools, but lacks explicit direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_accountGet accountARead-onlyInspect
Identify the authenticated merchant (connection test). Requires scope merchant_read.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| name | No | |
| is_live | Yes | false ⇒ you are using a sandbox key (sk_test_). |
| username | No | |
| created_at | No | |
| merchant_id | No | |
| merchant_slug | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds the scope requirement ('merchant_read') beyond annotations (readOnlyHint, openWorldHint). No contradiction found; it supplements transparency about authorization.
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?
Single sentence, extremely concise, front-loaded with purpose. No waste.
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 zero-parameter, read-only tool with annotations and output schema, the description is fully complete, covering purpose and required scope.
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?
With zero parameters and 100% schema description coverage, the description does not need to add parameter details. Baseline 4 for trivial parameters.
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 clearly states 'Identify the authenticated merchant (connection test)', providing a specific verb and resource. It is distinct from sibling tools which focus on products and checkouts.
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 description implies usage as a connection test and explicitly requires the 'merchant_read' scope, but does not mention when not to use it or suggest alternatives, though alternatives are not needed given its simplicity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_checkoutGet checkoutARead-onlyInspect
Fetch a checkout by id (owner view). Requires scope merchant_read.
| Name | Required | Description | Default |
|---|---|---|---|
| checkout_id | Yes | Checkout id (chk_…). |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| amount | Yes | |
| status | Yes | |
| is_live | Yes | |
| metadata | Yes | Merchant metadata, parsed to an object when it was valid JSON. |
| image_url | Yes | |
| created_at | Yes | |
| expires_at | Yes | |
| approved_at | Yes | |
| description | Yes | |
| pix_payload | Yes | PIX payload; present only while pending. |
| callback_url | Yes | |
| cancelled_at | Yes | |
| completed_at | Yes | |
| redirect_url | Yes | |
| processing_at | Yes | |
| blockchain_tx_id | Yes | |
| rejection_reasons | Yes | Provider reason codes when the underlying payment was refused/held; [] otherwise. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond readOnlyHint and openWorldHint annotations, the description adds the scope requirement and owner view, providing useful behavioral context.
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?
One sentence, directly front-loading the purpose with no wasted words.
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 a single parameter and output schema present, the description is complete for the tool's simplicity.
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%, and the description does not expand on the parameter beyond what the schema provides. Baseline score applies.
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 clearly states it fetches a checkout by ID with owner view, distinguishing from sibling tools like list_checkouts.
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 description lacks explicit guidance on when to use vs alternatives, though the scope requirement is stated. No when-not-to-use info.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_deposit_statusGet deposit statusARead-onlyInspect
Read a deposit's status (read-only). Requires scope wallet_read. This MCP cannot create deposits (that is the SDK, F3).
| Name | Required | Description | Default |
|---|---|---|---|
| deposit_id | Yes | Deposit id (or sandbox_… in test mode). |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| type | Yes | |
| status | Yes | |
| sandbox | Yes | |
| terminal | Yes | Derived from the terminal status set. |
| created_at | Yes | |
| updated_at | Yes | |
| amount_cents | Yes | |
| rejection_reasons | Yes | Provider reason codes when refused/held; [] when not refused. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds the scope requirement and clarifies the tool is read-only and cannot create deposits, providing additional behavioral context beyond 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?
Two concise sentences front-load the purpose and include essential usage notes. No redundant 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?
With only one parameter and an existing output schema, the description covers purpose, scope, and limitations fully. No gaps remain.
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% and the schema description for deposit_id is informative. The tool description does not add further parameter details, but baseline 3 is appropriate since the schema already handles it.
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 clearly states 'Read a deposit's status (read-only)', specifying the verb (read) and resource (deposit status). It is distinct from sibling tools like create_checkout or update_product.
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?
Explicitly states required scope ('wallet_read') and that this MCP cannot create deposits (that is the SDK, F3). This tells when to use it and provides a clear alternative, preventing misuse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_productGet productARead-onlyInspect
Fetch a product by id with checkout aggregates. Requires scope merchant_read.
| Name | Required | Description | Default |
|---|---|---|---|
| product_id | Yes | Product id (prd_…). |
Output Schema
| Name | Required | Description |
|---|---|---|
| stats | Yes | |
| product | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and the description adds behavioral context by stating it returns checkout aggregates and requires a scope. No contradictions; openWorldHint is consistent.
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?
Single, well-formed sentence with no wasted words. Every part is essential.
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?
The presence of an output schema covers return values. Description mentions aggregates and scope, which is complete for a simple fetch tool. No gaps.
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% as the only parameter (product_id) has a description and pattern. The tool description adds no extra parameter semantics beyond what the schema provides.
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 clearly states the action (fetch), resource (product by id), and specialization (with checkout aggregates). It distinguishes from sibling tools like list_products (listing multiple) and activate/deactivate product (modifications).
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?
Specifies required scope ('merchant_read'), which is a prerequisite. Context is clear but doesn't explicitly exclude cases where alternatives are better (e.g., fetching without aggregates).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_withdrawal_statusGet withdrawal statusARead-onlyInspect
Read a withdrawal's status (read-only). Requires scope wallet_read. This MCP cannot create withdrawals (that is the SDK, F3).
| Name | Required | Description | Default |
|---|---|---|---|
| withdrawal_id | Yes | Withdrawal id (or sandbox_… in test mode). |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| type | Yes | |
| status | Yes | `confirmed` appears only in sandbox (not a live status). |
| sandbox | Yes | |
| terminal | Yes | Derived from the terminal status set. |
| created_at | Yes | |
| updated_at | Yes | |
| liquid_txid | No | Settlement Liquid txid, once reported. |
| amount_cents | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, indicating safe read-only behavior. The description adds value by stating 'read-only' explicitly, requiring the `wallet_read` scope, and clarifying that this MCP cannot create withdrawals (which aligns with the readOnlyHint). There is no contradiction. This adds useful behavioral context beyond 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 description is extremely concise—two short sentences that immediately convey the purpose, scope requirement, and a key behavioral constraint. Every word earns its place with no redundancy or fluff. It is front-loaded with the primary action.
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?
Given the low complexity (one required parameter, read-only, output schema present), the description adequately covers all needed context: what the tool does, its scope requirement, and what it does not do. The presence of an output schema means return values don't need to be described. No information gaps remain.
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% with a single parameter `withdrawal_id` that has a description including test mode format. The description does not add additional parameter semantics beyond what the schema provides. With high schema coverage, the baseline is 3, and the description does not elevate it.
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 clearly states the tool reads a withdrawal's status (read-only). It uses the specific verb 'read' and identifies the resource as 'withdrawal status'. It also distinguishes from sibling tools by explicitly stating it cannot create withdrawals, which is a different action performed by other 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?
The description provides clear when-to-use context (to read a withdrawal's status) and an explicit exclusion (cannot create withdrawals). It also mentions the required scope `wallet_read`. However, it does not name alternative tools for related operations like get_deposit_status, but the sibling list provides that context. The guidance is strong but not perfect.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_checkoutsList checkoutsCRead-onlyInspect
List checkouts with filters and pagination. Requires scope merchant_read.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Substring match on id + description. | |
| to | No | UTC timestamp upper bound (created_at <=). | |
| from | No | UTC timestamp lower bound (created_at >=). | |
| limit | No | ||
| offset | No | ||
| status | No | ||
| product_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| limit | Yes | |
| stats | Yes | |
| offset | Yes | |
| has_more | Yes | |
| checkouts | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint. The description adds the scope requirement but does not disclose additional behaviors like pagination defaults or ordering.
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 description is concise with two sentences and no unnecessary words. It front-loads the main action and requirements.
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?
Despite having 7 optional parameters and a rich schema, the description provides minimal context. It lacks explanation of default behavior, response structure (though output schema exists), or filter examples.
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?
With only 43% schema description coverage, the description does not compensate by explaining any parameters. It only says 'with filters and pagination', adding no value beyond 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 clearly states 'List checkouts with filters and pagination', specifying the verb and resource. However, it does not explicitly differentiate from siblings like 'get_checkout' or 'list_product_checkouts'.
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 description mentions required scope 'merchant_read', which is useful, but provides no guidance on when to use this tool vs alternatives like 'list_product_checkouts' or the single 'get_checkout'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_product_checkoutsList a product's checkoutsARead-onlyInspect
List checkouts created from a product. Requires scope merchant_read.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No | ||
| status | No | ||
| product_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| limit | Yes | |
| stats | Yes | |
| offset | Yes | |
| has_more | Yes | |
| checkouts | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint and openWorldHint. The description adds the scope requirement, which is valuable context beyond annotations. No contradictions.
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 sentences: one for purpose, one for scope. Efficient and front-loaded with key information, no redundancy.
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?
Has an output schema (not provided), but description omits parameter guidance for pagination and filtering. For a list tool with 4 parameters, this is a moderate gap. Agent would need to infer from schema defaults and enums.
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 0%, so the description should compensate by explaining parameters like product_id, limit, offset, and status. It does not, leaving the agent to rely solely on schema types and defaults, which may be insufficient for understanding filtering and pagination.
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 clearly states 'List checkouts created from a product', specifying the verb, resource, and scope. It distinguishes from siblings like 'list_checkouts' (which lists all checkouts) and 'get_checkout'.
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 description explicitly requires 'merchant_read' scope, providing a prerequisite. However, it does not explicitly state when to use this tool versus alternatives like 'list_checkouts' for all checkouts, though the product-specific focus implies it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_productsList productsARead-onlyInspect
List products with filters and pagination. Requires scope merchant_read.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Substring search over slug, name and description. | |
| limit | No | ||
| active | No | Filter by active flag. | |
| offset | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| limit | Yes | |
| offset | Yes | |
| has_more | Yes | |
| products | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds the authorization requirement (scope merchant_read) beyond annotations. No contradictions are present. The description moderately enhances behavioral context.
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 description is extremely concise: two sentences with no superfluous information. It front-loads the core purpose and includes the scope requirement efficiently.
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?
Given the tool's simplicity (4 parameters, output schema exists), the description adequately covers the main behavior. It omits pagination details like limit defaults and offset usage, but the schema covers these. The scope requirement is the main extra context.
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 50% (2 of 4 parameters have descriptions). The description generically mentions 'filters and pagination' but does not elaborate on parameter details beyond what the schema provides. The baseline is 3 given the coverage level, and the description adds no extra semantic value.
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 clearly states 'List products with filters and pagination', specifying the verb (list), resource (products), and distinct features (filters and pagination). It differentiates from sibling tools like list_checkouts and list_product_checkouts by focusing on products.
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 description mentions 'Requires scope merchant_read', which provides authorization context. However, it does not explicitly state when to use this tool versus alternatives or provide exclusion criteria. Usage is implied but not fully elaborated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_featured_productsSet featured productsAInspect
Reconcile the pinned product set/order on the public page in one call (empty array clears all). Requires scope merchant_write.
| Name | Required | Description | Default |
|---|---|---|---|
| product_ids | Yes | Ordered product ids to pin (max 50). Empty array clears all pins. |
Output Schema
| Name | Required | Description |
|---|---|---|
| success | Yes | |
| featured | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate a write operation (readOnlyHint=false), so the description adds value by stating the scope requirement and the clearing behavior when an empty array is passed. It does not contradict 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?
Two efficient sentences: first explains purpose and behavior, second states authentication requirement. No unnecessary words.
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?
Given the presence of an output schema (not shown, but exists), the description covers the main behavior, parameter constraint, and scope. It doesn't mention error conditions but is adequate for agent use.
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 3. The description repeats the clearing behavior already in the schema parameter description, but does not add new meaning beyond 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 clearly states the tool reconciles the pinned product set/order on the public page, using the specific verb 'reconcile' and identifying the resource. It distinguishes from sibling tools like update_product or activate_product by focusing on bulk pin management.
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 description mentions 'in one call' and 'empty array clears all', providing context for when to use it (replace all pins) versus using individual updates. It also notes the required scope. However, it does not explicitly discuss when not to use it or name alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
simulate_checkout_paymentSimulate checkout payment (sandbox only)AInspect
Mark a SANDBOX checkout as paid so you can observe checkout.completed. Live checkouts return sandbox_only. Requires scope merchant_write.
| Name | Required | Description | Default |
|---|---|---|---|
| checkout_id | Yes | Sandbox checkout id (chk_…). |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | Yes | |
| success | Yes | |
| checkout_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false (mutation). The description adds that marking as paid triggers 'checkout.completed' and errors on live checkouts. It mentions required scope but does not elaborate on idempotency or other side effects.
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 description is two concise sentences, front-loading the key action and constraints. No wasted words; every sentence adds value.
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 simple sandbox simulation tool with one parameter, the description covers purpose, usage context (sandbox only), required scope, and expected error for live checkouts. The output schema exists but is not needed for completeness.
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% with description and pattern for 'checkout_id.' The description reinforces that it must be a sandbox checkout, adding value beyond schema. No further parameter details needed.
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 clearly states the verb 'simulate payment' and the resource 'checkout,' specifically for sandbox environments. It distinguishes from siblings by noting that live checkouts return 'sandbox_only,' making the purpose unambiguous.
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 description specifies that the tool is for sandbox only and requires 'merchant_write' scope. It implies not to use on live checkouts by stating they return 'sandbox_only,' but does not explicitly list alternatives or when to use among sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_productUpdate productAInspect
Partially update a product (only provided fields change). Requires scope merchant_write.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| slug | No | ||
| amount | No | Amount in BRL cents (R$5.00–R$3000.00). Wire field is `amount`. | |
| metadata | No | ||
| image_url | No | ||
| expires_in | No | ||
| product_id | Yes | ||
| description | No | ||
| amount_cents | No | Alias of `amount` (BRL cents). Provide either `amount` or `amount_cents`. | |
| callback_url | No | ||
| redirect_url | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| success | Yes | |
| product_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds the scope requirement beyond annotations, but does not disclose error handling or side effects, even though openWorldHint is true. Minimal additional context.
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 sentences, front-loaded with core functionality, no redundant words. Efficient and clear.
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?
Despite having an output schema, the description lacks guidance on prerequisites, error scenarios, or state implications. For a mutation tool with many parameters, it is insufficient.
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 only 18%, and the description does not elaborate on any parameters. Critical for a 11-param tool with low schema coverage.
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 clearly states the action 'partially update a product' and the resource, distinguishing it from sibling tools like create_product and activate_product.
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 description mentions partial update and required scope, but does not explicitly specify when not to use it or compare to alternatives like activate_product or create_product.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_for_checkoutWait for checkoutARead-onlyInspect
Wait server-side for a checkout to reach a terminal status, emitting progress. One call — no client-side polling. Returns { status, terminal, timed_out }. Requires scope merchant_read.
| Name | Required | Description | Default |
|---|---|---|---|
| checkout_id | Yes | Checkout id (chk_…). | |
| timeout_seconds | No | Server-side wait budget (5–290s). The internal deadline always fires with margin below the platform cap, returning timed_out:true rather than being killed. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| is_live | Yes | |
| terminal | Yes | true when status reached a terminal state. |
| timed_out | Yes | true if the wait budget elapsed before terminal; status is last observed. |
| checkout_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint: true and openWorldHint: true. The description adds value by specifying the return shape ({ status, terminal, timed_out }), explaining timeout behavior ('returns timed_out:true rather than being killed'), and stating the required scope. This goes beyond annotations, though it doesn't detail progress emission mechanisms.
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 description is extremely concise: two sentences that cover purpose, behavior, return shape, and scope. Every sentence is necessary and front-loaded with the core action. No wasted words.
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?
Given the tool's simplicity (2 parameters, output schema present, annotations provided), the description covers the essential aspects: core behavior, return shape, timeout semantics, and required scope. It omits details about progress emission and error handling for invalid checkout_id, but these are minor gaps given the context.
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 both parameters well. The description adds contextual meaning for timeout_seconds by clarifying that exceeding it returns timed_out:true instead of an error, which is valuable beyond the schema's description of min/max/default.
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 clearly states the tool's purpose: 'Wait server-side for a checkout to reach a terminal status, emitting progress.' It uses a specific verb ('wait') and resource ('checkout'), and distinguishes itself from sibling tools by explicitly contrasting with 'no client-side polling.' This makes the purpose unambiguous and distinct.
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 description provides usage guidance by contrasting with polling ('One call — no client-side polling') and specifying the required scope ('merchant_read'). However, it does not explicitly list alternative tools or conditions when not to use this tool, which would enhance clarity.
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. Dates show when Glama detected each change.
16 tool updates
v1.0.0- First observed
activate_product - First observed
create_checkout - First observed
create_product - First observed
deactivate_product - First observed
get_account - First observed
get_checkout - First observed
get_deposit_status - First observed
get_product - First observed
get_withdrawal_status - First observed
list_checkouts - First observed
list_product_checkouts - First observed
list_products - First observed
set_featured_products - First observed
simulate_checkout_payment - First observed
update_product - First observed
wait_for_checkout
TDQS
Each tool targets a distinct resource (product, checkout, wallet) or action (create, get, list, update, activate, deactivate, set_featured, simulate, wait_for). No two tools have overlapping purposes; even similar ones like list_checkouts and list_product_checkouts are differentiated by scope and description.
All tool names follow a consistent verb_noun pattern with underscores (e.g., create_product, get_checkout, wait_for_checkout). Verbs are descriptive and uniform across the set.
16 tools is well-scoped for a payment and wallet server. Each tool covers a necessary operation without redundancy or bloat, staying within the optimal 3-15 range (just slightly above) and justifying its presence.
The tool surface covers product lifecycle (CRUD, activation, featured), checkout management (create, get, list, simulate, wait), and wallet status queries. Missing features like refunds or checkout cancellation are minor gaps given the server's stated purpose of Pix payments via hosted pages.
Maintenance
Related MCP Connectors
The Mercado Pago MCP Server implements the Model Context Protocol to provide AI agents and LLMs with access to Mercado Pago's APIs and tools within compatible development environments. It acts as an intermediary that translates Mercado Pago resources into executable functions (tools) that AI applications can invoke to perform actions and automate flows. The server simplifies integration, enables using documentation to implement or improve code, and optimizes operations through natural language interactions without manual implementations.
MCP server connecting AI agents to non-custodial staking data across 130+ networks.
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
MCP server for AI agents to discover campaigns by humans and donate USDC directly on Base.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceMCP server for integrating with Abacate Pay API, enabling management of customers, billings, PIX QR codes, and discount coupons via AI assistants like Claude.MIT
- AlicenseNot gradedqualityBmaintenanceA remote MCP server enabling AI agents to accept Pix, credit/debit cards, and boleto payments in Brazil via Mercado Pago, with payment status polling and no webhooks needed.MIT

AdvinPay MCPofficial
AlicenseNot gradedqualityCmaintenanceMCP server to connect AI assistants to the AdvinPay payment API, enabling PIX charges, transaction queries, and documentation search.MIT- AlicenseNot gradedqualityDmaintenanceMCP server that enables AI agents to manage PagSeguro/PagBank payments, including orders, charges, checkouts, and public keys via official API.MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/depixapp/depix-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server