@ethioviral/mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| ETHIOVIRAL_API_KEY | Yes | Your API key for the Ethio-Viral API (required). | |
| ETHIOVIRAL_API_BASE_URL | No | Base URL for the API. Defaults to https://api.ethio-viral.com. | https://api.ethio-viral.com |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| search_catalogA | Full-text search across airtime, eSIMs, gift cards, and game top-ups. Returns up to 50 matching products with live prices. |
| list_categoriesA | Returns each product category (airtime, esim, giftcards, gaming, bills) with its item count. |
| get_categoryB | Returns every product in one category (from list_categories). |
| get_productA | Fetches one product by id (from search_catalog / get_category), including its current live price — always call this right before create_order to get the exact denomination. |
| get_balanceA | Returns the calling partner account's current prepaid balance (ETB). Orders are paid from this balance. |
| create_orderA | Places a live order, debited from your prepaid balance. denomination MUST exactly match one of the product's denoms[].retailMinor from get_product — call get_product first to get a current price, since prices can change. recipient is required when the product's recipientType is phone_number or email (E.164 digits, no leading + for phone). Moves real money — only call this once you intend to complete the purchase. |
| get_orderA | Fetches the current status of one order by id — use this to re-check an order after create_order, or to recover from a timed-out call. |
| get_order_historyA | Returns up to 50 of your most recent orders, newest first. |
| list_premium_productsA | Subscription seats (design tools, AI tools, streaming) priced on your reseller tier. Separate catalog and separate USD wallet from the store, but the same API key opens both. |
| get_premium_productA | Fetches one subscription product with its current tier price and stock — call this right before create_premium_order so you are quoting a live price. |
| get_premium_balanceA | The USD wallet premium orders are debited from. Check this before ordering — an order with insufficient balance is refused with 402. |
| create_premium_orderA | Buys a subscription seat and debits your USD wallet. Confirm the product, the price and the recipient with the user before calling this — it is not reversible from here. An Idempotency-Key is sent automatically, so retrying an identical call is safe and will never double-charge. |
| get_premium_orderA | Status of a premium order. Poll this after create_premium_order, or to recover from a timed-out call. |
| get_premium_deliveryA | The credentials, invite or link for a fulfilled premium order. Unlike store orders, premium delivery is NOT inline on the order — you must call this once status is fulfilled. |
| list_smm_servicesA | Social-media services (followers, views, likes) with their rate per 1000 and min/max order size. There are ~7,500 services, so ALWAYS pass a query (e.g. "tiktok followers", "instagram likes") — an unfiltered list is enormous and mostly irrelevant. The min and max are enforced server-side; an order outside them is refused. |
| create_smm_orderA | Buys a social-media service and debits your wallet. CONFIRM THE LINK WITH THE USER FIRST — delivery goes to whatever link is given and cannot be recalled once the supplier accepts it. Quantity must be within the service min/max. |
| get_smm_orderC | Status and real delivery progress (start count, delivered so far, remaining) for an SMM order. |
| get_webhookA | The endpoint we POST order events to, with its recent delivery health. Returns null if none is configured. |
| set_webhookA | Registers an https endpoint we call on every terminal order state, so you can stop polling. RETURNS THE SIGNING SECRET EXACTLY ONCE — show it to the user and tell them to store it now; it can never be read back. Private, loopback and cloud-metadata addresses are refused. |
| delete_webhookA | Stops webhook delivery. Orders are unaffected; you fall back to polling get_order. |
| test_webhookA | Posts a signed test event to the configured endpoint and reports what came back, so a partner can verify their signature check before relying on it. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 21 tools
Tools are generally distinguishable by domain prefix (store, premium, SMM, webhook), and descriptions clarify remaining ambiguity. A few pairs like get_order vs get_smm_order or list_premium_products vs get_premium_product could cause misselection if an agent skims names, but context usually resolves them.
Every tool follows a consistent verb_noun pattern using list, search, get, create, set, delete, or test. Domain qualifiers such as premium, smm, and webhook are applied uniformly, making the set predictable and easy to navigate.
At 21 tools, the server is at the upper edge of what feels comfortable, though the breadth is justified by covering store, premium, SMM, and webhook workflows. Each tool has a clear purpose, but the overall surface area is heavy compared to a typical focused MCP server.
The server covers the core reseller lifecycle well: product discovery, balance checks, order creation, order status retrieval, delivery retrieval, and webhook configuration across all order types. Minor gaps exist, such as no pagination for order history and no SMM-specific history listing, but they are workable and not severe.