Monei MCP Server
Allows interaction with the Ethereum blockchain for portfolio queries, sending ETH and ERC-20 tokens, and swapping tokens on Ethereum via the Monei API.
Allows interaction with the Optimism blockchain for portfolio queries, sending ETH and ERC-20 tokens, and swapping tokens on Optimism via the Monei API.
Allows interaction with the Polygon blockchain for portfolio queries, sending MATIC and ERC-20 tokens, and swapping tokens on Polygon via the Monei API.
Allows interaction with the Solana blockchain for portfolio queries, sending SOL and SPL tokens, and swapping tokens on Solana via the Monei API.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Monei MCP ServerWhat's my wallet balance?"
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.
@mrmonei/mcp-server
MCP server for the Monei API. Gives any AI agent access to wallets, transfers, crypto sends, swaps, offramp, and bill payments through natural language.
Works with Claude Desktop, Cursor, and any MCP compatible agent platform.
Quick start
Claude Desktop
Add to claude_desktop_config.json:
{
"mcpServers": {
"monei": {
"command": "npx",
"args": ["-y", "@mrmonei/mcp-server"],
"env": {
"MONEI_API_KEY": "your_api_key_here",
}
}
}
}Restart Claude Desktop. You should see the Monei tools available in the tools menu.
Cursor (local)
Add to .cursor/mcp.json in your project:
{
"mcpServers": {
"monei": {
"command": "npx",
"args": ["-y", "@mrmonei/mcp-server"],
"env": {
"MONEI_API_KEY": "your_api_key_here"
}
}
}
}Cursor (remote via Railway)
{
"mcpServers": {
"monei": {
"url": "https://mcp.monei.cc/sse",
"headers": {
"Authorization": "Bearer your_api_key_here"
}
}
}
}Related MCP server: starling-bank-mcp
Environment variables
Variable | Required | Default | Description |
| Yes (stdio) | — | Your Monei API key. Not required in HTTP/SSE mode — pass via |
| No |
| Transport mode: |
| No |
| HTTP/SSE server port |
| No |
| Request timeout in milliseconds. Max 120000 |
| No |
| Override the live API base URL |
Transport modes
Mode | Use case | How to start |
| Claude Desktop, local Cursor | Default — just run the server |
| Custom agents, API integrations |
|
| Cursor remote, Claude.ai |
|
In http and sse modes the server is stateless and multi-user. Each client passes their own API key via Authorization: Bearer <key>. One deployed server serves many users.
Tool reference
Account
monei_get_account
Returns the authenticated user's profile.
Inputs: none
Returns:
{
"id": "string",
"email": "string",
"firstName": "string",
"lastName": "string",
"phone": "string"
}Example prompt: "Who am I logged in as?"
Wallet
monei_get_wallet
Returns NGN balance and all subwallets.
Inputs: none
Returns:
{
"ngnBalance": "number",
"subWallets": [{ "id": "string", "type": "string", "balance": "number" }]
}Example prompt: "What's my wallet balance?"
monei_get_evm_portfolio
Returns the full token portfolio for an EVM chain including USD values.
Inputs:
Field | Type | Required | Description |
| number | Yes | Chain ID. 56=BSC, 137=Polygon, 8453=Base, 1=Ethereum |
Example prompt: "What tokens do I have on Base?"
monei_get_solana_portfolio
Returns SOL and all SPL token balances with USD values.
Inputs: none
Example prompt: "Show my Solana wallet"
monei_get_my_solana_address
Returns the user's Solana wallet address.
Inputs: none
Example prompt: "What's my Solana address? I want to receive SOL."
monei_get_supported_networks
Lists all supported EVM chains with chain IDs and names.
Inputs: none
Example prompt: "What chains do you support?"
Deposits
monei_generate_deposit_link
Generates a payment link the user can open to deposit NGN.
Inputs:
Field | Type | Required | Description |
| number | Yes | Amount in NGN to deposit |
Returns:
{
"paymentLink": "string",
"reference": "string"
}Example prompt: "I want to deposit ₦50,000 into my Monei account"
monei_check_deposit_status
Checks the status of a deposit by reference.
Inputs:
Field | Type | Required | Description |
| string | Yes | Reference from |
Example prompt: "Did my deposit go through?"
NGN Payouts
monei_send_naira_to_bank
Sends NGN to a Nigerian bank account.
Inputs:
Field | Type | Required | Description |
| number | Yes | Amount in NGN |
| string | Yes | Bank code from |
| string | Yes | 10-digit account number |
| string | Yes | User's 4-6 digit transaction PIN |
| string | No | Transfer description |
Always call
monei_verify_bank_accountfirst and show the account name to the user before sending.
Example prompt: "Send ₦20,000 to my GTBank account 0123456789"
monei_send_naira_to_user
Sends NGN to another Monei user by email or phone.
Inputs:
Field | Type | Required | Description |
| string | Yes | Recipient email or phone number |
| number | Yes | Amount in NGN |
| string | Yes | User's 4-6 digit transaction PIN |
Example prompt: "Send ₦5,000 to john@gmail.com"
Banking utilities
monei_get_banks
Returns the full list of supported Nigerian banks with their codes.
Inputs: none
Example prompt: "What banks do you support?" / "What's the bank code for GTBank?"
monei_verify_bank_account
Verifies a bank account number and returns the account holder name.
Inputs:
Field | Type | Required | Description |
| string | Yes | 10-digit bank account number |
| string | Yes | Bank code from |
Returns:
{
"accountName": "string",
"accountNumber": "string",
"bankCode": "string"
}Always call this before any bank payout and show the account name to the user for confirmation.
Example prompt: "Verify account 0123456789 at GTBank"
Crypto sends
monei_send_crypto_evm
Sends native tokens or ERC-20s on any supported EVM chain.
Inputs:
Field | Type | Required | Description |
| string | Yes | Recipient wallet address (0x...) |
| string | Yes | Amount to send as a string (e.g. "0.1") |
| number | Yes | Chain ID |
| string | No | ERC-20 contract address. Omit for native token sends |
Example prompts:
"Send 0.01 ETH to 0x742d..."
"Send 100 USDT on BSC to 0x..."
monei_send_crypto_solana
Sends SOL or SPL tokens on Solana.
Inputs:
Field | Type | Required | Description |
| string | Yes | Recipient Solana address |
| string | Yes | Amount to send |
| string | No | SPL token mint address. Omit for SOL sends |
Example prompts:
"Send 2 SOL to 5AH3..."
"Send 50 USDC on Solana to 5AH3..."
Token swaps
monei_swap_tokens_evm
Swaps tokens on EVM. Routes automatically based on whether tokens are native or ERC-20.
Inputs:
Field | Type | Required | Description |
| string | Yes | Amount to swap |
| number | Yes | Chain ID |
| string | No | ERC-20 contract to sell. Omit when selling native token |
| string | No | ERC-20 contract to buy. Omit when buying native token |
| number | No | Slippage tolerance in basis points. Default: 50 (0.5%) |
Example prompts:
"Swap 0.1 ETH for USDC on Base"
"Swap 100 USDC for USDT on Polygon"
monei_swap_tokens_solana
Swaps tokens on Solana. Routes automatically between SOL and SPL tokens.
Inputs:
Field | Type | Required | Description |
| number|string | Yes | Amount to swap |
| string | No | Mint address of token to sell. Omit when selling SOL |
| string | No | Mint address of token to buy. Omit when buying SOL |
| number | No | Slippage tolerance in basis points. Default: 50 (0.5%) |
Example prompts:
"Swap 1 SOL for USDC"
"Swap 100 USDC for SOL"
Offramp
monei_get_offramp_quote
Gets the live exchange rate for selling crypto to NGN.
Inputs:
Field | Type | Required | Description |
| string | Yes | Token to sell: |
| string | Yes | Network: |
| number | Yes | Amount of token to sell |
| string | No | Fiat to receive. Default: |
Example prompt: "What's the rate for selling 100 USDT on Base today?"
monei_sell_crypto_for_naira
Sells crypto and settles the proceeds to a Nigerian bank account.
Inputs:
Field | Type | Required | Description |
| number | Yes | Amount of token to sell |
| string | Yes | Token to sell: |
| string | Yes | Network the token is on |
| string | No | Default: |
| string | Yes | Destination bank code |
| string | Yes | Destination account number |
| string | Yes | Account holder name from |
Returns:
{
"reference": "string",
"status": "string",
"amounts": { "crypto": {}, "fiat": {}, "exchangeRate": 0, "totalFee": 0 },
"onChain": { "depositAddress": "string" }
}Call
monei_get_offramp_quotefirst to show the rate. Callmonei_verify_bank_accountto get theaccountName. Show both to the user for confirmation before calling this.
Example prompt: "Sell 100 USDT on Base to my GTBank account 0123456789"
monei_track_offramp
Checks the status of an offramp transaction.
Inputs:
Field | Type | Required | Description |
| string | Yes | Reference from |
Statuses: initiated → awaiting_deposit → deposit_received → processing → fiat_sent → completed
Example prompt: "What's the status of my USDT sale?"
Bill payments
monei_get_bill_providers
Lists available billers and packages for a bill category.
Inputs:
Field | Type | Required | Description |
| string | Yes |
|
| string | Conditional | Required for non-electricity categories (e.g. |
Example prompts:
"What MTN data plans are available?"
"What electricity providers do you support?"
monei_pay_bill
Pays a bill. Routes to the correct payment method based on category.
Common inputs: category (required), plus category-specific fields:
Category | Required fields |
|
|
|
|
|
|
|
|
All categories also accept isSchedule, scheduleData, saveBeneficiary, beneficiaryName.
Always call
monei_get_bill_providersfirst to get validbilleranditemCodevalues.
Example prompts:
"Buy ₦1,000 MTN airtime for 08012345678"
"Pay ₦5,000 to my IKEDC meter 12345678901"
"Subscribe DSTV Compact for smartcard 1234567890"
"Pay my DSTV every month on the 1st"
monei_get_bill_history
Returns recent bill payment history across all categories.
Inputs: none
Example prompt: "Show my recent bill payments"
Transactions
monei_get_transaction_history
Returns recent wallet transactions.
Inputs: none
Example prompt: "Show my recent transactions"
monei_get_transaction
Gets a single transaction by ID or reference.
Inputs:
Field | Type | Required | Description |
| string | Yes | Transaction ID or reference string |
Example prompt: "What happened with transaction ref_abc123?"
Common agent patterns
These natural language prompts work well out of the box:
Check balance and send naira
"Check my balance, then send ₦10,000 to my GTBank account 0123456789. The bank code is 058."
Agent flow: get_wallet → verify_bank_account → confirm with user → send_naira_to_bank
Full offramp flow
"I want to sell 200 USDT on Polygon to my Access Bank account 0987654321"
Agent flow: get_offramp_quote → get_banks → verify_bank_account → show rate + account name → confirm → sell_crypto_for_naira → track_offramp
Buy airtime
"Buy ₦500 Airtel airtime for 08098765432"
Agent flow: get_bill_providers (AIRTIME, Airtel) → get_wallet → pay_bill
Swap and check
"Swap 0.05 ETH for USDC on Base, then show me my updated portfolio"
Agent flow: get_evm_portfolio → confirm → swap_tokens_evm → get_evm_portfolio
Peer transfer
"Send ₦2,000 to jane@example.com from my Monei wallet"
Agent flow: get_wallet → confirm balance → send_naira_to_user
Troubleshooting
Tools not showing up in Claude Desktop
Check that
MONEI_API_KEYis set inclaude_desktop_config.jsonRestart Claude Desktop fully after config changes
Check stderr logs:
tail -f ~/Library/Logs/Claude/mcp*.log(macOS)
Authentication failed — your API key is invalid or expired
Verify your API key in the Monei dashboard
Make sure
MONEI_ENVmatches the environment your key belongs to (sandbox vs live)In HTTP/SSE mode, check the
Authorization: Bearerheader is being sent
Rate limit exceeded — please wait a moment
The server automatically retries up to 3 times with exponential backoff
If you see this in a tool response, the retries were exhausted — wait 30 seconds and try again
Session not found or expired (SSE mode)
The SSE session expired (1 hour TTL) or the server restarted
Re-open the
/sseconnection your MCP client will reconnect automatically in most cases
Zod validation errors on tool inputs
The agent passed a wrong type (e.g.
"100"instead of100for an amount)All amount fields use
z.coerce.number()so string numbers are acceptedIf you see this, check the exact field name in the error message and fix the agent prompt
Security
API keys never appear in logs, error messages, or stack traces
Transaction PINs are request-scoped. never stored, cached, or logged
Zod validation runs before the SDK is touched. invalid input is rejected immediately
License
MIT
Available Tools
24 toolsmonei_check_deposit_statusCheck Deposit StatusARead-onlyIdempotent
Checks the status of a deposit by its reference string.
Use this after generating a deposit link to confirm whether the user has completed payment. Poll this every 30-60 seconds if the user is waiting.
Args:
reference (string): The reference returned from monei_generate_deposit_link
Returns: { "reference": string, "status": string, // "PENDING" | "COMPLETED" | "FAILED" | "CANCELLED" "amount": number, "currency": string, "paidAt": string | null }
Examples:
"Did my deposit go through?" -> call this with the reference from the deposit link
"Check if the ₦50k arrived" -> call this with the deposit reference
| Name | Required | Description | Default |
|---|---|---|---|
| reference | Yes | Transaction reference string returned from a previous operation |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Although annotations already mark it readOnly, idempotent, and non-destructive, the description adds substantial behavior: it reveals the return shape, all four possible status values, and the poll-until-resolution pattern. Since there is no output schema, this return contract is essential and well covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is cleanly sectioned: purpose, when-to-use, parameter, return contract, and examples. It is front-loaded with the operative verb and resource, and every block adds decision-relevant information. The examples are short and demonstrate natural-language invocation.
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, no-output-schema read-only tool, this is complete. It specifies the input, the full response contract including status enum, the intended workflow position after link generation, and the polling strategy. Nothing that an agent needs to correctly select and invoke the tool is missing.
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?
The input schema already documents 'reference' at 100% coverage, giving baseline 3. The description improves on that by identifying the exact provenance of the value: 'The reference returned from monei_generate_deposit_link.' This tells an agent where to obtain the parameter, which is more useful than the generic schema description.
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 opens with a clear verb-resource statement: 'Checks the status of a deposit by its reference string.' It names the exact resource (deposit), the action (check status), and the input (reference). Among siblings, only this tool and monei_generate_deposit_link involve deposits, so it is readily distinguishable.
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 explicitly explains when to call it: 'Use this after generating a deposit link to confirm whether the user has completed payment,' and gives a concrete polling cadence of every 30-60 seconds. It does not enumerate exclusions or name alternatives, but the usage context is specific enough for an agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
monei_generate_deposit_linkGenerate Deposit LinkA
Generates a payment link the user can open to deposit NGN into their Monei wallet.
This is the simplest deposit path and works in one call. The user opens the returned link, completes payment via their bank, and the funds arrive in their NGN wallet. Card and USSD multi-step flows are not supported through this tool.
Args:
amount (number): Amount in NGN to deposit (e.g. 50000 for ₦50,000)
customerEmail (string, optional): Pre-fills the email field on the payment page
customerName (string, optional): Pre-fills the name field on the payment page
customerPhone (string, optional): Pre-fills the phone field on the payment page
Returns: { "paymentLink": string, // URL the user opens to complete the deposit }
After returning the link, tell the user to open it to complete payment. Then they can ask you to check the status using the reference.
Examples:
"I want to deposit ₦50,000" -> amount: 50000
"Add ₦10k to my wallet" -> amount: 10000
| Name | Required | Description | Default |
|---|---|---|---|
| amount | Yes | Amount in NGN to deposit (e.g. 50000 for ₦50,000) | |
| customerName | No | Customer name to pre-fill on the payment page (optional) | |
| customerEmail | No | Customer email address to pre-fill on the payment page (optional) | |
| customerPhone | No | Customer phone number to pre-fill on the payment page (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavioral context beyond the annotations: this is a one-call flow, the user must complete the payment externally, and the agent should tell the user to check status afterward. The reference for status checking is mentioned but not fully defined, and the absence of an output reference field creates slight ambiguity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well organized with clear sections: purpose, args, returns, follow-up instructions, and examples. It front-loads the core workflow and every section contributes actionable guidance without unnecessary 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?
Given that there is no output schema, the description compensates by documenting the return shape and the post-return user flow. Examples and exclusions round out the context, but the 'reference' used for status checks is never clearly introduced, leaving a minor ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds value with practical natural-language examples ('₦50,000' -> 50000, '₦10k' -> 10000) and clarifies that the optional customer fields pre-fill the payment page. These details help the agent map user requests to correct parameter values.
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 states a specific action ('Generates a payment link'), a clear resource ('deposit NGN into their Monei wallet'), and explicitly distinguishes this from card and USSD multi-step flows. This makes it easy to separate from sibling tools like monei_send_naira_to_bank or monei_check_deposit_status.
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 clearly explains the intended deposit workflow: the user opens the returned link, pays via bank, and funds arrive in the NGN wallet. It also explicitly says card and USSD multi-step flows are not supported through this tool, though it does not name specific alternative tools for those flows.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
monei_get_accountGet AccountARead-onlyIdempotent
Returns the profile of the currently authenticated Monei user.
Use this at the start of a session to identify who is logged in, confirm the user's name and email, or check their verification status before proceeding with financial operations.
Returns: { "id": string, // Internal user ID "firstName": string, "lastName": string, "email": string, "phone": string, "verified": boolean, // Whether the account is fully verified (KYC) "haveTransactionPin": boolean, // Whether the user has set a transaction PIN "lastLoggedIn": string // ISO timestamp of last login }
Examples:
"Who am I logged in as?" -> call this tool
"Is my account verified?" -> check 'verified' field in response
"Do I have a transaction PIN set?" -> check 'haveTransactionPin' field
Error handling:
Returns error if API key is invalid or expired
Returns error if the account has been suspended
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, openWorld, idempotent, and non-destructive behavior. The description adds meaningful context beyond this: it discloses the exact response shape, indicates the data reflects the 'currently authenticated' user, and documents error cases such as invalid/expired API keys and suspended accounts.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with an opening summary, usage context, a concrete return shape, examples, and error handling. Each section adds value, especially since there is no output schema, and the structure is front-loaded with the most important information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity, zero parameters, and rich annotations, the description is complete. It compensates for the missing output schema by documenting all returned fields and provides enough guidance on authentication, examples, and error behavior for an agent to invoke and interpret this tool correctly.
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?
This tool has zero parameters, so the baseline is 4. There are no parameter semantics to explain, and the description correctly focuses on the returned profile and usage context instead of inventing unnecessary parameter details.
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 states a specific verb and resource: 'Returns the profile of the currently authenticated Monei user.' This clearly distinguishes it from sibling tools like monei_get_wallet or monei_get_transaction_history, which cover different resources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear guidance on when to use the tool: at the start of a session to identify the logged-in user, confirm identity, or check verification status. It does not explicitly mention when not to use it or name alternative tools, but the context is strong enough that an agent can select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
monei_get_banksGet BanksARead-onlyIdempotent
Returns the full list of Nigerian banks supported by Monei, including their bank codes.
Call this before any payout to a bank account if you do not already have the bank code. The bank code is required for both send_naira_to_bank and verify_bank_account.
Returns: { "banks": [ { "name": string, // Human-readable bank name (e.g. "Guaranty Trust Bank") "code": string, // Bank code to use in other tools (e.g. "058") } ] }
Examples:
"What banks do you support?" -> call this, show bank names
"What's the code for GTBank?" -> call this, find GTBank in list, return its code
User mentions a bank by name but you don't have its code -> call this first
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the description does not need to repeat safety semantics. It adds useful behavioral context by specifying the exact return shape and emphasizing that the bank code is 'required' by downstream tools, which goes beyond what annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core statement, followed by a highly relevant usage directive, a compact output example, and practical examples. Every section adds value; there is no filler or meaningless repetition, and the formatting makes it easy for an agent to scan.
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?
There is no output schema, so the description must document the return value, and it does so clearly with a banks array containing name and code. It also connects the result to the real-world workflow (bank payouts and verification), making the tool's role fully understandable in context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters and no parameter descriptions are needed. The description does not document parameters, but the 0-param schema makes this a non-issue. Baseline 4 is appropriate because there is no parameter burden the description must carry.
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 opens with a specific verb-resource pairing: 'Returns the full list of Nigerian banks supported by Monei, including their bank codes.' This clearly distinguishes it from sibling tools like get_supported_networks and get_transaction_history, and the title 'Get Banks' reinforces the resource without creating ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool: 'Call this before any payout to a bank account if you do not already have the bank code.' It also names the dependent tools (send_naira_to_bank and verify_bank_account), giving concrete routing guidance that is missing from most tool descriptions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
monei_get_bill_historyGet Bill HistoryARead-onlyIdempotent
Returns the user's recent bill payment history across all categories: airtime, data, electricity, and cable TV.
Use this when the user wants to review past bill payments, check if a payment went through, or audit utility spending.
Returns: { "bills": [ { "id": string, "reference": string, "type": string, // "AIRTIME" | "MOBILEDATA" | "UTILITYBILLS" | "CABLEBILLS" "billerName": string, "customer": string, // Phone, meter number, or smartcard depending on type "amount": number, "status": string, // "PENDING" | "SUCCESS" | "FAILED" "token": string | null, // Electricity token for prepaid meters "units": string | null, "createdAt": string } ], "total": number, "page": number, "totalPages": number }
Examples:
"Show my recent bill payments" -> call this
"Did my electricity payment go through?" -> call this, filter by type=UTILITYBILLS
"When did I last buy MTN airtime?" -> call this, filter by type=AIRTIME
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior. The description adds interpretive context beyond that: status enum semantics (PENDING/SUCCESS/FAILED) that directly enable the 'did my payment go through' use case, the type enum, and field meanings such as customer (phone/meter/smartcard) and token (electricity prepaid meter). The pagination envelope (page, totalPages) is disclosed too, though the 'recent' window and pagination mechanics are left undefined.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence states purpose, the second gives usage context, and the commented JSON block documents the output in one structured pass — appropriate since no output schema accompanies this tool. The three examples are distinct (list, status check, specific query) and earn their place, though the overall definition is on the longer side.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only tool with comprehensive annotations, this is nearly complete: the only thing the schema and annotations can't convey — return structure — is documented inline with field-level comments. The remaining gaps are minor: 'recent' is not time-bounded, and page size/pagination behavior is not described.
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?
The tool takes zero parameters, so the baseline is 4 and the description correctly avoids manufacturing parameter documentation. It instead documents the return payload thoroughly and offers client-side filtering guidance ('filter by type=UTILITYBILLS'), which is the closest thing to parameter semantics this tool has.
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 opens with a specific verb and resource — 'Returns the user's recent bill payment history' — and names the full category scope (airtime, data, electricity, cable TV). This explicit scope distinguishes it from sibling tools like monei_get_transaction_history (all transactions) and monei_pay_bill (initiating a payment), so an agent can route correctly without opening schemas.
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?
A dedicated paragraph states 'Use this when the user wants to review past bill payments, check if a payment went through, or audit utility spending,' which is clear, contextual guidance. Three concrete intent-to-action examples ('Did my electricity payment go through?', 'When did I last buy MTN airtime?') reinforce when to call it. However, no exclusions or explicitly named alternative tools are given, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
monei_get_bill_providersGet Bill ProvidersARead-onlyIdempotent
Returns available billers and packages for a given bill category.
Always call this before monei_pay_bill to get the correct biller codes and item codes needed for payment.
Routing:
UTILITYBILLS → returns all electricity providers (no billerName needed)
AIRTIME, MOBILEDATA, CABLEBILLS → requires billerName to filter (e.g. "MTN", "DSTV")
Args:
category (string): "AIRTIME" | "MOBILEDATA" | "CABLEBILLS" | "UTILITYBILLS"
billerName (string, optional): Network or provider to filter by. Required for non-electricity categories.
Returns for AIRTIME/MOBILEDATA/CABLEBILLS: { "providers": [ { "billerCode": string, // Use as 'biller' or 'disco' in monei_pay_bill "itemCode": string, // Use as 'itemCode' in monei_pay_bill (data/cable only) "name": string, // Human-readable package name "amount": number, // Fixed price (0 means user-specified amount) "validityPeriod": string | null } ] }
Returns for UTILITYBILLS: { "providers": [ { "name": string, // e.g. "Ikeja Electric" "code": string, // Use as 'disco' in monei_pay_bill "billerCode": string } ] }
Examples:
"What MTN data plans are available?" -> category: "MOBILEDATA", billerName: "MTN"
"What electricity providers do you support?" -> category: "UTILITYBILLS"
"Show me DSTV packages" -> category: "CABLEBILLS", billerName: "DSTV"
"Buy MTN airtime" -> category: "AIRTIME", billerName: "MTN" to get the biller code first
| Name | Required | Description | Default |
|---|---|---|---|
| category | Yes | Category of bill to pay. AIRTIME for airtime top-up, MOBILEDATA for data bundles, CABLEBILLS for cable TV (DSTV, GOtv, Startimes), UTILITYBILLS for electricity. | |
| billerName | No | Biller/network name to filter by. Required for AIRTIME, MOBILEDATA, CABLEBILLS (e.g. 'MTN', 'DSTV'). Not needed for UTILITYBILLS — all electricity providers are returned. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly and non-destructive behavior, and the description adds significant behavioral context beyond them: category-dependent response shapes, the fact that UTILITYBILLS returns all electricity providers, and how returned codes map to monei_pay_bill parameters. This does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is long but well-organized with Routing, Args, Returns, and Examples sections, and the critical prerequisite is front-loaded. It earns its length because there is no output schema. Minor redundancy with the schema's Args descriptions prevents a 5.
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 fully compensates by specifying return shapes for both UTILITYBILLS and the other categories, including the meaning of each field for downstream use. Examples cover the main category types, and routing rules are explicit, so an agent has enough context to invoke the tool correctly.
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 baseline is 3. The description adds extra semantic value by mapping billerCode/itemCode to monei_pay_bill fields and providing real examples for category/billerName combinations, helping the agent choose correct values beyond the schema alone.
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?
Description clearly states it returns available billers and packages for a bill category, using a specific verb and resource. It goes further to distinguish itself as the prerequisite lookup step before monei_pay_bill, separating it from payment and history siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs 'Always call this before monei_pay_bill' and details category-specific routing, including when billerName is required and when it is not. Concrete examples show query-to-argument mapping. It does not explicitly contrast with monei_get_bill_history for history lookups, so it stops short of full when-not/alternative coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
monei_get_evm_portfolioGet EVM PortfolioARead-onlyIdempotent
Returns the full token portfolio for the user's EVM wallet on a specific chain, including native token and all ERC-20 holdings with USD values.
Use this when the user wants a detailed breakdown of their crypto holdings on a specific EVM network (BSC, Polygon, Base, etc.). For a simple balance check, use monei_get_wallet instead.
Args:
chainId (number): The EVM chain to query. Common values: 56 (BSC), 137 (Polygon), 8453 (Base), 1 (Ethereum), 42161 (Arbitrum), 10 (Optimism).
Returns: { "walletAddress": string, "network": string, "totalPortfolioValueUSD": string, "nativeToken": { "name": string, "symbol": string, "balance": string, "balanceUSD": string, "priceUSD": string }, "tokens": [ { "name": string, "symbol": string, "contractAddress": string, "balance": string, "balanceUSD": string } ], "updatedAt": string }
Examples:
"What tokens do I have on BSC?" -> chainId: 56
"Show my Polygon holdings" -> chainId: 137
"What's my USDC balance on Base?" -> chainId: 8453, then check tokens array for USDC
| Name | Required | Description | Default |
|---|---|---|---|
| chainId | Yes | EVM chain to query. 56=BSC, 137=Polygon, 8453=Base, 1=Ethereum, 42161=Arbitrum, 10=Optimism, 534352=Scroll, 1135=Lisk |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, and non-destructive behavior, so the description's burden is lower. It adds useful context by stating the result includes the native token, all ERC-20 holdings, USD values, and by providing an explicit JSON return shape. No contradictions with the annotations are present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized into clear sections (purpose, usage, args, returns, examples) and front-loads the core behavior. The Args list somewhat repeats schema information and the Returns block is long, but it compensates for the lack of an output schema and remains scannable.
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-only tool, the description is complete: it states the exact data returned, provides the full response shape, gives example chainIds with natural-language triggers, and names the alternative tool. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents chainId with all eight const values and per-chain descriptions (100% coverage), so the baseline is 3. The description adds practical natural-language mapping examples ('What tokens do I have on BSC?' -> 56) and shorthand common values, though it omits Scroll and Lisk from its list.
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 opening sentence states a specific action ('Returns the full token portfolio') with a precise scope ('EVM wallet on a specific chain') and content ('native token and all ERC-20 holdings with USD values'). This clearly differentiates it from balance-only tools like monei_get_wallet and from Solana-focused siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs when to use the tool: 'Use this when the user wants a detailed breakdown of their crypto holdings on a specific EVM network.' It also names the alternative directly: 'For a simple balance check, use monei_get_wallet instead.' This direct routing leaves no ambiguity between siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
monei_get_my_solana_addressGet My Solana AddressARead-onlyIdempotent
Returns the user's Solana wallet address so they can share it to receive SOL or SPL tokens.
Use this specifically when the user says "What's my Solana address?" or "I want to receive SOL/USDC on Solana" or "Share my Solana wallet". For full portfolio details, use monei_get_solana_portfolio instead.
Returns: { "address": string // Solana wallet address (base58 encoded) }
Examples:
"What's my Solana address?" -> call this, show address
"I want to receive USDC on Solana" -> call this, present the address to share
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already establish read-only, idempotent, and non-destructive behavior. The description adds useful behavioral context beyond that: it returns a base58-encoded address and clarifies the purpose is for receiving SOL or SPL tokens. It doesn't add unnecessary claims about side effects or rate limits, which is appropriate for such a simple read-only tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized and front-loaded. It states the function, gives usage conditions, shows the return shape, and provides examples. Every sentence earns its place, and the examples are genuinely helpful without being redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read-only tool with rich annotations and no output schema, the description is complete. It provides the return format, typical use cases, example invocations, and a clear distinction from the relevant sibling tool. An agent has everything needed to select and call it correctly.
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?
The tool has zero parameters, so there is no parameter semantics to document. The description instead clarifies the output, which is the relevant semantic content. The baseline of 4 for a zero-parameter tool is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a clear verb and resource: 'Returns the user's Solana wallet address' for receiving SOL or SPL tokens. It also distinguishes itself from the sibling tool by explicitly directing portfolio-related needs to monei_get_solana_portfolio.
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 usage guidance is explicit: it lists concrete trigger phrases like "What's my Solana address?" and "Share my Solana wallet", and explicitly says when NOT to use it (when full portfolio details are needed). This leaves no ambiguity about when to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
monei_get_offramp_quoteGet Offramp QuoteARead-only
Gets the current exchange rate and expected NGN payout for selling a specific amount of crypto.
Call this before monei_sell_crypto_for_naira to show the user the rate and how much NGN they will receive. The rate is live — it will be locked when the sell is actually initiated.
Args:
token (string): Token to sell — "USDT", "USDC", or "CNGN"
network (string): Network the token is on — "base", "polygon", "arbitrum-one", "bnb-smart-chain", "ethereum", "optimism", "lisk", "scroll", "starknet"
amount (number): Amount of the token to sell (e.g. 100 for 100 USDT)
fiat (string, optional): Fiat to receive — defaults to "NGN"
Returns: { "token": string, "network": string, "amount": number, "fiat": string, "rate": string | number // Exchange rate data returned by the API }
Examples:
"What's the rate for selling 100 USDT on Base?" -> token: "USDT", network: "base", amount: 100
"How much naira will I get for 50 USDC on Polygon?" -> token: "USDC", network: "polygon", amount: 50
| Name | Required | Description | Default |
|---|---|---|---|
| fiat | No | Fiat currency to receive. Currently only NGN is supported. | NGN |
| token | Yes | Token to sell. Supported: USDT, USDC, CNGN | |
| amount | Yes | Amount of the token to sell as a number (e.g. 100 for 100 USDT) | |
| network | Yes | Blockchain network the token is on. Supported: base, polygon, arbitrum-one, bnb-smart-chain, ethereum, starknet, optimism, lisk, scroll |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral context beyond annotations by stating 'The rate is live — it will be locked when the sell is actually initiated,' which helps set user expectations about rate volatility.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with purpose, usage guidance, args, returns, and examples. Every section earns its place, the key usage instruction is front-loaded, and the examples are illustrative without padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite lacking an output schema, the description supplies a return shape with fields and types, which gives the agent a clear picture of what to expect. It also covers the operational context (call before selling), all parameters, and example invocations, making it complete for a read-only quote 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%, so the schema already documents token, network, amount, and fiat. The description adds value by restating parameters in plain language and including two concrete natural-language examples that map user phrases to parameter values, which helps an agent extract arguments correctly.
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 opens with a specific verb and resource: 'Gets the current exchange rate and expected NGN payout for selling a specific amount of crypto.' This clearly identifies the tool as a quote-fetching operation and distinguishes it from the related monei_sell_crypto_for_naira, which actually executes the sale.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool: 'Call this before monei_sell_crypto_for_naira to show the user the rate and how much NGN they will receive.' It gives clear contextual instruction, though it does not explicitly enumerate when-not-to-use scenarios or alternative quote-related tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
monei_get_solana_portfolioGet Solana PortfolioARead-onlyIdempotent
Returns the full token portfolio for the user's Solana wallet, including SOL balance and all SPL token holdings with USD values.
Use this when the user wants a breakdown of what they hold on Solana. For a simple balance check, use monei_get_wallet instead.
Args:
network (string, optional): 'mainnet-beta' (default), 'devnet', or 'testnet'.
Returns: { "address": string, // Solana wallet address "nativeBalance": string, // SOL balance "nativeBalanceUsd": number, "tokens": [ { "mintAddress": string, "name": string, "symbol": string, "balance": string, "valueUsd": number, "priceUsd": number } ], "totalValueUsd": number }
Examples:
"What's in my Solana wallet?" -> call with default network
"Do I have any USDC on Solana?" -> check tokens array for USDC symbol
"What's my SOL balance?" -> check nativeBalance field
| Name | Required | Description | Default |
|---|---|---|---|
| network | No | Solana network to use. Defaults to mainnet-beta. | mainnet-beta |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as read-only, idempotent, non-destructive, and open-world. The description adds useful behavior context by clarifying that it returns the full portfolio structure, not just a balance, and that the agent should inspect specific fields like tokens[].symbol or nativeBalance for different user intents.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded: purpose first, usage guidance second, then args, return shape, and examples. Every section adds decision-relevant value, and the examples map natural-language questions to the correct response fields.
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?
There is no output schema, so the description compensates by providing a detailed JSON response shape covering address, native balance, token entries, and total value. Combined with the sibling distinction and clear parameter documentation, nothing essential is missing for an agent to invoke this tool correctly.
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?
The input schema fully documents the single optional network parameter, including the enum values and default. The description repeats this information but adds no deeper semantics beyond what the schema already provides, 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?
The description uses a specific verb and resource: returns the full Solana token portfolio including SOL and SPL tokens with USD values. It also distinguishes itself from monei_get_wallet by stating its broader scope, so an agent can clearly tell which tool fits the request.
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 explicitly says to use this tool when the user wants a breakdown of their Solana holdings and points to monei_get_wallet for a simple balance check. This direct when-to-use and when-not-to-use guidance is exactly what agents need to disambiguate between siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
monei_get_supported_networksGet Supported NetworksARead-onlyIdempotent
Returns all EVM blockchain networks supported by Monei, including chain IDs, native tokens, and block explorer URLs.
Use this when:
The user asks what chains or networks are supported
The user mentions a chain name and you need the chain ID to pass to another tool
You need to help the user pick a network before a swap or crypto send
Returns: { "networks": [ { "chainId": number, "name": string, // e.g. "BNB Smart Chain" "nativeToken": string, // e.g. "BNB" "blockExploreUrl": string, "isTestnet": boolean } ] }
Examples:
"What networks do you support?" -> call this
"What's the chain ID for Polygon?" -> call this, find Polygon in the list
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, covering the safety profile. The description adds the 'all networks' scope and the exact return fields, which is useful but not a major relational disclosure beyond the annotations. No contradiction exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: a one-sentence purpose, a compact 'Use this when' list, an explicit return shape, and concrete example prompts. Every section earns its place, and the core purpose is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read-only lookup tool with no output schema, the description is complete: it defines the purpose, usage triggers, return structure, and field meanings. Combined with the rich annotations, nothing needed for correct invocation is missing.
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?
This tool has zero parameters, so the schema already fully defines the input. Per the rubric, a zero-param tool gets a baseline of 4; the description appropriately notes when to call it without needing to explain any parameter semantics.
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 states a specific verb and resource: 'Returns all EVM blockchain networks supported by Monei, including chain IDs, native tokens, and block explorer URLs.' This clearly distinguishes the tool from siblings like monei_get_banks or monei_get_wallet, which serve different data resources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit 'Use this when' scenarios, including looking up chain IDs and helping users choose a network. It does not explicitly mention alternatives or exclusions, but no sibling tool overlaps with this network-listing capability, so the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
monei_get_transactionGet TransactionARead-onlyIdempotent
Returns the full details of a single transaction by its reference string.
Use this when the user provides a specific transaction reference and wants to know its current status or details. For browsing recent activity, use monei_get_transaction_history instead.
Args:
reference (string): Transaction reference returned from a previous operation (e.g. "TXN_abc123xyz")
Returns: { "id": string, "reference": string, "type": string, "nature": string, "amount": number, "currency": string, "status": string, "narration": string | null, "metadata": object | null, "createdAt": string, "updatedAt": string }
Examples:
"What's the status of transaction TXN_abc123?" -> reference="TXN_abc123"
"Show me the details for ref_456xyz" -> reference="ref_456xyz"
Error handling:
Returns error if the reference does not exist or belongs to a different user
| Name | Required | Description | Default |
|---|---|---|---|
| reference | Yes | Transaction reference string returned from a previous operation |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, and non-destructive behavior. The description adds useful behavioral context beyond those annotations: it returns full details in a specified shape, supports current status lookup, and includes an error-handling note for nonexistent references.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded: purpose first, then usage guidance, then parameters, return shape, examples, and error handling. Each section earns its place and there is no redundant 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 simple one-parameter read-only tool, the description is complete: it explains when to use it, what it returns, includes the return fields, gives examples, and notes error behavior. The annotations cover safety, and the schema covers the parameter definition.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents the reference parameter. The description adds value beyond the schema by providing concrete example values like 'TXN_abc123xyz' and natural-language example queries that map to the required reference argument.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: 'Returns the full details of a single transaction by its reference string.' It also differentiates itself from monei_get_transaction_history by explicitly noting this tool is for a specific reference, not for browsing recent activity.
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 explicitly tied to a concrete user scenario: when the user provides a specific transaction reference and wants status or details. The description also names the alternative tool for browsing recent activity, giving the agent a clear routing decision.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
monei_get_transaction_historyGet Transaction HistoryARead-onlyIdempotent
Returns the user's recent transaction history across all transaction types.
Use this when the user wants to review past activity, check if a payment went through, or audit recent sends, swaps, or bill payments.
Returns: { "transactions": [ { "id": string, "reference": string, "type": string, // e.g. "OFFRAMP", "SWAP", "TRANSFER", "BILL_PAYMENT" "nature": string, // e.g. "DEBIT" | "CREDIT" "amount": number, "currency": string, "status": string, // e.g. "COMPLETED", "PENDING", "FAILED" "narration": string, "createdAt": string } ] }
Examples:
"Show my recent transactions" -> call this
"Did my USDT sale go through?" -> call this, filter by type=OFFRAMP
"What did I spend money on recently?" -> call this, show narration fields
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already convey read-only, idempotent, non-destructive behavior, so the description only needs to add operational context. It does by documenting the exact response envelope, the type/nature/status enums, and the fact that all transaction types are included. A minor gap is that 'recent' is not quantified and pagination is not mentioned, but this is not critical for a zero-parameter read tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well organized into purpose, usage, return shape, and examples. Every section earns its place, and the return sample is especially valuable because there is no output 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?
It compensates for the missing output schema with a detailed response example and gives enough usage context for a simple read-only call. It is not fully complete because it does not state whether a maximum history length or pagination exists, and the client-side filtering instruction is implicit rather than explicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With zero parameters, the baseline is 4, and the schema already covers everything. The description loses a point because the example 'filter by type=OFFRAMP' implies a filtering parameter that does not exist; it should clarify that filtering is done client-side on the returned transactions.
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 opens with a specific action and resource: 'Returns the user's recent transaction history across all transaction types.' It is clear about scope, but it does not explicitly differentiate from the sibling monei_get_transaction, so an agent has to infer the singular-vs-list distinction.
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 concrete use cases ('review past activity, check if a payment went through, or audit recent sends...') and even example user intents. However, the examples say 'filter by type=OFFRAMP' and 'show narration fields,' which could be read as tool-call parameters even though the schema has zero parameters; the description never warns that filtering must happen on the returned list, and no alternative (e.g., monei_get_transaction) is mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
monei_get_walletGet WalletARead-onlyIdempotent
Returns the user's full wallet overview including NGN balance and all subwallets (EVM and Solana).
Call this at the start of any transaction flow to confirm the user has sufficient balance before attempting sends, swaps, or offramp. This is the single source of truth for all balances.
Args:
chainId (number, optional): If provided, filters the EVM portfolio to a specific chain.
Returns: { "nairaBalance": number, // NGN balance "subwallets": [ { "id": string, "type": "FIAT" | "CRYPTO", "currency": string, "balance": number, "chain": "EVM" | "SOLANA" | null, "publicAddress": string | null } ] }
Examples:
"What's my balance?" -> call this, show nairaBalance and subwallet balances
"Do I have enough USDT to send 100?" -> check the relevant subwallet balance
"What's my EVM wallet address?" -> find the subwallet with chain='EVM' and show publicAddress
| Name | Required | Description | Default |
|---|---|---|---|
| chainId | No | Optional EVM chain ID to scope the portfolio. If not provided, returns all subwallets. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly, idempotent, openWorld, and non-destructive behavior. The description adds meaningful context by declaring this the authoritative balance source and specifying the return shape. No contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and uses clear sections for args, returns, and examples. It is somewhat longer than necessary because the Args section repeats schema information, but the examples provide real agent-routing value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully compensates by providing the return object shape and field meanings. It also covers parameter behavior, common user intents, and how to extract balances/addresses, so an agent has enough to invoke and interpret the result correctly.
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 baseline is 3. The description's chainId line mostly restates the schema's 'Optional EVM chain ID to scope the portfolio' rather than adding new semantic detail.
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 opens with a specific verb and resource: 'Returns the user's full wallet overview including NGN balance and all subwallets (EVM and Solana).' This clearly distinguishes the tool from siblings like monei_get_evm_portfolio and monei_get_solana_portfolio, which expose only a subset.
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 explicit when-to-use guidance: 'Call this at the start of any transaction flow to confirm the user has sufficient balance before attempting sends, swaps, or offramp.' It does not explicitly name alternatives or exclusions, but the 'single source of truth' framing makes the intended primary use clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
monei_pay_billPay BillADestructive
Pays a utility bill, buys airtime, purchases a data bundle, or subscribes to cable TV.
Routes to the correct payment method based on the 'category' field:
AIRTIME → airtime top-up for a phone number
MOBILEDATA → data bundle purchase for a phone number
UTILITYBILLS → electricity payment by meter number
CABLEBILLS → cable TV subscription by smartcard number
Before calling:
Call monei_get_bill_providers to get valid biller codes and item codes
Confirm the user has sufficient NGN balance using monei_get_wallet
For data and cable, call monei_validate_bill first to confirm the customer details
Args depend on category:
AIRTIME:
phoneNumber (string): Phone to top up
biller (string): Biller code from monei_get_bill_providers
amount (number): Amount in NGN
MOBILEDATA:
phoneNumber (string): Phone to buy data for
biller (string): Biller code from monei_get_bill_providers
itemCode (string): Data bundle code from monei_get_bill_providers
UTILITYBILLS:
meterNumber (string): Electricity meter number
disco (string): Provider code from monei_get_bill_providers
amount (number): Amount to pay in NGN
CABLEBILLS:
smartcardNumber (string): Decoder smartcard/IUC number
biller (string): Provider code from monei_get_bill_providers
itemCode (string): Package code from monei_get_bill_providers
All categories also accept optional:
isSchedule (boolean): Set true to schedule for a later date
scheduleData: { executionDate, isRecurring?, recurrencePattern? }
saveBeneficiary (boolean): Save recipient for future use
beneficiaryName (string): Label for the saved beneficiary
Returns: { "id": string, "reference": string, "billerName": string, "customer": string, "amount": number, "status": string, // "PENDING" | "SUCCESS" | "FAILED" "token": string | null, // Electricity token (for prepaid meters) "units": string | null // Electricity units (for prepaid meters) }
Examples:
"Buy ₦1,000 MTN airtime for 08012345678" -> category: "AIRTIME"
"Get me 1GB MTN data for 08012345678" -> category: "MOBILEDATA"
"Pay ₦5,000 to my IKEDC meter 12345678901" -> category: "UTILITYBILLS"
"Subscribe DSTV Compact for smartcard 1234567890" -> category: "CABLEBILLS"
"Pay my DSTV every month on the 1st" -> include isSchedule: true, scheduleData with recurrence
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the mutation behavior is known. The description adds valuable context beyond that: it says the operation moves money, requires sufficient balance, may require pre-validation, and returns statuses. It skips details like failure/rollback behavior, but the category routing and prerequisites are transparent enough.
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?
Long, but every section earns its placegiven the four category-specific argument shapes. It is well-organized: purpose, category routing, prerequisites, args per category, return shape, and examples. The heading/list structure makes it scannable despite its length.
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?
There is no output schema, so the inline return object is essential and present. It also covers prerequisites, optional behavior, category mapping, and natural-language examples. Nothing an agent needs to correctly select and invoke this tool seems missing.
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?
The input schema is empty, so the description carries the entire parameter burden. It defines category-specific parameters with names, types, and meanings, plus optional scheduling/saveBeneficiary fields. This is exactly the information an agent needs to construct a valid call.
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 specific verbs and resources: pays utility bills, buys airtime, purchases data bundles, and subscribes to cable TV. It clearly differentiates these from sibling tools by framing this as the bill-payment entry point with category-based routing.
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 explicit pre-call steps: fetch biller codes, confirm NGN balance, and validate customer details for data and cable. It does not explicitly contrast with sibling money-transfer tools like monei_send_naira_to_bank, but the preconditions leave little doubt about when this tool should be used.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
monei_sell_crypto_for_nairaSell Crypto for NairaADestructive
Sells cryptocurrency and sends the NGN proceeds to a Nigerian bank account.
Handles the complete offramp flow: takes the token details, fiat currency, and destination bank account, then initiates the swap.
Before calling this tool:
Check the user has sufficient balance using monei_get_evm_portfolio or monei_get_wallet
Call monei_get_offramp_quote to show the user the current rate and expected NGN amount
Call monei_verify_bank_account to get the account holder name — pass that name as accountName
Show the verified account name, rate, and expected payout to the user and get explicit confirmation
Args:
amount (number): Amount of token to sell (e.g. 100 for 100 USDT)
token (string): Token to sell — "USDT", "USDC", or "CNGN"
network (string): Network the token is on — "base", "polygon", "arbitrum-one", "bnb-smart-chain", "ethereum", "optimism", "lisk", "scroll", "starknet"
fiatCurrency (string): Fiat to receive — defaults to "NGN"
bankCode (string): Destination bank code from monei_get_banks
accountNumber (string): Destination 10-digit bank account number
accountName (string): Account holder name from monei_verify_bank_account
Returns: { "id": string, "reference": string, // Use with monei_track_offramp to monitor progress "status": string, // Initial status e.g. "initiated" or "awaiting_deposit" "amounts": object, // Crypto and fiat amounts with exchange rate and fees "beneficiary": object, // Destination bank details "onChain": object, // Deposit address and on-chain details "timestamps": object }
After initiating, tell the user their reference and that settlement typically takes 5–10 minutes. Use monei_track_offramp to check progress.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | Token to sell. Supported: USDT, USDC, CNGN | |
| amount | Yes | Amount of token to sell as a number (e.g. 100 for 100 USDT) | |
| network | Yes | Blockchain network the token is on. Supported: base, polygon, arbitrum-one, bnb-smart-chain, ethereum, starknet, optimism, lisk, scroll | |
| bankCode | Yes | Destination bank code. Call monei_get_banks if you don't have this. | |
| accountName | Yes | Account holder name as returned by monei_verify_bank_account. Always verify and show this to the user for confirmation before calling. | |
| fiatCurrency | No | Fiat currency to receive. Currently only NGN is supported. | NGN |
| accountNumber | Yes | Destination bank account number (10 digits) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, so the description's job is to add context. It does: it states the tool 'initiates the swap', returns a reference for tracking, lists possible statuses ('initiated' or 'awaiting_deposit'), and warns to get explicit confirmation after showing the quote. Minor gap: it doesn't explicitly state whether crypto is deducted immediately or if a deposit is required first, though the return object hints at it via 'onChain' deposit details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections: summary, pre-call checklist, Args list, Returns snippet, and post-call instructions. It front-loads the core purpose and flow. The Args list is somewhat redundant with the schema, adding length without new information, but the overall organization is strong for a complex financial tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given this is a 7-parameter, potentially destructive tool with no output schema, the description is notably complete. It explains prerequisites, the required parameter values, the return object shape with field meanings, the expected settlement timeframe, and follow-up tracking via monei_track_offramp. An agent can confidently determine how and when to call it.
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%: every one of the 7 parameters has a schema description, enums, defaults, or patterns. The description's Args list largely repeats the schema (e.g., token allowed values, network list, accountNumber format). It adds minimal new semantic value beyond the schema, so the 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?
The description uses a specific verb–resource pair: 'Sells cryptocurrency and sends the NGN proceeds to a Nigerian bank account.' It clearly identifies this as the crypto offramp tool and distinguishes it from siblings like monei_send_naira_to_bank and monei_generate_deposit_link. It also names the full flow ('complete offramp flow'), leaving no ambiguity about what the tool accomplishes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a numbered before-calling checklist naming exact sibling tools: check balance via monei_get_evm_portfolio or monei_get_wallet, call monei_get_offramp_quote, call monei_verify_bank_account, then get explicit user confirmation. It also tells the agent what to do after initiation: share the reference, mention 5–10 minute settlement, and use monei_track_offramp for progress. This is explicit, actionable usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
monei_send_crypto_evmSend Crypto (EVM)ADestructive
Sends cryptocurrency from the user's Monei EVM wallet to an external wallet address.
Handles both native tokens (ETH, BNB, MATIC) and ERC-20 tokens (USDT, USDC) with a single tool. Routing is automatic: if tokenAddress is provided it sends the ERC-20, otherwise it sends the native token.
Before calling:
Confirm sufficient balance using monei_get_evm_portfolio for the relevant chain
Ask for the user's transaction PIN if not already provided — never store or log it
Show the recipient address and amount to the user and get explicit confirmation before sending
Args:
to (string): Recipient EVM wallet address (0x...)
amount (string): Amount to send as a string to avoid floating point errors
chainId (number): Chain to send on (56=BSC, 137=Polygon, 8453=Base, 1=Ethereum, etc.)
tokenAddress (string, optional): ERC-20 contract address — omit for native tokens (ETH/BNB/MATIC)
transactionPin (string): User's 4-6 digit PIN — ask at runtime, never store
Returns: { "txHash": string, // Transaction hash to track on the block explorer "amount": string, "to": string, "chainId": number }
Examples:
"Send 0.01 ETH to 0x742d..." -> chainId: 1, amount: "0.01", no tokenAddress
"Send 100 USDT on BSC to 0x..." -> chainId: 56, amount: "100", tokenAddress: USDT contract on BSC
"Send 50 MATIC to 0x..." -> chainId: 137, amount: "50", no tokenAddress
Security: Never log or store the transactionPin.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Recipient EVM wallet address | |
| amount | Yes | Amount to send as a string (e.g. '0.01' for 0.01 ETH, '100' for 100 USDT) | |
| chainId | Yes | Chain to send on. 56=BSC, 137=Polygon, 8453=Base, 1=Ethereum, 42161=Arbitrum, 10=Optimism | |
| tokenAddress | No | ERC-20 token contract address. Omit this for native tokens (ETH, BNB, MATIC). Include it for ERC-20 tokens like USDT, USDC. | |
| transactionPin | Yes | User's 4-6 digit transaction PIN. Ask for this at runtime — never store or log it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructive, non-read-only behavior; the description adds meaningful operational context: automatic native-vs-ERC20 routing, the requirement for a runtime PIN that must never be stored or logged, and the need for user confirmation before sending. It also discloses the return shape including txHash, which is important since no output schema is present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized with a clear main statement, a routing rule, numbered pre-call steps, labeled Args, a Returns block, and examples. It is detailed but every section contributes actionable information; nothing is redundant or 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 financial transfer tool with destructive behavior and no output schema, the description covers everything an agent needs: prerequisites, PIN handling, user confirmation, routing rules, parameter semantics, return values, examples, and security guidance. The sibling context is complex, but the description fully positions this EVM send operation.
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?
Input schema coverage is 100%, giving a strong baseline. The description adds value beyond the schema by explaining the reason for using a string amount ('to avoid floating point errors'), clarifying when to include or omit tokenAddress, and providing concrete chainId examples for ETH, BSC, and MATIC.
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 opens with a specific verb and resource: 'Sends cryptocurrency from the user's Monei EVM wallet to an external wallet address.' It further distinguishes the tool's scope by explaining it handles both native tokens and ERC-20s, and the EVM qualifier separates it from the Solana sibling tool.
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 clear operational guidance: check balance with monei_get_evm_portfolio, ask for the transaction PIN at runtime, and obtain explicit user confirmation before sending. It does not explicitly state when not to use this tool versus alternatives like send_crypto_solana or swap_tokens_evm, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
monei_send_crypto_solanaSend Crypto (Solana)ADestructive
Sends cryptocurrency from the user's Monei Solana wallet to an external wallet address.
Handles both native SOL and SPL tokens (USDC, USDT on Solana) with a single tool. Routing is automatic: if tokenMintAddress is provided it sends the SPL token, otherwise it sends SOL.
Before calling:
Confirm sufficient balance using monei_get_solana_portfolio
Ask for the user's transaction PIN if not already provided — never store or log it
Show the recipient address and amount to the user and get explicit confirmation before sending
Args:
to (string): Recipient Solana wallet address (base58 encoded)
amount (string): Amount to send as a string
network (string, optional): "mainnet-beta" (default), "devnet", or "testnet"
tokenMintAddress (string, optional): SPL token mint address — omit to send native SOL
transactionPin (string): User's 4-6 digit PIN — ask at runtime, never store
Returns: { "signature": string, // Solana transaction signature "status": string, "amount": string, "token": string, // "SOL" or the SPL token symbol "to": string, "network": string }
Examples:
"Send 2 SOL to 5AH3..." -> amount: "2", no tokenMintAddress
"Send 50 USDC on Solana to 5AH3..." -> amount: "50", tokenMintAddress: USDC mint address on Solana
Security: Never log or store the transactionPin.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Recipient Solana wallet address (base58 encoded) | |
| amount | Yes | Amount to send as a string (e.g. '2' for 2 SOL, '50' for 50 USDC) | |
| network | No | Solana network to use. Defaults to mainnet-beta. | mainnet-beta |
| transactionPin | Yes | User's 4-6 digit transaction PIN. Ask for this at runtime — never store or log it. | |
| tokenMintAddress | No | SPL token mint address. Omit for native SOL transfers. Include for SPL tokens like USDC, USDT on Solana. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag this as non-read-only, non-idempotent, and destructive, so the baseline burden is lower. The description adds valuable behavior: automatic token-vs-SOL routing, PIN handling rules, and the requirement to show the recipient and amount before sending. There is no contradiction with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with summary, routing behavior, pre-call checklist, args, returns, examples, and security note. It is somewhat longer than necessary and repeats some schema parameter descriptions, but the extra detail is justified for a financial send operation with security caveats.
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?
There is no output schema, so the explicit return object with signature, status, amount, token, to, and network is essential and provided. The description covers required parameters, optional network selection, SPL routing, examples, and security constraints, making it complete enough for an agent to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all parameters clearly. The description adds meaning beyond the schema by explaining the routing rule for tokenMintAddress, providing concrete examples like 'Send 2 SOL' and 'Send 50 USDC', and clarifying that amount is a string.
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 opens with a specific verb and resource: 'Sends cryptocurrency from the user's Monei Solana wallet to an external wallet address.' It clearly distinguishes this tool from the EVM and naira send siblings by specifying Solana and covering both native SOL and SPL tokens.
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 an explicit before-calling workflow: check balance, ask for PIN at runtime, and get user confirmation before sending. It also explains automatic routing between SOL and SPL tokens. It does not explicitly name monei_send_crypto_evm as an alternative, but the Solana scope makes the intended use clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
monei_send_naira_to_bankSend Naira to BankADestructive
Sends NGN from the user's Monei wallet to any Nigerian bank account.
Before calling this tool:
Confirm the user has sufficient NGN balance using monei_get_wallet
Call monei_verify_bank_account to get the account holder's name and show it to the user for confirmation
Ask for the user's transaction PIN if not already provided — never store or log it
Args:
amount (number): Amount in NGN to send (e.g. 20000 for ₦20,000)
bankCode (string): Bank code from monei_get_banks (e.g. "058" for GTBank)
accountNumber (string): 10-digit recipient bank account number
transactionPin (string): User's 4-6 digit transaction PIN — ask for this at runtime
narration (string, optional): Note for the transfer (max 100 characters)
Returns: { "reference": string, "status": string, // "PENDING" | "COMPLETED" | "FAILED" "amount": number, }
Examples:
"Send ₦20,000 to my GTBank account 0123456789" -> verify account first, then call with bankCode="058"
"Pay 5000 naira to account 0987654321 at UBA" -> verify, confirm name, then send
Security: Never log or store the transactionPin. Pass it directly to this call only.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | Yes | Amount in NGN to send (e.g. 20000 for ₦20,000) | |
| bankCode | Yes | Bank code (e.g. '058' for GTBank, '033' for UBA). Call get_banks to get the full list of bank codes. | |
| narration | No | Optional description or note for the transfer (max 100 characters) | |
| accountNumber | Yes | Nigerian bank account number (exactly 10 digits) | |
| transactionPin | Yes | User transaction PIN (4-6 digits). Required for all money movement operations. Prompt the user for this if not provided — never store or log it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag readOnlyHint=false, destructiveHint=true, and idempotentHint=false, which are consistent with a money-movement call. The description adds genuine behavior context beyonnd those flags: the PIN must never be stored or logged, the recipient account must be verified before calling, and the returned status enum (PENDING/COMPLETED/FIALED) is disclosed.s No contradiction 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and organized into clearly delineated sections (pre-call checklist, Args, Returns, Examples, Security). It is longer than average, but every section earns its place given the tool's money-movement and security implications.
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 security-sensitive tool with five parameters and no output schema, the description is comprehensive: it covers purpose, pre-conditions, parameter formats, return shape, examples, and key behavioral rules. Gaps are minor -- failure-path semantics are only the status enum, and there is no explicit routing note pointing intra-wallet transfers to monei_send_naira_to_user.
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 and the baseline is 3. The Args section largely restates schema content (e.g., bankCode '058' for GTBank, 10-digit accountNumber, narration max 100 chars), adding only marginal value such as the runtime-ask framing for transactionPin and concrete natural-language-to-amount examples.
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 opening sentence 'Sends NGN from the user's Monei wallet to any Nigerian bank account' states a specific verb, resource, and destination. The phrase 'any Nigerian bank account' distinguishes it from the sibling monei_send_naira_to_user, which targets other Monei users, so an agent can tell them apart without opening either 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?
Provides an explicit numbered pre-call checklist naming the exact sibling tools to invoke first (monei_get_wallet to confirm balance, monei_verify_bank_account to confirm the recipient name) and instructs asking for the PIN at runtime. It stops just short of a 5 because it never explicitly says when not to use this tool versus its closest sibling monei_send_naira_to_user.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
monei_send_naira_to_userSend Naira to Monei UserADestructive
Sends NGN to another Monei user identified by their email address or phone number.
This is faster than a bank transfer and works instantly between Monei users. Use this when the recipient is identified by email or phone rather than a bank account number.
Before calling:
Confirm sufficient NGN balance using monei_get_wallet
Ask for the user's transaction PIN if not provided — never store or log it
Args:
amount (number): Amount in NGN to send (e.g. 5000 for ₦5,000)
receiver (string): Recipient's registered Monei email or phone number (e.g. "john@gmail.com" or "08012345678")
transactionPin (string): User's 4-6 digit transaction PIN — ask for this at runtime
Returns: { "reference": string, "status": string, "amount": number, "currency": "NGN", "receiver": string, "createdAt": string }
Examples:
"Send ₦5,000 to john@gmail.com" -> receiver: "john@gmail.com"
"Transfer 2000 naira to 08012345678" -> receiver: "08012345678"
Error handling:
Returns error if the receiver is not a registered Monei user
Returns error if insufficient balance
Security: Never log or store the transactionPin. Pass it directly to this call only.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | Yes | Amount in NGN to send (e.g. 5000 for ₦5,000) | |
| receiver | Yes | The recipient's registered Monei email address or phone number (e.g. john@gmail.com or 08012345678) | |
| transactionPin | Yes | User transaction PIN (4-6 digits). Required for all money movement operations. Prompt the user for this if not provided — never store or log it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations signal that this is a non-read-only, destructive operation, and the description adds meaningful behavior beyond those flags: transfers are 'instant between Monei users,' it returns errors for unregistered receivers or insufficient balance, and it warns never to store or log the transaction PIN. This aligns with the annotations and gives an agent a complete safety picture.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, and the rest is organized into scannable sections: Before calling, Args, Returns, Examples, Error handling, and Security. Each section is purposeful for a money-movement tool and avoids unnecessary fluff.
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?
Even though there is no output schema, the description supplies the exact return shape, common error cases, required preconditions, and security handling. For a 3-parameter money-transfer tool, nothing an agent needs to select and invoke it correctly is missing.
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?
The input schema already covers all three parameters at 100%, so the baseline is 3. The description adds real value with natural-language examples that map user phrases like 'Send ₦5,000 to john@gmail.com' to the receiver parameter, and it emphasizes that the transactionPin must be asked for at runtime and passed directly without logging.
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 opens with a specific verb and resource: 'Sends NGN to another Monei user identified by their email address or phone number.' It clearly distinguishes this tool from bank transfers, crypto sends, and bill payments, so an agent can tell what it does without comparing schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use it: 'Use this when the recipient is identified by email or phone rather than a bank account number.' It also gives practical prerequisites, including confirming sufficient balance with monei_get_wallet and asking for the transaction PIN at runtime.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
monei_swap_tokens_evmSwap Tokens (EVM)ADestructive
Swaps one token for another on an EVM network using the user's Monei wallet.
Routing is automatic based on which fields you provide:
No tokenIn + tokenOut provided → Native to ERC-20 (e.g. ETH → USDC)
tokenIn + tokenOut both provided → ERC-20 to ERC-20 (e.g. USDC → USDT)
tokenIn provided + no tokenOut → ERC-20 to Native (e.g. USDC → ETH)
Before calling:
Confirm the user has sufficient balance using monei_get_evm_portfolio
If the user doesn't know contract addresses, look them up from their portfolio token list
Show the user what they are swapping and get confirmation before executing
Args:
amount (string): Amount to swap. Native-to-token: native amount (e.g. '0.1'). Token swaps: tokenIn amount.
chainId (number): Chain to swap on. 56=BSC, 137=Polygon, 8453=Base, 1=Ethereum, 42161=Arbitrum, 10=Optimism
tokenIn (string, optional): ERC-20 contract address of token to sell. Omit for native token sells.
tokenOut (string, optional): ERC-20 contract address of token to buy. Omit for native token buys.
slippageBps (number, optional): Slippage tolerance in basis points. Default 50 (0.5%).
Returns: { "txHash": string, // Transaction hash — can be checked on the block explorer "amount": string, "chainId": number, "route": string // Human-readable description of what was swapped }
Examples:
"Swap 0.1 ETH for USDC on Base" -> amount: "0.1", chainId: 8453, tokenOut: USDC contract
"Swap 100 USDC for USDT on BSC" -> amount: "100", chainId: 56, tokenIn: USDC contract, tokenOut: USDT contract
"Swap 50 USDC for BNB" -> amount: "50", chainId: 56, tokenIn: USDC contract, no tokenOut
| Name | Required | Description | Default |
|---|---|---|---|
| amount | Yes | Amount to swap as a string. For native-to-token swaps this is the native amount (e.g. '0.1' ETH). For token swaps this is the tokenIn amount. | |
| chainId | Yes | Chain to swap on. 56=BSC, 137=Polygon, 8453=Base, 1=Ethereum, 42161=Arbitrum, 10=Optimism | |
| tokenIn | No | Contract address of the token to sell. Omit if selling the native token (ETH, BNB, MATIC). | |
| tokenOut | No | Contract address of the token to buy. Omit if buying the native token (ETH, BNB, MATIC). | |
| slippageBps | No | Slippage tolerance in basis points. Default is 50 (0.5%). Max is 10000 (100%). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, and the description is consistent with those. It adds useful behavioral context by explaining that the swap uses the user's Monei wallet, that routing is automatic based on provided fields, that user confirmation is required, and that a transaction hash is returned. This goes beyond the annotation flags without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded with the purpose and routing logic, followed by preconditions, Args, Returns, and Examples. The length is justified by the tool's complexity and lack of an output schema. However, the Args bullet list partly repeats information already in the input schema, and the chainId list in the description omits Scroll and Lisk, so it is not perfectly lean.
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 5-parameter mutating swap tool with no output schema, this description is complete: it specifies route rules, preconditions such as balance verification and user confirmation, slippage default, supported chains, return shape with txHash, and illustrative examples. An agent can determine how and when to call the tool without needing to guess.
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 baseline is 3. The description adds meaningful route-level parameter semantics: which fields to include for native-to-ERC20, ERC20-to-ERC20, and ERC20-to-native swaps, plus worked examples mapping natural-language requests to concrete parameter values. This is genuinely helpful, even though some Args text merely restates schema descriptions.
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 opens with a precise statement of what the tool does: swap one token for another on an EVM network using the user's Monei wallet. The EVM specification in the name and title distinguishes it from the Solana swap sibling, and the three routing combinations clarify the operation beyond a simple tautology.
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 explicit pre-call guidance: check balance with monei_get_evm_portfolio, look up contract addresses from the portfolio, and get user confirmation before executing. It also explains exactly how to choose tokenIn/tokenOut fields based on the swap route. It does not explicitly say 'use monei_swap_tokens_solana for Solana', so it stops just short of fully naming alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
monei_swap_tokens_solanaSwap Tokens (Solana)ADestructive
Swaps one token for another on Solana using the user's Monei wallet.
Routing is automatic based on which fields you provide:
outputMint provided + no inputMint → SOL to SPL token (e.g. SOL → USDC)
inputMint + outputMint both provided → SPL to SPL token (e.g. USDC → USDT)
inputMint provided + no outputMint → SPL token to SOL (e.g. USDC → SOL)
Before calling:
Confirm the user has sufficient balance using monei_get_solana_portfolio
Mint addresses for common tokens: USDC = EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v, USDT = Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB
Show the user what they are swapping and get confirmation before executing
Args:
amount (number|string): Amount to swap. SOL-to-token: number (e.g. 1). Token-to-SOL: string (e.g. '100'). Token-to-token: number.
inputMint (string, optional): Mint address of the SPL token to sell. Omit when selling SOL.
outputMint (string, optional): Mint address of the SPL token to buy. Omit when buying SOL.
slippageBps (number, optional): Slippage tolerance in basis points. Default 50 (0.5%).
Returns: { "signature": string, // Solana transaction signature "txUrl": string, // Explorer URL to view the transaction "route": string // Human-readable description of what was swapped }
Examples:
"Swap 1 SOL for USDC" -> amount: 1, outputMint: USDC mint, no inputMint
"Swap 100 USDC for SOL" -> amount: "100", inputMint: USDC mint, no outputMint
"Swap 50 USDC for USDT on Solana" -> amount: 50, inputMint: USDC mint, outputMint: USDT mint
| Name | Required | Description | Default |
|---|---|---|---|
| amount | Yes | Amount to swap. For SOL-to-token use a number (e.g. 1 for 1 SOL). For token-to-SOL use a string (e.g. '100' for 100 USDC). For token-to-token use a number. | |
| inputMint | No | Mint address of the token to sell. Omit if selling native SOL. | |
| outputMint | No | Mint address of the token to buy. Omit if buying native SOL. | |
| slippageBps | No | Slippage tolerance in basis points. Default is 50 (0.5%). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even with destructiveHint=true and readOnly=false annotations, the description adds meaningful behavioral context: routing is determined automatically by provided fields, a balance check and user confirmation are expected before execution, and the on-chain result is a signature plus explorer URL. This complements the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured into routing rules, pre-call steps, argument explanations, return format, and examples. The critical routing logic is front-loaded and every section serves a distinct purpose. It is detailed without being rambling, and it fills the gap left by the absence of an output 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?
For a 4-parameter mutation tool with no output schema, the description is complete. It covers preconditions, parameter combinations, common token addresses, return fields, and realistic examples. An agent has everything needed to invoke the tool correctly and explain the outcome to the user.
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 already 100%, so the baseline is 3. The description goes beyond the schema by adding a routing matrix, worked examples, and actual mint addresses for USDC and USDT. This helps an agent select parameter combinations correctly, though the schema itself already carries most of the parameter meaning.
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 first sentence states a specific verb ('Swaps'), resource ('one token for another'), and network ('on Solana'), using the user's Monei wallet. The 'Solana' qualifier clearly distinguishes it from the EVM swap sibling, and the accompanying examples reinforce the intent.
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 explicit pre-call guidance: check the Solana portfolio for sufficient balance, show the user what is being swapped, and get confirmation before executing. It also explains the three routing scenarios based on inputMint and outputMint presence. It does not explicitly name monei_swap_tokens_evm as the EVM alternative or state when not to use this tool, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
monei_track_offrampTrack OfframpARead-onlyIdempotent
Checks the current status of an offramp transaction by its reference.
Use this after monei_sell_crypto_for_naira to monitor settlement. Most transactions complete within 5–10 minutes. Poll every 30–60 seconds if the user is waiting.
Possible statuses: initiated, quote_created, awaiting_deposit, deposit_received, pending, processing, fiat_sent, completed, failed, cancelled, refunded, expired.
Args:
reference (string): The reference returned from monei_sell_crypto_for_naira
Returns: { "id": string, "reference": string, "status": string, "cryptoAmount": number, "fiatAmount": number, "exchangeRate": number, "fromCurrency": string, "toCurrency": string, "createdAt": string, "updatedAt": string, "completedAt": string | null }
Examples:
"What's the status of my USDT sale?" -> call with the reference from the sell
"Did my offramp complete?" -> check status field — "completed" means NGN has been sent
| Name | Required | Description | Default |
|---|---|---|---|
| reference | Yes | Offramp transaction reference returned from monei_sell_crypto_for_naira |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, the description explains the possible status lifecycle, typical completion time, and polling cadence, and clarifies that 'completed' means NGN has been sent. It is fully consistent with the readOnly, idempotent, non-destructive annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded: purpose, usage timing, statuses, arguments, return shape, and examples. Each section adds value, especially the return object since there is no output 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?
Given a single required parameter and no output schema, the description supplies the return shape, all possible status values, timing context, polling advice, and grounded examples. An agent has everything needed to invoke and interpret the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the description repeats the same reference source already given in the schema. It reinforces that the reference comes from the sell call, but does not add new parameter-level meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Checks the current status of an offramp transaction by its reference.' This clearly distinguishes it from deposit, wallet, and transfer tools, and ties it directly to monei_sell_crypto_for_naira.
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 explicitly says to use this after monei_sell_crypto_for_naira to monitor settlement, and gives polling guidance for waiting users. It does not name alternative status-check tools or state when not to use it, but the intended workflow context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
monei_verify_bank_accountVerify Bank AccountARead-onlyIdempotent
Verifies a Nigerian bank account number and returns the account holder's name.
Always call this before sending naira to a bank account. Surfacing the account name to the user before they confirm the transaction prevents sending to the wrong account.
Args:
accountNumber (string): 10-digit Nigerian bank account number
bankCode (string): Bank code from monei_get_banks (e.g. "058" for GTBank)
Returns: { "accountName": string, "accountNumber": string, "bankCode": string }
Examples:
Before sending to 0123456789 at GTBank -> call this with accountNumber="0123456789", bankCode="058"
User says "send to my GTBank account 0123456789" -> verify first, show account name, confirm before sending
Error handling:
Returns error if the account number does not exist at the given bank
Returns error if the bank code is invalid (call monei_get_banks to find valid codes)
| Name | Required | Description | Default |
|---|---|---|---|
| bankCode | Yes | Bank code (e.g. '058' for GTBank, '033' for UBA). Call get_banks to get the full list of bank codes. | |
| accountNumber | Yes | Nigerian bank account number (exactly 10 digits) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and non-destructive behavior. The description adds meaningful behavioral context on top: error outcomes for invalid account numbers or bank codes, and the recommended user-confirmation workflow. No contradiction with annotations found.
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?
Well-organized: a one-sentence summary, clear when-to-use rationale, structured args, return shape, examples, and error handling. Every section earns its place; the length is justified for a safety-relevant verification tool.
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 fully covers the return format using a JSON example. It also covers required parameters, real-world examples, and failure modes, making the tool safe and self-contained for an agent to invoke correctly.
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?
The input schema already documents both parameters fully (100% coverage). The description adds practical value by restating that accountNumber is a 10-digit Nigerian account number, giving a concrete bankCode example ('058' for GTBank), and tying bankCode to monei_get_banks.
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 ('Verifies'), a clear resource ('Nigerian bank account number'), and the key outcome (returns the account holder's name). This immediately distinguishes it from siblings like monei_get_banks (bank metadata) and monei_send_naira_to_bank (sending).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to call this before sending naira to a bank account and explains why: surfacing the account name prevents sending to the wrong account. It also points to monei_get_banks as the source for valid bank codes, giving clear routing 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. Dates show when Glama detected each change.
24 tool updates
v1.3.1- First observed
monei_check_deposit_status - First observed
monei_generate_deposit_link - First observed
monei_get_account - First observed
monei_get_banks - First observed
monei_get_bill_history - First observed
monei_get_bill_providers - First observed
monei_get_evm_portfolio - First observed
monei_get_my_solana_address - First observed
monei_get_offramp_quote - First observed
monei_get_solana_portfolio - First observed
monei_get_supported_networks - First observed
monei_get_transaction - First observed
monei_get_transaction_history - First observed
monei_get_wallet - First observed
monei_pay_bill - First observed
monei_sell_crypto_for_naira - First observed
monei_send_crypto_evm - First observed
monei_send_crypto_solana - First observed
monei_send_naira_to_bank - First observed
monei_send_naira_to_user - First observed
monei_swap_tokens_evm - First observed
monei_swap_tokens_solana - First observed
monei_track_offramp - First observed
monei_verify_bank_account
TDQS
Each tool maps to a distinct resource/action pair—wallet balances, EVM/Solana portfolios, sends, swaps, offramp, bank lookups, and bill payments. Status-checking tools are clearly separated by domain (deposit link, offramp, transaction, bill history), and descriptions explicitly point to the right tool for each scenario. No two tools appear interchangeable.
All tools share the consistent monei_ prefix and follow a predictable snake_case verb_noun pattern (get_, send_, swap_, pay_, verify_). Minor verb variation like check_deposit_status versus track_offramp is semantically appropriate and does not break the naming convention.
24 tools is at the upper end of the 16–25 heavy band, which feels like a lot for a single MCP server. The broad fintech scope—NGN wallet, EVM and Solana crypto operations, offramp, and bill payments—justifies much of the surface, but splitting into wallet/crypto/bills sub-servers would improve focus.
Core lifecycles are well covered: deposits generate and check, sends cover bank/user and EVM/Solana, offramp has quote/execute/track, and bills have providers/pay/history. However, monei_pay_bill instructs agents to call monei_validate_bill before data and cable payments, but that tool is not exposed in the server—a concrete dead-end in the bill-payment flow. A swap quote/preview tool is also absent, though slippage defaults soften that gap.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
The Mercado Pago MCP Server implements the Model Context Protocol to provide AI agents and LLMs with access to Mercado Pago's APIs and tools within compatible development environments. It acts as an intermediary that translates Mercado Pago resources into executable functions (tools) that AI applications can invoke to perform actions and automate flows. The server simplifies integration, enables using documentation to implement or improve code, and optimizes operations through natural language interactions without manual implementations.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
- UnifAPIOAuthcom.unifapi
Hosted MCP server for live public-data APIs and Skills for AI agents.
Related MCP Servers
- AlicenseBqualityDmaintenanceAn MCP server to provide AI agents money functionalities via Nostr and Cashu.67717MIT
- AlicenseNot gradedqualityAmaintenanceMCP server for Starling Bank API integration, enabling AI agents to manage accounts, view transactions, and send payments via natural language.1044MIT
- AlicenseNot gradedqualityAmaintenanceMCP server that lets any AI agent operate a wallet directly on-chain: create wallets, send, swap, bridge, and deploy contracts across EVM and Bitcoin networks.2MIT

moolre-mcpofficial
FlicenseBqualityBmaintenanceMCP server that exposes Moolre's API as 24 tools for AI agents, enabling account management, transfers, payments, SMS, and WhatsApp operations.24-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Mr-Money01/mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server