Skip to main content
Glama

Flutterwave MCP Server

transfer.ts5.53 kB
import z from "zod"; import Flutterwave from "../client/index.js"; import { server } from "../server.js"; import { CreateTransferPayloadSchema, CreateBeneficiaryPayloadSchema } from "../types/transfer/schema.js"; // Cache transfer client to avoid repeated function calls const transfersClient = Flutterwave.transfers(); // Helper function to create error responses function createErrorResponse(message: string) { return { content: [{ type: "text" as const, text: message }], }; } // Helper function to validate API response function isValidResponse(status: unknown, data: unknown): data is { status?: string } { return !(typeof status === 'number' && status >= 400) && !!data; } export async function listBeneficiaries(): Promise<{ content: { type: "text"; text: string }[] }> { const response = await transfersClient.listBeneficiaries(); if (!response) { return createErrorResponse("No response from transfer client"); } if (!isValidResponse(response.status, response.data)) { if (response.data?.message) { return createErrorResponse(`Failed to list beneficiaries: ${response.data.message}`) } return createErrorResponse("Failed to list beneficiaries **: " + JSON.stringify( response.data )); } let responseData: any[] = [response.data] let remainingPages = []; // @ts-ignore if (response.meta?.page_info?.total_pages > 1) { // @ts-ignore for (let i = 2; i <= response.meta?.page_info?.total_pages; i++) { remainingPages.push(transfersClient.listBeneficiaries(i)) } let otherResults = await Promise.all(remainingPages) otherResults.forEach(result => { if (result?.data) { responseData.push(result.data) } }) } return { content: [{ type: "text" as const, text: "Beneficiaries listed successfully" + JSON.stringify(responseData) }], }; } export async function createBeneficiary(payload: { account_bank: string, account_number: string, beneficiary_name: string, currency: string, bank_name: string }) { const response = await transfersClient.createBeneficiary(payload); if (!response) { return createErrorResponse("No response from transfer client"); } if (!isValidResponse(response.status, response.data)) { if (response.data?.message) { return createErrorResponse(`Failed to create a beneficiary: ${response.message}`) } return createErrorResponse("Failed to create beneficiary *: " + JSON.stringify( response.message )); } return { content: [{ type: "text" as const, text: "Beneficiary created successfully" }], }; } export async function createTransfer(payload: { account_bank: string, account_number: string, amount: number | string, currency: string, callback_url?: string, debit_subaccount?: string, beneficiary?: number, beneficiary_name?: string, reference?: string, debit_currency?: string, destination_branch_code?: string, narration?: string, }) { // Ensure amount is a string as required by the Flutterwave API const requestPayload = { account_bank: payload.account_bank, account_number: payload.account_number, amount: String(payload.amount), currency: payload.currency, callback_url: payload.callback_url, debit_subaccount: payload.debit_subaccount, beneficiary: payload.beneficiary, beneficiary_name: payload.beneficiary_name, reference: payload.reference, debit_currency: payload.debit_currency, destination_branch_code: payload.destination_branch_code, narration: payload.narration, }; const response = await transfersClient.create(requestPayload); if (!response) { return createErrorResponse("No response from transfer client"); } if (!isValidResponse(response.status, response.data)) { return createErrorResponse("Failed to create transfer"); } return { content: [{ type: "text" as const, text: "Transfer created successfully" }], }; } export function registerTransferTools() { server.tool( "create_transfer", "Create a transfer with Flutterwave.", CreateTransferPayloadSchema, async (args) => { try { return await createTransfer(args); } catch (error) { return { content: [{ type: "text" as const, text: `Error Occured on creating transfer` }], }; } } ); server.tool( "list_beneficiaries", "List all beneficiaries with Flutterwave.", async () => { try { return await listBeneficiaries(); } catch (error) { return { content: [{ type: "text" as const, text: `Error Occured on listing beneficiaries` }], }; } } ); server.tool( "create_beneficiary", "Create a new beneficiary with Flutterwave.", CreateBeneficiaryPayloadSchema, async (args) => { try { return await createBeneficiary(args); } catch (error) { return { content: [{ type: "text" as const, text: `Error Occured on creating beneficiary` }], }; } } ); }

Latest Blog Posts

MCP directory API

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

curl -X GET 'https://glama.ai/api/mcp/v1/servers/bajoski34/mcp-flutterwave'

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