{"name":"io.github.investorphem/abapay","slug":"investorphem-abapay","title":"AbaPay","description":"Non-custodial stablecoin bill-pay rails on Celo & Base for AI agents, settled on-chain via MCP.","url":"https://mcp.market/server/investorphem-abapay","rating":null,"grade":"B","score":81,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":23,"stars":1,"forks":0,"downloads_week":null,"last_push_at":"2026-09-18T14:48:04.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"remote","callable_via_gateway":true,"default_price_micros":0,"repository":"https://github.com/investorphem/AbaPay","website":null,"version":"1.0.1","remotes":[{"type":"streamable-http","url":"https://agents.abapays.com/api/mcp"}],"packages":[],"tools":[{"name":"cancel_schedule","description":"Cancel one or more active schedules for the linked wallet. Call list_schedules first to get a real id. Pass id to cancel exactly one; pass provider to cancel every active schedule for that provider; omit both to cancel ALL active schedules for this wallet. No PIN required, matching chat.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"api_key":{"type":"string","description":"AbaPay MCP API key. NOT needed when the connector is authorized via OAuth — omit it entirely in that case."},"id":{"type":"string","description":"The exact schedule id from list_schedules. Cancels only that one schedule."},"provider":{"type":"string","description":"Cancel every active schedule for this provider, e.g. \"mtn\". Ignored if id is also given."}},"required":[],"additionalProperties":false}},{"name":"check_balance","description":"Check a linked wallet's stablecoin balances and remaining agent spending allowance. Works with no arguments once this connector is authorized via OAuth.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"api_key":{"type":"string","description":"AbaPay MCP API key (starts with aba_mcp_). NOT needed when the connector is authorized via OAuth — omit it entirely in that case; only supply it if this server asked you to authenticate and OAuth is unavailable."},"chain":{"type":"string","enum":["CELO","BASE"],"description":"Defaults to the chain approved when the key was created."}},"required":[],"additionalProperties":false}},{"name":"describe_capabilities","description":"List what AbaPay can pay (airtime, data, electricity, cable, etc.), any services currently paused, and example requests. Call this first if unsure what is supported.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{},"additionalProperties":false}},{"name":"list_international_options","description":"Browse the REAL, live international top-up catalogue (140+ countries) one level at a time. Call with no country to see supported countries. Add country to see its product types. Add product_type_id to see operators. Add operator_id too to see real, currently purchasable plans with their exact codes, foreign-currency price, and NGN-equivalent cost. ALWAYS call this before pay_bill with service: INTERNATIONAL, and pass back the exact country/product_type_id/operator_id/variation_code shown — never guess any of them. Only plans marked fixed-price can be paid via pay_bill right now; flexible-amount plans must be completed in the AbaPay app.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"country":{"type":"string","description":"Country name or ISO code, e.g. \"Ghana\" or \"GH\". Omit to list all supported countries."},"product_type_id":{"type":"string","description":"A product_type_id returned for this country — e.g. which kind of top-up (airtime vs a data bundle). Omit to list the country's product types."},"operator_id":{"type":"string","description":"An operator_id returned for this country + product_type_id — the network to top up. Omit to list operators."}},"required":[],"additionalProperties":false}},{"name":"list_plans","description":"List the REAL, currently purchasable plans for a service that needs one — DATA bundles, CABLE packages, or EDUCATION products (WAEC/JAMB) — with their exact codes and current VTpass prices. ALWAYS call this before pay_bill for these three services and pass back one of the returned codes as variation_code. Never guess a plan, a code, or a price — if this returns nothing usable, say so rather than inventing one.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"service":{"type":"string","enum":["DATA","CABLE","EDUCATION"],"description":"Which service to list plans for. Electricity and airtime are free-amount and have no plan list."},"provider":{"type":"string","description":"e.g. mtn, airtel, glo, 9mobile (data); dstv, gotv, startimes (cable); waec, waec-registration, jamb (education)"}},"required":["service","provider"],"additionalProperties":false}},{"name":"list_schedules","description":"List active recurring/one-off bill schedules for the linked wallet — same data as the AbaPay app and Telegram/WhatsApp \"show my schedules\". Read-only, no PIN required. Returns each schedule's id — pass that to cancel_schedule to remove one.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"api_key":{"type":"string","description":"AbaPay MCP API key. NOT needed when the connector is authorized via OAuth — omit it entirely in that case."}},"required":[],"additionalProperties":false}},{"name":"pay_bill","description":"Pay a real bill — Nigerian (airtime, data, electricity, cable TV, a WAEC/JAMB education PIN) or international airtime/data across 140+ countries — from the linked wallet, settled on-chain and delivered via the same pipeline as the AbaPay app. For DATA, CABLE (when changing package), and EDUCATION, call list_plans first and use a real variation_code from it. For service: INTERNATIONAL, call list_international_options first and pass back its exact country/product_type_id/operator_id/variation_code — never guess any of these. ALWAYS requires the PIN — including when this connector is authorized via OAuth; ask the human for it every time and never guess or reuse a remembered one. Money moves for real — only call this once the human has clearly confirmed the exact amount, provider, and account. EXECUTES IMMEDIATELY, with no delay/schedule parameter of any kind — there is no way to queue this call for later on this connection. If the human asks to pay \"in N minutes\", \"later today\", \"tomorrow\", or any other future time, do NOT call this now: ask them to confirm they want it sent immediately instead, or tell them delayed/recurring automations can only be set up from the AbaPay app or by messaging the AbaPay agent on Telegram/WhatsApp/X — never silently pay right away when a delay was requested.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"api_key":{"type":"string","description":"AbaPay MCP API key. NOT needed when the connector is authorized via OAuth — omit it entirely in that case."},"pin":{"type":"string","description":"4-6 digit PIN set when the API key was created. Required on EVERY payment, including over an OAuth connection — ask the human for it each time."},"service":{"type":"string","enum":["AIRTIME","DATA","ELECTRICITY","CABLE","EDUCATION","INTERNATIONAL"],"description":"Which kind of bill"},"provider":{"type":"string","description":"e.g. mtn, airtel, glo, ikeja-electric, dstv, gotv, startimes, waec, waec-registration, jamb. Not used for service: INTERNATIONAL — use country/product_type_id/operator_id instead."},"account_number":{"type":"string","description":"Phone number (airtime/data), meter number (electricity), smartcard/IUC number (cable), JAMB profile ID (education: jamb), the buyer's phone number (education: waec), or the destination phone number abroad (international)"},"amount_ngn":{"type":"number","description":"Amount in Naira. Not needed for service: INTERNATIONAL — the NGN-equivalent is derived from the live plan you picked via list_international_options."},"chain":{"type":"string","enum":["CELO","BASE"],"description":"Defaults to the chain approved when the API key was created. Only override this if the default chain lacks balance/allowance and check_balance shows funds on the other one."},"token":{"type":"string","enum":["USD₮","USDC","USA₮"],"description":"Which stablecoin to pay with. Defaults to the token approved when the API key was created. If that one is short on balance or on-chain allowance, call check_balance first to see what else is available on this chain, then retry with this field set — e.g. if USD₮ is short but the wallet holds USDC with its own approved limit, pass token: \"USDC\"."},"variation_code":{"type":"string","description":"Plan/bundle/product code — required for DATA, EDUCATION, and INTERNATIONAL, and for CABLE when changing package (not needed to renew the current one)"},"meter_type":{"type":"string","enum":["prepaid","postpaid"],"description":"Required for ELECTRICITY"},"customer_name":{"type":"string","description":"Optional — used for the receipt if known"},"customer_email":{"type":"string","description":"Required for service: INTERNATIONAL (the receipt goes here). Optional otherwise."},"country":{"type":"string","description":"Required for service: INTERNATIONAL — country name or ISO code, from list_international_options."},"product_type_id":{"type":"string","description":"Required for service: INTERNATIONAL — from list_international_options."},"operator_id":{"type":"string","description":"Required for service: INTERNATIONAL — from list_international_options."}},"required":["pin","service","account_number"],"additionalProperties":false}},{"name":"pay_bill_batch","description":"Pay airtime or data to multiple recipients in ONE call — the same multi-recipient batch Telegram/WhatsApp/X support (\"send 500 to X and 1000 to Y\"). One PIN authorizes the whole batch. Recipients are grouped by (chain, token); each group's capacity (balance + approved agent limit) is checked against that group's own subtotal — but if ANY group is short, the ENTIRE batch is refused before anything moves (all-or-nothing on capacity; paying 6 of 8 recipients because the 7th was under-funded is worse than one clear error up front). Once capacity clears, recipients are paid one at a time and the response reports each individually, since a single vend failure partway through must not be reported as if the whole batch failed. AIRTIME and DATA only — electricity, cable, education, and international are not batchable; call pay_bill for those, one at a time. For DATA, call list_plans first and give each recipient needing one its own real variation_code. EXECUTES IMMEDIATELY: no delay/schedule option, same as pay_bill — for a delayed/recurring batch, call schedule_bill once per recipient instead.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"api_key":{"type":"string","description":"AbaPay MCP API key. NOT needed when the connector is authorized via OAuth — omit it entirely in that case."},"pin":{"type":"string","description":"4-6 digit PIN set when the API key was created. Required once for the whole batch."},"recipients":{"type":"array","minItems":2,"maxItems":20,"description":"At least 2 recipients (a single recipient should just use pay_bill), at most 20 per call — split a larger batch across several calls.","items":{"type":"object","properties":{"service":{"type":"string","enum":["AIRTIME","DATA"],"description":"Only AIRTIME and DATA are batchable."},"provider":{"type":"string","description":"e.g. mtn, airtel, glo, 9mobile"},"account_number":{"type":"string","description":"Phone number to top up"},"amount_ngn":{"type":"number","description":"Amount in Naira for this recipient"},"variation_code":{"type":"string","description":"Required for DATA — call list_plans first and pass a real code for this recipient's plan."},"chain":{"type":"string","enum":["CELO","BASE"],"description":"Overrides the batch-level chain for this recipient only."},"token":{"type":"string","enum":["USD₮","USDC","USA₮"],"description":"Overrides the batch-level token for this recipient only."}},"required":["service","provider","account_number","amount_ngn"],"additionalProperties":false}},"chain":{"type":"string","enum":["CELO","BASE"],"description":"Default chain for recipients that don't set their own. Falls back to the chain approved when the API key was created."},"token":{"type":"string","enum":["USD₮","USDC","USA₮"],"description":"Default token for recipients that don't set their own. Falls back to the token approved when the API key was created."},"customer_email":{"type":"string","description":"Optional — used for receipts if known, applies to the whole batch."}},"required":["pin","recipients"],"additionalProperties":false}},{"name":"schedule_bill","description":"Set up a recurring or future one-off bill payment — daily/weekly/monthly airtime, data, electricity, or cable — the same automation Telegram/WhatsApp/X support. Validates exactly like pay_bill (call list_plans first for DATA, or CABLE when changing package, to get a real variation_code) and ALWAYS requires the PIN, since this creates a standing spend. Nothing is charged when this tool runs — money only moves later, when the schedule actually fires, and only if the wallet still has a funded on-chain allowance at that time. If the approved agent limit already covers the amount right now, the schedule is created to auto-pay itself each time it is due; otherwise it is saved as notify-only and someone must call pay_bill manually when it comes due — the response says which. EDUCATION and INTERNATIONAL cannot be scheduled; pay those directly with pay_bill. Use list_schedules to see what is set up and cancel_schedule to remove one.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"api_key":{"type":"string","description":"AbaPay MCP API key. NOT needed when the connector is authorized via OAuth — omit it entirely in that case."},"pin":{"type":"string","description":"4-6 digit PIN set when the API key was created. Required to create a schedule, same as pay_bill."},"service":{"type":"string","enum":["AIRTIME","DATA","ELECTRICITY","CABLE"],"description":"Which kind of bill to schedule. EDUCATION and INTERNATIONAL are not schedulable — use pay_bill directly for those."},"provider":{"type":"string","description":"e.g. mtn, airtel, glo, 9mobile, ikeja-electric, dstv, gotv, startimes"},"account_number":{"type":"string","description":"Phone number (airtime/data), meter number (electricity), or smartcard/IUC number (cable)"},"amount_ngn":{"type":"number","description":"Amount in Naira to charge each time the schedule runs."},"variation_code":{"type":"string","description":"Plan/bundle/product code — required for DATA, and for CABLE when changing package (not needed to renew the current one). Get a real one from list_plans first."},"meter_type":{"type":"string","enum":["prepaid","postpaid"],"description":"Required for ELECTRICITY"},"frequency":{"type":"string","enum":["daily","weekly","monthly","once"],"description":"How often this runs. \"once\" fires exactly one time, schedule_in_minutes from now."},"day_of_week":{"type":"number","description":"Required when frequency is \"weekly\" — 0 (Sunday) through 6 (Saturday)."},"day_of_month":{"type":"number","description":"Required when frequency is \"monthly\" — 1 through 28."},"schedule_in_minutes":{"type":"number","description":"Required when frequency is \"once\" — minutes from now to run it a single time."},"chain":{"type":"string","enum":["CELO","BASE"],"description":"Defaults to the chain approved when the API key was created."},"token":{"type":"string","enum":["USD₮","USDC","USA₮"],"description":"Defaults to the token approved when the API key was created."},"customer_email":{"type":"string","description":"Where to send a notification when this runs. MCP has no persistent channel to message back into a conversation — without this, you'll need to poll list_schedules or transaction_history yourself to see what happened."}},"required":["pin","service","account_number","amount_ngn","frequency"],"additionalProperties":false}},{"name":"transaction_history","description":"List recent real transactions for the linked wallet — same data as the AbaPay app's History tab (service, provider, amount, status, tx hash). Read-only, no PIN required. The interactive card's own Next/Previous buttons page through results by re-calling this tool with a different offset — pass offset yourself only when asked for something like \"the next page\" or \"transactions before that\" in plain text.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"api_key":{"type":"string","description":"AbaPay MCP API key. NOT needed when the connector is authorized via OAuth — omit it entirely in that case."},"limit":{"type":"number","description":"How many recent transactions to return. Defaults to 10, max 25."},"offset":{"type":"number","description":"How many of the most recent transactions to skip before listing — 0 (default) starts at the newest. Used for paging: offset=10 with the default limit gets the next 10 after the first page."}},"required":[],"additionalProperties":false}}],"scan":{"score":81,"grade":"B","scanned_at":"2026-09-19T09:58:32.678Z","report":{"scannerVersion":"0.1.3","scannedAt":"2026-09-19T09:58:32.630Z","components":{"code":{"score":-1,"max":25,"notes":["remote-only server, no package to scan"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 1682ms"]},"poisoning":{"score":15,"max":15,"notes":["10 tool descriptions checked"]},"auth":{"score":3,"max":15,"notes":["open endpoint exposes 4 write-action tools with no auth"]},"maintenance":{"score":15,"max":15,"notes":["last push 1 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[{"id":"auth.open-write","severity":"high","component":"auth","title":"Write-action tools reachable without authentication"}],"inputs":{"probes":[{"url":"https://agents.abapays.com/api/mcp","reachable":true,"authRequired":false,"latencyMs":1682,"serverInfo":{"name":"abapay","version":"1.0.0"}}],"packages":[],"repo":{"found":true,"owner":"investorphem","repo":"AbaPay","archived":false,"pushedAt":"2026-09-18T14:48:04Z","stars":1,"forks":0,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/39197206?v=4","ownerCreatedAt":"2018-05-11T16:12:14Z","license":"MIT"},"icon":{"url":"https://agents.abapays.com/apple-touch-icon.png","source":"site","width":180,"height":180},"presence":{"stars":1,"forks":0,"downloadsWeek":null,"license":"MIT","lastPushAt":"2026-09-18T14:48:04.000Z","score":23}}}},"grade_history":[],"reviews":[]}