klarna-mcp
Provides tools for interacting with Klarna's merchant APIs, covering order management (retrieving order status, amounts, and lines), captures, refunds, payouts and settlement transactions (including payout summaries and CSV reports), payment disputes, and payment sessions. Read-only by default; optional write tools allow capturing orders, issuing refunds, extending authorization times, cancelling orders, and releasing remaining authorization.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@klarna-mcpcheck order 3a1f9b2c-7d4e-4a8f-9c1e-2b5d6f8a0c3d, and any captures"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
klarna-mcp: an MCP server for Klarna's merchant APIs
A small Model Context Protocol server that gives Claude, Cursor, Claude Code and any other MCP client access to Klarna's merchant APIs: orders, captures, refunds, payouts, settlement transactions, disputes and payment sessions.
It is read-only by default. Write tools (capture, refund, extend authorization, cancel, release) exist, but they are not even registered unless you set KLARNA_ENABLE_WRITES=true.
Built by Walma AI. There is a longer write-up in our guide: Klarna MCP. For how e-commerce teams use servers like this one, see AI for e-commerce.
Unofficial. This project is not made, endorsed or supported by Klarna, and is not affiliated with Klarna Bank AB. "Klarna" is a trademark of Klarna Bank AB, used here only to describe which API the server talks to.
Status: built against Klarna's documented API; not yet verified against a live Klarna environment. Try it on the playground first and please report anything that does not match.
Tools
All money amounts, in and out, are integers in minor units of the currency: 10000 means 100.00 SEK, EUR or USD.
Read tools (always available)
Tool | Klarna endpoint | What it does |
|
| Order status, amounts (authorized, captured, refunded, remaining), expiry, lines, captures and refunds |
|
| All captures on an order |
|
| One capture |
|
| One refund (all refunds are listed on the order) |
|
| Payouts with totals, by date range and currency, paginated |
|
| One payout by the reference on your bank statement |
|
| Totals per currency for a date range |
|
| Settlement transactions by payout and/or order, paginated |
|
| One payout with its transactions, as CSV text |
|
| All payouts and transactions in a date range, as CSV text |
|
| Disputes by order, state, reason, reference and dates, cursor-paginated |
|
| One dispute with its requests and deadlines |
|
| A Klarna Payments session (never creates or updates one) |
Write tools (only with KLARNA_ENABLE_WRITES=true)
Tool | Klarna endpoint | Annotation |
|
| destructive |
|
| destructive |
|
| not destructive |
|
| destructive |
|
| destructive |
Read tools carry readOnlyHint: true. Write tools carry readOnlyHint: false, and every write that moves money or cannot be undone carries destructiveHint: true, so clients that honour annotations ask before running them. Capture is marked destructive too: it is an additive call in API terms, but it charges a customer.
Related MCP server: amazon-mcp
Safety model
Read-only unless you say otherwise. Without
KLARNA_ENABLE_WRITES=true(exactlytrue) the write tools do not exist on the server, so the model cannot call them, whatever the prompt says.Playground first.
KLARNA_ENVdefaults toplayground. Point it atproductiononly after you have watched the tools behave on test orders.Idempotency on every write. Each write sends a
Klarna-Idempotency-Keyheader. The tool generates one if you do not pass it and returns it in the result; retry a failed or timed-out write with the sameidempotency_keyand Klarna executes it at most once (Klarna keeps keys for 24 hours).Credentials stay out of the conversation. They are read from the environment and sent only in the
Authorizationheader. Error messages are built from Klarna'serror_code,error_messagesandcorrelation_id, and anything that looks like a credential is redacted before it reaches the model.Use a dedicated credential. Create a separate API credential for the agent in the Klarna Merchant Portal so you can revoke it on its own.
Setup
1. Get API credentials
In the Klarna Merchant Portal, create an API credential for the environment you want. Klarna's keys say which one they belong to: klarna_test_api_... is for the playground, klarna_live_api_... for production. When you create the credential, Klarna shows a username (a UUID) next to the API key; use the username as KLARNA_USERNAME and the API key as KLARNA_PASSWORD, or set only KLARNA_API_KEY.
2. Install
The package is not on npm. Clone and build it:
git clone https://github.com/Walma-Labs/klarna-mcp.git
cd klarna-mcp
npm install
npm run buildThis gives you dist/stdio.js. Node 20 or newer is required.
3. Configure
Variable | Default | Meaning |
| API credential username | |
| API credential password (the API key or shared secret) | |
| Alternative to the two above: a | |
|
|
|
|
|
|
| off |
|
Region and environment map to Klarna's documented hosts:
Production | Playground | |
|
|
|
|
|
|
|
|
|
4. Add it to your client
Use the absolute path to your clone.
Claude Code
claude mcp add --transport stdio klarna \
-e KLARNA_USERNAME=your-username \
-e KLARNA_PASSWORD=your-password \
-e KLARNA_REGION=eu \
-e KLARNA_ENV=playground \
-- node /absolute/path/to/klarna-mcp/dist/stdio.jsAdd -e KLARNA_ENABLE_WRITES=true only when you want the write tools.
Claude Desktop (claude_desktop_config.json)
{
"mcpServers": {
"klarna": {
"command": "node",
"args": ["/Users/you/klarna-mcp/dist/stdio.js"],
"env": {
"KLARNA_USERNAME": "your-username",
"KLARNA_PASSWORD": "your-password",
"KLARNA_REGION": "eu",
"KLARNA_ENV": "playground"
}
}
}
}Cursor (.cursor/mcp.json or ~/.cursor/mcp.json)
{
"mcpServers": {
"klarna": {
"command": "node",
"args": ["/Users/you/klarna-mcp/dist/stdio.js"],
"env": {
"KLARNA_USERNAME": "your-username",
"KLARNA_PASSWORD": "your-password",
"KLARNA_REGION": "eu",
"KLARNA_ENV": "playground"
}
}
}
}Desktop clients do not expand ~ or inherit your shell's PATH, so use absolute paths (and the absolute path to node if it is not found).
Running it as a remote server
dist/http.js is a stateless streamable-HTTP entrypoint for hosting the server centrally. It listens on PORT (default 8080) with a /healthz endpoint and has no auth of its own: anyone who reaches the port uses your Klarna credentials. Only run it behind a gateway that authenticates callers. Programmatic hosts can import { createKlarnaServer } from "klarna-mcp" and mount it on any transport.
Using it
Example prompts for an e-commerce or finance team:
"Show me order
<klarna order id>: what is authorized, what is captured, and when does the authorization expire?""Sum up our Klarna payouts for September per currency: sales, fees, returns and what actually hit the bank."
"Get payout
<payment reference>and list its transactions. Which fees and returns are in it?""Which settlement transactions belong to order
<klarna order id>, and in which payout did the sale land?""List open disputes created in the last 30 days, grouped by reason, and tell me which deadlines are closest."
"Download the payout report CSV for
<payment reference>and reconcile it against this export from our shop."With writes on, on the playground: "Capture 450.00 SEK of order
<id>for the two lines that shipped today, with DHL tracking number 123."
Things to tell the agent:
Order ids are Klarna's order ids, not your shop's order number. Your number is
merchant_reference1on the order.Settlements dates are date-times. A bare date means midnight, so ask for
2026-09-30T23:59:59Zto include the last day.Transactions have no date filter in Klarna's API. Find the payouts for a period first, then list transactions per payout.
Disputes need enrollment. Klarna's Disputes API v4 requires your merchant account to be enrolled; an empty list can mean you are not. Klarna's v4 reference lists only the EU hosts.
Development
npm install
npm run build && npm test
KLARNA_USERNAME=... KLARNA_PASSWORD=... node dist/stdio.jsTests drive the real MCP wire and the real HTTP client against a mocked fetch, so they need no network or credentials. Try the server interactively with the MCP Inspector:
npx @modelcontextprotocol/inspector node dist/stdio.jsSources
Every endpoint, field and header comes from Klarna's published API reference:
Left out on purpose: the PDF settlement reports (binary), order updates (amount, lines, addresses, references, shipping info), due-date extensions and customer send-outs, dispute responses and evidence uploads, and creating payment sessions or orders.
License
MIT. Copyright (c) 2026 Walma AI AB.
Available Tools
13 toolsget_captureGet captureBRead-onlyIdempotent
Get one capture on a Klarna order by capture_id (amounts in minor units).
| Name | Required | Description | Default |
|---|---|---|---|
| order_id | Yes | Klarna order id (UUID), as returned at purchase. Not the merchant order number. | |
| capture_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is fully covered. The description adds one genuinely useful behavioral detail not in structured data — that amounts are in minor units — but says nothing about error cases, auth requirements, or lookup failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler, and the minor-units caveat is tucked in a parenthetical rather than buried. It is lean to the point of being terse for a tool with an undocumented required parameter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only getter with complete annotations and no output schema, the description covers the essentials (what is fetched, by which key, unit convention). It does not describe the returned capture's shape or error behavior, and one required parameter is undocumented anywhere.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%: order_id is documented as a UUID (not merchant number) while capture_id has no schema description at all. The description only restates that lookup is by capture_id and that the order is a Klarna order, adding no format or constraint detail for the undocumented parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get), resource (capture), and the key used to fetch it (capture_id) plus the owning entity (Klarna order). The singular 'one capture' implicitly contrasts with the sibling list_captures, but no sibling is named explicitly, so it stops short of full differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use or when-not-to-use guidance and never names alternatives like list_captures or get_order. An agent must infer that this is the right tool only when it already holds a capture_id.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_disputeGet disputeARead-onlyIdempotent
Get one dispute in its current state, including its requests, deadlines and evidence history (Klarna Disputes API v4).
| Name | Required | Description | Default |
|---|---|---|---|
| payment_dispute_id | Yes |
TDQS
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 earns credit by disclosing payload scope (requests, deadlines, evidence history) and freshness ("current state"), which matters because there is no output schema — though it omits auth or identifier-validity notes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the core action leads and the returned content follows. Every clause contributes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-item read with a full safety annotation set and no output schema, the description covers what is returned and the resources involved. The only notable gap is the absence of any identifier provenance or error behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the single required parameter payment_dispute_id gets no explanation of format, source, or constraints. "One dispute" only weakly implies that an identifier must be supplied; the description adds essentially no meaning beyond the schema's property name and maxLength.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ("Get one dispute") and scopes the result to current state plus requests, deadlines and evidence history. A sibling list_disputes exists, and the singular "one dispute" implies retrieval by identifier versus listing, though the sibling is not named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: you fetch a single dispute when you have an identifier and need its detail. There is no explicit when-to-use statement, no prerequisites, and no pointer to list_disputes for discovery versus this tool for detail.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_orderGet orderARead-onlyIdempotent
Get a Klarna order: status (AUTHORIZED, PART_CAPTURED, CAPTURED, CANCELLED, EXPIRED, CLOSED), order_amount, captured_amount, refunded_amount, remaining_authorized_amount, expires_at, order lines, captures, refunds, merchant references and addresses. Amounts in minor units. This is also where refunds for an order are listed (Klarna has no separate list-refunds endpoint).
| Name | Required | Description | Default |
|---|---|---|---|
| order_id | Yes | Klarna order id (UUID), as returned at purchase. Not the merchant order number. |
TDQS
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 genuine context beyond them: the status enumeration (including terminal states like CANCELLED/EXPIRED/CLOSED) and the minor-units convention, which materially affects how an agent interprets returned amounts.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the verb and resource before the field inventory. The long mid-sentence field enumeration is dense and arguably longer than needed, but every item listed is return-value information an agent would otherwise have to probe for.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing return values, and it does so by naming the key fields and the amounts convention. What remains unstated are error/not-found behavior and whether nested lists (captures, refunds) are paginated or truncated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single order_id parameter is already documented in the schema, including the UUID format and the 'not the merchant order number' caveat. The description adds no further parameter meaning, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Get a Klarna order') and immediately enumerates the data surfaced: status, amounts, order lines, captures, refunds, merchant references, addresses. It also pre-empts confusion with a sibling by explaining that refunds are listed here because there is no separate list-refunds endpoint.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The closing sentence gives concrete routing guidance: use this tool to see refunds for an order since Klarna exposes no separate list-refunds endpoint, which steers the agent away from hunting for a dedicated sibling. It stops short of explicit when-not-to-use conditions (e.g. expired or not-found orders) or pointing at list_captures / get_payment_session as complements.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_payment_sessionGet payment sessionARead-onlyIdempotent
Read a Klarna Payments session by session_id: status, order amount and lines (minor units), purchase country/currency, payment method categories and expiry. Useful when debugging a checkout that never became an order. This server never creates or updates sessions.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes |
TDQS
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 covered by structured data. The description adds genuine scope context beyond that: the enumerated session contents (including expiry) and the flat statement that 'this server never creates or updates sessions,' which prevents an agent from attempting mutation calls. It omits auth needs, rate limits, and behavior for expired/unknown session IDs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the verb, resource, and lookup key before the returned fields and use case. The closing 'This server never creates or updates sessions' largely restates readOnlyHint and is the one clause that doesn't fully earn its place, but overall there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with no output schema, the description usefully enumerates what comes back, so the agent knows what it can inspect without a response schema. The remaining gaps are minor: session_id format/derivation and the outcome when a session has expired or does not exist.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for a single required string parameter, and it only restates the identifier ('by session_id') without format, origin, or where to obtain the value. It confirms which entity the ID identifies (a Klarna Payments session), which is marginally useful, but adds little semantic detail beyond the property name.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (read) and resource (Klarna Payments session) keyed by session_id, then enumerates the payload surface: status, order amount and lines, country/currency, payment method categories, expiry. This is plainly distinct from the sibling set (disputes, orders, captures, payouts, transactions), so an agent can route 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete trigger scenario: 'Useful when debugging a checkout that never became an order,' which tells the agent this is a pre-order artifact lookup. It does not name an explicit alternative (e.g., use get_order once a purchase order exists) or state when-not-to-use, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_payoutGet payoutARead-onlyIdempotent
Get one Klarna payout by its payment_reference (the reference on your bank statement), with all totals in minor units.
| Name | Required | Description | Default |
|---|---|---|---|
| payment_reference | Yes | Payout reference, as shown on the bank statement or in list_payouts |
TDQS
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 one genuinely useful behavioral detail beyond them — totals are in minor units — but says nothing about error behavior when the reference is unknown or about the response shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, no filler, with the core action front-loaded and the identifier and unit convention appended as useful qualifiers. Nothing could be cut without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with no output schema, the description covers the identifier source and the currency-unit convention, which is the main non-obvious detail an agent needs. It stops short of describing what a returned payout contains, but the essentials are present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single parameter, so the schema already explains payment_reference, including that it appears on the bank statement or in list_payouts. The description's parenthetical largely restates that, adding only slight reinforcement, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (get one Klarna payout), names the identifying key (payment_reference), and scopes it against the sibling list_payouts / get_payout_summary by making clear it retrieves a single payout. An agent can select it 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the requirement of a bank-statement reference and the singular 'one payout', which distinguishes it from the list/summary siblings. However, there is no explicit when-to-use or when-not-to-use statement, and no sibling is named as an alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_payout_report_csvPayout report (CSV)ARead-onlyIdempotent
Download the settlement report for one payout, with all its transactions, as CSV text (Klarna's documented settlement report format). Use for reconciliation in a spreadsheet.
| Name | Required | Description | Default |
|---|---|---|---|
| payment_reference | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/openWorld/idempotent/non-destructive, so safety is covered. The description usefully adds the return format (CSV text), the payload scope (all transactions for one payout), and the format provenance (Klarna's documented settlement report format). Pagination, size limits, or error behavior for an unknown payout are not disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with what is returned and in what format before the usage hint. Minimal waste; the parenthetical format note is small but justified.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read tool with no output schema, the description covers the return format and content, which is what an agent most needs. The remaining gap is the meaning/source of payment_reference and behavior on invalid references.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single required parameter payment_reference, and the description only says 'for one payout' without clarifying whether that reference is the payout ID or a payment reference. An agent cannot tell from the definition what identifier value to supply or where to obtain it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (download), resource (settlement report for one payout, including its transactions) and output format (CSV text). The singular 'one payout' implicitly contrasts with the plural sibling get_payouts_summary_report_csv, but no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use for reconciliation in a spreadsheet' gives a concrete usage context that separates it from the JSON get_payout/get_payout_summary tools. It does not, however, state exclusions or name a direct alternative (e.g., get_payouts_summary_report_csv for multiple payouts).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_payouts_summary_report_csvPayouts summary report (CSV)ARead-onlyIdempotent
Download a CSV report of all payouts and their transactions between two dates. Can be large: keep the range short (a month or less).
| Name | Required | Description | Default |
|---|---|---|---|
| end_date | Yes | End: ISO 8601 date-time filter on payout date, e.g. 2026-09-01T00:00:00Z. A bare date means 00:00:00 of that day. | |
| start_date | Yes | Start: ISO 8601 date-time filter on payout date, e.g. 2026-09-01T00:00:00Z. A bare date means 00:00:00 of that day. |
TDQS
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 genuinely useful non-annotation context: the output can be large and the date range should be kept to a month or less, which warns the agent about payload size. It stops short of stating whether results are truncated or what the CSV contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no filler. The purpose is front-loaded and the operational caveat follows immediately; every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly names the return format (CSV) and warns about size, covering the essentials for a two-parameter report tool. It omits how the CSV is delivered (inline text, URL, or file reference), which is a minor gap for a download-style tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: both start_date and end_date document ISO 8601 format, examples, and bare-date semantics. The description only restates that there are two dates and adds no format or boundary detail beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (download) and resource (CSV report of payouts and their transactions) with the scope bounded by two dates. However, it does not distinguish itself from the near-identical sibling get_payout_report_csv (nor from get_payout_summary), so an agent cannot tell which report tool to pick without further inspection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The date-range framing implies usage context, and the size caveat hints at when this is appropriate, but there is no explicit when-to-use guidance and no alternative named for cases where a JSON, paginated listing (e.g. list_payouts) would be preferable. Guidance is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_payout_summaryPayout summaryARead-onlyIdempotent
Summary of all payouts in a date range, one entry per currency: total sales, fees, returns, commissions, holdback, releases, reversals, tax and settlement amount (minor units). Good for monthly reconciliation.
| Name | Required | Description | Default |
|---|---|---|---|
| end_date | Yes | End (use 23:59:59 to include the whole day): ISO 8601 date-time filter on payout date, e.g. 2026-09-01T00:00:00Z. A bare date means 00:00:00 of that day. | |
| start_date | Yes | Start: ISO 8601 date-time filter on payout date, e.g. 2026-09-01T00:00:00Z. A bare date means 00:00:00 of that day. | |
| currency_code | No | ISO 4217, e.g. SEK, EUR, USD |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description adds real behavioral detail beyond them: one entry per currency, the exact aggregate fields returned, and that amounts are in minor units. It omits granularity/auth/pagination details but adds meaningful context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose in one dense sentence, then a short usage hint. The field enumeration is long but each term earns its place for a financial summary; no filler sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so well by listing every aggregate field and the unit (minor units) plus the per-currency granularity. It could still note whether currency_code narrows the result, but it is otherwise sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so start_date/end_date format and the currency_code pattern are already fully documented in the schema. The description only echoes the date-range scoping and never mentions currency_code filtering, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (summary of payouts) and enumerates exactly what each entry contains, which cleanly separates it from the per-payout siblings list_payouts/get_payout. It does not name a sibling explicitly, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Good for monthly reconciliation" implies a usage context but gives no explicit when-to-use/when-not guidance and never names the competing aggregate tools (get_payout_report_csv, get_payouts_summary_report_csv) to route between them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_refundGet refundARead-onlyIdempotent
Get one refund on a Klarna order by refund_id: refunded_amount (minor units), time, description, reference and order lines. To list all refunds, use get_order.
| Name | Required | Description | Default |
|---|---|---|---|
| order_id | Yes | Klarna order id (UUID), as returned at purchase. Not the merchant order number. | |
| refund_id | Yes |
TDQS
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 covered. The description adds genuinely useful behavior beyond that: the exact return payload (refunded_amount, time, description, reference, order lines) with the unit caveat 'minor units', which matters because 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the action and key, followed by the alternative. The field enumeration is dense but earns its place since no output schema exists; the sentence is slightly overloaded with a colon-delimited list.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description compensates well for the missing output schema by listing the refund fields returned, and annotations cover the read-only/idempotent profile. The remaining gap is the undocumented refund_id format and any error/not-found behavior, though these are minor for a simple point-lookup tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50% — order_id is documented as a Klarna UUID that is explicitly not the merchant order number, while refund_id has no schema description at all. The description only restates that lookup is 'by refund_id' and does not give its format or clarify how it relates to order_id, so the schema plus description together still leave the second parameter under-specified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a precise verb+resource pair ('Get one refund on a Klarna order by refund_id') and enumerates the returned fields, so the agent knows exactly what entity it fetches and by which key. It also explicitly distinguishes itself from the listing path by naming get_order, so no sibling schema needs to be opened to disambiguate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear use context (retrieve a single refund by refund_id) and names the alternative tool for the listing case (get_order). It stops short of stating exclusions or prerequisites, such as whether the refund must already be settled or whether it requires the order to be fetched first, but the when-to-use routing is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_capturesList capturesBRead-onlyIdempotent
List all captures on a Klarna order, with captured_amount and refunded_amount (minor units), capture time, references and shipping info.
| Name | Required | Description | Default |
|---|---|---|---|
| order_id | Yes | Klarna order id (UUID), as returned at purchase. Not the merchant order number. |
TDQS
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. The description adds useful field-level context (captured_amount/refunded_amount in minor units, capture time, references, shipping info) but says nothing about pagination, result counts, or external-system behavior implied by openWorldHint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One tightly packed sentence with the resource and scope front-loaded and zero filler. Every clause (verb, target, returned fields) earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool, annotations cover safety and the schema fully covers the sole parameter; with no output schema, the description usefully enumerates return fields. The only shortfall is absent pagination/ordering guidance for a list endpoint.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the single order_id parameter is fully documented in the schema (UUID, not the merchant order number). The description contributes no additional parameter syntax or format detail, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource ('List all captures on a Klarna order') and even enumerates the returned fields, so an agent knows exactly what it does. However, it never distinguishes itself from the close sibling 'get_capture' (singular), leaving the agent to infer the difference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use or when-not-to-use guidance is provided, and no alternative tool is named. The phrase 'on a Klarna order' implies the context, but the agent receives no explicit routing advice versus get_capture or the other list_* siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_disputesList disputesARead-onlyIdempotent
List customer disputes (Klarna Disputes API v4) filtered by order, state, reason, purchase reference and date ranges. States: INITIATED, REPRESENTMENT, PRE_ARBITRATION, ARBITRATION, CLOSED. Cursor pagination: pass pagination.last_item from the previous page as starting_after. Your merchant account must be enrolled for the Disputes API; an empty list can also mean it is not.
| Name | Required | Description | Default |
|---|---|---|---|
| size | No | Page size; omit for Klarna's default | |
| state | No | ||
| reason | No | ||
| sort_by | No | Prefix with - for descending. Klarna default: created_at | |
| order_ids | No | ||
| merchant_ids | No | ||
| closed_at_end | No | ||
| created_at_end | No | Disputes created before, ISO 8601 UTC | |
| starting_after | No | Cursor: pagination.last_item from the previous page | |
| updated_at_end | No | ||
| closed_at_start | No | ||
| created_at_start | No | Disputes created at or after, ISO 8601 UTC | |
| updated_at_start | No | ||
| purchase_references | No | Your customer-facing order numbers | |
| payment_transaction_ids | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and openWorld, so the safety profile is covered. The description adds non-obvious behavior the annotations cannot express: the enrollment prerequisite and the important ambiguity that an empty list may mean the account is not enrolled, which prevents a false 'no disputes' conclusion.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with the verb/resource and filter axes before moving to domain states, pagination mechanics and the enrollment caveat. Little padding, though the state enumeration slightly duplicates the schema enum.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 15-parameter, no-output-schema listing tool with annotations already covering safety, the description supplies the crucial extras an agent needs: pagination protocol, enrollment precondition and the empty-result caveat. The remaining gap is that several filter parameters (merchant_ids, payment_transaction_ids) are not characterized anywhere.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 40% across 15 parameters, so the description must carry weight. It does add meaning for cursor usage (pass pagination.last_item as starting_after) and enumerates the valid state values, but it omits explanation of merchant_ids, order_ids, payment_transaction_ids, size, sort_by and the four date-range boundaries, leaving nearly half the surface undocumented in both places.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) plus resource (customer disputes) and enumerates the filter axes (order, state, reason, purchase reference, date ranges), so the agent immediately knows this is the multi-item search endpoint. It does not name get_dispute as the singular alternative, so differentiation from the sibling is left to inference 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives real operational context: the merchant account must be enrolled for the Disputes API, and an empty result can indicate non-enrollment rather than zero disputes. It also explains the cursor flow. It stops short of an explicit when-to-use-this-vs-get_dispute rule, but the list/fetch distinction is implied by the pagination guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_payoutsList payoutsARead-onlyIdempotent
List Klarna payouts (settlements to your bank account) with totals per payout: sale, fee, return, holdback, reversal, tax and settlement amounts, all in minor units. Filter by payout date range and currency. Paginated with size/offset; the response has a pagination object with total.
| Name | Required | Description | Default |
|---|---|---|---|
| size | No | 1-500, Klarna default 20 | |
| offset | No | Offset for pagination, default 0 | |
| end_date | No | End: ISO 8601 date-time filter on payout date, e.g. 2026-09-01T00:00:00Z. A bare date means 00:00:00 of that day. | |
| start_date | No | Start: ISO 8601 date-time filter on payout date, e.g. 2026-09-01T00:00:00Z. A bare date means 00:00:00 of that day. | |
| currency_code | No | ISO 4217, e.g. SEK, EUR, USD |
TDQS
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 then adds real behavioral context: amounts are in minor units, the response includes a pagination object with total, and each payout carries a defined set of total fields. That is meaningful disclosure beyond the structured data, though it says nothing about rate limits or default page size behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences with no filler: the resource definition and returned totals come first, then filtering and pagination. Every clause carries information and nothing is repeated from the schema verbatim.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by naming the per-payout total fields, stating units (minor units), and describing the pagination envelope with total. An agent can call and interpret it correctly. Missing only edge behavior such as default page size or empty-result handling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all five parameters with ranges, formats and defaults. The description only restates that filtering is by payout date range and currency and that size/offset drive pagination, adding the useful nuance that the date filter is on payout date rather than creation date, but no syntax beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb (List) and resource (Klarna payouts), and defines the resource parenthetically as settlements to your bank account, which removes ambiguity. It also enumerates the per-payout totals returned. It does not explicitly distinguish itself from close siblings like get_payout_summary or list_payouts_summary_report_csv, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States that results can be filtered by payout date range and currency and are paginated via size/offset, which implies the intended usage pattern. However, it gives no explicit when-to-use or when-not-to-use guidance, nor does it name the alternative tools (get_payout, get_payout_summary, the CSV report siblings) an agent should pick instead in other situations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_transactionsList settlement transactionsARead-onlyIdempotent
List settlement transactions (SALE, RETURN, FEE, REVERSAL and so on) with amount in minor units, order id, capture/refund ids, merchant references and payout reference. Filter by payout (payment_reference) and/or Klarna order_id. Klarna's API has no date filter here: to get a period, find the payouts with list_payouts and pass each payment_reference. Paginated with size/offset.
| Name | Required | Description | Default |
|---|---|---|---|
| size | No | 1-500, Klarna default 20 | |
| offset | No | Offset for pagination, default 0 | |
| order_id | No | Klarna order id to filter by | |
| payment_reference | No | Payout reference to filter by |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, open-world behavior, so the bar is lower. The description adds real context beyond them: the absence of a date filter in Klarna's API, the minor-units amount convention, and pagination via size/offset. It stops short of auth or rate-limit details, but the disclosed API constraint is the important behavioral fact.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with purpose and returned fields, then filters, then the workaround for date ranges, then pagination. No filler and nothing repeated from the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by naming the returned fields (amount in minor units, order id, capture/refund ids, merchant references, payout reference) and covers filtering and pagination. An agent has everything needed to call it correctly, including the cross-tool workflow for time-bounded queries.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description goes beyond the schema by explaining that payment_reference is a payout reference (obtained from list_payouts) and that the two filters can be combined ('and/or'), which is semantic linkage the schema's field descriptions do not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (settlement transactions), enumerates the transaction types (SALE, RETURN, FEE, REVERSAL) and the fields returned, and is clearly distinguishable from siblings like list_payouts and list_disputes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit filter conditions (by payout payment_reference and/or order_id) and, crucially, routes the agent to the sibling tool for date-range queries: 'find the payouts with list_payouts and pass each payment_reference', because the API has no date filter. This is exactly when-to-use/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.
13 tool updates
v0.1.0- First observed
get_capture - First observed
get_dispute - First observed
get_order - First observed
get_payment_session - First observed
get_payout - First observed
get_payout_report_csv - First observed
get_payout_summary - First observed
get_payouts_summary_report_csv - First observed
get_refund - First observed
list_captures - First observed
list_disputes - First observed
list_payouts - First observed
list_transactions
TDQS
Scored across 13 tools
Most tools target distinct resources (disputes, sessions, orders, captures, refunds, payouts, transactions). The main ambiguity is the payout cluster: get_payout_report_csv (one payout) vs get_payouts_summary_report_csv (range report) and list_payouts vs get_payout_summary differ by subtle wording. Descriptions mostly disambiguate, but the CSV pair could be misselected at a glance.
Names follow a consistent get_/list_ verb_noun pattern across the set (list_disputes, get_dispute, get_order, list_captures, get_capture, get_refund, list_payouts, etc.). The only minor wrinkle is payout (singular) vs payouts (plural) in the summary/report names, but conventions remain predictable.
13 tools is well-scoped for a Klarna merchant domain spanning disputes, payments sessions, orders, captures, refunds, payouts and settlement reports. Each tool maps to a distinct operation and none feels redundant or filler.
Read coverage is broad, but the surface is entirely read-only: there are no order creation, capture, refund, cancel or release operations, and disputes expose no actions (submit evidence, represent, arbitrate). This leaves obvious lifecycle gaps for a merchant integration, though it may be intentional for reconciliation-focused use.
Maintenance
Related MCP Connectors
Connect your ads, shop, analytics, social, CRM and finance platforms once, then let Claude, ChatGPT, Cursor or any MCP client read, join and explain your numbers. Public statistics from the World Bank, IMF, Eurostat, OECD, WHO and SEC filings come as context, searchable and chartable from the same tools. Read-only by design, every number carries its source.
Query your org's data in natural language — read-only MCP access to SQL, NoSQL, files & warehouses.
Hosted Amazon Seller Central and Amazon Ads MCP server for Claude, ChatGPT, Cursor, and agents.
Atendio is a WhatsApp AI assistant for businesses in Latin America, on the official WhatsApp Business Platform. This MCP server lets Claude (or any MCP client) list and read WhatsApp conversations, view analytics and assistant settings, and create, edit or delete the rules your AI assistant follows. Remote, OAuth 2.1; the business always reviews and publishes rule changes.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceEnables Claude to query Stripe data—customers, charges, subscriptions, invoices, balance, events, and more—through 17 read-oriented tools, with optional write protections and a read-only default for remote deployments.-
- AlicenseNot gradedqualityCmaintenanceEnables sellers to interact with Amazon Selling Partner API and Advertising API data—orders, inventory, pricing, ads, reports, and more—through MCP clients like Claude and Cursor.MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to read Kaufland marketplace seller data as MCP tools, including orders, order units, offers, shipments, tickets, storefronts, and warehouses.AGPL 3.0
- AlicenseAqualityCmaintenanceEnables Claude, ChatGPT and other MCP clients to read an Amiqus ID account—clients, onboarding records and steps, check results, templates, case status counts and webhooks—and, when writes are enabled, create records.9MIT