Skip to main content
Glama

payping-mcp: PayPing MCP server for AI agents

Let your AI agent work with your PayPing (پی‌پینگ) merchant account. An unofficial MCP server for PayPing, the Iranian payment gateway and invoicing service: read balance, sales, transactions, customers, products, coupons and invoices, and create invoices, payment links and coupons after you confirm, from Claude, Cursor or Copilot.

PyPI Python CI MCP Registry License: MIT mcpfarsi

Install in Cursor Install in VS Code

For AI agents · Why · What it can do · Quick start · Tools · Security · Troubleshooting · FAQ · فارسی


For AI agents

  • What: unofficial MCP server (model context protocol) for a PayPing (payping.ir, Iran) merchant account. Amounts are Toman, dates UTC.

  • Install: uvx payping-mcp (needs uv, Python 3.10+; or pip install payping-mcp). Transport: stdio.

  • Claude Code: claude mcp add payping -e PAYPING_TOKEN=your-token -- uvx payping-mcp

  • Auth: PAYPING_TOKEN (required, a PayPing API token whose scopes decide what works); PAYPING_MCP_PROXY (optional HTTP proxy).

  • Access: acts on the user's own account, so it is not read-only: 15 read tools and 6 create/send tools. Ask the user to confirm before any create or send tool. No tool can withdraw, refund, reverse or delete.

  • Tools: 21, prefixed payping_*. Start with payping_get_profile, payping_get_balance, payping_get_sales_summary, payping_list_transactions, payping_list_invoices. Balance and sales summary use dashboard endpoints that PayPing may reject for API tokens; the other tools still work.

  • Typical sequence: payping_create_customer -> payping_create_invoice -> payping_send_invoice; or payping_create_product -> payping_create_payment_link.

  • Units: Toman (not Rial), dates and times UTC.

  • Use when: the user wants to see or create invoices, payment links, coupons, customers or sales figures in their own PayPing account.

  • Do not use when: the task is taking raw payments, verifying or refunding a payment, or paying out; there are no tools for these.

  • Output: compact JSON; lists return at most 50 items with total (page with offset); pass codes (customer, product, invoice) between tools.

  • Machine-readable: server.json; catalog of all Iran MCP servers: iran-mcp (TOOLS.md, servers.json, llms.txt).

Related MCP server: Stax Payments MCP Connector

Why

The PayPing panel is built for people clicking through screens. Answering "how much did I sell this month, which payments failed, and who still owes me?" means opening several pages, and creating an invoice means filling in a customer, items and a send step by hand. With payping-mcp an agent does it in a few calls: it reads the numbers, drafts the invoice, shows you the details and only creates and sends it after you say yes.

You: Create an invoice for Ali Rezaei: 2 hours of consulting at 1,500,000 Toman each, and send it.

Agent: calls payping_list_customers -> shows you the invoice details and waits for your OK -> payping_create_invoice -> payping_send_invoice

It gives you the public pay page link (https://ppng.ir/v/<invoice code>) and tells you PayPing sent the invoice by SMS/email.

Everything runs on your machine with your own token. There is no hosted relay in between.

What it can do

  • Money: wallet balance, sales totals for a period, transactions, one payment's real status, settlements to your bank

  • Shop data: list and search customers, products, coupons and invoices

  • Get paid: create a customer and an invoice with a pay page link, or a reusable payment link for a product, then have PayPing send the invoice by SMS/email

  • Safe by design: runs on your machine, talks only to PayPing, asks before creating anything, and cannot withdraw, refund, reverse a payment or delete anything

Example prompts:

  • "Show my PayPing profile."

  • "What is my PayPing balance and how much did I sell this month?"

  • "List this week's received payments and tell me which ones failed."

  • "Which invoices are overdue?"

  • "Create a product called Monthly plan at 490,000 Toman and give me a payment link."

  • "Create an invoice for Ali Rezaei: 2 hours of consulting at 1,500,000 Toman each. Show me before you create it."

  • فاکتورهای پرداخت&zwnj;نشده این ماه را نشان بده.

  • موجودی پی&zwnj;پینگ من چقدر است و این ماه چقدر فروش داشتم؟

  • یک لینک پرداخت برای محصول «اشتراک ماهانه» بساز.

  • آخرین تسویه&zwnj;های من به حساب بانکی را نشان بده.

Quick start

You need:

  • a PayPing merchant account with a complete profile (PayPing only approves tokens for complete profiles)

  • uv

  • an MCP client: Claude Code, Claude Desktop, Cursor, VS Code, or any other

Then:

  1. Create a PayPing token and wait for PayPing to approve it.

  2. Add the server to your MCP client.

  3. Check that it works.

1. Create a PayPing token

  1. Sign in at app.payping.ir.

  2. Open اتصالات (Connections) → توسعه دهندگان (Developers). The page title is توکن ها (Tokens).

  3. Click توکن جدید (New token) and fill in the form:

    Field

    What to enter

    توکن تست (test token)

    Leave off to work with your real account.

    نام توکن (token name)

    Any name, e.g. payping-mcp on my laptop

    آی&zwnj;پی&zwnj;های مجاز (allowed IPs)

    Optional. If you fill it in, list the public IP your computer reaches PayPing from. Calls from any other IP fail with error code 166.

    تاریخ انقضا (expiry date)

    When the token stops working. Shorter is safer.

    دسترسی&zwnj;ها (scopes)

    See the table below.

    توضیحات (description)

    e.g. MCP server for AI agents

    رمز پیامکی (SMS code)

    Click ارسال رمز (send code) and type the code PayPing sends to your phone.

  4. Click توکن جدید to submit. Copy the token now: PayPing shows it only once.

  5. Wait for approval. PayPing staff review every new token. After approval, wait about 10 more minutes; until then the token gets HTTP 401.

Scopes. The form preselects گزارش پرداخت&zwnj;ها and ساخت پرداخت. Remove ساخت پرداخت: this server never uses it. Then add what you need:

Panel label

Scope

Tools that need it

گزارش پرداخت&zwnj;ها

pay:read

transactions, payment detail, withdrawals

مشاهده و گزارش از مشتریان

customer:read

list and get customers

ساخت و ویرایش مشتریان

customer:write

create customer

مشاهده و گزارش از محصولات

product:read

list and get products

ساخت و ویرایش محصولات

product:write

create product, create payment link

مشاهده و گزارش کدهای تخفیف

coupon:read

list and get coupons

ساخت و ویرایش کدهای تخفیف

coupon:write

create coupon

مشاهده و گزارش از فاکتورها

invoice:read

list and get invoices

ساخت و ویرایش فاکتور

invoice:write

create and send invoices

ساخت پرداخت

pay:write

none: leave it out

Want a read-only agent? Select only the read scopes. The create tools then fail with HTTP 403 and nothing in the account can change.

2. Add the server to your MCP client

Put your token where it says your-token.

claude mcp add payping -e PAYPING_TOKEN=your-token -- uvx payping-mcp

This saves the server, with the token, in your user config (~/.claude.json), not in the project. Add --scope user to use it in every project.

Settings → Developer → Edit Config, then add:

{
  "mcpServers": {
    "payping": {
      "command": "uvx",
      "args": ["payping-mcp"],
      "env": { "PAYPING_TOKEN": "your-token" }
    }
  }
}

Restart Claude Desktop after saving.

Click Install in Cursor at the top and fill in the token, or add the Claude Desktop block to ~/.cursor/mcp.json (or .cursor/mcp.json in a project).

Click Install in VS Code at the top, or add to .vscode/mcp.json. VS Code asks for the token once and stores it securely, so the file is safe to commit:

{
  "inputs": [
    { "type": "promptString", "id": "payping-token", "description": "PayPing API token", "password": true }
  ],
  "servers": {
    "payping": {
      "type": "stdio",
      "command": "uvx",
      "args": ["payping-mcp"],
      "env": { "PAYPING_TOKEN": "${input:payping-token}" }
    }
  }
}
codex mcp add payping --env PAYPING_TOKEN=your-token -- uvx payping-mcp

Or in ~/.codex/config.toml:

[mcp_servers.payping]
command = "uvx"
args = ["payping-mcp"]

[mcp_servers.payping.env]
PAYPING_TOKEN = "your-token"

Add to ~/.gemini/settings.json:

{
  "mcpServers": {
    "payping": {
      "command": "uvx",
      "args": ["payping-mcp"],
      "env": { "PAYPING_TOKEN": "your-token" }
    }
  }
}

Add the Claude Desktop block to ~/.codeium/windsurf/mcp_config.json.

Replace uvx payping-mcp with:

uvx --from git+https://github.com/sepehr071/payping-mcp payping-mcp

In JSON configs: "args": ["--from", "git+https://github.com/sepehr071/payping-mcp", "payping-mcp"].

It's a standard stdio MCP server: run uvx payping-mcp, or pip install payping-mcp and run payping-mcp, with PAYPING_TOKEN in the environment.

3. Check that it works

Ask the agent: "Show my PayPing profile." You should see your PayPing username. If you see an error, look it up in Troubleshooting.

Then try the example prompts under What it can do.

Tools

All amounts are Toman, all dates UTC. Lists return at most 50 items per call and include total.

Read-only (15):

Tool

What it does

payping_get_profile

Account behind the token: username, name, contact, verification flags

payping_get_balance

Wallet balance

payping_get_sales_summary

Total sales, count and daily averages for a period (default last 30 days)

payping_list_transactions

Payments in a date range, received or paid

payping_get_payment

One payment by code, with its real status (paid and verified, cancelled, ...)

payping_list_withdrawals

Settlements to your bank account

payping_get_withdrawal

One settlement by code: IBAN, bank tracking number

payping_list_customers

Saved customers, searchable

payping_get_customer

One customer

payping_list_products

Products (financial items), searchable

payping_get_product

One product

payping_list_coupons

Discount coupons

payping_get_coupon

One coupon with buyer count and total

payping_list_invoices

Invoices, filter by status or customer

payping_get_invoice

One invoice with items and its pay page url

Create and send (6; the agent must confirm with you first):

Tool

What it does

payping_create_customer

Save a customer; returns its code

payping_create_product

Create a product with a fixed or payer-set price

payping_create_payment_link

Public pay page for a product: https://ppng.ir/d/<product code>

payping_create_coupon

Percent or Toman discount coupon

payping_create_invoice

Invoice for a saved customer; returns its pay page https://ppng.ir/v/<invoice code>

payping_send_invoice

PayPing sends the invoice to the customer by SMS/email

How it works

  AI agent  (Claude, Cursor, Copilot, ...)
      │
      │  MCP over stdio
      ▼
  payping-mcp  (runs on your machine, holds PAYPING_TOKEN)
      │
      │  HTTPS (REST, Bearer token, optional proxy)
      ├──────▶  api.payping.ir    (reports, customers, products, coupons, invoices)
      └──────▶  oauth.payping.ir  (profile)

payping-mcp runs locally and calls PayPing's API with your own token. There's no hosted server in between. It ignores system proxy settings, retries a failed GET once after a second on HTTP 429, 502 or 503 (never a create or send call), keeps no cache, and returns each result as one compact JSON block with empty fields dropped.

Privacy and security

  • Local only. The server runs on your machine and talks only to api.payping.ir and oauth.payping.ir. There is no relay server and no telemetry.

  • The token never leaks. It is sent only in the Authorization header to PayPing and never appears in tool output, errors or logs.

  • Treat the token like a password. Anyone who has it can use your account within its scopes. Don't commit it; use VS Code inputs or your client's user config. Give it only the scopes you need and an expiry date.

  • Lost or leaked token? In the panel, open the token and use حذف (delete) or تعویض توکن (swap token, which issues a new value). Then update your MCP config.

  • Confirm before creating. Create and send tools are annotated destructiveHint, so MCP clients ask before running them. Their descriptions also tell the agent to confirm the details with you.

  • No money moves out. No tool can withdraw, refund, reverse a payment or delete anything.

  • Prompt-injection aware. Customer names, descriptions and notes come from other people. The server tells the agent to treat them as data, never as instructions.

Good to know

  • Toman, not Rial. PayPing uses Toman in every service, and so does every tool. Dates and times are UTC.

  • Not read-only. Six tools create data or message a real customer. Use read-only scopes if you want an agent that can only look.

  • Limits. Lists return at most 50 items per call (limit 1-50); page with offset. redirect_url must be https.

  • Balance and sales summary are less certain. payping_get_balance and payping_get_sales_summary use endpoints from the PayPing dashboard, not the public API docs. If PayPing rejects them for API tokens, the tool error says so, and every other tool keeps working.

  • No raw payments. Raw POST /v3/pay payments are left out on purpose. They need your own callback server and a verify call within 10 minutes, or PayPing refunds the payer. Invoices and payment links use PayPing's own pay page instead.

  • What it does not do. No withdrawals, refunds, payment reversal, verification of raw payments, updates or deletes.

  • Changing scopes needs a swap. After you edit a token's website, return URL or scopes, PayPing applies the change only after تعویض توکن (swap token). The swap gives a new token value; put it in your MCP config.

  • Proxy. Set PAYPING_MCP_PROXY if your network needs a proxy to reach PayPing. System proxy variables are ignored on purpose.

Troubleshooting

The MCP client did not pass the token. Check the env block (or -e PAYPING_TOKEN=... for Claude Code) and restart the client.

One of these:

  • PayPing has not approved the token yet, or approved it less than 10 minutes ago.

  • The token expired. The panel shows منقضی شده (expired) on it.

  • The token was swapped or deleted, or was copied incompletely.

Add the scope from the scope table to the token, then تعویض توکن (swap token) and use the new value.

Your IP is not in the token's allowed IPs. Add your current public IP to آی&zwnj;پی&zwnj;های مجاز or clear the list. If you route through a proxy, the IP PayPing sees is the proxy's exit IP.

The server ignores system proxy settings on purpose. If your network needs a proxy to reach PayPing, set PAYPING_MCP_PROXY, e.g. http://127.0.0.1:10809. In testing, PayPing's API hosts answered both from Iran and from a foreign exit.

Use the full path to uvx (where uvx on Windows, which uvx on macOS/Linux) as command.

npx @modelcontextprotocol/inspector -e PAYPING_TOKEN=your-token uvx payping-mcp

Errors that carry a PayPing trace id: give that id to PayPing support.

FAQ

Yes. payping-mcp wraps the PayPing merchant API as 21 MCP tools, so any MCP client can use it with your own token.

Create a PayPing token, then add the server with claude mcp add payping -e PAYPING_TOKEN=your-token -- uvx payping-mcp or the config blocks in Quick start.

It is unofficial and free (MIT). It runs on your machine, talks only to PayPing and cannot withdraw or refund. Give the token only the scopes you need; read-only scopes make it read-only.

The tools are annotated so MCP clients ask before running them, and the server tells the agent to confirm the details with you first. Your client's permission settings have the last word, and a token with only read scopes cannot create anything.

No. There are no tools to withdraw, refund, reverse a payment or delete anything.

PayPing staff review every new token, and the token starts working about 10 minutes after approval.

They use dashboard endpoints, not the documented public API, and PayPing may reject them for API tokens. The error says so and the other tools keep working.

The PayPing API hosts answered both from Iran and from a foreign exit in testing. You still need a PayPing merchant account; set PAYPING_MCP_PROXY if your network needs a proxy.

Toman, in every tool.

Configuration

Variable

Required

Meaning

PAYPING_TOKEN

yes

API token from the PayPing panel (app.payping.ir, Connections > Developers > Tokens). Secret.

PAYPING_MCP_PROXY

no

HTTP proxy URL for every request, e.g. http://user:pass@host:port. System proxy settings are ignored.

فارسی: سرور MCP پی&zwnj;پینگ

payping-mcp یک سرور MCP غیررسمی برای پی&zwnj;پینگ (درگاه پرداخت و فاکتورنویسی آنلاین در ایران) است و به دستیار هوش مصنوعی شما (Claude، Cursor، Copilot و ...) اجازه می&zwnj;دهد موجودی، فروش، تراکنش&zwnj;ها، تسویه&zwnj;ها، مشتریان، محصولات، کدهای تخفیف و فاکتورهای حساب پی&zwnj;پینگ شما را ببیند، و پس از تأیید شما مشتری، محصول، لینک پرداخت، کد تخفیف و فاکتور بسازد.

  • روی سیستم خود شما اجرا می&zwnj;شود و توکن فقط به سرورهای پی&zwnj;پینگ فرستاده می&zwnj;شود.

  • فقط&zwnj;خواندنی نیست: ابزارهای ساخت و ارسال روی حساب واقعی شما کار می&zwnj;کنند و باید پیش از اجرا تأیید بدهید. اگر فقط دسترسی&zwnj;های خواندن را به توکن بدهید، چیزی در حساب تغییر نمی&zwnj;کند.

  • برداشت، استرداد، برگشت پرداخت و حذف با این ابزار ممکن نیست.

  • مبالغ به تومان و تاریخ&zwnj;ها به وقت UTC هستند.

ساخت توکن:

  1. در پنل پی&zwnj;پینگ به «اتصالات ← توسعه دهندگان» بروید و «توکن جدید» را بزنید.

  2. نام توکن، تاریخ انقضا و توضیحات را وارد کنید. «آی&zwnj;پی&zwnj;های مجاز» اختیاری است؛ اگر پر کنید، درخواست از آی&zwnj;پی دیگر با خطای 166 رد می&zwnj;شود.

  3. در «دسترسی&zwnj;ها» فقط موارد لازم را انتخاب کنید و «ساخت پرداخت» را حذف کنید؛ این ابزار به آن نیازی ندارد.

  4. رمز پیامکی را بگیرید و وارد کنید. توکن فقط یک بار نمایش داده می&zwnj;شود؛ همان لحظه کپی کنید.

  5. پروفایل شما باید کامل باشد. کارشناس پی&zwnj;پینگ توکن را تأیید می&zwnj;کند و تا حدود ۱۰ دقیقه بعد از تأیید ممکن است خطای 401 بگیرید.

نصب در Claude Code:

claude mcp add payping -e PAYPING_TOKEN=your-token -- uvx payping-mcp

نمونه پرسش&zwnj;ها

  • «موجودی پی&zwnj;پینگ من چقدر است و این ماه چقدر فروختم؟»

  • «فاکتورهای پرداخت&zwnj;نشده این ماه را نشان بده.»

  • «یک فاکتور برای علی رضایی بساز: ۲ ساعت مشاوره، ساعتی ۱٬۵۰۰٬۰۰۰ تومان. قبل از ساخت به من نشان بده.»

  • «برای محصول من لینک پرداخت بساز.»

  • «آخرین تسویه&zwnj;ها به حساب بانکی من چه بوده&zwnj;اند؟»

توکن را مثل رمز عبور نگه دارید و در گیت قرار ندهید. اگر لو رفت، در پنل آن را حذف یا «تعویض توکن» کنید.

Development

git clone https://github.com/sepehr071/payping-mcp && cd payping-mcp
uv sync
uv run ruff check . && uv run ruff format --check .
uv run pytest -q                                   # offline, against a mocked PayPing API
PAYPING_TOKEN=your-token uv run pytest -m live     # read-only calls to the real API

Tools live in src/payping_mcp/reports.py (account, money) and shop.py (customers, products, coupons, invoices); http.py is the only HTTP code. Each tool is a typed async function with a docstring that tells the agent when to use it. Issues and PRs are welcome.

Releases: bump the version in pyproject.toml and server.json, then push a v* tag. GitHub Actions tests, publishes to PyPI and the MCP Registry, and creates the GitHub Release.

  • iran-mcp: catalog of all Iranian-service MCP servers

  • bale-mcp for sending messages through a Bale bot, the other account tool in this family

  • iran-tax-mcp for Iranian tax data

  • tgju-mcp for dollar, gold, coin and commodity prices from TGJU

  • iran-crypto-mcp for crypto prices on Iranian exchanges

  • Listed on mcpfarsi.ir, the Persian MCP marketplace

Disclaimer

Unofficial and not affiliated with or endorsed by PayPing. It uses PayPing's API with your own token. Follow PayPing's terms. It acts on your own account: review what the agent is about to create or send.

If this saves you clicks, a star helps others find it.

Author

Built and maintained by Sepehr Radmard (سپهر رادمرد). Connect on LinkedIn or follow @sepehr071 on GitHub for more MCP servers for Iranian websites, all listed in iran-mcp. If this saves you time, a star on the repo helps other people find it.

License

MIT

Available Tools

21 tools
payping_create_couponPayPing: create couponA
Destructive

Create an active discount coupon and return its code. Creates real data: confirm with the user first.

NameRequiredDescriptionDefault
kindYes'percent' off, or a fixed Toman amount off.
nameYes
amountYesPercent (1-100) or Toman, per `kind`.
max_usesNo
expires_onNoLast valid day (YYYY-MM-DD).
coupon_codeNoCode buyers type; omit to generate.
product_codesNoLimit to these products; omit for all.

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=false, and readOnlyHint=false. The description adds value on top: it discloses the return value (the generated `code`) and an operational guardrail (confirm with the user). It stops short of explaining coupon lifetime or side effects beyond creation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, front-loaded with the core action and followed by the caution. Every clause carries information; nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly notes the returned `code`, and rich annotations cover the mutation/safety profile. It is largely complete for a create tool, though it omits parameter-level detail.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description contributes nothing about the seven parameters. Schema coverage is 71% (below the 80% threshold), leaving `name` and `max_uses` undocumented in both schema and description, so the description fails to compensate for the gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (create) and resource (discount coupon), plus two key facts: the coupon is active and the response returns its `code`. This clearly separates it from the get_coupon/list_coupons siblings, though it never names them explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Adds a real usage rule ("Creates real data: confirm with the user first") that tells the agent to gate the call behind user confirmation. However, it gives no guidance on when to create vs. when to reuse or fetch an existing coupon, so usage is only partially covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

payping_create_customerPayPing: create customerA
Destructive

Save a new customer in the PayPing account and return it with its code (needed for invoices). Creates real data: confirm the details with the user before calling.

NameRequiredDescriptionDefault
memoNoPrivate note.
emailNo
phoneNoMobile number, e.g. 09121234567.
last_nameYes
first_nameYes
is_businessNoTrue for a company (legal person).
national_idNoNational code or economic code.
business_nameNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=true, so the safety profile is covered. The description adds genuinely useful context beyond them: the operation creates real data and requires user confirmation, plus the practical fact that the returned `code` feeds invoices. It omits failure behavior (duplicate email/phone) and auth requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero waste, and the highest-value constraints – what it does, the returned code, and the confirmation requirement – are front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool whose annotations already carry the safety profile and which has no output schema, the description covers purpose, the return value, and the confirmation prerequisite. It is only slightly incomplete in not addressing the 50% undocumented parameter surface or error cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 8 parameters at only 50% schema description coverage, the description must compensate but adds no input-field meaning at all; it only mentions the returned code. Half the fields (email, last_name, first_name, business_name) have no schema description and the description does nothing to fill that gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Save a new customer in the PayPing account') and distinguishes itself from the get/list_customer siblings by adding the returned `code` needed for invoices. An agent can tell exactly what this does without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides a concrete pre-call condition: 'Creates real data: confirm the details with the user before calling.' This is a clear when-to-use caveat, but it never names alternatives (e.g., payping_get_customer to check for an existing customer first) or exclusions, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

payping_create_invoicePayPing: create invoiceA
Destructive

Create an invoice for a saved customer; returns code, payCode and url (public pay page). Not sent: call payping_send_invoice or share the url. Creates real data: confirm customer, items and prices with the user before calling.

NameRequiredDescriptionDefault
itemsYes
notesNoShown to the customer.
titleNo
due_dateNoPay by this day (YYYY-MM-DD).
customer_codeYesFrom payping_create_customer.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=true, idempotentHint=false, so the mutation profile is known. The description adds genuinely new behavior: the invoice is created but NOT sent, and it demands user confirmation of customer/items/prices before execution. It stops short of explaining reversibility or what happens on retry (non-idempotent), which would be valuable given destructiveHint=true.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose and return values, then the routing rule, then the safety caveat — a sensible ordering in roughly three short sentences. The line break mid-sentence ("Not sent:\ncall payping_send_invoice") is slightly awkward but the content carries no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 5-parameter creation tool with no output schema, the description compensates by naming the return fields (code, payCode, url), stating the prerequisite, the non-send behavior, and the confirmation requirement. The remaining gap is the non-idempotent/destructive semantics — retry behavior and reversibility are not addressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 60%, so some documentation is already present. The description reinforces the semantic gist (customer, items, prices) and implies customer_code must reference an existing customer, but adds no detail on the undocumented fields (title, notes, quantity, has_tax) beyond what the schema says. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Create an invoice for a saved customer") and names the exact artifacts returned (`code`, `payCode`, `url`). It also distinguishes itself from payping_send_invoice and payping_create_payment_link by clarifying that the invoice is not dispatched, so an agent can pick between them without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit when-to-use-elsewhere rule: "Not sent: call payping_send_invoice or share the url." It also states a precondition ("saved customer") and a pre-call confirmation requirement ("confirm customer, items and prices with the user before calling"), leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

payping_create_productPayPing: create productA
Destructive

Create a product (financial item) and return its code. Then payping_create_payment_link makes a public payment page for it. Creates real data: confirm title and price with the user before calling.

NameRequiredDescriptionDefault
titleYes
has_taxNoAdd VAT to the price.
quantityNoStock; omit for unlimited.
descriptionNo
amount_tomanNoPrice in Toman.
amount_set_by_payerNoPayer types the amount (donations); no price.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=false and openWorldHint=true, so the safety profile is partly covered. The description adds real value on top: it flags that this writes production data, mandates user confirmation, and discloses the returned `code` field, which no structured field provides.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences with no filler; the mutation-and-confirm warning is front-loaded alongside the purpose rather than buried, and every clause carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, but the description names the returned identifier, and it covers the creation/confirmation flow for a 6-param write tool. Missing only secondary details such as currency handling for amount_toman versus amount_set_by_payer, which the schema partially covers.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67%, with most optional params (has_tax, quantity, amount_set_by_payer) already documented in the schema. The description only alludes to 'title and price', adding no syntax or constraint detail beyond what the schema supplies, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Create a product') plus a clarifying parenthetical ('financial item') and the return value ('return its `code`'). This cleanly separates it from the read-side siblings (payping_list_products, payping_get_product) and the follow-on payping_create_payment_link.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear workflow cue ('Then payping_create_payment_link makes a public payment page for it') and a hard precondition ('confirm title and price with the user before calling'). It stops short of naming when not to use it (e.g. versus create_invoice), but the routing for the common path is explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

payping_get_balancePayPing: wallet balanceA
Read-onlyIdempotent

Current PayPing wallet balance in Toman (money received and not yet withdrawn).

NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is covered. The description adds genuinely new context — the unit is Toman and the balance excludes already-withdrawn funds — but says nothing about auth requirements, freshness/caching, or multi-wallet behavior despite openWorldHint=true.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence that front-loads the resource and immediately qualifies it. No filler, no redundancy with the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no parameters, no output schema, and annotations covering the safety profile, very little is required from the description. The currency and balance definition are sufficient to call and interpret it, though an agent gets no hint about the response shape or what an empty/zero balance looks like.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline is 4 and the description correctly avoids inventing any. The unit (Toman) is the only semantic detail relevant to interpreting the result, and it is supplied.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource (PayPing wallet balance) and pins down its scope with the parenthetical 'money received and not yet withdrawn', which separates it from the sibling withdrawal tools. It does not, however, name or contrast with an actual sibling by name, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to call this versus payping_get_withdrawal or payping_list_transactions, and no prerequisites (e.g., authentication, token type) are mentioned. Usage is only implied by the resource name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

payping_get_couponPayPing: coupon detailB
Read-onlyIdempotent

One coupon by code: amount, expiry, max uses, number of buyers and their total spend.

NameRequiredDescriptionDefault
codeYes

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, non-destructive and openWorld, so the safety profile is covered. The description adds genuine value by disclosing the returned data (amount, expiry, max uses, buyer count and total spend), which no output schema provides. It stops short of error behavior (e.g. unknown code) or auth requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single dense sentence, front-loaded with the resource and lookup key, then the return fields. Every clause earns its place, though the field list is a touch listy rather than explanatory.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter lookup with an output-free schema, the description covers what an agent needs: the resource, the lookup key, and the shape of the return. It omits only edge-case behavior such as missing/invalid codes, which is a minor gap for a read-only tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and there is no description on the 'code' property, so the description must carry the burden. 'One coupon by code' implicitly informs the agent that the sole parameter is a coupon code identifier, but it adds no format, case-sensitivity, or length guidance beyond that.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource and scope: 'One coupon by code', which cleanly implies a single-item retrieval and implicitly contrasts with payping_list_coupons. It also enumerates the returned fields, so an agent knows exactly what it gets. The only gap is that it never names the sibling alternative, but the resource+cardinality is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no when-to-use guidance, no when-not-to-use, and does not point to payping_list_coupons or payping_create_coupon as alternatives. The 'by code' phrasing weakly implies the lookup key, but there is no explicit context for choosing this tool over its siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

payping_get_customerPayPing: customer detailA
Read-onlyIdempotent

One customer by code: name, contact details, address, national id, memo.

NameRequiredDescriptionDefault
codeYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description contributes the returned field set, which is genuinely useful, but says nothing about auth requirements, error behavior for unknown codes, or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single short sentence, front-loaded with the scoping constraint and followed by the returned fields. Nothing is wasted; the only slight weakness is that the field enumeration is comma-heavy rather than structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description reasonably compensates by listing the returned fields. Annotations carry the safety and world-access profile. For a one-parameter read tool this is close to complete, missing only auth/error context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter exists and schema description coverage is 0%, so the schema gives no meaning for 'code'. The description's 'by code' clarifies that the input identifies a single customer, but adds no format, source, or example beyond that minimal hint.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource and scope: 'One customer by code', immediately distinguishing it from payping_list_customers and payping_create_customer. It also enumerates the returned fields (name, contact details, address, national id, memo). The retrieval verb is implied rather than stated, so it falls just short of the top tier.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'By code' implies this is the single-record lookup versus the sibling list tool, so the usage is inferable. However, there is no explicit when-to-use statement, no exclusion of alternatives, and no mention of prerequisites such as authentication or obtaining a valid code.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

payping_get_invoicePayPing: invoice detailA
Read-onlyIdempotent

One invoice by code with its items, customer, status and payment code, plus url, the public page where the customer pays.

NameRequiredDescriptionDefault
codeYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent and non-destructive, so the safety profile is covered. The description adds real value beyond that by disclosing the response contents (items, customer, status, payment code) and clarifying what `url` means, which matters since there is no output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no waste: the core action leads and the returned fields follow. Every clause earns its place and nothing is padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only single-invoice getter with annotations covering safety and the description covering the returned fields, an agent has enough to call it correctly. The only minor gap is the absence of any hint at error behavior for a missing/invalid code.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single `code` parameter has 0% schema description coverage, but the description anchors it ('by code'), and the parameter is self-evident for a get-by-identifier tool. More detail on code format would help, but the semantics are adequately conveyed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

'One invoice by code' is a specific verb+resource statement that clearly identifies a single-record fetch rather than a list. It sits opposite list_invoices and create/send_invoice, though it doesn't name those siblings explicitly, so differentiation is implied rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: 'by code' suggests you call this when you already hold an invoice code, but the description never states when to prefer it over list_invoices or what happens if the code is unknown. No exclusions or alternatives are named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

payping_get_paymentPayPing: payment detailA
Read-onlyIdempotent

One payment by payment code: amount, dates, payer, card, fees, refund state, paymentStatus plus status_text. Use it to check whether a payment really succeeded.

NameRequiredDescriptionDefault
codeYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds that refund state and status_text are exposed, but says nothing about error behavior for a missing/invalid code or any rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the retrieval scope before the use case, and no filler. The middle field enumeration is a long run-on list but each item is informative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description's field inventory (amount, dates, payer, card, fees, refund state, status) is the agent's only view of the return shape, and it supplies that adequately for a simple read-by-id tool. Only the missing-error/not-found behavior keeps it from being fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single 'code' parameter has 0% schema description coverage; the description compensates by naming it a 'payment code,' which usefully disambiguates it from invoice or customer codes in this product family. It still omits format expectations (prefix, checksum, typical length) that would let an agent construct the value confidently.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (retrieve) and resource (one payment) scoped by payment code, and enumerates the returned fields (amount, dates, payer, card, fees, refund state, paymentStatus, status_text). That distinguishes it from siblings like list_transactions and get_invoice, though it never uses an explicit verb like 'Fetch' and slightly reads like a field list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use it to check whether a payment really succeeded' gives one concrete use case, which is more than a bare restatement. However, it names no alternatives or exclusions – an agent is not told whether to prefer this over list_transactions or how to handle an unknown code.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

payping_get_productPayPing: product detailB
Read-onlyIdempotent

One product by code: title, description, price (Toman), stock, tax, image, category.

NameRequiredDescriptionDefault
codeYes

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish the full safety profile (readOnly=true, idempotent=true, destructive=false, openWorld=true), so the description's burden is light. It usefully discloses the return contents, which matters because there is no output schema, but adds nothing on auth, error behavior, or lookup failures.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single compact sentence that front-loads the core action ('One product by code') and then the returned fields. No wasted words, though the fragment style lacks the structure that would make the field list scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple single-item read on an annotated, zero-config tool, the definition is nearly sufficient: safety is covered by annotations and return contents are enumerated in lieu of an output schema. Only the parameter format and error handling for an unknown code are unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry the meaning of 'code' — and it does, implying the parameter is a product code that selects a single product. It stops short of stating the code format or source, so it only partially compensates for the annotation-free parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('One product by code') and enumerates the fields returned (title, price, stock, etc.), so the agent knows exactly what it retrieves. It does not explicitly name or contrast with the sibling payping_list_products, though 'by code' implicitly distinguishes a single-item fetch from a list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit when-to-use guidance and no named alternative. The phrase 'by code' hints that a product code is required, but the description never says to prefer this over payping_list_products when a code is known, nor does it state any prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

payping_get_profilePayPing: account profileA
Read-onlyIdempotent

Show the PayPing account behind PAYPING_TOKEN: username, name, email, phone and verification flags. Use first to confirm the token works.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint/idempotentHint/non-destructive, so safety is covered externally. The description adds value beyond that by disclosing the auth mechanism (PAYPING_TOKEN) and the intended pre-flight/validation role, though it says nothing about failure behavior when the token is invalid.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the resource and field list, then the usage hint. No filler, no repetition of the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by listing the account fields returned, and a zero-parameter read tool needs little more. Auth source and intended use are both stated, so nothing required for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, which is explicitly the baseline-4 case. There are no parameters whose meaning could be clarified further.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb ('Show') and resource ('the PayPing account behind PAYPING_TOKEN') and enumerates the returned fields (username, name, email, phone, verification flags). This distinguishes it cleanly from siblings like payping_get_balance or payping_get_customer without needing to name them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use first to confirm the token works' gives a concrete, actionable context for invocation. It does not name alternatives or state when this tool is not appropriate, so it stops short of the explicit when/when-not needed for a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

payping_get_sales_summaryPayPing: sales summaryA
Read-onlyIdempotent

Sales totals for a period: total amount (Toman), transaction count and daily averages. Defaults to the last 30 days.

NameRequiredDescriptionDefault
to_dateNoLast day to include (YYYY-MM-DD, UTC).
from_dateNoFirst day to include (YYYY-MM-DD, UTC).

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent and non-destructive, so safety is covered. The description adds real behavioral value an agent cannot get from annotations: the returned metrics (totals, count, daily averages) and the default trailing-30-day window when no dates are supplied.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, front-loaded with what the tool returns and followed by the default-window behavior. Every clause earns its place with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only, idempotent summary with a rich annotation set and full parameter documentation, the description covers purpose, return fields and default range. It could be slightly more explicit about how the daily averages are computed or the aggregation boundary, but nothing needed to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and both date parameters are documented with format. The description still adds meaning beyond the schema by clarifying that omitting the dates means the last 30 days, resolving the null defaults the schema leaves unexplained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb+resource ('Sales totals for a period') and enumerates what is returned (total amount in Toman, transaction count, daily averages), so the agent knows exactly what this summarizes. It does not explicitly differentiate against siblings like payping_list_transactions, but no sibling offers a summary, so ambiguity is low.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Defaults to the last 30 days' implies the intended context of a periodic summary, but it never states when to prefer this over list_transactions for detail or get_balance for point-in-time figures. Usage is implied rather than guided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

payping_get_withdrawalPayPing: withdrawal detailA
Read-onlyIdempotent

Detail of one settlement by code: amount (Toman), request and payout dates, IBAN, bank tracking number.

NameRequiredDescriptionDefault
codeYes

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent and non-destructive, so safety is covered. Because there is no output schema, the description's disclosure of the returned fields (amount, request/payout dates, IBAN, bank tracking number) and the 'Toman' currency unit is genuinely useful additional context beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence that names the operation first and the returned fields second, with no filler. Appropriate size for a one-parameter read tool, though the telegraphic fragment style leaves little room for anything else.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-by-id tool with no output schema and one opaque parameter, the description covers the resource and the returned fields adequately and annotations cover behavior. The main omission is not telling the agent where the required 'code' comes from.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%: the single 'code' parameter is an undescribed string. The description adds only 'by code', clarifying it identifies the settlement, but gives no format, length or provenance for the identifier, so it only partially compensates for the documentation gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: 'Detail of one settlement by code', and the singular framing implicitly contrasts with the sibling payping_list_withdrawals. It is very clear what it returns, though it never names an alternative explicitly to help an agent choose between the two.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'by code' implies the tool is used once a settlement code is already known (e.g. from list_withdrawals), so usage is inferable. There is no explicit when-to-use/when-not-to-use guidance and no named alternative, leaving the list-vs-detail choice to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

payping_list_couponsPayPing: list couponsB
Read-onlyIdempotent

List discount coupons: name, type (0 = percent, 1 = Toman), amount, code, active, products it applies to.

NameRequiredDescriptionDefault
limitNoItems to return, 1-50.
offsetNoSkip this many items (paging).
searchNoText to search for.
include_archivedNoInclude archived items.

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is fully covered without the description. The description adds a useful data-model detail (coupon type encoding 0=percent, 1=Toman) but says nothing about pagination behaviour or whether archived coupons appear by default.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler; the resource and its key fields come first. It is appropriately sized, though the parenthetical field list is a slight run-on.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description's enumeration of returned fields is genuinely useful. However, for a paged, searchable list tool it omits how paging/search behave and omits any hint about result volume, leaving the agent to reconstruct that from the schema alone.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so limit, offset, search, and include_archived are already fully documented in the schema and the baseline is 3. The description's 'type' detail refers to a returned field, not any input parameter, so it adds no parameter meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a clear verb+resource ('List discount coupons') and even enumerates the returned fields, which helps an agent know what data it gets. It does not, however, distinguish itself from the sibling payping_get_coupon (single-coupon fetch), so an agent choosing between list and get gets no explicit signal.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to use this tool, no mention of the singular payping_get_coupon alternative, and no indication that the listing can be paged or filtered. Usage must be inferred entirely from the name and schema.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

payping_list_customersPayPing: list customersB
Read-onlyIdempotent

List saved customers (code, name, phone, email, business name) with the total count.

NameRequiredDescriptionDefault
limitNoItems to return, 1-50.
offsetNoSkip this many items (paging).
searchNoText to search for.

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered. The description adds useful return-content context (the fields and total count), which is valuable because there is no output schema, but it does not explain pagination behavior, search semantics, or what 'total count' represents. This is a modest addition beyond annotations, consistent with a 3.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence that packs the essential purpose and return content without any wasted words. It is appropriately sized for a simple list operation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a list tool with three optional parameters and no output schema, the description partially covers returns by naming fields and the total count. However, it omits pagination behavior (limit/offset) and how search interacts with the result set, leaving gaps that matter when no output schema exists.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so limit, offset, and search are fully documented in the schema itself. The description mentions returned fields, not parameters, and adds no syntax or behavioral meaning beyond what the schema already provides. Baseline 3 is correct when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) and resource (saved customers), and enumerates the fields returned plus the total count. It is clear what the tool does, but it does not explicitly differentiate itself from sibling tools like payping_get_customer (single customer) or payping_list_transactions, so it falls short of the sibling-differentiation bar for a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance on when to use this tool versus alternatives such as payping_get_customer for a single record, nor any prerequisites or context. Usage is only implied by the word 'List', which is not enough for a 3.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

payping_list_invoicesPayPing: list invoicesB
Read-onlyIdempotent

List invoices: code, number, title, status (0 draft, 1 awaiting payment, 2 paid, 3 overdue, 4 cancelled), total (Toman), due and paid dates, customer.

NameRequiredDescriptionDefault
limitNoItems to return, 1-50.
offsetNoSkip this many items (paging).
searchNoText to search for.
statusNo
customer_codeNo

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds the returned field set, but says nothing about pagination behavior, result ordering, or rate limits for a list operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single dense sentence that front-loads the verb and then the payload; every token carries information. The status legend is parenthetical and compact rather than sprawling.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the field list is the right thing to include and it is present. However, for a 5-parameter filtered list tool it omits any statement of filterability and paging semantics, so an agent cannot infer how to narrow results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 60%; limit/offset/search are documented in the schema, while status and customer_code are not. The description supplies the semantics of the status values (draft/awaiting payment/paid/overdue/cancelled), which partially compensates, but never explains that status, search or customer_code are usable filters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a clear verb+resource ('List invoices') and enumerates the fields the listing returns, so the agent knows exactly what it gets back. It does not differentiate from the sibling payping_get_invoice or explain how this list relates to payping_list_customers/transactions, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no mention of prerequisites, and no routing to alternatives such as payping_get_invoice for a single invoice. The status legend hints that statuses exist but never says the tool can be filtered by them.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

payping_list_productsPayPing: list productsB
Read-onlyIdempotent

List products (PayPing "financial items"): code, title, price (Toman), stock, active, has a payment link.

NameRequiredDescriptionDefault
limitNoItems to return, 1-50.
offsetNoSkip this many items (paging).
searchNoText to search for.
include_archivedNoInclude archived items.

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is fully covered externally. The description adds useful domain context (the items are called 'financial items', prices are denominated in Toman, and items carry a payment link), but says nothing about ordering, pagination total counts, or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single tight sentence with the core action front-loaded before the field enumeration; no filler. It is slightly compressed, packing the return-field list and the terminology alias into one clause, but every element earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description partly compensates by naming the returned fields (code, title, price, stock, active, payment link), which is the main information gap for this tool. Paging mechanics and default exclusion of archived items are left to the schema, but nothing critical for a simple list call is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% – limit, offset, search and include_archived are all self-documented, including ranges and defaults. The description adds no parameter-level detail (e.g. what search matches against, or that archived items are excluded by default), so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb (list) plus resource (products), and it disambiguates the domain-specific PayPing term 'financial items' so an agent doesn't confuse products with transaction line items. It also enumerates the returned fields. The sibling payping_get_product (singular retrieval) is only implicitly contrasted via the 'list' verb, so it falls just short of 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance: nothing says to reach for this instead of payping_get_product for a single item, nor when to set include_archived or use the search parameter. The description only describes payload contents, leaving routing entirely to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

payping_list_transactionsPayPing: list transactionsA
Read-onlyIdempotent

List payments (newest first) with amount (Toman), payer, description, isPaid and payment code, plus the total count for the same filter. Use payping_get_payment with a code for full detail.

NameRequiredDescriptionDefault
kindNo'received' = payments to you, 'paid' = payments you made; omit for both.
limitNoItems to return, 1-50.
offsetNoSkip this many items (paging).
to_dateNoLast day to include (YYYY-MM-DD, UTC).
from_dateNoFirst day to include (YYYY-MM-DD, UTC).

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered. The description adds genuinely useful behavior beyond that: results are newest-first, amounts are denominated in Toman, and the response includes a total count for the same filter. It does not mention auth requirements, rate limits, or pagination behavior, but the added return-shape context is real value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, both earning their place: the first front-loads what is returned and its ordering, the second handles sibling routing. No filler or repetition of schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return-shape burden and does so by enumerating the fields and the total count, which is the key information for a list tool. It omits pagination semantics (limit/offset interaction, maximums) that an agent would want when iterating over large result sets, and mentions nothing about the newest-first ordering interacting with date filters.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already explains kind (received/paid), limit range, offset paging, and the UTC YYYY-MM-DD date bounds. The description adds only the incidental "Toman" unit and "same filter" framing for the total count, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("List payments") and immediately defines the returned shape: amount in Toman, payer, description, isPaid, payment code, plus total count. It also distinguishes itself from the sibling payping_get_payment, which is the closest lookalike in the toolset.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear routing guidance: use this tool to enumerate payments, and switch to payping_get_payment with a code when full detail is needed. It does not state when-not to use it (e.g. versus payping_list_withdrawals or payping_get_sales_summary for aggregation), so it stops short of the full when/when-not/alternatives bar.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

payping_list_withdrawalsPayPing: list withdrawalsB
Read-onlyIdempotent

List settlements (withdrawals to your bank account): date, amount (Toman), code and whether it was paid out, plus the total count.

NameRequiredDescriptionDefault
limitNoItems to return, 1-50.
offsetNoSkip this many items (paging).

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is fully covered without the description. The description does add useful domain context (amount is in Toman, includes a paid-out flag and total count), but says nothing about ordering, paging behavior, or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence that identifies the resource and then enumerates the salient return fields. No filler, no redundancy with the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully names the returned fields (date, amount, code, paid status, total count), which is exactly what the agent needs to judge relevance. Only the absence of paging/ordering guidance and sibling routing keeps it short of full completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so limit and offset are already documented in the schema including defaults and ranges. The description adds no further parameter meaning, which is the expected baseline when the schema does the work.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb ('List') and resource ('settlements (withdrawals to your bank account)'), and even disambiguates the domain term settlement with the common-language equivalent. It does not explicitly contrast itself with the sibling payping_get_withdrawal, but the list-vs-get distinction is inferable from the names.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus payping_get_withdrawal or payping_list_transactions, and no mention of paging workflow despite limit/offset parameters. The agent must infer usage from the name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

payping_send_invoicePayPing: send invoiceA
Destructive

Send an invoice to its customer by SMS/email from PayPing. Messages a real person: confirm with the user before calling.

NameRequiredDescriptionDefault
codeYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly=false, destructive=true, openWorld=true and idempotent=false, so the safety profile is covered. The description adds genuinely new context: the effect leaves the system as an outbound SMS/email to a human recipient, which explains the open-world/destructive hints and justifies the confirmation requirement.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with zero filler: the action and channel first, then the operational caution. Nothing is repeated from the schema or annotations and nothing could be cut without losing information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter mutation with no output schema, the description covers what happens and the key behavioral risk, and annotations cover idempotency and world-openness. The remaining gap is the meaning of the required 'code' argument, which is never clarified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

One parameter ('code') with 0% schema description coverage, so the schema explains nothing and the description must compensate. The description only implies the code identifies the invoice; it never states the format, where the code comes from, or how to obtain it, leaving the sole required input under-specified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (send) and resource (invoice) plus the delivery channels (SMS/email) and the service (PayPing). It is clearly distinguishable from reads like payping_get_invoice, though it never explicitly contrasts itself with payping_create_invoice, the nearest write sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit caution — 'Messages a real person: confirm with the user before calling' — which tells the agent this is a user-visible, irreversible-feeling action rather than a safe retrieval. It does not name alternative tools or state what to do if the invoice was already sent, so it stops short of full 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.

  1. 21 tool updatesv0.2.0
    • Changedpayping_create_coupon9 fields changed
      • removedInput schema / properties / amount / title
        Removed value: -"Amount"
      • removedInput schema / properties / coupon_code / title
        Removed value: -"Coupon Code"
      • removedInput schema / properties / expires_on / title
        Removed value: -"Expires On"
      • removedInput schema / properties / kind / title
        Removed value: -"Kind"
      • removedInput schema / properties / max_uses / title
        Removed value: -"Max Uses"
      • removedInput schema / properties / name / title
        Removed value: -"Name"
      • removedInput schema / properties / product_codes / title
        Removed value: -"Product Codes"
      • removedInput schema / title
        Removed value: -"payping_create_couponArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "payping_create_couponDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedpayping_create_customer10 fields changed
      • removedInput schema / properties / business_name / title
        Removed value: -"Business Name"
      • removedInput schema / properties / email / title
        Removed value: -"Email"
      • removedInput schema / properties / first_name / title
        Removed value: -"First Name"
      • removedInput schema / properties / is_business / title
        Removed value: -"Is Business"
      • removedInput schema / properties / last_name / title
        Removed value: -"Last Name"
      • removedInput schema / properties / memo / title
        Removed value: -"Memo"
      • removedInput schema / properties / national_id / title
        Removed value: -"National Id"
      • removedInput schema / properties / phone / title
        Removed value: -"Phone"
      • removedInput schema / title
        Removed value: -"payping_create_customerArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "payping_create_customerDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedpayping_create_invoice13 fields changed
      • removedInput schema / $defs / InvoiceItem / properties / amount_toman / title
        Removed value: -"Amount Toman"
      • removedInput schema / $defs / InvoiceItem / properties / description / title
        Removed value: -"Description"
      • removedInput schema / $defs / InvoiceItem / properties / has_tax / title
        Removed value: -"Has Tax"
      • removedInput schema / $defs / InvoiceItem / properties / quantity / title
        Removed value: -"Quantity"
      • removedInput schema / $defs / InvoiceItem / properties / title / title
        Removed value: -"Title"
      • removedInput schema / $defs / InvoiceItem / title
        Removed value: -"InvoiceItem"
      • removedInput schema / properties / customer_code / title
        Removed value: -"Customer Code"
      • removedInput schema / properties / due_date / title
        Removed value: -"Due Date"
      • removedInput schema / properties / items / title
        Removed value: -"Items"
      • removedInput schema / properties / notes / title
        Removed value: -"Notes"
      • removedInput schema / properties / title / title
        Removed value: -"Title"
      • removedInput schema / title
        Removed value: -"payping_create_invoiceArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "payping_create_invoiceDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedpayping_create_payment_link7 fields changed
      • removedInput schema / properties / ask_address / title
        Removed value: -"Ask Address"
      • removedInput schema / properties / product_code / title
        Removed value: -"Product Code"
      • changedInput schema / properties / redirect_url / anyOf
        Previous value: -[
        -  {
        -    "maxLength": 500,
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 500,
        +    "pattern": "^https://\\S+$",
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / redirect_url / description
        Previous value: -"Page to open after payment."New value: +"https:// page to open after payment."
      • removedInput schema / properties / redirect_url / title
        Removed value: -"Redirect Url"
      • removedInput schema / title
        Removed value: -"payping_create_payment_linkArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "payping_create_payment_linkDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedpayping_create_product8 fields changed
      • removedInput schema / properties / amount_set_by_payer / title
        Removed value: -"Amount Set By Payer"
      • removedInput schema / properties / amount_toman / title
        Removed value: -"Amount Toman"
      • removedInput schema / properties / description / title
        Removed value: -"Description"
      • removedInput schema / properties / has_tax / title
        Removed value: -"Has Tax"
      • removedInput schema / properties / quantity / title
        Removed value: -"Quantity"
      • removedInput schema / properties / title / title
        Removed value: -"Title"
      • removedInput schema / title
        Removed value: -"payping_create_productArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "payping_create_productDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedpayping_get_balance2 fields changed
      • removedInput schema / title
        Removed value: -"payping_get_balanceArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "payping_get_balanceDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedpayping_get_coupon3 fields changed
      • removedInput schema / properties / code / title
        Removed value: -"Code"
      • removedInput schema / title
        Removed value: -"payping_get_couponArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "payping_get_couponDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedpayping_get_customer3 fields changed
      • removedInput schema / properties / code / title
        Removed value: -"Code"
      • removedInput schema / title
        Removed value: -"payping_get_customerArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "payping_get_customerDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedpayping_get_invoice3 fields changed
      • removedInput schema / properties / code / title
        Removed value: -"Code"
      • removedInput schema / title
        Removed value: -"payping_get_invoiceArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "payping_get_invoiceDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedpayping_get_payment3 fields changed
      • removedInput schema / properties / code / title
        Removed value: -"Code"
      • removedInput schema / title
        Removed value: -"payping_get_paymentArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "payping_get_paymentDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedpayping_get_product3 fields changed
      • removedInput schema / properties / code / title
        Removed value: -"Code"
      • removedInput schema / title
        Removed value: -"payping_get_productArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "payping_get_productDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedpayping_get_profile2 fields changed
      • removedInput schema / title
        Removed value: -"payping_get_profileArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "payping_get_profileDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedpayping_get_sales_summary4 fields changed
      • removedInput schema / properties / from_date / title
        Removed value: -"From Date"
      • removedInput schema / properties / to_date / title
        Removed value: -"To Date"
      • removedInput schema / title
        Removed value: -"payping_get_sales_summaryArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "payping_get_sales_summaryDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedpayping_get_withdrawal3 fields changed
      • removedInput schema / properties / code / title
        Removed value: -"Code"
      • removedInput schema / title
        Removed value: -"payping_get_withdrawalArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "payping_get_withdrawalDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedpayping_list_coupons7 fields changed
      • removedInput schema / properties / include_archived / title
        Removed value: -"Include Archived"
      • changedInput schema / properties / limit / description
        Previous value: -"Items to return, 1-50 (PayPing's maximum is 50)."New value: +"Items to return, 1-50."
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / properties / offset / title
        Removed value: -"Offset"
      • removedInput schema / properties / search / title
        Removed value: -"Search"
      • removedInput schema / title
        Removed value: -"payping_list_couponsArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "payping_list_couponsDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedpayping_list_customers6 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Items to return, 1-50 (PayPing's maximum is 50)."New value: +"Items to return, 1-50."
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / properties / offset / title
        Removed value: -"Offset"
      • removedInput schema / properties / search / title
        Removed value: -"Search"
      • removedInput schema / title
        Removed value: -"payping_list_customersArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "payping_list_customersDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedpayping_list_invoices8 fields changed
      • removedInput schema / properties / customer_code / title
        Removed value: -"Customer Code"
      • changedInput schema / properties / limit / description
        Previous value: -"Items to return, 1-50 (PayPing's maximum is 50)."New value: +"Items to return, 1-50."
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / properties / offset / title
        Removed value: -"Offset"
      • removedInput schema / properties / search / title
        Removed value: -"Search"
      • removedInput schema / properties / status / title
        Removed value: -"Status"
      • removedInput schema / title
        Removed value: -"payping_list_invoicesArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "payping_list_invoicesDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedpayping_list_products7 fields changed
      • removedInput schema / properties / include_archived / title
        Removed value: -"Include Archived"
      • changedInput schema / properties / limit / description
        Previous value: -"Items to return, 1-50 (PayPing's maximum is 50)."New value: +"Items to return, 1-50."
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / properties / offset / title
        Removed value: -"Offset"
      • removedInput schema / properties / search / title
        Removed value: -"Search"
      • removedInput schema / title
        Removed value: -"payping_list_productsArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "payping_list_productsDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedpayping_list_transactions8 fields changed
      • removedInput schema / properties / from_date / title
        Removed value: -"From Date"
      • removedInput schema / properties / kind / title
        Removed value: -"Kind"
      • changedInput schema / properties / limit / description
        Previous value: -"Items to return, 1-50 (PayPing's maximum is 50)."New value: +"Items to return, 1-50."
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / properties / offset / title
        Removed value: -"Offset"
      • removedInput schema / properties / to_date / title
        Removed value: -"To Date"
      • removedInput schema / title
        Removed value: -"payping_list_transactionsArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "payping_list_transactionsDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedpayping_list_withdrawals5 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Items to return, 1-50 (PayPing's maximum is 50)."New value: +"Items to return, 1-50."
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / properties / offset / title
        Removed value: -"Offset"
      • removedInput schema / title
        Removed value: -"payping_list_withdrawalsArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "payping_list_withdrawalsDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedpayping_send_invoice3 fields changed
      • removedInput schema / properties / code / title
        Removed value: -"Code"
      • removedInput schema / title
        Removed value: -"payping_send_invoiceArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "payping_send_invoiceDictOutput",
        -  "type": "object"
        -}New value: +null
  2. 21 tool updatesv0.1.0
    • First observedpayping_create_coupon
    • First observedpayping_create_customer
    • First observedpayping_create_invoice
    • First observedpayping_create_payment_link
    • First observedpayping_create_product
    • First observedpayping_get_balance
    • First observedpayping_get_coupon
    • First observedpayping_get_customer
    • First observedpayping_get_invoice
    • First observedpayping_get_payment
    • First observedpayping_get_product
    • First observedpayping_get_profile
    • First observedpayping_get_sales_summary
    • First observedpayping_get_withdrawal
    • First observedpayping_list_coupons
    • First observedpayping_list_customers
    • First observedpayping_list_invoices
    • First observedpayping_list_products
    • First observedpayping_list_transactions
    • First observedpayping_list_withdrawals
    • First observedpayping_send_invoice

TDQS

A3.7/5.0

Scored across 21 tools

Disambiguation5/5

Each tool targets a distinct resource+action pair (get_payment vs list_transactions, get_withdrawal vs list_withdrawals, list_coupons vs get_coupon), and entity types (payment, customer, product, coupon, invoice, withdrawal) are clearly separated. Descriptions reinforce boundaries so an agent can reliably pick the right tool.

Naming Consistency5/5

Every tool uses the payping_ prefix followed by a consistent verb_noun pattern (get_, list_, create_, send_). No camelCase mixing or divergent verb styles; the convention is fully predictable.

Tool Count4/5

21 tools is on the heavier side, but the domain legitimately spans payments, customers, products, coupons, invoices, withdrawals, profile and sales, each with reads and creates. It is slightly wide but each tool earns its place.

Completeness3/5

Read coverage is thorough (list+get for every entity) and creation is covered, but there are no update or delete operations for customers, products, coupons or invoices, and no refund/payment-charge tool. These are notable gaps that leave several lifecycle operations as dead ends.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Talk to your DeonPay merchant account from any MCP-compatible AI host. Enables reading transactions, creating payment links, inspecting subscriptions, and more.
    20
    4 npm
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Lets AI clients work with one or more Stax Payments merchant accounts over stdio, discovering and switching between accounts, finding customers, listing saved payment methods, and reading transactions. Read-only by default, with opt-in write tools for creating customers, charging saved payment methods, capturing, refunding, and voiding transactions.
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Lets an AI agent read a Pyxis dashboard's analytics — overviews, funnels, devices, acquisition, backend requests, visits and project settings — using a read-only access token created by an admin and revocable at any time. It runs locally over stdio, holds no state, and exposes only GET-style reads of the live Pyxis API.
    16
    2,203 npm
    MIT