Skip to main content
Glama

Extend AI Toolkit MCP Server

Official
helpers.py7.5 kB
import json from typing import Dict # Helper functions for formatting responses def add_line(label, value): """Return a formatted line only if value is not None or 'N/A'.""" if value is not None and value != "N/A": return f" {label}: {value}\n" return "" def format_virtual_cards_list(response: Dict) -> str: """Format the virtual cards list response""" pagination = response.get("pagination", {}) cards = response.get("virtualCards", []) if not cards: return "No virtual cards found." result = f"Pagination:{json.dumps(pagination)}\n\nVirtual Cards:\n\n" for card in cards: result += ( f"- ID: {card['id']}\n" f" Name: {card['displayName']}\n" f" Status: {card['status']}\n" f" Balance: ${card['balanceCents'] / 100:.2f}\n" f" Expires: {card['expires']}\n\n" ) return result def format_canceled_virtual_card(response: Dict) -> str: """Format the canceled virtual card response""" card = response.get("virtualCard", {}) if not card: return "Virtual card not found." return ( f"Virtual Card Cancelled Successfully!\n\n" f"ID: {card['id']}\n" f"Name: {card['displayName']}\n" f"Status: {card['status']}\n" f"Balance: ${card['balanceCents'] / 100:.2f}\n" ) def format_closed_virtual_card(response: Dict) -> str: """Format the closed virtual card response""" card = response.get("virtualCard", {}) if not card: return "Virtual card not found." return ( f"Virtual Card Closed Successfully!\n\n" f"ID: {card['id']}\n" f"Name: {card['displayName']}\n" f"Status: {card['status']}\n" f"Final Balance: ${card['balanceCents'] / 100:.2f}\n" ) def format_virtual_card_details(response: Dict) -> str: """Format the detailed virtual card response""" card = response.get("virtualCard", {}) if not card: return "Virtual card not found." return ( f"Virtual Card Details:\n\n" f"ID: {card['id']}\n" f"Name: {card['displayName']}\n" f"Status: {card['status']}\n" f"Balance: ${card['balanceCents'] / 100:.2f}\n" f"Spent: ${card['spentCents'] / 100:.2f}\n" f"Limit: ${card['limitCents'] / 100:.2f}\n" f"Last 4: {card['last4']}\n" f"Expires: {card['expires']}\n" f"Valid From: {card['validFrom']}\n" f"Valid To: {card['validTo']}\n" f"Recipient: {card.get('recipientId', 'N/A')}\n" f"Notes: {card.get('notes', 'N/A')}\n" ) def format_credit_cards_list(response: Dict) -> str: """Format the credit cards list response""" cards = response.get("creditCards", []) if not cards: return "No credit cards found." result = "Available Credit Cards:\n\n" for card in cards: result += ( f"- ID: {card['id']}\n" f" Name: {card['displayName']}\n" f" Status: {card['status']}\n" f" Last 4: {card['last4']}\n" f" Issuer: {card['issuerName']}\n\n" ) return result def format_credit_card_detail(response: Dict) -> str: """Format the credit card detail response""" card = response.get("creditCard", {}) if not card: return "No credit card found." card_features = card['features'] or {} return ( f"Credit Card Details:\n\n" f"- ID: {card['id']}\n" f" Name: {card['displayName']}\n" f" Card User: {card['user']['firstName']} {card['user']['lastName']}\n" f" Is Budget: {card['parentCreditCardId'] is not None}\n" f" Status: {card['status']}\n" f" Last 4: {card['last4']}\n" f" Issuer: {card['issuerName']}\n" f" Guest Cards Enabled: {card_features['direct']}\n" f" Receipt Management Enabled: {card_features['receiptManagementEnabled']}\n" f" Receipt Capture Enabled: {card_features['receiptCaptureEnabled']}\n" f" Bill Pay Enabled: {card_features['billPay']}\n\n" ) def format_transactions_list(response: Dict) -> str: """Format the transactions list response""" # Handle case where response is error message if isinstance(response, str): return response # Get report data report = response.get("report", {}) transactions = report.get("transactions", []) if not transactions: return "No transactions found." # Add pagination info current_page = report.get("page", 1) total_pages = report.get("numPages", 1) per_page = report.get("per_page", 25) total_count = report.get("count", 0) result = f"Recent Transactions (Page {current_page} of {total_pages}, {total_count} total):\n\n" for txn in transactions: # Always include these required fields txn_id = txn.get('id') amount_cents = txn.get('clearingBillingAmountCents', txn.get('authBillingAmountCents', 0)) status = txn.get('status') # Start the transaction entry result += f"- ID: {txn_id}\n" result += f" Amount: ${amount_cents / 100:.2f}\n" result += f" Status: {status}\n" # Date can be under authedAt or clearedAt; skip if neither is provided txn_date = txn.get('authedAt', txn.get('clearedAt')) result += add_line("Date", txn_date) # Optional fields – add only if they have a valid value result += add_line("VCN ID", txn.get('virtualCardId')) result += add_line("VCN Name", txn.get('virtualCardDisplayName')) result += add_line("Cardholder Name", txn.get('cardholderName')) result += add_line("Recipient Name", txn.get('recipientName')) result += add_line("Merchant", txn.get('merchantName')) result += add_line("MCC", txn.get('mccDescription')) result += add_line("Notes", txn.get('notes')) result += add_line("Review Status", txn.get('reviewStatus')) result += add_line("Receipt Required", txn.get('receiptRequired')) result += add_line("Receipt Attachments Count", txn.get('attachmentsCount')) # For fields like connectedPlatforms that require some processing, # compute the value first synced_to_erp = True if txn.get('connectedPlatforms') and len(txn.get('connectedPlatforms')) > 0 else False result += add_line("Synced to ERP", synced_to_erp) # Optionally add a blank line or separator between transactions result += "\n" if current_page < total_pages: result += f"\nThere are more transactions available. Use page parameter to view next page." return result def format_transaction_details(response: Dict) -> str: """Format the transaction detail response""" txn = response if not txn: return "Transaction not found." amount = txn.get('clearingBillingAmountCents', txn.get('authBillingAmountCents', 0)) return ( f"Transaction Details:\n\n" f"ID: {txn['id']}\n" f"Merchant: {txn.get('merchantName', 'N/A')}\n" f"Amount: ${amount / 100:.2f}\n" f"Status: {txn['status']}\n" f"Type: {txn['type']}\n" f"Card: {txn.get('virtualCardId', 'N/A')}\n" f"Authorization Date: {txn.get('authedAt', 'N/A')}\n" f"Clearing Date: {txn.get('clearedAt', 'N/A')}\n" f"MCC: {txn.get('mcc', 'N/A')}\n" f"Notes: {txn.get('notes', 'N/A')}\n" )

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/paywithextend/extend-ai-toolkit'

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