Skip to main content
Glama
AnanseLabs-Org

BulkClix MCP Server

Ananse MCP Server (Python FastMCP)

A Python-based MCP (Model Context Protocol) server that gives AI agents (LibreChat, Claude Desktop, Cursor, etc.) full access to ghanaian platforms via natural language.

Developed with FastMCP for simple tool declarations.


Features

  • Food & Catalog Ordering: Search food menus across Accra/Bolt Food catalog, place merchant orders via SMS, collect MoMo payments.

  • MongoDB Order Tracking: Save user profiles, delivery addresses, and track live order lifecycle states (PENDING, CONFIRMED, IN_TRANSIT, DELIVERED).

  • SMS: Send bulk SMS, fetch campaign reports, request/list Sender IDs.

  • OTP: Send and verify OTPs via SMS and Email.

  • Airtime: List networks, purchase airtime via momo, and send airtime from wallet balance.

  • Mobile Money: MoMo payment collections, status checks, disbursements.

  • Bank Transfer: Disburse to bank accounts, list banks.

  • Data Bundles: Fetch bundles, purchase data packages.

  • KYC: MSISDN owner name lookups.

  • Contacts: Full CRUD for contact groups & contacts.

  • Account: Check wallet balance.


Related MCP server: AgentPhone MCP Server

Installation & Running

Run the server along with the mini MongoDB instance for tracking orders and storing user profiles:

docker-compose up -d

Option 2: Standalone via uv

Using uv is highly recommended as it automatically manages dependencies:

# Run server using uv
uv run server.py

If you want the server to use a default BulkClix key, set BULKCLIX_API_KEY before starting it:

export BULKCLIX_API_KEY="your-bulkclix-api-key"
uv run server.py mcp

To expose admin-only workflows like contact management, enable internal tools on the server:

export BULKCLIX_ENABLE_INTERNAL_TOOLS=true

The public chat-facing tools now work without caller-supplied keys. SMS and OTP tools automatically pick the first sender ID returned by BulkClix. Airtime and data purchases first collect payment through MoMo, then complete the fulfillment after payment is confirmed.


Configuration in LibreChat

Option 1: stdio transport (default)

Add this under mcpServers in your librechat.yaml:

mcpServers:
  ananse:
    command: uv
    args:
      - run
      - --directory
      - /path/to/ananse-mcp
      - server.py
    type: stdio

Option 2: HTTP / MCP transport (Remote/Streamable)

Run the server on a port (e.g. port 8000):

cd ananse-mcp
uv run server.py mcp

Then configure LibreChat to use the MCP-over-HTTP endpoint:

mcpServers:
  bulkclix:
    url: http://localhost:8000/
    type: sse

You can then tunnel that port with localtunnel:

npx localtunnel --port 8000

If BULKCLIX_API_KEY is set on the machine running the server, the client can use the public tools without providing any per-call key. Admin-only tools are hidden unless BULKCLIX_ENABLE_INTERNAL_TOOLS=true is set on the server.


License

This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License (CC BY-NC-ND 4.0). See the LICENSE file for details.

Available Tools

25 tools
airtime_get_networksA
Read-only

Get supported networks for airtime top-up.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, and destructiveHint. Description adds minimal behavioral context beyond stating the tool's purpose, which is acceptable given 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence, front-loaded with the verb and resource. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Description sufficiently explains the tool's purpose for a simple list retrieval with no parameters and an output schema. Could be considered complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters exist. Schema coverage is 100% (trivially). Baseline 4 applies; description adds no param info but none is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Get') and resource ('supported networks for airtime top-up'), clearly distinguishing it from sibling tools like airtime_purchase.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool vs alternatives (e.g., when to get networks vs purchase airtime). Sibling tools exist but no explicit context is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

airtime_purchaseC

Start an airtime purchase using the BulkClix purchase route. :param destination: Recipient phone number receiving the airtime. :param phone_number: MoMo phone number being charged for payment. :param network: Payer network code (e.g., 'MTN', 'VDF', 'ATL'). :param amount: Airtime purchase amount in GHS. :param network_id: Network UUID from airtime_get_networks. :param payment_type: Payment type (usually 'momo').

ParametersJSON Schema
NameRequiredDescriptionDefault
amountYesAirtime purchase amount in GHS.
networkYesPayer network code (e.g., 'MTN', 'VDF', 'ATL').
referenceNo
network_idYesNetwork UUID from airtime_get_networks.
destinationYesRecipient phone number receiving the airtime.
callback_urlNo
payment_typeNoPayment type (usually 'momo').momo
phone_numberYesMoMo phone number being charged for payment.
await_paymentNo
transaction_idNo
timeout_secondsNo
poll_interval_secondsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate it is not read-only (readOnlyHint=false) and not destructive. The description adds no behavioral details beyond what annotations provide, such as success/failure conditions or side effects like charging the phone number.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is structured as a list of parameter descriptions, which is functional but verbose. It could be more concise by summarizing the tool's action and highlighting key required parameters.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema and many optional parameters, the description lacks context on expected return values, asynchronous behavior, or error handling. It does not explain what happens after 'starting' the purchase.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 50%, and the description repeats some parameter descriptions already present. It adds minor clarifications (e.g., 'Airtime purchase amount in GHS') but does not significantly enhance understanding beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool starts an airtime purchase using a specific route (BulkClix). It distinguishes from sibling tools like data_purchase or airtime_get_networks by focusing on immediate purchase initiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives, no prerequisites, and no context for expected usage scenarios. It only lists parameters.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_verified_vendors_orderA

Place an order with a food/goods vendor and initiate mobile money payment via BulkClix. IMPORTANT: Before calling this tool you MUST have collected ALL required fields from the user: (1) if order_type='inhouse' — you MUST ask the user for their table_number first; (2) if order_type='delivery' — you MUST ask the user for their delivery_address first. Do NOT call this tool without those values — the tool will fail. :param vendor_id: Vendor's UUID. :param items: List of items to order, with dish_id, quantity, and addon_ids. :param payment_number: Mobile money number to charge (e.g. '0544929180'). :param network: Mobile money network code (e.g. 'MTN'). :param order_type: 'inhouse' or 'delivery' — must be one of the vendor's supported order_types. :param table_number: Table number string. REQUIRED when order_type is 'inhouse' — ask the user before calling. :param delivery_address: Delivery address string. REQUIRED when order_type is 'delivery' — ask the user before calling. :returns: dict with success, order_id, payment status, and vendor confirmation.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYesList of items to order, with dish_id, quantity, and addon_ids.
networkYesMobile money network code (e.g. "MTN").
vendor_idYesVendor's UUID.
order_typeNo"inhouse" or "delivery" — must be one of the vendor's supported order_types.inhouse
table_numberNoTable number. Required when order_type is "inhouse".
payment_numberYesMobile money number to charge (e.g. "0544929180").
delivery_addressNoDelivery address. Required when order_type is "delivery".

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate write and open-world behavior. The description adds context by explaining the payment initiation, failure conditions if prerequisites are missing, and the return value structure, which goes beyond annotation hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose and important notes, then lists parameters. It is slightly verbose by repeating schema descriptions, but still efficient and well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (7 params, conditional requirements, payment initiation) and availability of output schema mention, the description covers purpose, prerequisites, conditional fields, and return shape. Missing details on payment failure handling are acceptable as output includes payment status.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the description adds critical preconditions: table_number needed for inhouse, delivery_address for delivery, and that these must be asked before calling. This semantic guidance is not in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool places an order with a food/goods vendor and initiates mobile money payment via BulkClix. It distinguishes from siblings like get_verified_vendors (listing) and place_merchant_order (likely for non-verified or different flow).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes an important prerequisite note about collecting required fields before calling, and conditional requirements for order_type. However, it does not explicitly compare with sibling tools or state when not to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

data_check_statusA
Read-only

Check the status of a data bundle payment or purchase by order ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
order_idYes
payment_idNo
transaction_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description ('Check the status') aligns with the readOnlyHint annotation, indicating a safe read operation. However, it does not add any behavioral details beyond the annotations, such as authentication requirements or rate limits. Since annotations already provide the safety profile, the description is adequate but not enhanced.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that front-loads the purpose without any wasted words. It is concise and to the point, earning its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having an output schema (indicated) and moderate complexity (3 params, 1 required), the description lacks completeness. It does not explain the role of optional parameters or what the status response contains beyond 'status'. Parameter coverage is minimal, leaving the agent underinformed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has three parameters (order_id, payment_id, transaction_id) with 0% schema coverage in the description. The description only mentions 'order ID', leaving the purpose of payment_id and transaction_id unexplained. With such low coverage, the description should compensate but fails to do so adequately.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'check', the resource 'status of a data bundle payment or purchase', and the key identifier 'order ID'. It effectively distinguishes from sibling tools like 'momo_check_status' (mobile money) and 'track_order' (general orders) by specifying the data bundle context.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies that this tool should be used when an order ID for a data bundle payment or purchase is available, but it does not provide explicit guidance on when to use it versus alternatives like 'momo_check_status' or 'track_order'. No when-not-to-use or alternative suggestions are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

data_get_bundlesC
Read-only

List available data bundle services.

ParametersJSON Schema
NameRequiredDescriptionDefault
network_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide readOnlyHint=true and destructiveHint=false, which sufficiently indicate a safe read operation. The description adds no extra behavioral context beyond annotations, so a 3 is appropriate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single short sentence, very concise. However, it is too brief and omits important parameter information, making it incomplete.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simplicity of the tool (one optional param, no nested objects, output schema exists), the description is minimally adequate but lacks parameter details. For a list tool, it could still be functional but incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has one optional parameter (network_id) with 0% schema description coverage, but the description does not mention it or explain its purpose. The description should compensate for the lack of schema docs but fails to do so.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'List available data bundle services.' clearly states the verb 'list' and the resource 'data bundle services'. It distinguishes from the sibling 'data_get_offers' which likely lists offers, but could be more specific about what defines a 'bundle'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives like 'data_get_offers' or 'data_check_status'. The description simply states what it does without context for selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

data_get_offersA
Read-only

List available data bundle offers for a service and phone number. :param service_id: Data service UUID. :param phone_number: Recipient phone number.

ParametersJSON Schema
NameRequiredDescriptionDefault
service_idYesData service UUID.
phone_numberYesRecipient phone number.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, destructiveHint false. Description adds no new behavioral traits beyond listing offers; it's consistent but not enriching.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence with param descriptions; no fluff. Could be front-loaded better, but concise and clear.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Simple list tool with output schema present; description covers core purpose and parameters. Missing minor context like ordering or filtering, but adequate for its complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and description merely repeats the param descriptions. No additional meaning beyond what schema provides; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description uses specific verb 'List' and resource 'available data bundle offers', clearly distinguishing from siblings like data_get_bundles (lists bundles for purchase) and data_check_status (checks status).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implied usage for viewing offers before purchase, but no explicit when-to-use or alternatives. Siblings like data_purchase are nearby, but no guidance on when not to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

data_purchaseC

Start a data bundle purchase using the BulkClix purchase route.

ParametersJSON Schema
NameRequiredDescriptionDefault
networkYes
bundle_idYes
referenceNo
network_idYes
service_idYes
callback_urlNo
phone_numberYes
await_paymentNo
customer_nameNo
transaction_idNo
timeout_secondsNo
poll_interval_secondsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate this is a mutation (readOnlyHint=false) with openWorldHint=true. The description adds only the route name but fails to disclose important behavioral traits like payment initiation, async polling, or side effects. Parameters like 'await_payment' and 'timeout_seconds' suggest complex behavior, but the description is silent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence, which is concise but overly terse given the tool's complexity (12 parameters, no schema descriptions). It sacrifices clarity for brevity and does not earn its place by adding value beyond the name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having an output schema (not shown), the tool has 12 parameters with zero description, no workflow explanation, and no mention of important concepts like the BulkClix purchase route's requirements. The description is inadequate for an agent to use this tool correctly in a realistic scenario.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% (no parameter descriptions). The tool description adds no meaning to any of the 12 parameters, leaving agents without context for fields like 'bundle_id', 'network_id', or 'await_payment'. This severely impairs correct invocation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool starts a data bundle purchase using the BulkClix route, specifying the verb ('Start'), resource ('data bundle purchase'), and method ('BulkClix purchase route'). It distinguishes from sibling tools like data_get_bundles or data_get_offers that list bundles or offers.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives, no prerequisites (e.g., need to fetch bundles first via data_get_bundles), and no exclusions. Users are left to infer context from the tool name and siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_food_itemsA
Read-only

Search for food items, dishes, pizza, rice, chicken, or menus across all verified vendors or a specific vendor. Use this when asking 'what food is available', 'show me the menu', 'do you have pizza', 'search menu for burger'.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
vendor_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, open-world, non-destructive behavior. Description adds only example search terms, not additional behavioral details like pagination, result limits, or error handling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with purpose, no redundant information. Efficient and clear.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Adequate for a search tool with annotations and output schema present. Covers scope and use cases; missing details on empty results or error cases, but acceptable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but description hints at vendor_id usage and query examples. Doesn't specify query format or constraints, so adds moderate value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Search for food items, dishes, pizza, rice, chicken, or menus' with specific verb and resource, and provides example queries that distinguish it from sibling tools like search_food_menus.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit example queries and mentions scope (all vendors or specific vendor via vendor_id). Lacks explicit when-not-to-use or comparison to siblings, but gives clear context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_customer_profileA
Read-only

Retrieve a saved customer profile from MongoDB by phone number to get delivery address and payment preferences.

ParametersJSON Schema
NameRequiredDescriptionDefault
phone_numberYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=true and destructiveHint=false, so the description adds little extra behavioral context. Mentioning MongoDB is minor. No contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence (16 words) with no wasted words. Efficiently conveys all necessary information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given one parameter, a clear description, and an output schema (as indicated), the description is fully adequate for a simple lookup tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but the description clarifies that 'phone_number' is the key for retrieval, adding meaning beyond the bare schema definition.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description specifies the action 'retrieve', the data source 'MongoDB', the parameter 'phone number', and the output 'delivery address and payment preferences'. It clearly distinguishes from sibling tools like 'save_customer_profile' and 'search'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage when needing customer delivery address and payment preferences, but does not explicitly state when to use or avoid this tool, nor mention alternatives like 'search'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_token_infoB
Read-only

Returns information about the Auth0 token.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds no behavioral context beyond what is implied by the annotations, such as token validity, authentication requirements, or response format.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence, concise and front-loaded. However, it could include slightly more detail about the type of information returned without becoming verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has zero parameters and an output schema, the description is minimally adequate. It does not add extra context beyond the name, but nothing critical is missing for such a simple tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero parameters with 100% schema description coverage. The description does not need to add parameter details. Baseline for no parameters is 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Returns information about the Auth0 token' clearly states the verb ('Returns') and the resource ('Auth0 token'). No sibling tool has a similar purpose, so there is no ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool or when not to. The description only states the function, leaving the agent to infer usage context from the name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_verified_vendorsA
Read-only

List available vendors to purchase goods from using BulkClix payment. :param vendor_id: Vendor's UUID. If given, returns just that vendor. :param category: Vendor's category of goods (e.g. 'restaurant', 'food', 'airtime'). If given, filters vendors using case-insensitive substring and synonym expansion.

ParametersJSON Schema
NameRequiredDescriptionDefault
categoryNoVendor's category of goods (e.g. "restaurant", "food", "airtime"). If given, filters vendors using case-insensitive substring and synonym expansion.
vendor_idNoVendor's UUID. If given, returns just that vendor.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=true and destructiveHint=false. The description adds behavioral context: filtering by vendor_id or category with case-insensitive substring and synonym expansion, and the BulkClix payment context. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence stating the main purpose, followed by parameter documentation. No unnecessary words, yet all key details are present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With two optional parameters, existing output schema, and annotations, the description covers purpose, parameter semantics, and context. No gaps remain for typical usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the description adds meaningful semantics beyond schema: explains synonym expansion and case-insensitive substring for category, and that vendor_id returns just that vendor.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('List'), resource ('available vendors'), and context ('using BulkClix payment'). It distinguishes from sibling tools like get_verified_vendors_menu and list_vendor_categories.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for listing vendors but does not provide explicit guidance on when to use this tool versus alternatives or when not to use it. No exclusions or alternative references.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_verified_vendors_menuA
Read-only

List available menu items for a vendor, flattened and checkout-ready — each item has dish_id, name, price, is_available, and addons. No nested categories. :param vendor_id: Vendor's UUID. :param query: Optional case-insensitive substring filter on dish name.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNoOptional case-insensitive substring filter on dish name.
vendor_idYesVendor's UUID.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds context beyond annotations: flattened structure, checkout-ready, specific fields, no nested categories. However, lacks details on pagination or error handling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Efficient front-loaded summary, but the param lines are redundant with schema. Could be slightly more concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Sufficient for a simple read-only list tool with output schema. Explains output format well. Does not cover all edge cases but acceptable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with descriptions. The description repeats param info (vendor_id, query) but adds no new meaning beyond what schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states 'List available menu items for a vendor, flattened and checkout-ready' with specific fields. However, it does not explicitly differentiate from sibling tools like search_food_menus or find_food_items.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool vs alternatives. Does not mention prerequisites, context, or when not to use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_vendor_categoriesA
Read-only

List all categories of goods (e.g. 'restaurant', 'food', 'airtime', 'data') supported by the verified vendors.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the description's addition of 'supported by the verified vendors' provides minor context. No behavioral contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence, front-loaded with the verb 'List', no waste. Perfectly concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless tool with an output schema (not shown), the description sufficiently explains what the tool returns. Could hint at ordering or uniqueness, but overall complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are no parameters (schema has no properties), so the description does not need to explain them. The examples add value, meriting above baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states 'List all categories of goods...' with concrete examples ('restaurant', 'food', 'airtime', 'data'), making the purpose clear and differentiating it from sibling tools that deal with specific vendors or purchases.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit when-to-use or when-not-to-use guidance is given, but given the tool's simplicity (no parameters), the usage is implied. It does not mention alternatives or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

momo_check_statusA
Read-only

Check the status of a Mobile Money collection or transaction. :param transaction_id: The transaction ID returned during collection. :param payment_id: Optional payment record ID if you already have it.

ParametersJSON Schema
NameRequiredDescriptionDefault
payment_idNoOptional payment record ID if you already have it.
transaction_idYesThe transaction ID returned during collection.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate readOnlyHint=true and destructiveHint=false, which the description supports by stating 'Check the status'. The description adds no contradictions and provides basic behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences plus parameter list, front-loaded with the core purpose. Every sentence is essential, with no waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema, the description adequately covers purpose and parameters. It could mention expected status values but is sufficient for a read-only check tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds minor context beyond the schema by specifying that transaction_id comes from collection and payment_id is optional.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool checks status of a Mobile Money collection or transaction, using a specific verb and resource. It distinguishes from sibling tools like data_check_status by specifying 'Mobile Money'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool versus alternatives. The description implies usage after obtaining a transaction_id, but does not mention when not to use it or provide alternative tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

otp_send_emailA

Send an OTP (One-Time Password) via Email. CRITICAL: The message parameter MUST contain the exact placeholder <%otp_code%>. If this placeholder is missing, the API call will fail with a 422 error. :param email: Recipient email address. :param subject: Email subject. :param message: Email body containing <%otp_code%> template (e.g. 'Your verification code is: <%otp_code%>'). :param expiry: OTP validity duration in minutes (default 5). :param length: Digit length of the OTP (default 4).

ParametersJSON Schema
NameRequiredDescriptionDefault
emailYesRecipient email address.
expiryNoOTP validity duration in minutes (default 5).
lengthNoDigit length of the OTP (default 4).
messageYesEmail body containing `<%otp_code%>` template (e.g. 'Your verification code is: <%otp_code%>').
subjectYesEmail subject.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide readOnlyHint=false and destructiveHint=false, but the description adds critical behavioral details: the mandatory placeholder requirement, the explicit error condition (422), and default values for expiry and length. This goes well beyond 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is somewhat verbose but well-structured: it opens with a critical warning, then lists parameters in a consistent format. Every sentence provides value, though a slight reduction in length could improve conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's 5 parameters (3 required), the presence of an output schema, and no nested objects, the description covers all necessary behavioral aspects: failure conditions, defaults, and parameter constraints. It is complete enough for an AI agent to select and invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

While the schema already covers 100% of parameters, the description enriches understanding by emphasizing the critical placeholder requirement for the message parameter, providing an example, and clarifying default values. This adds significant meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Send an OTP (One-Time Password) via Email,' which is a specific verb+resource combination. The tool name itself distinguishes it from siblings like otp_send_sms and otp_verify_email, and the description reinforces this by specifying the email channel.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly warns that the message parameter must contain <%otp_code%> or the call will fail with a 422 error. However, it does not explicitly state when to use this tool versus alternative OTP delivery methods (e.g., SMS). The context from sibling tool names implies the distinction, but explicit guidance would improve score.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

otp_send_smsA

Send an OTP (One-Time Password) via SMS. CRITICAL: The message parameter MUST contain the exact placeholder <%otp_code%>. If this placeholder is missing, the API call will fail with a 422 error. :param phone_number: Recipient phone number (e.g. '0541000000'). :param message: Message template containing <%otp_code%> (e.g. 'Your verification code is: <%otp_code%>'). :param expiry: OTP validity duration in minutes (default 5). :param length: Digit length of the OTP (default 4).

ParametersJSON Schema
NameRequiredDescriptionDefault
expiryNoOTP validity duration in minutes (default 5).
lengthNoDigit length of the OTP (default 4).
messageYesMessage template containing `<%otp_code%>` (e.g. 'Your verification code is: <%otp_code%>').
phone_numberYesRecipient phone number (e.g. '0541000000').

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate readOnlyHint=false and destructiveHint=false, confirming a write operation. The description adds behavior beyond annotations: the mandatory placeholder, failure condition (422 error), and parameter defaults (expiry=5, length=4). No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description repeats schema parameter descriptions, making it longer than necessary. It front-loads the critical requirement, but the Python docstring style (e.g., ':param ...') adds redundancy. Could be more concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (OTP sending), annotations, and the presence of an output schema (not shown), the description covers the core functionality, failure mode, and parameter details. It does not describe the return value, but the output schema likely does that.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 value by emphasizing the critical nature of <%otp_code%> in the message parameter, which is not highlighted in the schema description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Send' and the resource 'OTP via SMS'. It distinguishes from sibling tools like otp_send_email and otp_verify_sms by specifying the channel and the critical placeholder requirement.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a critical guideline: the message must contain <%otp_code%> or the call fails with 422. It does not explicitly compare to alternatives (e.g., otp_send_email), but the name and context imply the use case for SMS OTP delivery.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

otp_verify_emailA

Verify an OTP code that was sent via Email. :param request_id: The requestId returned from sending the OTP. :param email: The email address the OTP was sent to. :param code: The verification code to verify.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesThe verification code to verify.
emailYesThe email address the OTP was sent to.
request_idYesThe requestId returned from sending the OTP.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate non-read-only, non-destructive. Description adds no further behavioral context (e.g., rate limits, idempotency, error behavior). No contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Short and front-loaded, but includes redundant parameter documentation that already exists in the schema, adding unnecessary verbosity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Adequately describes the operation and all required parameters. Lacks usage guidelines but is otherwise complete for a straightforward verification tool with good annotations and output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with descriptions. Tool description merely repeats param docs, adding no extra meaning beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states 'Verify an OTP code that was sent via Email' with specific verb and resource, distinguishing it from sibling tools like otp_verify_sms and otp_send_email.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implies usage through parameter descriptions (e.g., request_id from sending OTP), but no explicit when-to-use or when-not-to-use guidance, especially relative to otp_verify_sms.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

otp_verify_smsA

Verify an OTP code that was sent via SMS. :param request_id: The requestId returned from sending the OTP. :param phone_number: The phone number the OTP was sent to. :param code: The code input by the user to check.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesThe code input by the user to check.
request_idYesThe requestId returned from sending the OTP.
phone_numberYesThe phone number the OTP was sent to.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description is consistent with annotations (readOnlyHint=false, destructiveHint=false) but adds no additional behavioral details beyond the basic operation. The agent is not informed about side effects like OTP consumption or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise but includes redundant param definitions that are already in the schema. It could be more structured by omitting the param lines.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema, the description is adequate but does not mention error conditions or return value semantics. It is complete for basic use but lacks depth.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the parameters are fully documented. The description redundantly repeats these details in a :param format, adding no extra meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Verify an OTP code that was sent via SMS.' This is a specific verb (verify) and resource (SMS OTP), and it distinguishes itself from siblings like otp_verify_email and otp_send_sms.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies use after sending an SMS OTP but does not explicitly state when to use this tool versus alternatives like otp_verify_email. No when-not-to guidance is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pay_verify_otpA
Destructive

Verify a payment OTP after the customer reads the code from their phone and sends it in chat. CRITICAL: This is ONLY for validating payment-related transactions. The request_id MUST be the one returned in the response of a payment/purchase initiation tool (e.g., airtime_purchase, data_purchase, or momo_collect), NOT from otp_send_sms. Providing a standard SMS OTP request ID will result in a 404 Error. :param code: OTP code entered by the customer from their phone. :param request_id: Request ID returned from the payment/purchase initiation response. :param phone_number: The phone number used for the payment transaction.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesOTP code entered by the customer from their phone.
request_idYesRequest ID returned from the payment/purchase initiation response.
phone_numberYesThe phone number used for the payment transaction.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint=false and destructiveHint=true. The description adds no additional behavioral context beyond what the annotations convey. It does not contradict annotations but also does not elaborate on side effects or other behavioral traits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the purpose and critical note. It includes parameter descriptions but is slightly verbose with the colon-formatted param list. Every sentence adds value, but it could be more concise without losing clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has an output schema (so return values are documented elsewhere), the description covers purpose, usage guidelines, parameter semantics, and critical warnings. It is fully 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.

Parameters4/5

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 reinforces the source of request_id beyond the schema, emphasizing it must come from payment initiation responses, not from otp_send_sms. This adds valuable context that helps avoid errors.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action 'Verify a payment OTP' and the context 'after the customer reads the code from their phone and sends it in chat'. It explicitly distinguishes from sibling tools like otp_verify_sms by specifying that the request_id must come from payment initiation tools, not from otp_send_sms.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance: when to use (for validating payment-related transactions), when not to use (not with standard SMS OTP request IDs), and specifies the source of request_id (payment/purchase initiation responses). It also warns about the 404 error for incorrect usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

place_merchant_orderA

Place a food order directly with a restaurant merchant. Creates an order record in MongoDB, triggers MoMo payment collection from customer, and sends an order SMS dispatch to the merchant.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYes
amount_ghcYes
customer_nameYes
payment_phoneNo
customer_phoneYes
payment_networkNoMTN
delivery_addressYes
restaurant_phoneYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds behavioral context beyond annotations: it creates a database record, triggers payment collection, and sends an SMS. This is useful information that annotations (readOnlyHint=false, destructiveHint=false) do not provide. It does not disclose failure behavior or idempotency, but overall adds value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences long, front-loaded with the core purpose, and contains no fluff or redundant information. It efficiently communicates the tool's function.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (8 parameters, 6 required, no schema descriptions), the description is incomplete. It lacks parameter explanations, usage context, and does not mention return values despite having an output schema. Sibling differentiation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, yet the description does not explain individual parameters like 'payment_phone', 'payment_network', or 'amount_ghc'. While it mentions a few fields descriptively, it fails to compensate for the lack of schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly specifies the action (place), the resource (food order with merchant), and lists three sub-actions (MongoDB record, MoMo payment, SMS dispatch). This distinguishes it from sibling tools like 'create_verified_vendors_order' and 'track_order'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool vs alternatives. It does not mention prerequisites, conditions, or contexts where this tool is preferred over siblings like 'create_verified_vendors_order' or 'search_food_menus'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_customer_profileA

Save or update a customer profile in MongoDB, including delivery address, landmark, and default MoMo payment number.

ParametersJSON Schema
NameRequiredDescriptionDefault
addressYes
landmarkNo
phone_numberYes
customer_nameYes
default_payment_phoneNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate a non-readonly, non-destructive mutation. The description adds that it includes specific fields, but does not clarify behavior for omitted fields (e.g., setting to null) or mention return value, despite an output schema existing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single 16-word sentence that is front-loaded with the verb and resource. Every word adds value; no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the core purpose but omits details on handling missing fields, validation, and return structure. The existence of an output schema mitigates the need for return description, but openWorldHint is not addressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema coverage, the description provides the only parameter context by naming fields (address, landmark, default_payment_phone). However, it lacks format constraints, examples, or validation hints for parameters like phone_number or customer_name.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool saves or updates a customer profile in MongoDB, listing specific fields (address, landmark, MoMo payment number). It distinguishes itself from the sibling 'get_customer_profile' which is read-only.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies upsert behavior but does not explicitly specify when to use create vs update, nor does it contrast with other write tools like 'place_merchant_order'. No prerequisites or alternatives are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_food_menusB
Read-only

Search food dishes and restaurants across available catalogs in a specified city (e.g. Accra). Currently searches verified vendors matching categories or name.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoaccra
queryYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=true, so description adds value by specifying 'currently searches verified vendors matching categories or name'. However, it does not disclose pagination, rate limits, or result structure beyond the output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences with no extraneous text. First sentence states purpose and scope, second adds a qualifying detail. Ideal length and structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given low complexity (2 parameters, output schema exists), the description covers the essential functionality: city-scoped search of verified vendors. Could mention search behavior (e.g., fuzzy matching) but is generally complete with output schema present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description adds minimal meaning: city example 'Accra' (already defaulted) and query matching 'categories or name'. Does not explain allowed formats or provide examples for the parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool searches for food dishes and restaurants in a specified city, using terms like 'search', 'dishes', 'restaurants', and 'catalogs'. It mentions 'verified vendors', which adds specificity but does not explicitly differentiate from sibling tools like 'find_food_items'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for searching food in a city, but lacks explicit when-to-use comparisons with alternatives like 'find_food_items' or 'get_verified_vendors_menu'. No guidance on when not to use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

track_orderC

Track real-time status and delivery details of an order from MongoDB.

ParametersJSON Schema
NameRequiredDescriptionDefault
order_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.5/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description states 'Track' implying a read-only operation, but annotations indicate readOnlyHint=false, creating a contradiction. No additional behavioral context is provided (e.g., no mention of side effects, auth needs, or rate limits), and the openWorldHint=true is not addressed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence, which is concise and front-loaded with the key action. However, it lacks necessary details, making it minimally adequate for conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having an output schema and one parameter, the description is incomplete. It does not explain the order_id parameter, the nature of 'real-time', or the fact that it applies specifically to MongoDB orders. The annotations hint at open-world behavior but are not clarified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage and a single parameter 'order_id', the description adds no meaning beyond its presence. It does not specify format, source, or constraints, leaving the agent with insufficient information to correctly invoke the tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Track', the resource 'order', and the scope 'real-time status and delivery details'. It distinguishes from sibling tools like 'data_check_status' or 'momo_check_status' by specifying 'from MongoDB', making its purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It does not mention prerequisites, when-not-to-use, or compare with other status-checking tools among the siblings.

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.

  1. 25 tool updatesv1.0.0
    • First observedairtime_get_networks
    • First observedairtime_purchase
    • First observedcreate_verified_vendors_order
    • First observeddata_check_status
    • First observeddata_get_bundles
    • First observeddata_get_offers
    • First observeddata_purchase
    • First observedfind_food_items
    • First observedget_customer_profile
    • First observedget_token_info
    • First observedget_verified_vendors
    • First observedget_verified_vendors_menu
    • First observedget_yango_delivery_link
    • First observedlist_vendor_categories
    • First observedmomo_check_status
    • First observedotp_send_email
    • First observedotp_send_sms
    • First observedotp_verify_email
    • First observedotp_verify_sms
    • First observedpay_verify_otp
    • First observedplace_merchant_order
    • First observedsave_customer_profile
    • First observedsearch
    • First observedsearch_food_menus
    • First observedtrack_order

TDQS

B3.3/5.0
Disambiguation3/5

Tools have distinct purposes overall, but there is overlap among search tools (find_food_items, search_food_menus, search) and between order placement tools (create_verified_vendors_order, place_merchant_order). Descriptions help differentiate, but an agent might still misselect.

Naming Consistency4/5

Most tools follow a verb_noun snake_case pattern (e.g., airtime_get_networks, data_purchase). However, there are minor deviations: 'pay_verify_otp' uses two verbs, and 'search' lacks a noun. Overall, the convention is fairly consistent.

Tool Count3/5

With 25 tools, the server covers multiple domains (airtime, data, food ordering, OTP, profiles, search). This is slightly heavy but not excessive given the scope. Some tools could be consolidated (e.g., merging similar search tools).

Completeness4/5

The tool surface supports core workflows: airtime/data top-up, food ordering with payment, OTP verification, and customer profiles. Missing update/delete operations for orders and profiles are minor gaps; no dead ends for main use cases.

Maintenance

ActivityActive
ResponsivenessSyncing

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

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Enables AI assistants to send SMS, manage contacts, verify numbers, and query campaigns via SMS Masivos platform using natural language.
    30
    26
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Connects any MCP-compatible AI assistant to the MojaWave SMS Gateway, enabling sending SMS, checking credit balances, and managing bulk SMS jobs.
    10
    MIT

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/AnanseLabs-Org/ananse-tools'

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