Skip to main content
Glama

wayl-mcp

CI waylMCP MCP server License: MIT Python 3.10+

An MCP server for the Wayl payments API — take payments online in Iraq from an AI assistant.

Ask your assistant to "charge 25,000 dinars for a consultation" and it creates the payment link, hands you the checkout URL, and can tell you later whether the customer actually paid. Works for anything you sell: physical goods, digital downloads, services, tickets, invoices.

Wayl is an Iraqi payment gateway. All amounts are in Iraqi Dinar (IQD).

waylMCP MCP server

Setup

You need an API key. Wayl's guide says to email jisr@wayl.io to request a merchant token; their API reference says it is in your merchant dashboard. Try the dashboard first, then email. Your store must be verified before it can create links.

uv sync

Then set the key:

export WAYL_API_KEY="your-merchant-token"

Check it works:

uv run python -c "import asyncio, wayl_mcp.server as s; print(asyncio.run(s.verify_auth_key()))"

Related MCP server: PayPal

Connecting it

Claude Code

claude mcp add wayl --env WAYL_API_KEY=your-merchant-token -- uv run --directory /absolute/path/to/wayl_MCP wayl-mcp

Claude Desktop

In claude_desktop_config.json:

{
  "mcpServers": {
    "wayl": {
      "command": "uv",
      "args": ["run", "--directory", "/absolute/path/to/wayl_MCP", "wayl-mcp"],
      "env": {
        "WAYL_API_KEY": "your-merchant-token",
        "WAYL_ENV": "test"
      }
    }
  }
}

Use an absolute path — the server is launched from an arbitrary working directory.

Configuration

Variable

Default

Purpose

WAYL_API_KEY

Required. Merchant token, sent as X-WAYL-AUTHENTICATION.

WAYL_ENV

test

Default environment for new links: test or live.

WAYL_BASE_URL

https://api.thewayl.com

API host.

WAYL_WEBHOOK_URL

Default webhook URL for new links.

WAYL_WEBHOOK_SECRET

Default webhook signing secret (10–255 chars).

WAYL_REDIRECT_URL

Where buyers land after paying.

WAYL_REFERENCE_PREFIX

order

Prefix for generated order IDs.

WAYL_TIMEOUT

30

HTTP timeout in seconds.

WAYL_ENV defaults to test so nothing moves real money until you opt in. Set it to live when you are ready to actually sell, or pass env="live" per call.

While in test mode, check_order_paid and parse_webhook report paid: true for a completed sandbox checkout but safeToFulfil: false — the payment is simulated, so the order should not be fulfilled. Branch on safeToFulfil, not paid.

Tools

Selling

Tool

Does

sell_item

Create a checkout link for a simple sale, with the price breakdown filled in.

check_order_paid

Answer whether an order is paid and safe to fulfil.

create_payment_link

Create a payment link with full control over every field.

Links

Tool

Does

get_payment_link

Fetch one link and its status.

list_payment_links

List links, newest first, filterable by status.

get_payment_links_batch

Look up to 100 links at once; reports which were missing.

invalidate_payment_link

Cancel an unpaid link.

invalidate_payment_link_if_pending

Cancel it only if still pending.

Products

Tool

Does

list_products

List your Wayl catalogue (Digital, Physical, Service).

get_product

Fetch one product's details.

Refunds

Tool

Does

create_refund

Request a refund. Needs a 100+ character justification.

list_refunds

List refund requests.

get_refund

Fetch one refund.

cancel_refund

Withdraw a refund still in Requested.

Webhooks and diagnostics

Tool

Does

parse_webhook

Verify a webhook's signature and report whether the order is paid.

verify_webhook

Signature check alone.

verify_auth_key

Confirm the API key works.

wayl_status

Show how the server is configured, without calling the API.

Read-only tools are marked readOnlyHint; refunds and invalidations are marked destructiveHint so your client can ask before running them.

Taking a payment

Creating the link:

Sell "Wireless keyboard" for 30000 IQD with 5000 delivery

sell_item builds the line items, generates a unique reference ID, and returns a checkout URL like https://checkout.thewayl.com/pay/I94F590I. Send that to the customer. It works the same for a service, a ticket or a digital download — set delivery_fee=0 when nothing ships.

For full control over webhooks, redirects and custom line items, use create_payment_link instead.

Finding out whether they paid — either poll:

Has order order-wireless-keyboard-a1b2c3 been paid?

or receive a webhook. Set webhookUrl and webhookSecret when creating the link, then pass each incoming request to parse_webhook, which verifies the signature and tells you whether to fulfil.

Webhooks

Wayl signs each delivery with HMAC-SHA256 over the raw request body, sending the hex digest in the x-wayl-signature-256 header.

Three things that break integrations:

  1. Hash the raw bytes. json.dumps(json.loads(body)) changes whitespace and key order, so the digest will not match. Verify before you parse.

  2. Wayl sends Content-Type: text/plain, so JSON body parsers may hand you an empty body. Read the raw body yourself.

  3. Deduplicate on the payload's id. There is no timestamp in the signature, so a captured request replays forever — and Wayl retries on timeout, so duplicates happen in normal operation too.

The webhook reports paymentStatus: "Paid", which is not one of the eight link statuses the REST API uses. parse_webhook handles that distinction.

Development

uv run pytest
uv run ruff check src tests

See CLAUDE.md for architecture notes and the API's sharp edges.

Licence

MIT

Available Tools

18 tools
cancel_refundA
Destructive

Withdraw a refund request before Wayl acts on it, so no money is returned.

Only refunds still in status 'Requested' can be cancelled. Once Wayl has moved one
to Refunded or Rejected this call will not take it back, so check with `get_refund`
first when you are unsure of the state.

`refund_id` is Wayl's own ID for the refund — the `id` returned by `create_refund`
— not your order's reference ID. If you only have the order, find it with
`list_refunds(reference_id=...)`.

This touches the refund request only; the payment link and the buyer's completed
payment are unaffected. To stop a buyer paying in the first place, use
`invalidate_payment_link_if_pending` instead.

Confirm with the user before calling. Undoing it means filing a fresh refund with
a new 100-character reason, and Wayl reviews that from scratch.
ParametersJSON Schema
NameRequiredDescriptionDefault
refund_idYesWayl's own ID for the refund — the `id` field in the `create_refund`, `get_refund` or `list_refunds` response. NOT your order's reference ID.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Annotations mark the tool as destructive, but the description adds meaningful context: it only affects the refund request, not the payment link or buyer's payment, requires user confirmation, and the undo involves filing a fresh refund with a new reason and re-review. This goes well beyond the annotation hints.

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?

Every sentence carries necessary information—state constraints, ID disambiguation, side effects, alternatives, and caution. The structure flows logically from action to limitations to confirmation, with no filler or redundancy.

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?

For a destructive, state-dependent tool, the description covers prerequisites, scope of impact, user confirmation, and consequences. An output schema exists, so return-value documentation is not needed here. The description is fully self-sufficient for correct invocation.

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 schema already thoroughly describes refund_id with 100% coverage. The description reinforces this and adds how to find the ID when only the order reference is available (list_refunds with reference_id). This exceeds the schema baseline.

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?

The description opens with a specific action: 'Withdraw a refund request before Wayl acts on it, so no money is returned.' It clearly identifies the resource (refund request) and the effect, and differentiates from sibling tools like invalidate_payment_link_if_pending.

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?

Provides explicit when-to-use and when-not-to-use guidance: only for 'Requested' status, not for 'Refunded' or 'Rejected', suggests checking get_refund first, and names the alternative invalidate_payment_link_if_pending for stopping payment. Also gives direction to list_refunds when only the order reference is known.

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

check_order_paidA
Read-onlyIdempotent

Answer whether an order is paid and safe to fulfil, from your reference ID.

Returns `paid: true` only for statuses Complete or Delivered. Wayl documents the
names of its eight link statuses and nothing else, so this server treats only
those two as settled. Check this before sending a download link or shipping a
copy — a link in status Created or Pending means the buyer has not paid yet.

`paid` and `safeToFulfil` are not the same thing. While this server is in test
mode, a settled payment is a sandbox simulation that moved no real money, so
`safeToFulfil` stays false even when `paid` is true. Act on `safeToFulfil`.

Read-only, so poll it as often as you need. When a webhook delivery arrives use
`parse_webhook` instead — it authenticates the payload and reads the webhook's
separate `paymentStatus` vocabulary. For the full link record use
`get_payment_link`; to reconcile many orders use `get_payment_links_batch`.

The returned `total` is a string, as Wayl sends it. Parse it before arithmetic.
ParametersJSON Schema
NameRequiredDescriptionDefault
reference_idYesYour own order ID — the referenceId used when the link was created. Not Wayl's internal link ID and not the checkout `code`.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the read-only and idempotent annotations, the description explains the exact semantics of `paid` (only Complete or Delivered statuses), the crucial distinction between `paid` and `safeToFulfil`, the test-mode behavior where `safeToFulfil` stays false, and the string type of `total`. This adds substantive context not available from annotations alone.

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?

While the description is long, every sentence earns its place by explaining status mappings, the safeToFulfil distinction, usage guidance, and return field types. It is well-structured, front-loaded with the core answer, and contains no redundant fluff.

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?

The description fully accounts for the tool's complexity by explaining the return fields (`paid`, `safeToFulfil`, `total`), the test-mode edge case, and the correct usage context. Even with an output schema present, it adds necessary business logic not inferable 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?

The schema description for `reference_id` already provides 100% coverage, explaining it is the user's own order ID and not Wayl's internal link ID or checkout code. The description adds no new parameter syntax or format, so it does not significantly enhance the schema's semantics.

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?

The description clearly states the tool 'Answer whether an order is paid and safe to fulfil, from your reference ID,' which is specific and distinguishes it from related tools like `parse_webhook` and `get_payment_link` by referencing alternatives.

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?

It explicitly instructs when to use the tool ('Check this before sending a download link or shipping a copy') and provides alternative tools for other scenarios ('When a webhook delivery arrives use `parse_webhook` instead; for the full link record use `get_payment_link`; to reconcile many orders use `get_payment_links_batch`').

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

create_refundA
Destructive

Request a refund against a paid order. This sends real money back to a customer.

The order must already be paid and linked to a customer, and `amount` may not exceed
what the buyer actually paid — run `check_order_paid` first if you are unsure the
order settled.

Wayl reviews the request, so the refund starts in status 'Requested' rather than being
applied immediately; while it sits there you can still withdraw it with `cancel_refund`.
Once Wayl moves it to 'Refunded' there is no undo, so confirm the amount with the user
before calling.

This POST is never retried automatically and Wayl offers no idempotency key: call it
twice and you have two refunds. Save the returned `id` — `get_refund` and `cancel_refund`
need it, and `list_refunds` is the only other place to recover it.
ParametersJSON Schema
NameRequiredDescriptionDefault
amountYesAmount to return in whole IQD. Minimum 1000, and no more than what the buyer actually paid.
reasonYesWhy the refund is warranted. Wayl requires 100-1500 characters — state what was bought, what went wrong, and what the customer asked for.
reference_idYesReference ID of the paid order to refund.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotation `destructiveHint: true`, the description discloses critical behavioral traits: the refund is irreversible once 'Refunded', there is no idempotency key so duplicate calls create duplicate refunds, and the returned `id` must be saved for `get_refund`/`cancel_refund`. It also notes the POST is never retried. This is rich, non-obvious context that annotations alone do not provide.

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?

The description is compact yet information-dense. Every sentence serves a purpose: what it does, prerequisites, approval flow, cancellation option, irreversibility warning, idempotency caveat, and ID recovery advice. The structure is logical, moving from action to lifecycle to cautions, with no redundant words.

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?

Given the tool's destructive nature and the existence of an output schema, the description covers all essential context: prerequisite conditions, workflow states, error-prone amount ceiling, no-undo warning, duplicate-risk, retry policy, and how to recover the ID. It fully equips an agent to invoke the tool correctly and handle follow-ups.

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 input schema already provides 100% coverage with clear descriptions for `reference_id`, `reason`, and `amount`. The description reinforces the amount constraint ('may not exceed what the buyer actually paid') and the reason length requirement, but adds no new per-parameter semantics beyond what the schema states. This meets the baseline for fully documented schemas.

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?

The description opens with a specific verb+resource: 'Request a refund against a paid order.' It clarifies the real-world effect ('sends real money back') and distinguishes from sibling tools like `list_refunds`, `get_refund`, and `cancel_refund` by focusing on the creation action. No ambiguity about what the tool does.

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?

The description gives explicit when-to-use and when-not-to-use guidance. It instructs calling `check_order_paid` first if unsure, notes that Wayl reviews the request so it starts as 'Requested', and explains that `cancel_refund` can withdraw it while pending. This clearly orients the agent relative to alternatives and prerequisites.

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

get_productA
Read-onlyIdempotent

Fetch one product's basic details by ID. Use it when you already have the ID from list_products or a product URL — there is no lookup by name or slug.

Returns a reduced field set: id, name, price, status, url, image, tags and
description. Stock (`qt`, `unlimited`), variants (`inventories`), discounts and
downloadable files are NOT returned here — for those, page `list_products` and
filter by id.

`price` is a string of whole IQD; parse it before doing arithmetic. Read-only:
nothing in the catalogue changes and nobody is charged. A blank product_id is
rejected before any request is made. The catalogue is unrelated to payment links —
selling still means creating one with `sell_book` or `create_payment_link`.
ParametersJSON Schema
NameRequiredDescriptionDefault
product_idYesWayl's own product ID, as returned in the `id` field by `list_products`. Not the product name, slug or public URL.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnly and idempotent hints, but the description adds significant behavioral context: 'nothing in the catalogue changes and nobody is charged,' 'A blank product_id is rejected before any request is made,' and the format warning that '`price` is a string of whole IQD; parse it before doing arithmetic.' This goes well beyond the structured hints and helps the agent anticipate edge cases.

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?

The description is well-structured: it leads with the purpose, then usage, exclusions (what's NOT returned), a critical data-format caveat, read-only reassurance, and a cross-tool clarification. Every sentence carries distinct, useful information; there is no filler or repetition of schema/annotations.

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?

Given the tool's complexity is low (one parameter), the description is nevertheless thorough. It covers the full field set returned (and what is omitted), the alternative for richer data, the ID source, and a payment-link disambiguation. An output schema exists, so return format is already defined, but the description adds the 'NOT returned' list, which is very helpful. No meaningful context 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 the param description already explains the ID is Wayl's own ID, not name/slug/URL. The tool description adds value by tying the ID source to `list_products` or a product URL, and by confirming no lookup by name is possible. This reinforces and slightly extends the schema without redundancy, though the core meaning is already present in the schema.

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?

The description opens with a precise verb+resource: 'Fetch one product's basic details by ID.' It clearly distinguishes from sibling tools like `list_products` and `get_payment_link` by stating it's for a single product and only basic details. No ambiguity about the tool's core function.

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?

Explicitly states when to use: 'Use it when you already have the ID from `list_products` or a product URL — there is no lookup by name or slug.' It also names an alternative for extended fields: 'for those, page `list_products` and filter by id.' Plus it clarifies the tool is unrelated to payment links, guiding against misuse.

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

get_refundA
Read-onlyIdempotent

Fetch one refund request by its Wayl refund ID: reason, linkId, referenceId, amount, initiatedBy and current status ('Requested', 'Refunded', 'Rejected' or 'Cancelled').

Use it to poll a refund you raised with `create_refund` — that call returns the `id` you
pass here. If all you have is the order's reference ID, use `list_refunds` with
`reference_id` instead; nothing on the payment link points back to its refunds.

Read-only: it never changes a refund. To withdraw one still in 'Requested', call
`cancel_refund`.

Wayl omits the refund's own ID from this response, so the server re-attaches it as
`refundId`. Amount is a number in whole IQD, unlike a link's `total`, which is a string.
ParametersJSON Schema
NameRequiredDescriptionDefault
refund_idYesThe refund's Wayl ID, as returned in `id` by `create_refund` or `list_refunds`. Not your order reference ID.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint. The description reinforces the read-only nature and adds non-obvious behavioral details: the server re-attaches the refund ID as `refundId` when omitted, and the amount is a number in whole IQD (unlike link's string `total`). No contradictions with annotations.

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?

The description is moderately long but every sentence earns its place: purpose, return fields, usage guidance, alternative tools, and two subtle response quirks. It opens with a clear, specific summary and avoids fluff.

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 only one required parameter and an output schema present, the description is more than sufficient. It covers the tool's role, its relationship to sibling tools, and key data type nuances, making the tool fully comprehensible in context.

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 schema already documents `refund_id` with 100% coverage, but the description enriches it by clarifying that this ID is what `create_refund` returns and is not the order reference ID. This helps prevent misuse without repeating schema text.

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?

The description clearly states it fetches one refund request by its Wayl refund ID and enumerates the returned fields (reason, linkId, referenceId, amount, initiatedBy, status). It distinguishes itself from siblings by explicitly contrasting with `list_refunds` and `cancel_refund`.

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?

It provides explicit when-to-use guidance: poll a refund you raised with `create_refund`, and if you have only the order's reference ID, use `list_refunds` instead. It also tells users to call `cancel_refund` to withdraw a pending refund, covering both when and when-not to use this tool.

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

list_productsA
Read-onlyIdempotent

List the products in your Wayl catalogue, newest first.

Covers Digital, Physical and Service products; Subscription products are not
returned by this endpoint. Digital products are the relevant kind for selling
ebooks, since they carry downloadable files.

This returns richer records than `get_product` does — stock (`qt`, `unlimited`),
variants (`inventories`), discounts and the downloadable file URL appear only here.
To inspect one product's stock, page this endpoint and filter by `id`.

Wayl returns no total count, so do not treat the number of rows as the size of the
catalogue: keep paging with `nextSkip` while `hasMore` is true. `price` comes back
as a string of whole IQD. Listing changes nothing and charges nobody — selling still
means creating a link with `sell_book` or `create_payment_link`.
ParametersJSON Schema
NameRequiredDescriptionDefault
skipNoHow many to skip, for paging.
takeNoHow many products to return.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

Although annotations already declare readOnlyHint, openWorldHint, and idempotentHint, the description adds critical context: listing changes nothing and charges nobody, returns no total count, requires paging via nextSkip/hasMore, returns price as a string, and provides richer records than get_product. This goes far beyond annotations.

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

Conciseness5/5

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

The description is well-structured, front-loaded with the core purpose, and every sentence provides useful information—no fluff. It covers scope, exclusions, returned record details, paging, price format, side effects, and alternatives without being redundant.

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 an output schema present and comprehensive annotations, the description fills remaining gaps: it explains the richer record content, paging limitations, price representation, and product type filters. This is complete for a list tool of this complexity.

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% for both skip and take, each with clear descriptions. The description does not elaborate on parameter usage beyond what schema provides, though it does mention paging behavior (nextSkip/hasMore) that relates to skip. Baseline 3 is appropriate given high schema coverage.

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?

The description opens with a clear specific action: 'List the products in your Wayl catalogue, newest first.' It identifies the resource (products) and the ordering, and later distinguishes from siblings like get_product and sell_book by clarifying what this endpoint does and does not return.

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?

The description explicitly states scope (Digital, Physical, Service) and exclusions (Subscription products are not returned), when to use it for stock inspection ('To inspect one product's stock, page this endpoint'), and names alternatives for selling (sell_book or create_payment_link). It also warns about paging semantics.

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

list_refundsA
Read-onlyIdempotent

List refund requests, newest first, optionally filtered by order reference or status.

Use this to recover a refund's Wayl `id`: `create_refund` returns it once, and it is the
only handle `get_refund` and `cancel_refund` accept. Pass `reference_id` to see every
refund raised against one order. When you already hold the refund ID, call `get_refund`
instead of paging this.

Refund statuses are 'Requested' (awaiting Wayl's decision, still cancellable),
'Refunded', 'Rejected' and 'Cancelled'. Amounts come back as numbers in whole IQD,
unlike a link's `total`, which is a string.

Wayl returns no total count, so do not read the row count as the number of refunds.
Keep paging with `nextSkip` while `hasMore` is true.
ParametersJSON Schema
NameRequiredDescriptionDefault
skipNoHow many to skip, for paging.
takeNoHow many refunds to return.
statusesNoFilter by refund status.
reference_idNoYour order reference ID — the one passed to `create_payment_link`. Shows every refund raised against that one order; omit to list refunds across all orders.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Goes well beyond annotations by explaining status meanings ('Requested' is cancellable), amount format (whole IQD numbers vs. string), and paging semantics (no total count, use nextSkip/hasMore). No contradiction with readOnlyHint.

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?

The description is well-structured and front-loaded with the core purpose. Each paragraph covers a distinct aspect (usage, statuses, paging) with no redundant or filler sentences.

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?

Given the output schema exists, the description doesn't need return details. It covers purpose, alternatives, filtering, statuses, amount types, and paging instructions, making it comprehensive for this list tool.

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 already covers all parameters, but description adds valuable semantics for statuses and reference_id. The paging reference to 'nextSkip' is slightly ambiguous against the 'skip' parameter, but overall it enriches parameter understanding.

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?

The description clearly states the tool lists refund requests with ordering and optional filters. It explicitly distinguishes from get_refund by emphasizing when to use this list vs. fetching a single refund by ID.

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?

Provides explicit use cases: recovering a refund ID when only order reference is known, and instructing to use get_refund instead when the ID is already held. Also clarifies the reference_id filter behavior.

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

parse_webhookA
Read-onlyIdempotent

Verify a Wayl webhook and summarise what it says about the order.

Use this for any incoming delivery: it authenticates the signature, parses the
payload and reports whether the order is paid, all locally with no network call.
Use `verify_webhook` when a bare valid/invalid boolean is enough, and
`check_order_paid` when polling by reference ID rather than handling a push.

The webhook's `paymentStatus` is a different vocabulary from the REST API's link
`status` — it reports "Paid", which is not one of the eight link statuses. This
tool reads the right field so you do not have to.

Never act on a payload where `verified` is false; that result carries no order
details. `paid` and `safeToFulfil` are deliberately different: while this server is
in test mode a settled payment is simulated, so `safeToFulfil` stays false even when
`paid` is true. Branch on `safeToFulfil`.

Deduplicate on `eventId` before delivering — Wayl retries, and the signature has no
timestamp, so a replayed request stays valid forever. A verified body that is not a
JSON object raises an error rather than returning a false verdict.
ParametersJSON Schema
NameRequiredDescriptionDefault
secretNoThe webhookSecret used when this link was created. Wayl scopes secrets per link, so pass the one matching this order.
headersNoThe webhook's headers; the signature header is found automatically.
raw_bodyYesThe webhook request body exactly as received, byte for byte. Wayl sends it with Content-Type: text/plain, so read the raw body rather than relying on a JSON body parser.
signatureNoValue of the x-wayl-signature-256 header.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

The description goes far beyond the annotations by revealing critical behaviors: it operates 'all locally with no network call,' handles the different paymentStatus vocabulary, simulates payment in test mode via safeToFulfil, and warns about replay attacks due to missing timestamps. This is valuable context not present in readOnlyHint or idempotentHint.

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?

Although long, every sentence earns its place for a security-sensitive webhook tool. It opens with the core purpose, moves to usage alternatives, then covers essential caveats. The structure is logical, front-loaded, and densely informative without redundancy.

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?

The description covers the full operational context: authentication, payload parsing, safety fields, idempotency, replay risks, and error behavior. Given the tool's complexity and the presence of an output schema for return values, this is comprehensive and leaves no critical gaps.

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%, so parameter meaning is already documented. The description adds extra semantic guidance, such as reading raw_body byte-for-byte because Wayl sends text/plain, and that headers/signature are found automatically. This supplements the schema with practical context, though it does not systematically walk through each parameter.

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?

The first sentence immediately states the specific verb and resource: 'Verify a Wayl webhook and summarise what it says about the order.' It distinguishes itself from siblings by explicitly naming the alternatives and their different use cases, making its purpose unmistakable.

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?

The description provides clear guidance on when to use this tool: 'Use this for any incoming delivery.' It also explicitly contrasts with alternatives: 'Use verify_webhook when a bare valid/invalid boolean is enough, and check_order_paid when polling by reference ID.' It adds operational warnings like deduplicating on eventId and never acting on unverified payloads.

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

sell_bookA

Create a checkout link for a book order, with the price breakdown filled in.

Builds the line items (copies, discount, delivery), computes the total as
price * quantity + delivery_fee - discount, generates a unique reference ID from
the title, and creates the payment link. Returns the checkout `url` to send the
buyer. The total must reach Wayl's 1000 IQD minimum or the call is rejected.

The buyer sees an itemised breakdown rather than a bare number, which is what you
want for anything beyond a single flat-priced copy.

Creating the link charges nobody — it only produces a checkout page, and a link
created with env='test' never moves real money at all. Do NOT deliver the book
(send a download link, ship a copy) until `check_order_paid` or `parse_webhook` returns
`safeToFulfil: true`. That is a different field from `paid`: a sandbox payment
settles and is still not something to ship against.

Use `create_payment_link` instead when you need a webhook, redirect or custom
line items for one order: here those URLs come from the server's
WAYL_WEBHOOK_URL, WAYL_WEBHOOK_SECRET and WAYL_REDIRECT_URL settings and cannot
be set per call. Persist the returned `code` — no other endpoint returns it.
ParametersJSON Schema
NameRequiredDescriptionDefault
envNo'live' takes real money, 'test' is a sandbox that charges nobody. Defaults to 'test'.
priceYesPrice of one copy in whole IQD — no decimal subunits. The order total after delivery and discount must still reach 1000 IQD.
titleYesBook title, used as the checkout line-item label. Long titles are truncated to Wayl's 255-character label limit; very short ones are padded to its 3-character minimum.
discountNoDiscount to subtract from the whole order, in whole IQD — not per copy.
quantityNoHow many copies.
delivery_feeNoDelivery or handling charge in IQD. Use 0 for ebooks.
reference_idNoYour order ID, unique across all your links. Generated from the title if omitted.
customer_noteNoFree-form note stored on the order as `customParameter` and echoed back on reads, for your own tracking. May be visible at checkout, so keep secrets out of it.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

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

The description discloses side effects: creating the link 'charges nobody', env='test' 'never moves real money at all', and it stresses the safeToFulfil requirement. This goes well beyond the annotations (readOnlyHint=false, destructiveHint=false) by explaining the real-world impact and the distinction between paid and safeToFulfil.

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?

The description is long but tightly packed: every sentence adds a distinct piece of information (purpose, calculation, minimum, env behavior, fulfillment warning, alternative tool, persistence hint). It's structured with clear paragraphs and no filler.

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 an output schema already present, the description still covers the key returned fields (`url`, `code`), the rejection condition (total below 1000 IQD), and the critical fulfillment check (`safeToFulfil`). Together with the rich annotations and schema, an agent has everything it needs to invoke this tool correctly.

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

Parameters5/5

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

The schema already documents all 8 parameters at 100%, but the description adds the exact formula (`price * quantity + delivery_fee - discount`), the 1000 IQD minimum, and title truncation/padding details. It also clarifies that discount applies to the whole order, not per copy.

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?

The opening sentence names the exact action and output: 'Create a checkout link for a book order, with the price breakdown filled in.' It goes on to specify the mechanics (line items, total computation, reference ID) and explicitly contrasts with create_payment_link, so the purpose is unmistakable.

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?

It tells the agent exactly when to prefer this tool: 'Use `create_payment_link` instead when you need a webhook, redirect or custom line items for one order.' It also gives the negative condition ('for anything beyond a single flat-priced copy') and warns about fulfillment timing, which is crucial usage context.

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

verify_auth_keyA
Read-onlyIdempotent

Check that the configured Wayl API key is accepted by the API.

Call this first when payment tools start failing — it distinguishes a bad or missing
key from a problem with the request itself. Returns the key's validity alongside the
base URL and default environment this server is using.

Makes one network call. To inspect configuration without touching the network —
whether a key is set at all, which env new links default to — use `wayl_status`.

Wayl authenticates before routing, so an unknown path answers 401 rather than 404: a
failure here means the key was rejected *or* WAYL_BASE_URL is wrong, and the status
code cannot tell the two apart. Success says nothing about test versus live — Wayl
uses one key for both, and the environment is chosen per link with `env`.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Adds significant behavioral context beyond the annotations: makes one network call, explains the 401-vs-404 routing behavior, and clarifies that success does not indicate test vs. live because Wayl uses a single key for both. This is genuinely useful nuance not derivable from readOnlyHint/openWorldHint/idempotentHint.

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?

The description is dense but each sentence earns its place: purpose, usage context, alternative, and caveats are all covered in a compact format. Front-loaded with the core purpose, then expands with relevant details without redundancy.

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?

For a zero-parameter diagnostic tool with a rich output schema, the description covers all necessary context: when to use, what it returns, key behavioral caveats, and the alternative. Nothing important seems missing, and the output schema handles return-form specifics.

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 has zero parameters, and the schema confirms this with 100% coverage. The description adds value by explaining what the return communicates (key validity, base URL, default environment), which is more than expected for a no-parameter tool. Baseline 4 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?

The description clearly states the tool's function: verifying that the configured Wayl API key is accepted. It uses a specific verb ('check') and resource ('API key'), and distinguishes itself from siblings by positioning it as the first diagnostic step when payment tools fail, in contrast to wayl_status for configuration inspection.

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?

Provides explicit guidance: call this first when payment tools start failing to distinguish bad key from request issues. It also names the alternative wayl_status for offline configuration inspection, giving a clear when-to-use vs. when-not-to-use distinction.

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

verify_webhookA
Read-onlyIdempotent

Check a webhook's HMAC-SHA256 signature and return only a valid/invalid answer.

Prefer `parse_webhook` for an incoming delivery — it verifies the signature *and*
extracts the payment status, event ID and a paid/not-paid verdict in one call.
Reach for this tool only when the boolean alone is what you need.

Runs locally; makes no network call. Treat a `valid: false` result as an attack
or a misconfiguration and ignore the payload — an unverified "payment complete"
event is exactly how someone gets a book without paying.

Pass the body exactly as received; the digest covers the raw request bytes, so
re-serialising the JSON breaks it. Secrets are per link, not per account. This
errors instead of answering when no signature or secret is available, or when the
secret falls outside Wayl's 10-255 characters — one that short cannot have signed
a real delivery.

`valid: true` does not mean the event is new. There is no timestamp or nonce, so a
captured delivery verifies forever. Deduplicate on the payload's `id`.
ParametersJSON Schema
NameRequiredDescriptionDefault
secretNoThe webhookSecret for this link. Defaults to WAYL_WEBHOOK_SECRET.
headersNoThe webhook's request headers. The signature header is found automatically, so you can pass the whole map instead of extracting it.
raw_bodyYesThe webhook request body exactly as received, byte for byte. Do not reformat or re-serialise it — that changes the signature.
signatureNoSignature from the webhook's signature header. Omit if you pass `headers` instead.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the readOnly/idempotent hints, the description discloses key behaviors: errors on missing signature/secret or out-of-range secret, no timestamp/nonce (so valid:true does not imply freshness), and instructs to treat invalid as an attack. It adds security-critical context without contradicting annotations.

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?

The description is organized into tight paragraphs, front-loading the core purpose and then layering context. Every sentence adds value, covering usage, failure modes, and security caveats without redundant fluff.

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?

The tool is security-sensitive and the description covers all essential context: what it verifies, when to use it, what invalid means, how to pass the body, error conditions, and idempotency/deduplication guidance. The output schema exists, so return values need no extra explanation.

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 parameter descriptions already explain each field. The tool description complements by reinforcing raw_body must be byte-for-byte, headers can be passed whole because signature is auto-found, and secrets are per link. This adds practical nuance beyond the schema.

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?

The description opens with 'Check a webhook's HMAC-SHA256 signature and return only a valid/invalid answer', using a specific verb and resource, and explicitly names the sibling 'parse_webhook' as an alternative that does more. This fully distinguishes the tool from its siblings.

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?

The description gives explicit guidance: 'Prefer parse_webhook for an incoming delivery' and 'Reach for this tool only when the boolean alone is what you need.' It also notes the tool runs locally with no network call, providing clear contextual usage direction.

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

wayl_statusA
Read-onlyIdempotent

Report how this server is configured, without calling the Wayl API.

Call this first when something looks misconfigured: it returns the base URL, whether
an API key is present, which environment new links default to (`defaultEnv` and
`liveMode`), which optional defaults are set, the reference prefix, and the fixed IQD
currency with its 1000 IQD minimum charge.

It reports presence, not validity — `apiKeyConfigured: true` only means a key was
found in the environment. Use `verify_auth_key` to confirm the key actually works.
Secret values are never returned, only booleans saying whether they are set.

Config is read once at start-up, so editing environment variables changes nothing
until the server is restarted. Makes no network call and changes no state.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnlyHint and idempotentHint, but the description enriches them with important behavioral details: it 'Makes no network call and changes no state,' never returns secrets (only booleans), and notes that config is read once at startup so env changes require restart. It also clarifies that `apiKeyConfigured` reports presence, not validity. These go beyond annotation-provided safety hints.

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?

Every sentence earns its place: main purpose, when to call, return fields (condensed), presence-vs-validity caveat, secret handling, startup read behavior, and side-effect note. The structure is logical and front-loaded with the most important information. Despite length, it is compact for the amount of nuanced content.

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?

Given zero parameters and a likely simple output schema, the description still covers edge cases (misconfiguration detection, key validity, env var changes, secret masking) and explicitly states side effects. It gives the agent everything needed to decide and invoke correctly, and it complements annotations and output schema without redundancy.

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 has zero parameters, so the baseline is 4. There are no parameter semantics to explain, and the description correctly avoids inventing any. The schema coverage is 100% (empty), so no compensation is needed.

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?

The description opens with a specific verb and resource: 'Report how this server is configured, without calling the Wayl API.' This clearly distinguishes it from sibling tools, which focus on links, products, refunds, webhooks, etc. The scope (configuration/status) 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 Guidelines5/5

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

Explicit guidance is given: 'Call this first when something looks misconfigured.' It also provides a direct alternative for a related need: 'Use `verify_auth_key` to confirm the key actually works.' This tells the agent exactly when to choose this tool versus a sibling.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 18 tool updatesv0.1.0
    • First observedcancel_refund
    • First observedcheck_order_paid
    • First observedcreate_payment_link
    • First observedcreate_refund
    • First observedget_payment_link
    • First observedget_payment_links_batch
    • First observedget_product
    • First observedget_refund
    • First observedinvalidate_payment_link
    • First observedinvalidate_payment_link_if_pending
    • First observedlist_payment_links
    • First observedlist_products
    • First observedlist_refunds
    • First observedparse_webhook
    • First observedsell_book
    • First observedverify_auth_key
    • First observedverify_webhook
    • First observedwayl_status

TDQS

A4.6/5.0
Disambiguation5/5

Every tool has a distinctly defined purpose, and the descriptions carefully cross-reference related tools (e.g., get_payment_link vs get_payment_links_batch vs check_order_paid, invalidate_payment_link vs invalidate_payment_link_if_pending). This makes selection unambiguous for an agent.

Naming Consistency4/5

Most tools follow a clear verb_noun pattern (create_, get_, list_, invalidate_, cancel_, verify_, parse_). The only outlier is wayl_status, which could have been get_status, but it remains understandable.

Tool Count4/5

18 tools is on the heavier side, but the server covers payment links, products, refunds, webhooks, and configuration—each area justifies several tools. The count feels appropriate for the scope, though some consolidation might be possible.

Completeness4/5

The core workflow (create payment link, monitor payment, verify webhook, refund) is fully covered. Minor gaps: product tools are read-only only, and there is no update operation for payment links, but these are not essential for the server's stated purpose of selling books.

Maintenance

ActivityMaintained
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    The PayPal Model Context Protocol server allows you to integrate with PayPal APIs through function calling. This protocol supports various tools to interact with different PayPal services.
    603
    190
    -
  • A
    license
    A
    quality
    C
    maintenance
    A Model Context Protocol (MCP) server for integrating with the SATIM payment gateway system in Algeria, enabling AI assistants to process CIB/Edhahabia card payments through the SATIM-ePAY platform.
    5
    18
    15
    GPL 3.0
  • A
    license
    A
    quality
    B
    maintenance
    MCP server for JazzCash mobile wallet and payments (Pakistan). Supports wallet payments, mobile account payments, vouchers, refunds, and balance inquiries.
    5
    20
    1
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/muthanii/waylMCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server