# How to integrate Paystack MCP with LlamaIndex

```json
{
  "title": "How to integrate Paystack MCP with LlamaIndex",
  "toolkit": "Paystack",
  "toolkit_slug": "paystack",
  "framework": "LlamaIndex",
  "framework_slug": "llama-index",
  "url": "https://composio.dev/toolkits/paystack/framework/llama-index",
  "markdown_url": "https://composio.dev/toolkits/paystack/framework/llama-index.md",
  "updated_at": "2026-03-29T06:45:03.266Z"
}
```

## Introduction

This guide walks you through connecting Paystack to LlamaIndex using the Composio tool router. By the end, you'll have a working Paystack agent that can list all successful transactions from this week, create a new customer profile in paystack, refund a recent payment from customer through natural language commands.
This guide will help you understand how to give your LlamaIndex agent real control over a Paystack account through Composio's Paystack MCP server.
Before we dive in, let's take a quick look at the key ideas and tools involved.

## Also integrate Paystack with

- [OpenAI Agents SDK](https://composio.dev/toolkits/paystack/framework/open-ai-agents-sdk)
- [Claude Agent SDK](https://composio.dev/toolkits/paystack/framework/claude-agents-sdk)
- [Claude Code](https://composio.dev/toolkits/paystack/framework/claude-code)
- [Claude Cowork](https://composio.dev/toolkits/paystack/framework/claude-cowork)
- [Codex](https://composio.dev/toolkits/paystack/framework/codex)
- [OpenClaw](https://composio.dev/toolkits/paystack/framework/openclaw)
- [Hermes](https://composio.dev/toolkits/paystack/framework/hermes-agent)
- [CLI](https://composio.dev/toolkits/paystack/framework/cli)
- [Google ADK](https://composio.dev/toolkits/paystack/framework/google-adk)
- [LangChain](https://composio.dev/toolkits/paystack/framework/langchain)
- [Vercel AI SDK](https://composio.dev/toolkits/paystack/framework/ai-sdk)
- [Mastra AI](https://composio.dev/toolkits/paystack/framework/mastra-ai)
- [CrewAI](https://composio.dev/toolkits/paystack/framework/crew-ai)

## TL;DR

Here's what you'll learn:
- Set your OpenAI and Composio API keys
- Install LlamaIndex and Composio packages
- Create a Composio Tool Router session for Paystack
- Connect LlamaIndex to the Paystack MCP server
- Build a Paystack-powered agent using LlamaIndex
- Interact with Paystack through natural language

## What is LlamaIndex?

LlamaIndex is a data framework for building LLM applications. It provides tools for connecting LLMs to external data sources and services through agents and tools.
Key features include:
- ReAct Agent: Reasoning and acting pattern for tool-using agents
- MCP Tools: Native support for Model Context Protocol
- Context Management: Maintain conversation context across interactions
- Async Support: Built for async/await patterns

## What is the Paystack MCP server, and what's possible with it?

The Paystack MCP server is an implementation of the Model Context Protocol that connects your AI agent and assistants like Claude, Cursor, etc directly to your Paystack account. It provides structured and secure access so your agent can perform Paystack operations on your behalf.

## Supported Tools

| Tool slug | Name | Description |
|---|---|---|
| `PAYSTACK_ADD_PRODUCTS_TO_PAGE` | Add Products to Page | Tool to add products to a Paystack payment page. Use when you need to add products to an existing page that was created with 'product' type. This action adds the specified products to the page, allowing customers to select from multiple products when making a payment. |
| `PAYSTACK_ADD_PRODUCTS_TO_STOREFRONT` | Add Products to Storefront | Tool to add previously created products to a Storefront. Use when you need to associate existing products with a specific storefront. |
| `PAYSTACK_ADD_SPLIT_CODE_TO_VIRTUAL_TERMINAL` | Add Split Code to Virtual Terminal | Tool to add a split code to a virtual terminal. Use when you need to assign payment splitting configuration to a virtual terminal. |
| `PAYSTACK_ADD_SUBACCOUNT_TO_SPLIT` | Add Subaccount to Split | Tool to add a subaccount to a split configuration, or update the share of an existing subaccount. Use this when you need to modify the payment distribution by adding new partners/customers to a split or adjusting their allocation. The split must already exist before adding subaccounts to it. |
| `PAYSTACK_ARCHIVE_PAYMENT_REQUEST` | Archive Payment Request | Tool to archive a payment request to clean up records. Use when you need to remove a payment request from active listings. An archived payment request cannot be verified and will not appear when listing payment requests. |
| `PAYSTACK_ASSIGN_DESTINATION_TO_VIRTUAL_TERMINAL` | Assign Destination to Virtual Terminal | Tool to assign WhatsApp destinations to a Virtual Terminal for payment notifications. Use when you need to add recipients who will receive notifications for payments made through a specific Virtual Terminal. |
| `PAYSTACK_CHECK_PENDING_CHARGE` | Check Pending Charge | Tool to check the status of a pending charge transaction. Use when you receive a 'pending' status from a charge endpoint or need to verify if a charge status has changed. Wait at least 10 seconds after initiating a charge before calling this endpoint. |
| `PAYSTACK_CHECK_SLUG_AVAILABILITY` | Check Slug Availability | Tool to check if a custom slug is available for use when creating a payment page. Use when you need to verify a slug is not already taken before creating a new payment page. |
| `PAYSTACK_BULK_CREATE_TRANSFER_RECIPIENTS` | Bulk Create Transfer Recipients | Create multiple transfer recipients in batches. Use when you need to add multiple recipients at once for transfers. Duplicate account numbers automatically return existing recipient records instead of creating duplicates. |
| `PAYSTACK_CREATE_CHARGE` | Create Charge | Tool to initiate a payment by integrating the payment channel of your choice. Use when you need to charge a customer using authorization code, bank account, mobile money, or USSD. |
| `PAYSTACK_CREATE_CUSTOMER` | Create Customer | Tool to create a customer on your Paystack integration. Use when you need to add a new customer with their email address and optional details like name and phone number. |
| `PAYSTACK_CREATE_PAYMENT_PAGE` | Create Payment Page | Tool to create a payment page on your Paystack integration. Use when you need to create a payment page that customers can visit to make payments. |
| `PAYSTACK_CREATE_PAYMENT_REQUEST` | Create Payment Request | Create a new payment request by issuing an invoice to a customer. Use this when you need to request payment from a customer for goods or services. |
| `PAYSTACK_CREATE_PLAN` | Create Plan | Tool to create a plan for recurring payments on Paystack. Use when you need to set up subscription billing or recurring payment schedules. The plan defines the amount, interval, and other settings for recurring charges to customers. |
| `PAYSTACK_CREATE_REFUND` | Create Refund | Tool to initiate a refund for a previously completed transaction on Paystack. Use when a customer requests a refund or when you need to reverse a payment. The refund can be for the full transaction amount or a partial amount. |
| `PAYSTACK_CREATE_SPLIT_CONFIGURATION` | Create Split Configuration | Tool to create a split configuration for transaction revenue sharing. Use when you need to configure how transaction revenue should be split between multiple subaccounts (e.g., for marketplace platforms, revenue sharing, or commission distribution). |
| `PAYSTACK_CREATE_STOREFRONT` | Create Storefront | Create a digital storefront on Paystack to manage and display products. Use this when you need to set up a new online shop for selling digital or physical products. |
| `PAYSTACK_CREATE_SUBACCOUNT` | Create Subaccount | Tool to create a subaccount on your Paystack integration. Use when you need to set up a new subaccount with bank details and settlement information. |
| `PAYSTACK_CREATE_TRANSFER_RECIPIENT` | Create Transfer Recipient | Tool to create a new recipient for transfers. Use when you need to set up a recipient before initiating a transfer. Note: A duplicate account number will lead to retrieval of the existing record rather than creating a new one. |
| `PAYSTACK_CREATE_VIRTUAL_TERMINAL` | Create Virtual Terminal | Create a Virtual Terminal on your Paystack integration to accept payments. Use this when you need to set up a new payment terminal for in-person or remote transactions with custom notification settings. |
| `PAYSTACK_DEACTIVATE_AUTHORIZATION` | Deactivate Authorization | Tool to deactivate an authorization when a card or payment method needs to be forgotten. Use when customers want to remove saved payment methods from their account. |
| `PAYSTACK_DEACTIVATE_VIRTUAL_TERMINAL` | Deactivate Virtual Terminal | Tool to deactivate a Virtual Terminal on your integration. Use when you need to disable a terminal and prevent it from accepting further payments. |
| `PAYSTACK_DELETE_PRODUCT` | Delete Product | Delete a previously created product from Paystack by its ID. Use this when you need to remove a product from your catalog. The deletion is permanent and cannot be undone. |
| `PAYSTACK_DELETE_STOREFRONT` | Delete Storefront | Delete a previously created storefront from Paystack by its ID. Use this when you need to remove a storefront. The deletion is permanent and cannot be undone. |
| `PAYSTACK_DELETE_TRANSFER_RECIPIENT` | Delete Transfer Recipient | Tool to delete a transfer recipient by setting it to inactive status. Use when you need to remove a recipient from the active transfer list. |
| `PAYSTACK_DISABLE_OTP_FOR_TRANSFERS` | Disable OTP for Transfers | Tool to disable OTP requirement for programmatic transfers. Use when you want to complete transfers without OTP verification. Returns an OTP needed to finalize the request. |
| `PAYSTACK_DISABLE_SUBSCRIPTION` | Disable Subscription | Tool to disable a subscription on your Paystack integration. Use when you need to stop recurring charges for a customer subscription. Requires the subscription code and email verification token sent to the customer. |
| `PAYSTACK_DUPLICATE_STOREFRONT` | Duplicate Storefront | Tool to duplicate a previously created Storefront. Use when you need to create a copy of an existing storefront with the same configuration. |
| `PAYSTACK_ENABLE_OTP_FOR_TRANSFERS` | Enable OTP for Transfers | Tool to enable OTP requirement for transfers. Use when a customer wants to stop being able to complete transfers programmatically and require OTP verification instead. |
| `PAYSTACK_EXPORT_TRANSACTIONS` | Export Transactions | Tool to export transactions from Paystack for a specific timeframe. Use when you need to download transaction data for reporting, analysis, or record-keeping purposes. The API returns a download link that expires after a certain time. |
| `PAYSTACK_FETCH_BALANCE` | Fetch Balance | Tool to fetch the available balance on your Paystack integration. Use when you need to check account balance across different currencies. |
| `PAYSTACK_FETCH_BALANCE_LEDGER` | Fetch balance ledger | Tool to fetch all pay-ins and pay-outs that went into your Paystack balance. Use when you need to view transaction history and balance changes over time. |
| `PAYSTACK_FETCH_BULK_CHARGE_BATCH` | Fetch Bulk Charge Batch | Tool to retrieve a specific bulk charge batch by code. Use when you need to check the progress of a bulk charge batch via its total_charges and pending_charges attributes. |
| `PAYSTACK_FETCH_CUSTOMER` | Fetch Customer | Tool to get details of a customer on your integration. Use when you need to retrieve customer information using their customer code. |
| `PAYSTACK_FETCH_MANDATE_AUTHORIZATIONS` | Fetch Mandate Authorizations | Tool to fetch the list of direct debit mandate authorizations associated with a customer. Use when you need to retrieve all mandate authorizations for a specific customer ID. |
| `PAYSTACK_FETCH_PAYMENT_PAGE` | Fetch Payment Page | Tool to fetch details of a payment page on your Paystack integration. Use when you need to retrieve information about a specific payment page by its ID. |
| `PAYSTACK_FETCH_PAYMENT_REQUEST_DETAILS` | Fetch Payment Request Details | Tool to fetch details of a payment request from Paystack. Use when you need to retrieve comprehensive information about a previously created payment request, including customer details, payment status, line items, and associated metadata. |
| `PAYSTACK_FETCH_PAYMENT_SESSION_TIMEOUT` | Fetch Payment Session Timeout | Tool to fetch the payment session timeout configured on your Paystack integration. Use when you need to check the current timeout duration for payment sessions. |
| `PAYSTACK_FETCH_PLAN` | Fetch Plan | Tool to get details of a plan on your integration. Use when you need to retrieve plan information using the plan code or ID. |
| `PAYSTACK_FETCH_PRODUCT` | Fetch Product | Tool to get details of a product on your integration. Use when you need to retrieve product information by its ID. |
| `PAYSTACK_FETCH_PRODUCT_ORDERS` | Fetch Product Orders | Tool to fetch all orders for a particular product on your Paystack integration. Use when you need to retrieve order history and details for a specific product by its ID. |
| `PAYSTACK_FETCH_REFUND` | Fetch Refund | Tool to get details of a refund on your integration. Use when you need to retrieve comprehensive information about a specific refund, including status, amount, customer details, and timestamps. |
| `PAYSTACK_FETCH_SPLIT` | Fetch Split | Tool to get details of a split configuration for a transaction. Use when you need to retrieve split payment configuration information by its ID. |
| `PAYSTACK_FETCH_STOREFRONT` | Fetch Storefront | Tool to get the details of a previously created Storefront. Use when you need to retrieve information about a specific storefront including its products, contacts, and configuration. |
| `PAYSTACK_FETCH_STOREFRONT_ORDERS` | Fetch Storefront Orders | Tool to fetch all orders in a Paystack storefront. Use when you need to retrieve order information for a specific storefront using its ID. |
| `PAYSTACK_FETCH_SUBACCOUNT` | Fetch Subaccount | Tool to get details of a subaccount on your integration. Use when you need to retrieve subaccount information using the subaccount code. |
| `PAYSTACK_FETCH_SUBSCRIPTION` | Fetch Subscription | Tool to get details of a subscription on your integration. Use when you need to retrieve subscription information using the subscription code. |
| `PAYSTACK_FETCH_TRANSACTION` | Fetch Transaction | Tool to get details of a transaction carried out on your integration. Use when you need to retrieve comprehensive information about a specific transaction, including payment status, customer details, authorization info, and timestamps. |
| `PAYSTACK_FETCH_TRANSACTION_TIMELINE` | Fetch Transaction Timeline | Tool to fetch the timeline of a transaction showing the steps taken from initiation to completion. Use when you need to debug payment flows or understand where customers encountered issues during the payment process. |
| `PAYSTACK_FETCH_TRANSFER_RECIPIENT` | Fetch Transfer Recipient | Tool to fetch details of a transfer recipient. Use when you need to retrieve information about an existing recipient using their recipient code. |
| `PAYSTACK_FETCH_VIRTUAL_TERMINAL` | Fetch Virtual Terminal | Tool to fetch a Virtual Terminal on your Paystack integration. Use when you need to retrieve details about an existing virtual terminal, including its configuration, payment methods, and active status. |
| `PAYSTACK_FINALIZE_PAYMENT_REQUEST` | Finalize Payment Request | Tool to finalize the creation of a draft payment request for a customer. Use when you need to convert a draft payment request into an active one that can be paid by the customer. |
| `PAYSTACK_GENERATE_UPDATE_SUBSCRIPTION_LINK` | Generate Update Subscription Link | Tool to generate a link for updating the card on a subscription. Use when you need to allow a customer to update their payment card for an active subscription. |
| `PAYSTACK_GET_PAYMENT_REQUEST_TOTALS` | Get Payment Request Totals | Tool to retrieve metrics for all pending and successful payment requests. Use when you need an overview of payment request amounts grouped by currency and status. |
| `PAYSTACK_GET_TRANSACTION_TOTALS` | Get Transaction Totals | Tool to get the total amount received on your Paystack account. Use when you need to retrieve transaction totals and pending transfers, optionally filtered by date range. |
| `PAYSTACK_INITIALIZE_AUTHORIZATION` | Initialize Authorization | Tool to initialize a reusable authorization for recurring transactions. Use when you need to create a direct debit mandate that allows charging a customer's account repeatedly without requiring them to provide payment details each time. |
| `PAYSTACK_INITIALIZE_TRANSACTION` | Initialize Transaction | Tool to initialize a transaction from your backend. Returns an authorization URL to redirect the customer to for payment. Use when you need to start a payment flow and get a checkout URL for the customer. |
| `PAYSTACK_INITIATE_BULK_CHARGE` | Initiate Bulk Charge | Tool to initiate a bulk charge on your integration. Use when you need to charge multiple customers at once using their authorization codes. |
| `PAYSTACK_LIST_BANKS` | List Banks | Tool to get a list of all supported banks and their properties on Paystack. Use when you need to retrieve available banks for payments, transfers, or account verification. |
| `PAYSTACK_LIST_BULK_CHARGE_BATCHES` | List Bulk Charge Batches | Tool to list bulk charge batches created on your integration. Use when you need to view all bulk charge batches, optionally filtering by status (active, paused, or complete) and paginating through results. |
| `PAYSTACK_LIST_CHARGES_IN_BATCH` | List Charges in Batch | Tool to retrieve the charges associated with a specified bulk charge batch. Use when you need to inspect individual charge details within a batch to monitor charge statuses or retrieve charge-level information. |
| `PAYSTACK_LIST_COUNTRIES` | List countries | Tool to retrieve a list of countries that Paystack currently supports. Use when you need to know which countries are available for Paystack operations. |
| `PAYSTACK_LIST_CUSTOMERS` | List Customers | Tool to list customers available on your integration. Use when you need to retrieve all customers with optional filtering by date range and pagination support. |
| `PAYSTACK_LIST_DISPUTES` | List Disputes | Tool to list transaction disputes filed by customers on your Paystack integration. Use when you need to retrieve disputes with optional filtering by status, transaction, or date range. |
| `PAYSTACK_LIST_APPLE_PAY_DOMAINS` | List Apple Pay Domains | Tool to list all registered Apple Pay domains on your integration. Use when you need to retrieve domains configured for Apple Pay payments. |
| `PAYSTACK_LIST_MANDATE_AUTHORIZATIONS` | List Mandate Authorizations | Tool to get a list of all direct debit mandates on your integration. Use when you need to retrieve mandate authorizations with optional filtering by status and pagination support. |
| `PAYSTACK_LIST_ORDERS` | List Orders | Tool to list orders available on your integration. Use when you need to retrieve all orders with optional filtering by date range and pagination support. |
| `PAYSTACK_LIST_PAYMENT_PAGES` | List Payment Pages | Tool to list payment pages available on your Paystack integration. Use when you need to retrieve all payment pages with optional filtering by date range and pagination. |
| `PAYSTACK_LIST_PAYMENT_REQUESTS` | List Payment Requests | Tool to list all previously created payment requests to your customers. Use when you need to retrieve a list of payment requests with optional filters for customer, status, currency, or date range. |
| `PAYSTACK_LIST_PLANS` | List Plans | Tool to list all subscription plans available on your integration. Use when you need to retrieve plans, optionally filtering by interval, amount, or date range. |
| `PAYSTACK_LIST_PRODUCTS` | List Products | Tool to list products available on your integration. Use when you need to retrieve all products with optional filtering by date range, active status, and pagination support. |
| `PAYSTACK_LIST_REFUNDS` | List Refunds | Tool to list refunds available on your integration. Use when you need to retrieve a list of refunds with optional filters for date range and pagination. |
| `PAYSTACK_LIST_SETTLEMENTS` | List Settlements | Tool to list settlements made to your settlement accounts. Use when you need to retrieve settlement information with optional pagination support. |
| `PAYSTACK_LIST_SPLITS` | List Splits | Tool to list the transaction splits available on your integration. Use when you need to retrieve all split configurations with optional filtering by name, status, subaccount, or date range. |
| `PAYSTACK_LIST_STATES_FOR_ADDRESS_VERIFICATION` | List states for address verification | Tool to retrieve a list of states for a country for address verification. Use when you need to get available states/provinces for a specific country code. |
| `PAYSTACK_LIST_STOREFRONT_PRODUCTS` | List Storefront Products | Tool to list all products in a Paystack storefront. Use when you need to retrieve product information for a specific storefront using its ID. |
| `PAYSTACK_LIST_STOREFRONTS` | List Storefronts | Tool to list storefronts available on your integration. Use when you need to retrieve all storefronts with optional filtering by status and pagination support. |
| `PAYSTACK_LIST_SUBACCOUNTS` | List Subaccounts | Tool to list subaccounts available on your integration. Use when you need to retrieve all subaccounts with optional filtering by active status and pagination support. |
| `PAYSTACK_LIST_SUBSCRIPTIONS` | List Subscriptions | Tool to list all subscriptions available on your integration. Use when you need to retrieve subscriptions, optionally filtering by plan, customer, or date range. |
| `PAYSTACK_LIST_TRANSACTIONS` | List Transactions | Tool to list transactions that have occurred on your integration. Use when you need to retrieve all transactions with optional filtering by date range, status, source, channel, customer, and other criteria. Supports both cursor-based and page-based pagination. |
| `PAYSTACK_LIST_TRANSFER_RECIPIENTS` | List Transfer Recipients | Tool to list transfer recipients available on your integration. Use when you need to retrieve all recipients with optional pagination support. |
| `PAYSTACK_LIST_TRANSFERS` | List Transfers | Tool to list all transfers carried out on your integration. Use when you need to retrieve transfer history with optional filtering by status, recipient, or date range. |
| `PAYSTACK_LIST_VIRTUAL_TERMINALS` | List Virtual Terminals | Tool to list virtual terminals available on your integration. Use when you need to retrieve all virtual terminals with pagination support. |
| `PAYSTACK_PAUSE_BULK_CHARGE` | Pause Bulk Charge | Tool to pause processing of a bulk charge batch. Use when you need to temporarily stop a bulk charge batch from processing further charges. |
| `PAYSTACK_PUBLISH_STOREFRONT` | Publish Storefront | Tool to make a Storefront publicly available on Paystack. Use this when you need to publish a previously created storefront so that customers can access and purchase from it. |
| `PAYSTACK_REMOVE_SUBACCOUNT_FROM_SPLIT` | Remove Subaccount from Split | Tool to remove a subaccount from a split configuration. Use this when you need to stop payment distribution to a specific partner or customer in an existing split. The share parameter must match the subaccount's current allocation. |
| `PAYSTACK_RESEND_OTP_FOR_TRANSFER` | Resend OTP for Transfer | Tool to resend OTP for a transfer. Use when a customer is having trouble receiving their OTP and needs a new one sent to complete their transfer. |
| `PAYSTACK_RESOLVE_CARD_BIN` | Resolve Card BIN | Tool to get basic information about a card BIN (Bank Identification Number). Use when you need to retrieve card details such as brand, issuing bank, country, and card type from the first 6 digits of a card. |
| `PAYSTACK_RESUME_BULK_CHARGE_BATCH` | Resume Bulk Charge Batch | Tool to resume processing of a previously paused bulk charge batch. Use when you need to restart a paused bulk charge batch using its batch code. |
| `PAYSTACK_SEND_PAYMENT_REQUEST_NOTIFICATION` | Send Payment Request Notification | Tool to send an email notification to a customer for a previously created payment request. Use when you need to remind a customer about an unpaid invoice or payment request. |
| `PAYSTACK_SEND_SUBSCRIPTION_UPDATE_LINK` | Send Subscription Update Link | Tool to send an email to the customer with a link to update the card on their subscription. Use when a customer needs to update their payment card for an active subscription and you want to notify them via email. |
| `PAYSTACK_SET_RISK_ACTION` | Set Risk Action | Tool to set a customer's risk action by whitelisting or blacklisting them. Use when you need to apply fraud prevention rules to a specific customer by setting their risk action to 'allow' (whitelist), 'deny' (blacklist), or 'default' (no special action). |
| `PAYSTACK_SUBMIT_PHONE` | Submit Phone | Tool to submit phone number when requested during a charge transaction. Use this when a charge requires phone number submission for verification or authentication purposes. |
| `PAYSTACK_TRIGGER_DIRECT_DEBIT_ACTIVATION_CHARGE` | Trigger direct debit activation charge | Tool to trigger an activation charge on an inactive direct debit mandate for a customer. Use when a mandate needs to be reactivated or retried. |
| `PAYSTACK_UNASSIGN_DESTINATION_FROM_VIRTUAL_TERMINAL` | Unassign Destination from Virtual Terminal | Tool to unassign WhatsApp destinations from a Virtual Terminal. Use when you need to remove recipients who should no longer receive payment notifications for a specific Virtual Terminal. |
| `PAYSTACK_UNREGISTER_APPLE_PAY_DOMAIN` | Unregister Apple Pay Domain | Tool to unregister a top-level domain or subdomain previously used for Apple Pay integration. Use when you need to remove a domain from your Apple Pay configuration. |
| `PAYSTACK_UPDATE_CUSTOMER` | Update Customer | Tool to update a customer's details on your Paystack integration. Use when you need to modify existing customer information such as name, phone number, or metadata. |
| `PAYSTACK_UPDATE_PAYMENT_PAGE` | Update Payment Page | Tool to update a payment page on your Paystack integration. Use when you need to modify details of an existing payment page such as name, description, amount, or active status. |
| `PAYSTACK_UPDATE_PAYMENT_REQUEST` | Update Payment Request | Tool to update a payment request on your Paystack integration. Use when you need to modify details of an existing payment request such as amount, description, due date, or other attributes. |
| `PAYSTACK_UPDATE_PAYMENT_SESSION_TIMEOUT` | Update Payment Session Timeout | Tool to update the payment session timeout on your Paystack integration. Use when you need to change the duration before a payment session expires. |
| `PAYSTACK_UPDATE_PLAN` | Update Plan | Tool to update a plan's details on your Paystack integration. Use when you need to modify an existing plan's name, amount, interval, or other settings. Only the fields you provide will be updated; other fields remain unchanged. |
| `PAYSTACK_UPDATE_PRODUCT` | Update Product | Tool to update a product on your integration. Use when you need to modify product details like name, description, price, or currency. |
| `PAYSTACK_UPDATE_SPLIT_CONFIGURATION` | Update Split Configuration | Tool to update a split configuration for transactions. Use when you need to modify split settings such as name, active status, or bearer type. |
| `PAYSTACK_UPDATE_STOREFRONT` | Update Storefront | Tool to update the details of a previously created Storefront. Use when you need to modify storefront information such as name, description, or slug. |
| `PAYSTACK_UPDATE_SUBACCOUNT` | Update Subaccount | Tool to update a subaccount's details on your Paystack integration. Use when you need to modify existing subaccount information such as business name, bank details, contact information, or activation status. |
| `PAYSTACK_UPDATE_TRANSFER_RECIPIENT` | Update Transfer Recipient | Tool to update the details of a transfer recipient. Use when you need to modify an existing recipient's name or email address. |
| `PAYSTACK_VALIDATE_BANK_ACCOUNT` | Validate Bank Account | Tool to validate the authenticity of a customer's bank account before sending money. Use when you need to confirm account details are correct and the account is active and can receive funds. |
| `PAYSTACK_VALIDATE_CUSTOMER` | Validate Customer | Tool to validate a customer's identity on your Paystack integration. Use when you need to verify customer identification details such as BVN and bank account information. The verification happens asynchronously, and Paystack sends a webhook event when verification is complete. |
| `PAYSTACK_VALIDATE_ORDER` | Validate Order | Tool to validate a pay for me order on Paystack. Use when you need to verify the details and status of a previously created order using its unique order code. |
| `PAYSTACK_VERIFY_PAYMENT_REQUEST` | Verify Payment Request | Tool to verify the status of a previously created payment request on Paystack. Use when you need to check if a payment request has been paid or to retrieve details about a specific payment request using its request code. |
| `PAYSTACK_VERIFY_STOREFRONT_SLUG` | Verify Storefront Slug | Tool to verify the availability of a slug before using it for a Storefront. Use when you need to check if a slug is available before creating a new storefront. |
| `PAYSTACK_VERIFY_TRANSACTION` | Verify Transaction | Tool to confirm the status of a transaction using its reference. Use when you need to verify a payment was successful or check the current state of a transaction after customer completes checkout. |

## Supported Triggers

None listed.

## Creating MCP Server - Stand-alone vs Composio SDK

The Paystack MCP server is an implementation of the Model Context Protocol that connects your AI agent to Paystack. It provides structured and secure access so your agent can perform Paystack operations on your behalf through a secure, permission-based interface.
With Composio's managed implementation, you don't have to create your own developer app. For production, if you're building an end product, we recommend using your own credentials. The managed server helps you prototype fast and go from 0-1 faster.

## Step-by-step Guide

### 1. Prerequisites

Before you begin, make sure you have:
- Python 3.8/Node 16 or higher installed
- A Composio account with the API key
- An OpenAI API key
- A Paystack account and project
- Basic familiarity with async Python/Typescript

### 1. Getting API Keys for OpenAI, Composio, and Paystack

No description provided.

### 2. Installing dependencies

No description provided.
```python
pip install composio-llamaindex llama-index llama-index-llms-openai llama-index-tools-mcp python-dotenv
```

```typescript
npm install @composio/llamaindex @llamaindex/openai @llamaindex/tools @llamaindex/workflow dotenv
```

### 3. Set environment variables

Create a .env file in your project root:
These credentials will be used to:
- Authenticate with OpenAI's GPT-5 model
- Connect to Composio's Tool Router
- Identify your Composio user session for Paystack access
```bash
OPENAI_API_KEY=your-openai-api-key
COMPOSIO_API_KEY=your-composio-api-key
COMPOSIO_USER_ID=your-user-id
```

### 4. Import modules

No description provided.
```python
import asyncio
import os
import dotenv

from composio import Composio
from composio_llamaindex import LlamaIndexProvider
from llama_index.core.agent.workflow import ReActAgent
from llama_index.core.workflow import Context
from llama_index.llms.openai import OpenAI
from llama_index.tools.mcp import BasicMCPClient, McpToolSpec

dotenv.load_dotenv()
```

```typescript
import "dotenv/config";
import readline from "node:readline/promises";
import { stdin as input, stdout as output } from "node:process";

import { Composio } from "@composio/core";

import { mcp } from "@llamaindex/tools";
import { agent as createAgent } from "@llamaindex/workflow";
import { openai } from "@llamaindex/openai";

dotenv.config();
```

### 5. Load environment variables and initialize Composio

No description provided.
```python
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
COMPOSIO_API_KEY = os.getenv("COMPOSIO_API_KEY")
COMPOSIO_USER_ID = os.getenv("COMPOSIO_USER_ID")

if not OPENAI_API_KEY:
    raise ValueError("OPENAI_API_KEY is not set in the environment")
if not COMPOSIO_API_KEY:
    raise ValueError("COMPOSIO_API_KEY is not set in the environment")
if not COMPOSIO_USER_ID:
    raise ValueError("COMPOSIO_USER_ID is not set in the environment")
```

```typescript
const OPENAI_API_KEY = process.env.OPENAI_API_KEY;
const COMPOSIO_API_KEY = process.env.COMPOSIO_API_KEY;
const COMPOSIO_USER_ID = process.env.COMPOSIO_USER_ID;

if (!OPENAI_API_KEY) throw new Error("OPENAI_API_KEY is not set");
if (!COMPOSIO_API_KEY) throw new Error("COMPOSIO_API_KEY is not set");
if (!COMPOSIO_USER_ID) throw new Error("COMPOSIO_USER_ID is not set");
```

### 6. Create a Tool Router session and build the agent function

What's happening here:
- We create a Composio client using your API key and configure it with the LlamaIndex provider
- We then create a tool router MCP session for your user, specifying the toolkits we want to use (in this case, paystack)
- The session returns an MCP HTTP endpoint URL that acts as a gateway to all your configured tools
- LlamaIndex will connect to this endpoint to dynamically discover and use the available Paystack tools.
- The MCP tools are mapped to LlamaIndex-compatible tools and plug them into the Agent.
```python
async def build_agent() -> ReActAgent:
    composio_client = Composio(
        api_key=COMPOSIO_API_KEY,
        provider=LlamaIndexProvider(),
    )

    session = composio_client.create(
        user_id=COMPOSIO_USER_ID,
        toolkits=["paystack"],
    )

    mcp_url = session.mcp.url
    print(f"Composio MCP URL: {mcp_url}")

    mcp_client = BasicMCPClient(mcp_url, headers={"x-api-key": COMPOSIO_API_KEY})
    mcp_tool_spec = McpToolSpec(client=mcp_client)
    tools = await mcp_tool_spec.to_tool_list_async()

    llm = OpenAI(model="gpt-5")

    description = "An agent that uses Composio Tool Router MCP tools to perform Paystack actions."
    system_prompt = """
    You are a helpful assistant connected to Composio Tool Router.
    Use the available tools to answer user queries and perform Paystack actions.
    """
    return ReActAgent(tools=tools, llm=llm, description=description, system_prompt=system_prompt, verbose=True)
```

```typescript
async function buildAgent() {

  console.log(`Initializing Composio client...${COMPOSIO_USER_ID!}...`);
  console.log(`COMPOSIO_USER_ID: ${COMPOSIO_USER_ID!}...`);

  const composio = new Composio({
    apiKey: COMPOSIO_API_KEY,
    provider: new LlamaindexProvider(),
  });

  const session = await composio.create(
    COMPOSIO_USER_ID!,
    {
      toolkits: ["paystack"],
    },
  );

  const mcpUrl = session.mcp.url;
  console.log(`Composio Tool Router MCP URL: ${mcpUrl}`);

  const server = mcp({
    url: mcpUrl,
    clientName: "composio_tool_router_with_llamaindex",
    requestInit: {
      headers: {
        "x-api-key": COMPOSIO_API_KEY!,
      },
    },
    // verbose: true,
  });

  const tools = await server.tools();

  const llm = openai({ apiKey: OPENAI_API_KEY, model: "gpt-5" });

  const agent = createAgent({
    name: "composio_tool_router_with_llamaindex",
        description : "An agent that uses Composio Tool Router MCP tools to perform actions.",
    systemPrompt:
      "You are a helpful assistant connected to Composio Tool Router."+
"Use the available tools to answer user queries and perform Paystack actions." ,
    llm,
    tools,
  });

  return agent;
}
```

### 7. Create an interactive chat loop

No description provided.
```python
async def chat_loop(agent: ReActAgent) -> None:
    ctx = Context(agent)
    print("Type 'quit', 'exit', or Ctrl+C to stop.")

    while True:
        try:
            user_input = input("\nYou: ").strip()
        except (KeyboardInterrupt, EOFError):
            print("\nBye!")
            break

        if not user_input or user_input.lower() in {"quit", "exit"}:
            print("Bye!")
            break

        try:
            print("Agent: ", end="", flush=True)
            handler = agent.run(user_input, ctx=ctx)

            async for event in handler.stream_events():
                # Stream token-by-token from LLM responses
                if hasattr(event, "delta") and event.delta:
                    print(event.delta, end="", flush=True)
                # Show tool calls as they happen
                elif hasattr(event, "tool_name"):
                    print(f"\n[Using tool: {event.tool_name}]", flush=True)

            # Get final response
            response = await handler
            print()  # Newline after streaming
        except KeyboardInterrupt:
            print("\n[Interrupted]")
            continue
        except Exception as e:
            print(f"\nError: {e}")
```

```typescript
async function chatLoop(agent: ReturnType<typeof createAgent>) {
  const rl = readline.createInterface({ input, output });

  console.log("Type 'quit' or 'exit' to stop.");

  while (true) {
    let userInput: string;

    try {
      userInput = (await rl.question("\nYou: ")).trim();
    } catch {
      console.log("\nAgent: Bye!");
      break;
    }

    if (!userInput) {
      continue;
    }

    const lower = userInput.toLowerCase();
    if (lower === "quit" || lower === "exit") {
      console.log("Agent: Bye!");
      break;
    }

    try {
      process.stdout.write("Agent: ");

      const stream = agent.runStream(userInput);
      let finalResult: any = null;

      for await (const event of stream) {
        // The event.data contains the streamed content
        const data: any = event.data;

        // Check for streaming delta content
        if (data?.delta) {
          process.stdout.write(data.delta);
        }

        // Store final result for fallback
        if (data?.result || data?.message) {
          finalResult = data;
        }
      }

      // If no streaming happened, show the final result
      if (finalResult) {
        const answer =
          finalResult.result ??
          finalResult.message?.content ??
          finalResult.message ??
          "";
        if (answer && typeof answer === "string" && !answer.includes("[object")) {
          process.stdout.write(answer);
        }
      }

      console.log(); // New line after streaming completes
    } catch (err: any) {
      console.error("\nAgent error:", err?.message ?? err);
    }
  }

  rl.close();
}
```

### 8. Define the main entry point

What's happening here:
- We're orchestrating the entire application flow
- The agent gets built with proper error handling
- Then we kick off the interactive chat loop so you can start talking to Paystack
```python
async def main() -> None:
    agent = await build_agent()
    await chat_loop(agent)

if __name__ == "__main__":
    # Handle Ctrl+C gracefully
    signal.signal(signal.SIGINT, lambda s, f: (print("\nBye!"), exit(0)))
    try:
        asyncio.run(main())
    except KeyboardInterrupt:
        print("\nBye!")
```

```typescript
async function main() {
  try {
    const agent = await buildAgent();
    await chatLoop(agent);
  } catch (err) {
    console.error("Failed to start agent:", err);
    process.exit(1);
  }
}

main();
```

### 9. Run the agent

When prompted, authenticate and authorise your agent with Paystack, then start asking questions.
```bash
python llamaindex_agent.py
```

```typescript
npx ts-node llamaindex-agent.ts
```

## Complete Code

```python
import asyncio
import os
import signal
import dotenv

from composio import Composio
from composio_llamaindex import LlamaIndexProvider
from llama_index.core.agent.workflow import ReActAgent
from llama_index.core.workflow import Context
from llama_index.llms.openai import OpenAI
from llama_index.tools.mcp import BasicMCPClient, McpToolSpec

dotenv.load_dotenv()

OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
COMPOSIO_API_KEY = os.getenv("COMPOSIO_API_KEY")
COMPOSIO_USER_ID = os.getenv("COMPOSIO_USER_ID")

if not OPENAI_API_KEY:
    raise ValueError("OPENAI_API_KEY is not set")
if not COMPOSIO_API_KEY:
    raise ValueError("COMPOSIO_API_KEY is not set")
if not COMPOSIO_USER_ID:
    raise ValueError("COMPOSIO_USER_ID is not set")

async def build_agent() -> ReActAgent:
    composio_client = Composio(
        api_key=COMPOSIO_API_KEY,
        provider=LlamaIndexProvider(),
    )

    session = composio_client.create(
        user_id=COMPOSIO_USER_ID,
        toolkits=["paystack"],
    )

    mcp_url = session.mcp.url
    print(f"Composio MCP URL: {mcp_url}")

    mcp_client = BasicMCPClient(mcp_url, headers={"x-api-key": COMPOSIO_API_KEY})
    mcp_tool_spec = McpToolSpec(client=mcp_client)
    tools = await mcp_tool_spec.to_tool_list_async()

    llm = OpenAI(model="gpt-5")
    description = "An agent that uses Composio Tool Router MCP tools to perform Paystack actions."
    system_prompt = """
    You are a helpful assistant connected to Composio Tool Router.
    Use the available tools to answer user queries and perform Paystack actions.
    """
    return ReActAgent(
        tools=tools,
        llm=llm,
        description=description,
        system_prompt=system_prompt,
        verbose=True,
    );

async def chat_loop(agent: ReActAgent) -> None:
    ctx = Context(agent)
    print("Type 'quit', 'exit', or Ctrl+C to stop.")

    while True:
        try:
            user_input = input("\nYou: ").strip()
        except (KeyboardInterrupt, EOFError):
            print("\nBye!")
            break

        if not user_input or user_input.lower() in {"quit", "exit"}:
            print("Bye!")
            break

        try:
            print("Agent: ", end="", flush=True)
            handler = agent.run(user_input, ctx=ctx)

            async for event in handler.stream_events():
                # Stream token-by-token from LLM responses
                if hasattr(event, "delta") and event.delta:
                    print(event.delta, end="", flush=True)
                # Show tool calls as they happen
                elif hasattr(event, "tool_name"):
                    print(f"\n[Using tool: {event.tool_name}]", flush=True)

            # Get final response
            response = await handler
            print()  # Newline after streaming
        except KeyboardInterrupt:
            print("\n[Interrupted]")
            continue
        except Exception as e:
            print(f"\nError: {e}")

async def main() -> None:
    agent = await build_agent()
    await chat_loop(agent)

if __name__ == "__main__":
    # Handle Ctrl+C gracefully
    signal.signal(signal.SIGINT, lambda s, f: (print("\nBye!"), exit(0)))
    try:
        asyncio.run(main())
    except KeyboardInterrupt:
        print("\nBye!")
```

```typescript
import "dotenv/config";
import readline from "node:readline/promises";
import { stdin as input, stdout as output } from "node:process";

import { Composio } from "@composio/core";
import { LlamaindexProvider } from "@composio/llamaindex";

import { mcp } from "@llamaindex/tools";
import { agent as createAgent } from "@llamaindex/workflow";
import { openai } from "@llamaindex/openai";

dotenv.config();

const OPENAI_API_KEY = process.env.OPENAI_API_KEY;
const COMPOSIO_API_KEY = process.env.COMPOSIO_API_KEY;
const COMPOSIO_USER_ID = process.env.COMPOSIO_USER_ID;

if (!OPENAI_API_KEY) {
    throw new Error("OPENAI_API_KEY is not set in the environment");
  }
if (!COMPOSIO_API_KEY) {
    throw new Error("COMPOSIO_API_KEY is not set in the environment");
  }
if (!COMPOSIO_USER_ID) {
    throw new Error("COMPOSIO_USER_ID is not set in the environment");
  }

async function buildAgent() {

  console.log(`Initializing Composio client...${COMPOSIO_USER_ID!}...`);
  console.log(`COMPOSIO_USER_ID: ${COMPOSIO_USER_ID!}...`);

  const composio = new Composio({
    apiKey: COMPOSIO_API_KEY,
    provider: new LlamaindexProvider(),
  });

  const session = await composio.create(
    COMPOSIO_USER_ID!,
    {
      toolkits: ["paystack"],
    },
  );

  const mcpUrl = session.mcp.url;
  console.log(`Composio Tool Router MCP URL: ${mcpUrl}`);

  const server = mcp({
    url: mcpUrl,
    clientName: "composio_tool_router_with_llamaindex",
    requestInit: {
      headers: {
        "x-api-key": COMPOSIO_API_KEY!,
      },
    },
    // verbose: true,
  });

  const tools = await server.tools();

  const llm = openai({ apiKey: OPENAI_API_KEY, model: "gpt-5" });

  const agent = createAgent({
    name: "composio_tool_router_with_llamaindex",
    description:
      "An agent that uses Composio Tool Router MCP tools to perform actions.",
    systemPrompt:
      "You are a helpful assistant connected to Composio Tool Router."+
"Use the available tools to answer user queries and perform Paystack actions." ,
    llm,
    tools,
  });

  return agent;
}

async function chatLoop(agent: ReturnType<typeof createAgent>) {
  const rl = readline.createInterface({ input, output });

  console.log("Type 'quit' or 'exit' to stop.");

  while (true) {
    let userInput: string;

    try {
      userInput = (await rl.question("\nYou: ")).trim();
    } catch {
      console.log("\nAgent: Bye!");
      break;
    }

    if (!userInput) {
      continue;
    }

    const lower = userInput.toLowerCase();
    if (lower === "quit" || lower === "exit") {
      console.log("Agent: Bye!");
      break;
    }

    try {
      process.stdout.write("Agent: ");

      const stream = agent.runStream(userInput);
      let finalResult: any = null;

      for await (const event of stream) {
        // The event.data contains the streamed content
        const data: any = event.data;

        // Check for streaming delta content
        if (data?.delta) {
          process.stdout.write(data.delta);
        }

        // Store final result for fallback
        if (data?.result || data?.message) {
          finalResult = data;
        }
      }

      // If no streaming happened, show the final result
      if (finalResult) {
        const answer =
          finalResult.result ??
          finalResult.message?.content ??
          finalResult.message ??
          "";
        if (answer && typeof answer === "string" && !answer.includes("[object")) {
          process.stdout.write(answer);
        }
      }

      console.log(); // New line after streaming completes
    } catch (err: any) {
      console.error("\nAgent error:", err?.message ?? err);
    }
  }

  rl.close();
}

async function main() {
  try {
    const agent = await buildAgent();
    await chatLoop(agent);
  } catch (err: any) {
    console.error("Failed to start agent:", err?.message ?? err);
    process.exit(1);
  }
}

main();
```

## Conclusion

You've successfully connected Paystack to LlamaIndex through Composio's Tool Router MCP layer.
Key takeaways:
- Tool Router dynamically exposes Paystack tools through an MCP endpoint
- LlamaIndex's ReActAgent handles reasoning and orchestration; Composio handles integrations
- The agent becomes more capable without increasing prompt size
- Async Python provides clean, efficient execution of agent workflows
You can easily extend this to other toolkits like Gmail, Notion, Stripe, GitHub, and more by adding them to the toolkits parameter.

## How to build Paystack MCP Agent with another framework

- [OpenAI Agents SDK](https://composio.dev/toolkits/paystack/framework/open-ai-agents-sdk)
- [Claude Agent SDK](https://composio.dev/toolkits/paystack/framework/claude-agents-sdk)
- [Claude Code](https://composio.dev/toolkits/paystack/framework/claude-code)
- [Claude Cowork](https://composio.dev/toolkits/paystack/framework/claude-cowork)
- [Codex](https://composio.dev/toolkits/paystack/framework/codex)
- [OpenClaw](https://composio.dev/toolkits/paystack/framework/openclaw)
- [Hermes](https://composio.dev/toolkits/paystack/framework/hermes-agent)
- [CLI](https://composio.dev/toolkits/paystack/framework/cli)
- [Google ADK](https://composio.dev/toolkits/paystack/framework/google-adk)
- [LangChain](https://composio.dev/toolkits/paystack/framework/langchain)
- [Vercel AI SDK](https://composio.dev/toolkits/paystack/framework/ai-sdk)
- [Mastra AI](https://composio.dev/toolkits/paystack/framework/mastra-ai)
- [CrewAI](https://composio.dev/toolkits/paystack/framework/crew-ai)

## Related Toolkits

- [Stripe](https://composio.dev/toolkits/stripe) - Stripe is a global online payments platform offering APIs for managing payments, customers, and subscriptions. Trusted by businesses for secure, efficient, and scalable payment processing worldwide.
- [Alpha vantage](https://composio.dev/toolkits/alpha_vantage) - Alpha Vantage is a financial data platform offering real-time and historical stock market APIs. Get instant, reliable access to equities, forex, and technical analysis data for smarter trading decisions.
- [Altoviz](https://composio.dev/toolkits/altoviz) - Altoviz is a cloud-based billing and invoicing platform for businesses. It streamlines online payments, expense tracking, and customizable invoice management.
- [Benzinga](https://composio.dev/toolkits/benzinga) - Benzinga provides real-time financial news and data APIs for market coverage. It helps you track breaking news and actionable market insights instantly.
- [Brex](https://composio.dev/toolkits/brex) - Brex provides corporate credit cards and spend management tailored for startups and tech businesses. It helps optimize company cash flow, streamline accounting, and accelerate business growth.
- [Chaser](https://composio.dev/toolkits/chaser) - Chaser is accounts receivable automation software that sends invoice reminders and helps businesses get paid faster. It streamlines the collections process to save time and improve cash flow.
- [Clientary](https://composio.dev/toolkits/clientary) - Clientary is a platform for managing clients, invoices, projects, proposals, and more. It streamlines client work and saves you serious admin time.
- [Coinbase](https://composio.dev/toolkits/coinbase) - Coinbase is a platform for buying, selling, and storing cryptocurrency. It makes exchanging and managing crypto simple and secure for everyone.
- [Coinranking](https://composio.dev/toolkits/coinranking) - Coinranking is a comprehensive cryptocurrency market data platform offering access to real-time coin prices, market caps, and historical data. Get accurate, up-to-date stats for thousands of digital assets in one place.
- [Coupa](https://composio.dev/toolkits/coupa) - Coupa is a business spend management platform for procurement, invoicing, and expenses. It helps organizations streamline purchasing, control costs, and gain complete visibility over financial operations.
- [CurrencyScoop](https://composio.dev/toolkits/currencyscoop) - CurrencyScoop is a developer-friendly API for real-time and historical currency exchange rates. Easily access fiat and crypto data for smart, up-to-date financial applications.
- [Daffy](https://composio.dev/toolkits/daffy) - Daffy is a modern charitable giving platform with a donor-advised fund. Easily set aside funds, grow them tax-free, and donate to over 1.7 million U.S. charities.
- [Eagle doc](https://composio.dev/toolkits/eagle_doc) - Eagle doc is an AI-powered OCR API for invoices and receipts. It delivers fast, reliable, and accurate document data extraction for seamless automation.
- [Elorus](https://composio.dev/toolkits/elorus) - Elorus is an online invoicing and time-tracking software for freelancers and small businesses. Easily manage finances, bill clients, and track work in one place.
- [Eodhd apis](https://composio.dev/toolkits/eodhd_apis) - Eodhd apis delivers comprehensive financial data, including live and historical stock prices, via robust APIs. Easily access reliable, up-to-date market insights to power your apps, dashboards, and analytics.
- [Fidel api](https://composio.dev/toolkits/fidel_api) - Fidel api is a secure platform for linking payment cards to web and mobile apps. It enables real-time card transaction monitoring and event-based automation for businesses.
- [Finage](https://composio.dev/toolkits/finage) - Finage is a secure API platform delivering real-time and historical financial data for stocks, forex, crypto, indices, and commodities. It empowers developers and businesses to access, analyze, and act on market data instantly.
- [Finmei](https://composio.dev/toolkits/finmei) - Finmei is an invoicing tool that simplifies billing, invoice management, and expense tracking. Ideal for automating and organizing your business finances in one place.
- [Fixer](https://composio.dev/toolkits/fixer) - Fixer is a currency data API offering real-time and historical exchange rates for 170 currencies. Instantly access accurate, up-to-date forex data for your applications and workflows.
- [Fixer io](https://composio.dev/toolkits/fixer_io) - Fixer.io is a lightweight API for real-time and historical foreign exchange rates. It makes global currency conversion fast, accurate, and hassle-free.

## Frequently Asked Questions

### What are the differences in Tool Router MCP and Paystack MCP?

With a standalone Paystack MCP server, the agents and LLMs can only access a fixed set of Paystack tools tied to that server. However, with the Composio Tool Router, agents can dynamically load tools from Paystack and many other apps based on the task at hand, all through a single MCP endpoint.

### Can I use Tool Router MCP with LlamaIndex?

Yes, you can. LlamaIndex fully supports MCP integration. You get structured tool calling, message history handling, and model orchestration while Tool Router takes care of discovering and serving the right Paystack tools.

### Can I manage the permissions and scopes for Paystack while using Tool Router?

Yes, absolutely. You can configure which Paystack scopes and actions are allowed when connecting your account to Composio. You can also bring your own OAuth credentials or API configuration so you keep full control over what the agent can do.

### How safe is my data with Composio Tool Router?

All sensitive data such as tokens, keys, and configuration is fully encrypted at rest and in transit. Composio is SOC 2 Type 2 compliant and follows strict security practices so your Paystack data and credentials are handled as safely as possible.

---
[See all toolkits](https://composio.dev/toolkits) · [Composio docs](https://docs.composio.dev/llms.txt)
