Skip to main content
Glama

afro.tools

Server Details

Open-source API specs for African providers (payments, SMS, KYC, delivery) for AI agents.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
afrotools/afrotools
GitHub Stars
31
Server Listing
Afro Tools MCP Server

TDQS

A4.4/5.0

Scored across 5 tools

Disambiguation4/5

Each tool maps to a distinct step of the spec lifecycle: browse (list_providers), query (search_specs), retrieve (get_spec), request a missing spec (request_spec), and report results (report_integration). The only mild overlap is list_providers vs search_specs with no query args, since both return provider lists, but the descriptions make the browse-vs-filter distinction clear. No two tools could plausibly be mistaken for the same action.

Naming Consistency5/5

All five names follow a strict verb_noun snake_case pattern: get_spec, list_providers, search_specs, report_integration, request_spec. Resource words (spec, provider) are consistently reused. No mixed conventions or casing drift.

Tool Count5/5

Five tools is tightly scoped to a spec registry: discover, retrieve, request, and report. Each tool earns its place with no redundancy and nothing feels thin — even the feedback path has both request and report variants, which are genuinely different actions.

Completeness4/5

The surface covers the full loop: discovery, full-payload retrieval, requesting missing specs, and closing the loop with verified/wrong reports. Minor gaps remain around batch retrieval (no way to fetch multiple specs in one call) and there's no direct verification submission — reporting only builds a GitHub link for manual review. These are workarounds an agent can handle, not dead ends.

Available Tools

5 tools
get_specGet SpecA
Read-onlyIdempotent
Inspect

Returns the full spec payload for a provider + capability, including canonical_example.ts source code. Use this to get the complete integration guide — auth pattern, endpoint, schemas, gotchas, and a TypeScript example — before writing API calls.

The response includes a "status" field:

  • "verified": tested against the provider's API, in "sandbox" or "production" (verified_in / verification.environment)

  • "deprecated": the provider is retiring it — "deprecation" gives the reason, replaced_by (the capability to use instead) and removed_after

  • anything else (e.g. "ready", "unverified"): written from the provider's documentation, NOT tested against the live API "verification" says how and when it was tested; sandbox proves the request and response shapes, not production behaviour. "open_questions", when present, lists what the provider's docs do not answer: tell the user before relying on the spec. "environments", when present, gives each documented environment's base URL; a missing one is undocumented — ask the user, never guess. "auth.credentials" / "signing" / "token_exchange" / "apply" and "webhook.signature", when present, describe the auth and webhook signature steps exactly: follow them. "parameters", when present, lists the path, query and header parameters; "input_schema" is the request body only. A path parameter fills the {name} placeholder of endpoint.url. "success_condition", when present, names the response field (dotted path) that says the call succeeded: a 2xx response with another value is a failure.

If status is not "verified", always warn the user before generating integration code: "This spec has not been tested against the live API yet and may contain errors."

Args:

  • provider (string): Provider slug e.g. "paycard"

  • capability (string): Capability name e.g. "create_payment"

  • variant (string[]?): Discriminator values to keep, e.g. ["mobile_money_ghs"] or ["bank", "NGN"]. In every union (oneOf) of input_schema and response_schema, only the branches pinned to one of these values are kept; a union none of them matches is left whole. Without it, all branches are returned. The response lists every value under "variants" (discriminator property → values). A large spec also carries "_mcp_size_note": if your client cut the result, call again with the variant you need.

Returns: Full Spec object with canonical_example string (plus _mcp_warning when status is not "verified"). If not found: isError, with { error, available_capabilities } when the provider exists — capability names are each provider's own, pick one from that list — and did_you_mean (closest provider slugs or capability names) when one is close. A capability removed from the registry after a provider deprecation answers isError with removed_in, reason and alternatives. Use search_specs or list_providers first to discover available providers and capabilities.

NameRequiredDescriptionDefault
variantNoDiscriminator values to keep, e.g. ["mobile_money_ghs"] — see "variants" in search_specs
providerYesProvider slug e.g. "paycard"
capabilityYesCapability name e.g. "create_payment"

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare a safe read; the description goes far beyond by decoding the status taxonomy (verified/deprecated/other), explaining that sandbox verification does not prove production behaviour, and mandating a user warning when status is not 'verified'. It also predicts error shapes (isError with available_capabilities, did_you_mean, removed_in) and the _mcp_size_note truncation hint — behavior an agent could not infer from 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?

Front-loaded with the core action and its result, then organized as a field-by-field key, which is scannable despite its length. It is longer than typical, but nearly every line is a disambiguation rule for a returned field an agent must interpret; only the trailing error-handling sentence overlaps slightly with the Returns section.

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?

No output schema exists, so the description carries the full burden of explaining the response — and it does, covering status, verification, open_questions, environments, auth blocks, parameters vs input_schema, success_condition, and error cases. For a read-only lookup tool with three simple params, nothing an agent needs to call or interpret it is missing.

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 already 100%, so baseline is 3; the description earns extra by explaining what variant actually does — filtering oneOf/union branches by discriminator value, leaving unmatched unions whole, and surfacing the result under 'variants'. It also clarifies that a path parameter fills {name} in endpoint.url. The provider/capability params get no added syntax guidance beyond the schema examples.

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 first sentence states a specific verb and resource — 'Returns the full spec payload for a provider + capability' — plus what is inside (canonical_example.ts source). An agent knows exactly what it gets and can distinguish it from search_specs (discovery) and list_providers (enumeration).

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?

It gives explicit timing — 'before writing API calls' — and names the prerequisites: 'Use search_specs or list_providers first to discover available providers and capabilities.' It also states what to do on failure (pick from available_capabilities, use did_you_mean), which routes the agent rather than leaving it to guess.

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

list_providersList ProvidersA
Read-onlyIdempotent
Inspect

Lists all providers and their verification status. Every listed provider is AI Ready: its specs give you a structured description to integrate it from. They can still contain errors — that is what each capability's "status" reports. all_verified is true only when ALL its capabilities have status "verified". Providers with any capability not yet "verified" have all_verified false — call search_specs or get_spec and check each capability's "status": one that is not "verified" has not been tested against the provider's API.

Returns: { providers: Array<{ slug, name, category, channels?, all_verified, verified_count, capabilities, country_code, docs_public, docs_url }> }

NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and closed-world, so safety needs no restating. The description adds real semantics annotations cannot convey: what all_verified means precisely (true only when ALL capabilities are verified) and the caveat that specs can still contain errors because untested capabilities exist.

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 core statement is front-loaded and the caveat/follow-up logic is ordered sensibly. It is slightly repetitive — the all_verified false case is restated in both the second and third paragraphs — but the extra lines still carry distinct information about untested capabilities.

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?

With no output schema, the description carries the burden of describing returns, and it does so with an explicit object shape and all top-level field names. It stops short of explaining fields like channels or docs_public, which leaves some interpretation to the agent.

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 tool takes zero parameters, so the baseline is 4; there is nothing for the description to disambiguate and it correctly spends no words on inputs.

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 opening sentence gives a specific verb and resource ("Lists all providers") plus the salient attribute (verification status). It implicitly separates itself from search_specs/get_spec by being the enumerate-everything entry point, though it never explicitly says "use this to discover providers, use search_specs to filter."

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?

It gives concrete follow-up routing: when all_verified is false, "call search_specs or get_spec and check each capability's status." That is a genuine use-vs-alternative instruction, though it describes the drill-down path rather than when to pick this tool over search_specs in the first place.

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

report_integrationReport IntegrationA
Read-onlyIdempotent
Inspect

Builds a pre-filled GitHub link to report how an integration went against a spec — it worked, or the spec is wrong. Call it when the user confirms an integration works against the real API (sandbox or production), or when you find the spec does not match the API. Reports are how specs get verified and fixed. Nothing is posted: the user reviews the text and submits it on GitHub. One report per provider, covering every capability of the flow (e.g. payment init, status, webhook): each one is verified on its own.

Args:

  • provider (string): Provider slug e.g. "paycard"

  • capabilities (array): Every capability the integration used, each with its own result e.g. [{ "capability": "create_payment", "result": "worked" }, { "capability": "webhook", "result": "wrong: status is SUCCESSFUL, spec says succeeded" }]

  • summary (string): One line about the flow, e.g. "checkout flow works in sandbox"

  • details (string): What was called, what came back, what differed from the spec. NEVER include API keys, tokens, phone numbers or personal data.

  • tested_on (string?): Date of the test, YYYY-MM-DD

Returns: { url, next_step } — give the url to the user and follow next_step. If a spec does not exist: isError, with { error, available_capabilities } when the provider exists.

NameRequiredDescriptionDefault
detailsYesNo secrets or personal data
summaryYesOne line
providerYesProvider slug e.g. "paycard"
tested_onNoDate of the test, YYYY-MM-DD
capabilitiesYesEvery capability the integration used, each with its own result

TDQS

A4.8/5.0
Behavior5/5

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

Although readOnlyHint/idempotentHint already signal safety, the description adds what the annotations cannot: "Nothing is posted: the user reviews the text and submits it on GitHub" — clarifying the human handoff. It also documents the failure mode ("If a spec does not exist: isError, with { error, available_capabilities }") and instructs on what to do with the returned url/next_step.

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 key behavior (build a link, nothing is posted) is front-loaded, then usage conditions, then parameters, then return shape — a sensible ordering. A few Args lines duplicate schema text verbatim (e.g. tested_on format), slightly diluting density.

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?

For a tool with no output schema, the description fully covers the return contract ({ url, next_step } and the error shape with available_capabilities) as well as the agent's required follow-through. Nothing needed to invoke it correctly is absent.

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 100%, so the baseline is 3; the description earns a bump by supplying concrete examples for provider slug, capability objects, and result strings ("wrong: status is SUCCESSFUL, spec says succeeded"), plus an explicit PII/secret prohibition on details. The Args block largely restates the schema, so it is not a full 5.

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 opens with a specific verb and artifact: "Builds a pre-filled GitHub link to report how an integration went against a spec". This is clearly distinct from the sibling tools (get_spec, request_spec, search_specs), which retrieve or request specs rather than file verification reports.

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?

It states exactly when to call: "when the user confirms an integration works against the real API (sandbox or production), or when you find the spec does not match the API". It also adds a scoping rule: "One report per provider, covering every capability of the flow... each one is verified on its own", which prevents the agent from splitting reports per capability.

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

request_specRequest SpecAInspect

Logs a request for a spec that doesn't exist yet and notifies maintainers. Call this when a user asks for a provider or capability that has no spec in the registry (check list_providers first). This helps maintainers prioritize which specs to write next.

Args:

  • provider (string): Provider slug e.g. "wave"

  • capability (string): Capability name e.g. "create_payment"

Returns: { logged: true, count } if the request was recorded — count is the all-time number of requests for this exact provider+capability, including this one, so you can tell the user e.g. "you're the Nth person to ask for this". count is absent if it could not be reliably determined — in that case do NOT guess a number to the user, just confirm the request was logged. { logged: false, reason } if the spec already exists. isError if the request could not be stored: tell the user it was NOT recorded.

NameRequiredDescriptionDefault
providerYesProvider slug e.g. "wave"
capabilityYesCapability name e.g. "create_payment"

TDQS

A4.5/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing the external side effect (maintainers are notified), the exact return shapes, and that a missing count must not be guessed to the user. It also specifies error behavior — an isError means the request was NOT recorded and the user must be told — which the openWorldHint/idempotentHint flags alone never convey. Nothing contradicts the annotations: logging a request is a non-read-only, non-idempotent, non-destructive write.

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?

Front-loaded with purpose and the selection condition, then cleanly separated Args and Returns blocks. The longer Returns section earns its space because there is no output schema and the count-absent and isError branches require explicit agent behavior.

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 no output schema, the description carries the return contract itself and does so completely: success with optional count, the already-exists case, and the storage-failure case each map to a specific agent response. Combined with the caller precondition, nothing needed to invoke or report results is missing.

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% and the description's argument notes only repeat the schema's example values for provider and capability. The one useful addition is that the pair is treated as an exact key used for all-time counting, but that is stated in the Returns section rather than as parameter guidance. Baseline 3 is appropriate.

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?

States a specific verb and resource — logs a spec request and notifies maintainers — plus the exact precondition (no spec exists in the registry). The reference to list_providers and the scoping to a provider+capability pair separates it cleanly from get_spec and search_specs.

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?

Explicitly says when to call it: a user asks for a provider or capability with no spec, and tells the agent to check list_providers first. It also covers the negative case indirectly by documenting the { logged: false } return when the spec already exists. It doesn't mention search_specs as an alternative route, so it falls just short of full when/when-not coverage.

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

search_specsSearch SpecsA
Read-onlyIdempotent
Inspect

Searches specs by words and filters by category, channel, provider, country, currency, status or capability type. Returns the matching providers, each with its countries, currencies, sandbox flag, docs URL and the matching capabilities (name, type, status, example_prompt) — no endpoints, schemas, gotchas or canonical_example source. Use get_spec with the exact capability name to retrieve the full payload. A capability with "variants" has several request/response shapes (e.g. one per payment method or corridor): pass the ones you need to get_spec "variant" to receive only those.

Each result includes a "status" field:

  • "verified": tested against the provider's API, in "sandbox" or "production" (verified_in / verification.environment)

  • "deprecated": the provider is retiring it — get_spec says what replaces it

  • anything else (e.g. "ready", "unverified"): written from the provider's documentation, NOT tested against the live API — may contain errors

Always check the status field. If status is not "verified", inform the user that the spec is experimental and may contain errors.

Args:

  • query (string?): Words, e.g. "wave", "mobile money senegal", "send sms", "kyc", "XOF". Every word must match somewhere: provider name or slug, capability, description, example_prompt, countries (code or English/French name), currencies, channels (a few synonyms: momo, otp, kyc, payout…). Providers the query names come first.

  • category (string?): Filter by category, e.g. "payment", "communications" (SMS, WhatsApp, USSD, voice and email providers — "sms" is accepted as a legacy alias), "identity" (KYC, document verification, AML), "logistics" (delivery and courier providers). The registry adds categories over time: list_providers shows every category that exists

  • channel ("sms"|"whatsapp"|"ussd"|"voice"|"email"?): Only providers that offer this channel

  • provider (string?): Provider slug e.g. "paycard"

  • country_code (string?): ISO 3166-1 alpha-2 e.g. "GN"

  • currency (string?): ISO 4217 e.g. "XOF"

  • status ("verified"|"ready"|"unverified"?): e.g. "verified" for specs tested against the provider's API

  • capability_type ("synchronous"|"asynchronous"|"webhook"|"sdk"?): Filter by capability type

Returns: { providers: ProviderMatch[], note?: string, hint?: string, unverified_count: number, warning?: string } note is present when example_prompt was left out to keep a wide result readable. hint is present when nothing matched: widen the search before telling the user a provider is unavailable. unverified_count counts matching capabilities whose status is not "verified"; warning is present only when it is > 0.

NameRequiredDescriptionDefault
queryNoWords, e.g. "mobile money senegal" — every word must match
statusNo
channelNo
categoryNo
currencyNoISO 4217 e.g. "XOF"
providerNoProvider slug e.g. "paycard"
country_codeNoISO 3166-1 alpha-2 e.g. "GN"
capability_typeNo

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare a safe idempotent read, and the description adds substantive context beyond them: what is deliberately excluded from results, the meaning of each status value with the strong 'not tested against live API, may contain errors' caveat, and the semantics of note, hint, unverified_count and warning in the response.

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?

Purpose is front-loaded and the Args/Returns structure is scannable, with almost every sentence carrying operational information. It is on the long side and repeats some return-shape detail, but nothing is filler-grade.

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?

No output schema exists, and the description fully documents the return object, its optional fields, and the interpretation rules for status — everything needed to call and interpret results for an 8-parameter, zero-required search tool.

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?

With only 50% schema coverage, the description compensates thoroughly: query is explained as all-words-must-match across named fields with provider ranking, category carries examples plus the legacy 'sms' alias and a discovery path via list_providers, and every other filter gets a concrete value example or definition. This clearly exceeds what the bare 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?

Opens with a specific verb and resource ('Searches specs') plus the exact filter dimensions, and explicitly scopes what is omitted (no endpoints, schemas, gotchas, canonical_example) with a pointer to get_spec for the full payload. An agent can distinguish this from get_spec and list_providers without opening a schema.

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?

Names the alternative explicitly ('Use get_spec with the exact capability name to retrieve the full payload') and gives the condition for it, plus how to handle variants via get_spec "variant". It also tells the agent to check the status field and inform the user when a spec is not verified, and the hint field tells it to widen the search rather than declare a provider unavailable.

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.

  1. 5 tool updates
    • First observedget_spec
    • First observedlist_providers
    • First observedreport_integration
    • First observedrequest_spec
    • First observedsearch_specs

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Open-source MCP server that streamlines payment integration for AI agents and financial apps in Africa, providing unified tools for providers like M-Pesa.
    1
    -
  • -
    license
    Not graded
    quality
    Not graded
    maintenance
    Field operations agent API for task management, geo-tracking, and team coordination. Built for African logistics, delivery, and field service teams.
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    Nigeria's AI infrastructure server that provides business automation agents including WhatsApp automation, university support, travel management, and legal document processing. Integrates payment processing, text-to-speech capabilities, and webhook handling for Nigerian businesses.
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    A unified MCP server for West African payment providers, enabling AI agents and REST clients to initiate payments, payouts, refunds, and manage webhooks across 10 providers with a single API.
    8
    1 npm
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.