The Question
“Can you show me all of the possible values for ATMCassetteStatusCode and when it is appropriate to use them? Should any filtering of dropdown values occur? When and why? Can you give me a truth table that both my developers and QA will understand?”
That is a question the average developer would spend an afternoon answering by digging through XSD files and spec PDFs. Watch what happens when the AI has a live connection to the repository.
Step 1 — The MCP Server Returns Every Value With Its Definition
The AI queries the Beneficial Strategies ISO 20022 MCP Server live, navigating the data dictionary directly to the ATMCassetteStatusCode code set. No searching, no guessing — the server returns the complete authoritative list in one call.
The spec defines it as: “Status of a cassette in an ATM.” Here are all 10 values, exactly as registered:
| Code | ISO Definition |
|---|---|
Ok |
The cash unit is in a good state. |
Full |
The cash unit is full. |
High |
The cash unit is high — it has reached or exceeded the threshold defined for this cassette. |
Low |
The cash unit is low — it has reached or is below the threshold defined for this cassette. |
Empty |
The cash unit is empty. |
Inoperative |
The cash unit is inoperative. |
Missing |
The cash unit is missing. |
NotAvailable |
The values of this cash unit are not available. |
NoReference |
There are no reference values available for this cash unit. |
Manipulated |
The device has been inserted when the device was not in an exchange state. |
The server also returns a second code set: ATMCassetteStatus1Code. This is the restricted profile of the base set — it carries the same 10 values but is used in specific versioned ATM messages (the cain message family). The base ATMCassetteStatusCode is the authoritative source of truth for definitions; the 1Code variant is the wire-format type used in message elements.
Step 2 — A Clarifying Question
Before producing the truth table, the AI asks:
“Should the truth table focus on: (a) which status values are valid inputs for each cassette type when reporting status to the acquirer, or (b) which status values should trigger alerts or automated responses in your ATM management system — or both?”
Answer: Both. Developers need to know what to send; QA needs to know what to test.
Step 3 — Context: The Six Cassette Types
The MCP server also returns ATMCassetteTypeCode — the six types of cassette an ATM may contain. This is the key to filtering, because the meaning of a status code changes entirely depending on what the cassette does:
| Type | Role | Fill concern | Drain concern |
|---|---|---|---|
Out |
Dispenses notes to customers | Low/Empty → ATM goes out of service | — |
In |
Accepts deposits from customers | Full → ATM can’t accept more | — |
Recycling |
Accepts deposits, then re-dispenses them | Both (fills from deposits, drains from dispenses) | Both |
Replenishment |
Staging cassette — holds extra notes before loading into Out |
Low/Empty → no backup stock | — |
Reject |
Collects notes rejected during dispense (unreadable, wrong denom) | Full → rejected notes have nowhere to go | — |
Retract |
Collects notes presented but not taken by customer within timeout | Full → retracted notes have nowhere to go | — |
All 10 status values are syntactically valid for all 6 cassette types — the ISO spec does not restrict which codes may appear for a given type. But the operational interpretation — and therefore the alert severity and any UI filtering — depends entirely on the cassette type.
Step 4 — The Truth Table
Part A — Operational Meaning by Cassette Type
This is the reference table for developers implementing status-handling logic. Read each cell as: “What does this status mean when reported for this cassette type?”
| Status | Out (Dispense) |
In (Deposit) |
Recycling |
Replenishment |
Reject |
Retract |
|---|---|---|---|---|---|---|
Ok |
Normal — notes available, below thresholds | Normal — space available | Normal — balanced | Normal — stock available | Normal — space available | Normal — space available |
Full |
Freshly loaded — note for informational log | Cannot accept more deposits — service needed | Deposit side full — dispense to drain | Maximum staging stock | Cannot collect more rejects — service needed | Cannot collect more retractions — service needed |
High |
Unusually well-stocked (rare; may indicate misconfiguration) | Approaching full — service soon | Approaching deposit-full OR dispense-high | Approaching max stock | Approaching full — service soon | Approaching full — service soon |
Low |
Approaching empty — replenishment needed soon | Nearly empty — normal after recent service | Low on dispense stock OR low on deposit space | Low — replenish staging stock | Nearly empty — normal after recent service | Nearly empty — normal after recent service |
Empty |
No notes left — ATM cannot dispense | Empty — normal after recent service | Completely balanced or unloaded | No backup stock | Empty — recently serviced | Empty — recently serviced |
Inoperative |
Hardware fault — ATM cannot dispense from this cassette | Hardware fault — cannot accept deposits | Hardware fault | Hardware fault | Hardware fault — rejected notes cannot be collected | Hardware fault — retracted notes cannot be collected |
Missing |
Cassette not loaded — ATM cannot dispense | Cassette not present — deposits impossible | Cassette not present | Cassette not present | Cassette not present — rejected notes fall loose | Cassette not present — retracted notes fall loose |
NotAvailable |
Sensors not reporting fill level — assume degraded | Sensors not reporting — assume degraded | Sensors not reporting | Sensors not reporting | Sensors not reporting | Sensors not reporting |
NoReference |
Thresholds not configured — Low/High impossible to evaluate |
Thresholds not configured | Thresholds not configured | Thresholds not configured | Thresholds not configured | Thresholds not configured |
Manipulated |
Security event — inserted outside exchange state | Security event | Security event | Security event | Security event | Security event |
Part B — Alert Severity and Service Impact
This is the table QA should use to verify alert routing. Each cell shows: alert severity / take ATM out of dispense service?
| Status | Out |
In |
Recycling |
Replenishment |
Reject |
Retract |
|---|---|---|---|---|---|---|
Ok |
— / No | — / No | — / No | — / No | — / No | — / No |
Full |
Info / No | 🟡 Warn / No | 🟡 Warn / No | Info / No | 🔴 Critical / No | 🔴 Critical / No |
High |
🟡 Warn / No | 🟡 Warn / No | 🟡 Warn / No | 🟡 Warn / No | 🟡 Warn / No | 🟡 Warn / No |
Low |
🟡 Warn / No | Info / No | 🟡 Warn / No | 🟡 Warn / No | Info / No | Info / No |
Empty |
🔴 Critical / Yes | Info / No | 🔴 Critical / Yes | 🔴 Critical / No¹ | Info / No | Info / No |
Inoperative |
🔴 Critical / Yes | 🔴 Critical / Yes | 🔴 Critical / Yes | 🔴 Critical / No¹ | 🔴 Critical / Yes² | 🔴 Critical / Yes² |
Missing |
🔴 Critical / Yes | 🔴 Critical / Yes | 🔴 Critical / Yes | 🔴 Critical / No¹ | 🔴 Critical / Yes² | 🔴 Critical / Yes² |
NotAvailable |
🟡 Warn / No | 🟡 Warn / No | 🟡 Warn / No | 🟡 Warn / No | 🟡 Warn / No | 🟡 Warn / No |
NoReference |
🟡 Warn / No | 🟡 Warn / No | 🟡 Warn / No | 🟡 Warn / No | 🟡 Warn / No | 🟡 Warn / No |
Manipulated |
🚨 Security / Yes | 🚨 Security / Yes | 🚨 Security / Yes | 🚨 Security / Yes | 🚨 Security / Yes | 🚨 Security / Yes |
¹ A
Replenishmentcassette beingEmpty/Inoperative/Missingdoes not prevent the ATM from dispensing now — but it removes the buffer for the next replenishment cycle. Raise a maintenance alert, not an out-of-service event.² If
RejectorRetractisInoperative/Missing, the ATM cannot safely route problematic notes — treat this as an out-of-service condition to avoid loose notes in the mechanism.
Part C — UI Dropdown Filtering Rules
When building a cassette management screen that allows operators to manually set or override a cassette status, apply these filtering rules:
| Rule | Rationale |
|---|---|
Never expose Manipulated as a selectable option |
Manipulated is set by the ATM hardware security module when a physical tamper event is detected. It cannot be a valid manual entry — if it appears in a dropdown, a malicious operator could clear it by selecting Ok. Treat it as read-only. |
Hide High/Low/Full/Empty when NoReference is active |
If no thresholds are configured for the cassette, threshold-relative statuses (High, Low) have no defined meaning and should not be offered. Full and Empty remain valid (they are absolute, not threshold-relative). |
Offer Full and Empty for Reject/Retract cassettes; suppress Low |
Low on a Reject or Retract cassette means “recently serviced” — it is a natural post-maintenance state and not a meaningful operator selection. Auto-set it after a service confirmation instead. |
NoReference is a configuration status, not an operator selection |
It indicates a missing system configuration. Expose it as read-only alongside a link to the threshold configuration screen. |
| All 10 values are valid in the protocol | The filter rules above are UX guidance, not protocol restrictions. The wire format accepts any of the 10 values for any cassette type. |
QA Test Checklist
Derived directly from the truth tables above. Cover these scenarios in your ATM management integration tests:
Status transitions — Out cassette:
[ ] Ok → Low: alert raised at warn severity; ATM stays in service
[ ] Low → Empty: alert escalated to critical; ATM taken out of dispense service
[ ] Any → Manipulated: security alert raised; ATM taken out of service immediately; not clearable via UI
[ ] Any → Inoperative: critical alert; ATM out of service
[ ] Any → Missing: critical alert; ATM out of service
[ ] Full → Ok: informational log; no alert
Status transitions — In cassette (deposit):
[ ] Ok → High: warn alert; ATM stays in service for deposits
[ ] High → Full: critical alert; deposits suspended
[ ] Full → Low: info (post-service); ATM accepts deposits again
[ ] Any → Manipulated: security alert; ATM fully suspended
Status transitions — Reject / Retract cassette:
[ ] Ok → Full: critical alert; ATM out of dispense service (no safe path for rejected notes)
[ ] Missing: critical alert; ATM out of dispense service
[ ] Post-service Empty: no alert; confirm ATM returns to service
NoReference guard:
[ ] High/Low statuses received when NoReference active: log warning; do not escalate as threshold breach
[ ] NoReference cleared (thresholds configured): resume threshold-relative alerting
Manipulated (security path):
[ ] Manipulated status received: security team notified; cassette locked out
[ ] Manipulated not selectable via management UI dropdown
[ ] Manipulated not clearable by standard operator role (requires security role)
What Just Happened?
The Beneficial Strategies ISO 20022 MCP Server returned the complete ATMCassetteStatusCode definition — all 10 values, with authoritative ISO definitions — in a single call. It also returned ATMCassetteTypeCode (the 6 cassette types), which is what makes a meaningful truth table possible: the same status code means something entirely different depending on what the cassette does.
Your developers have a reference table. Your QA team has a test checklist. Your UI filtering rules are in writing. None of it was guessed from training data — every code value and definition came live from the published ISO specification.
See what other questions the MCP server can answer for your payment engineering team.