Skip to main content
Glama
mojawave

MojaWave MCP

Official
by mojawave

mojawave-mcp

MojaWave MCP server — connect any MCP-compatible AI assistant to the MojaWave SMS and Email API.

Works with Claude (Desktop & Code), ChatGPT (via OpenAI Agents SDK), Gemini (via Google ADK), Cursor, Windsurf, and any other tool that speaks the Model Context Protocol.

Every tool maps to a documented endpoint of the MojaWave public API — nothing undocumented is exposed.


Available tools

SMS

Tool

API endpoint

What it does

list_sms_sender_ids

GET /sms/sender-ids/approved

List approved sender IDs available on your account — call this before sending to pick the right sender_id

send_sms

POST /sms/send

Send a single SMS, optionally scheduled (schedule_at)

send_bulk_sms

POST /sms/bulk

Start an async bulk SMS job for up to 10,000 recipients — returns a job_id

get_bulk_sms_job

GET /sms/bulk/{id}

Poll the status and progress of a bulk SMS job

Email

Tool

API endpoint

What it does

list_email_domains

GET /email/domains

List sending domains and their verification status — call before sending to confirm a domain is verified

list_email_senders

GET /email/senders

List registered sender addresses available as from_email

send_email

POST /email/send

Send a transactional email — supports HTML + plain text, CC/BCC, reply-to, attachments, scheduled delivery, and tags

Messages & account

Tool

API endpoint

What it does

get_message

GET /messages/{id}

Get full details and delivery timeline for a single message

get_credit_balance

GET /credits

Check current SMS and email credit balances

verify_webhook_signature

Verify a webhook's X-MojaWave-Signature (HMAC-SHA256)

Inputs are validated before any request is made (E.164 phone numbers, 1–11-char sender IDs, message length, recipient count, ISO-8601 schedule times, email addresses, subject length), and the client retries 429/5xx responses with backoff that honours Retry-After.


Related MCP server: Twilio SMS Server

Sending SMS

1. list_sms_sender_ids()
   → [{ "sender_id": "MYAPP", "status": "approved" }]

2. send_sms(to="+255712345678", message="Hello!", sender_id="MYAPP")
   → { "id": "...", "status": "sent" }

Sending email

1. list_email_domains()    — confirm your domain is "verified"
2. list_email_senders()    — pick a valid from_email address
3. send_email(to="customer@example.com", from_email="noreply@yourdomain.com",
              subject="Hello", body="Hi there")
   → { "id": "...", "status": "queued" }

Bulk SMS

1. list_sms_sender_ids()   — pick an approved sender ID

2. send_bulk_sms(recipients=["+255700000001", ...], message="...", sender_id="MYAPP")
   → { "job_id": "ec0fb57c-...", "status": "scheduled", "total_recipients": 500 }

3. get_bulk_sms_job(job_id="ec0fb57c-...")
   → { "status": "completed", "total_recipients": 500, "total_credits_cost": 500 }

Installation

pip install mojawave-mcp

Or for local development:

git clone https://github.com/mojawave/mojawave-mcp
cd mojawave-mcp
pip install -e ".[dev]"

Configuration

Copy .env.example to .env and add your API key:

cp .env.example .env
MOJAWAVE_API_KEY=sk_live_mw_xxxxxxxxxxxxxxxxxxxx

Get your API key from the MojaWave dashboard under Settings → API Keys.

Use a test key (sk_test_mw_…) during development — it returns synthetic responses without sending real messages or charging credits.


Connecting to AI assistants

Claude Desktop

Add this block to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):

{
  "mcpServers": {
    "mojawave": {
      "command": "mojawave-mcp",
      "env": {
        "MOJAWAVE_API_KEY": "sk_live_mw_xxxxxxxxxxxxxxxxxxxx"
      }
    }
  }
}

Restart Claude Desktop. You will see a MojaWave tool icon in the chat interface.


Claude Code (CLI)

claude mcp add mojawave -- env MOJAWAVE_API_KEY=sk_live_mw_xxx mojawave-mcp

Cursor / Windsurf / any stdio MCP client

Point the client at the mojawave-mcp command with your API key as an environment variable. Most clients use the same JSON config format as Claude Desktop above — refer to your client's MCP documentation.


OpenAI Agents SDK (ChatGPT / GPT-4o)

Start the server in SSE mode so OpenAI can reach it over HTTP:

MOJAWAVE_API_KEY=sk_live_mw_xxx mojawave-mcp --transport sse --port 8080

Then connect from Python:

from agents import Agent, Runner
from agents.mcp import MCPServerSse

async def main():
    server = MCPServerSse(url="http://localhost:8080/sse")
    async with server:
        agent = Agent(
            name="MojaWave Agent",
            model="gpt-4o",
            mcp_servers=[server],
        )
        result = await Runner.run(
            agent, "Send an SMS to +255712345678 saying Hello from AI"
        )
        print(result.final_output)

Google Gemini (Google ADK)

Start the server in SSE mode:

MOJAWAVE_API_KEY=sk_live_mw_xxx mojawave-mcp --transport sse --port 8080

Then connect from Python:

from google.adk.agents import LlmAgent
from google.adk.tools.mcp_tool.mcp_toolset import MCPToolset, SseServerParams

mojawave_tools = MCPToolset(
    connection_params=SseServerParams(url="http://localhost:8080/sse")
)

agent = LlmAgent(
    model="gemini-2.0-flash",
    name="mojawave_agent",
    instruction="You can send SMS and email and check credits via MojaWave.",
    tools=[mojawave_tools],
)

Hosted deployment (Docker)

For production, run the SSE server behind a reverse proxy:

FROM python:3.12-slim
RUN pip install mojawave-mcp
ENV MOJAWAVE_API_KEY=""
EXPOSE 8080
CMD ["mojawave-mcp", "--transport", "sse", "--port", "8080"]
docker build -t mojawave-mcp .
docker run -e MOJAWAVE_API_KEY=sk_live_mw_xxx -p 8080:8080 mojawave-mcp

Running locally (stdio)

MOJAWAVE_API_KEY=sk_live_mw_xxx mojawave-mcp

The server reads JSON-RPC from stdin and writes to stdout — the standard MCP stdio transport used by Claude Desktop and most IDE extensions.


Security notes

  • Never commit your API key. Use environment variables or a secrets manager.

  • Use test keys (sk_test_mw_…) in CI/CD and development — no real messages are sent and no credits are charged.

  • Scope API keys to only the permissions they need from the MojaWave dashboard.

  • The AI is instructed to always confirm recipient, content, and sender with you before calling send_sms, send_bulk_sms, or send_email — these spend real credits and deliver real messages.

  • Webhook payloads are signed with X-MojaWave-Signature (HMAC-SHA256) — verify signatures on your server before trusting delivery events.


License

MIT

Available Tools

10 tools
get_bulk_sms_jobA

Get the status and progress of a bulk SMS job.

Args: job_id: The job UUID returned by send_bulk_sms.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

No annotations are provided, so the description bears full responsibility. It correctly indicates a read operation without side effects, though it could be more explicit about being non-destructive. The mention of progress implies multiple states.

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 extremely concise: one sentence for purpose and one for parameter guidance. No extraneous information, and the key action is front-loaded.

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 simplicity (1 parameter, output schema exists), the description fully covers the necessary context. It tells what the tool returns, what input it needs, and where that input comes from.

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?

With 0% schema description coverage, the description adds essential context for the job_id parameter: 'The job UUID returned by send_bulk_sms.' This informs the agent about the parameter's origin, going beyond the schema's title.

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 'Get the status and progress of a bulk SMS job,' which clearly identifies the action and resource. This distinguishes it from siblings like send_bulk_sms or list_sms_sender_ids.

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 instructs that the job_id is the UUID returned by send_bulk_sms, providing clear context for when to use this tool (after sending a bulk SMS). While it doesn't explicitly list alternatives, it effectively narrows usage.

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

get_credit_balanceA

Get current SMS and email credit balances for your organization.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

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

No annotations provided, so the description bears the burden. It states it returns current balances, which is straightforward. It lacks details on potential latency, caching, or authentication, but for a simple read tool this is adequate.

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 sentence of 11 words, front-loaded with the core purpose. Every word earns its place, no fluff.

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 no parameters and the presence of an output schema (not shown but indicated), the description fully covers what the agent needs to know: it retrieves credit balances.

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?

With zero parameters, the baseline is 4. The description adds no parameter info, which is acceptable since there are none to explain.

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 'Get', the resource 'SMS and email credit balances', and scope 'for your organization'. It effectively distinguishes from sibling tools that send messages or manage other aspects.

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 implies usage for checking balances without explicit when-not-to-use or alternatives, but the context of sibling tools makes it clear this is for querying, not sending.

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

get_messageA

Get full details and delivery status (timeline) for a single message.

Args: message_id: The UUID of the message returned when it was sent.

ParametersJSON Schema
NameRequiredDescriptionDefault
message_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It indicates a read operation ('Get full details...') but does not disclose any potential behavioral traits such as authentication needs 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.

Conciseness5/5

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

Two sentences, no superfluous words. The description efficiently conveys the tool's purpose and parameter semantics.

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 simple single-message retrieval tool with an output schema, the description adequately covers what the tool returns (full details and delivery status). No additional context is needed.

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?

The schema provides only a simple title 'Message Id', while the description adds crucial context: 'The UUID of the message returned when it was sent.' This fully compensates for the 0% schema description coverage.

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 'Get full details and delivery status (timeline) for a single message', providing a specific verb and resource that distinguishes it from sibling tools like get_bulk_sms_job.

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 explains that the message_id is 'the UUID returned when it was sent', implying usage context, but does not explicitly state when to use this tool over alternatives.

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

list_email_domainsA

List all email sending domains registered on your account.

Call this before send_email to confirm which domains are verified and available. Only domains with status "verified" can send mail.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

Indicates a read-only listing operation with no side effects. While it doesn't explicitly state 'read-only', the description is clear and no annotations are provided to contradict.

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 short, focused sentences with no fluff. Information is front-loaded and every sentence adds value.

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 parameters and an output schema present, the description provides all necessary context: what it does, when to use it, and a crucial constraint (verified status).

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?

Tool has zero parameters, so baseline score of 4 applies as there is nothing needed beyond the 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?

Clearly states it lists email sending domains, a specific verb-resource combination. Distinguishes from sibling tools like send_email by noting it's for checking verified domains.

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?

Explicitly advises to call this before send_email to confirm verified domains, and notes that only verified domains can send mail.

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

list_email_sendersA

List all registered sender addresses available for sending email.

Returns the email addresses you can use in the from_email field of send_email. Each sender belongs to a verified domain.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations, the description discloses the list operation and mentions that senders belong to verified domains. It is clear and consistent, though it omits potential details like pagination or ordering.

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, each adding value: first states the main action, second clarifies the purpose. No wasted words.

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 no parameters and an output schema, the description adequately covers what the tool does and its context (verified domains, use in send_email). No gaps.

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, so baseline is 4. The description adds no parameter information as none exist.

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 states the action 'list' and resource 'registered sender addresses' clearly, and explains their use in the 'from_email' field of send_email. This distinguishes it from sibling tool list_email_domains which lists domains.

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 context (for obtaining valid from addresses for send_email) but does not explicitly say when not to use this tool or compare with alternatives like list_email_domains.

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

list_sms_sender_idsA

List approved SMS sender IDs available on your account.

Returns IDs with status "approved". If the list is empty, the user has no custom sender IDs yet — use 'MojaWave' as the default shared sender ID, which is always available as a fallback. Call this before sending to pick the correct sender ID.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior4/5

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

No annotations provided, so description carries full burden. It discloses that only approved IDs are returned and explains the empty list case, which is sufficient for a read-only list tool. Could be improved by explicitly stating it's safe and read-only.

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?

Three sentences, front-loaded with purpose, every sentence adds value. No wasted words.

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 no parameters and presence of output schema, description covers why, when, and what to expect (including fallback). Complete for a simple list 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?

No parameters exist (schema coverage 100%), and description adds meaning by explaining output behavior (only approved, fallback). Baseline 4 for 0 params, +1 for added context.

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 clearly states that the tool lists approved SMS sender IDs available on the account. It uses specific verb 'list' and resource 'approved SMS sender IDs', and distinguishes from sibling tools by its unique purpose.

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?

Explicitly advises 'Call this before sending to pick the correct sender ID.' Also provides guidance when the list is empty: use 'MojaWave' as default shared sender ID, which is always available.

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

send_bulk_smsA

Send the same SMS to up to 10,000 recipients. Processed asynchronously — returns a job_id immediately; use get_bulk_sms_job to track progress.

Confirm the recipient list size, message, and sender_id with the user first — this spends real credits.

Args: recipients: List of phone numbers in E.164 format (1-10,000). message: SMS text content (max 1600 characters). sender_id: Sender ID (1-11 alphanumeric chars). Use list_sms_sender_ids to find approved IDs, or 'MojaWave' as the default fallback. name: Optional campaign name for your reference (e.g. "June Promo").

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
messageYes
sender_idYes
recipientsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior4/5

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

Discloses asynchronous processing with immediate job_id return, and credit spending. No annotations provided, so description handles transparency well but could mention error handling or rate limits for completeness.

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?

Concise yet comprehensive: three sections (action, async note, warning) followed by clean parameter list. No redundant sentences, all details earned.

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?

Complete for a complex tool: covers async behavior, credit cost, confirmation requirement, parameter constraints, and references sibling tools for tracking and sender ID lookup. Output schema exists so return details are not needed.

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?

Despite 0% schema coverage, description fully compensates by detailing each parameter: recipients (E.164, 1-10k), message (max 1600 chars), sender_id (1-11 alphanumeric, with tool reference and default), name (optional campaign name). Adds constraints, types, and examples beyond 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?

Clear verb 'send', resource 'SMS', and scope 'up to 10,000 recipients' directly stated. Distinguishes from send_sms by specifying bulk and async processing.

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?

Explicitly advises confirming recipient list, message, and sender_id with the user first, noting credit cost. Recommends using get_bulk_sms_job for tracking and list_sms_sender_ids for sender_id lookup. Provides default fallback sender_id.

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

send_emailA

Send a transactional email from a registered sender address.

Costs 1 credit per recipient (to + each cc + each bcc). At least one of body (plain text) or html is required.

Call list_email_senders first to confirm from_email is registered. ALWAYS confirm to, subject, from_email, and body/html with the user before sending — this spends real credits and delivers a real email.

Args: to: Recipient email address (e.g. customer@example.com). from_email: Registered sender address on a verified domain (e.g. noreply@yourdomain.com). Use list_email_senders to find valid values. subject: Email subject line (max 500 chars). body: Plain-text body. At least one of body or html is required. html: Optional HTML body (e.g. "Hello"). Provide alongside body as a fallback for clients that don't render HTML. from_name: Optional display name shown in the recipient's inbox (e.g. "Duka Masta Billing"). cc: Optional list of CC addresses. Each costs 1 credit. bcc: Optional list of BCC addresses. Each costs 1 credit. reply_to: Optional reply-to address if different from from_email. schedule_at: Optional future delivery time in ISO-8601 (e.g. 2026-06-15T09:00:00Z). Naive datetimes (no Z/offset) are treated as EAT (Africa/Dar_es_Salaam, UTC+3). Leave empty to send immediately. tags: Optional string labels for filtering in message history (max 10).

ParametersJSON Schema
NameRequiredDescriptionDefault
ccNo
toYes
bccNo
bodyNo
htmlNo
tagsNo
subjectYes
reply_toNo
from_nameNo
from_emailYes
schedule_atNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations, the description fully discloses credit costing per recipient, requirements for body/html, timezone handling for schedule_at (EAT), tag limits, and that this is a real email send. 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.

Conciseness4/5

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

The description is well-structured with a purpose statement, key notes, and an organized parameter list. It is concise for 11 parameters but some entries (e.g., html fallback explanation) could be slightly more terse.

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 complexity (11 params, no annotations, no schema descriptions), the description covers all essentials: purpose, prerequisites, costs, parameter details, behavioral nuances (timezone), and references to related tools. It is fully actionable.

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?

Despite 0% schema coverage, the description's Args section provides detailed semantics for all 11 parameters, including constraints (max 500 chars for subject, max 10 tags), formatting (ISO-8601 for schedule_at), and dependencies (body or html required).

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 starts with a specific verb ('Send') and resource ('transactional email from a registered sender address'), clearly stating the tool's function. It implicitly distinguishes from SMS siblings by focusing on email.

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 gives important prerequisites: 'Call list_email_senders first to confirm from_email is registered' and warns about real credit usage and user confirmation. It lacks explicit comparison to alternatives but the context is sufficient.

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

send_smsA

Send a single SMS message, optionally scheduled for future delivery.

Confirm recipient, message, and sender_id with the user first — this spends real credits.

Args: to: Recipient phone number in E.164 format (e.g. +255712345678). message: SMS text content (max 1600 characters). sender_id: Sender ID shown to the recipient (1-11 alphanumeric chars, e.g. MYAPP). Use list_sms_sender_ids to find approved IDs. If none exist, use 'MojaWave' as the default shared sender ID. schedule_at: Optional future delivery time in ISO-8601 UTC (e.g. 2026-06-15T09:00:00Z). Leave empty to send immediately.

ParametersJSON Schema
NameRequiredDescriptionDefault
toYes
messageYes
sender_idYes
schedule_atNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

With no annotations, the description carries the full burden. It discloses credit spending, required confirmation, optional scheduling, and default sender ID. It doesn't cover error handling or return values, but provides solid behavioral context for a sending tool.

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 efficiently structured: one sentence of purpose, one usage warning, then bullet-like args. Every sentence adds value, no redundancy, and key details are front-loaded.

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 4 params (one optional) and an output schema (not shown), the description covers all needed context: credit spending, sender selection, scheduling options, and parameter formatting. It's complete for effective use without further aid.

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 0%, so the description wholly defines parameters: 'to' format (E.164), 'message' max length (1600), 'sender_id' constraints (1-11 alphanumeric) with guidance, and 'schedule_at' format (ISO-8601 UTC). This adds significant meaning beyond the schema's bare types/titles.

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 a single SMS message, optionally scheduled for future delivery,' with a specific verb and resource. It distinguishes from siblings like 'send_bulk_sms' (multiple) and 'get_message' (retrieval), making the tool's 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 Guidelines4/5

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

It warns to confirm with the user and mentions credit consumption, plus directs to 'list_sms_sender_ids' for approved sender IDs. It lacks explicit 'when not to use' or alternatives like 'send_bulk_sms', but the guidance is sufficient for typical use.

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

verify_webhook_signatureA

Verify a MojaWave webhook's HMAC-SHA256 signature.

Pass the RAW request body (exactly as received), the value of the X-MojaWave-Signature header, and your webhook signing secret. Returns whether the signature is valid — only act on webhook events that verify as valid.

Args: payload: The raw webhook request body (do not re-serialize it). signature: The X-MojaWave-Signature header value. secret: Your webhook signing secret (whsec_...).

ParametersJSON Schema
NameRequiredDescriptionDefault
secretYes
payloadYes
signatureYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries the burden. It explains that the tool returns whether the signature is valid and warns against re-serializing the payload. It does not mention side effects, but as a read-only verification, none are expected.

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 front-loaded with a one-line summary followed by a clear, structured paragraph and an Args section. It is concise with no wasted words and uses formatting for emphasis.

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?

The description covers the essential aspects: purpose, inputs, and action recommendation. It does not describe the output schema (but output schema exists), nor error handling. Given the tool's simplicity, it is nearly complete.

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 description coverage is 0%, but the description provides detailed explanations for each parameter: payload as raw body, signature as header value, and secret in whsec_... format. This fully compensates 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 verb 'Verify' and the resource 'a MojaWave webhook's HMAC-SHA256 signature'. It distinguishes the tool from siblings by its unique verification functionality.

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 explicit guidance on when to use the tool ('only act on webhook events that verify as valid') and specifies that the raw request body must be passed exactly as received. It does not explicitly state when not to use, but the context is clear.

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. 10 tool updatesv0.3.2
    • First observedget_bulk_sms_job
    • First observedget_credit_balance
    • First observedget_message
    • First observedlist_email_domains
    • First observedlist_email_senders
    • First observedlist_sms_sender_ids
    • First observedsend_bulk_sms
    • First observedsend_email
    • First observedsend_sms
    • First observedverify_webhook_signature

TDQS

A4.4/5.0
Disambiguation5/5

Each tool covers a distinct operation: sending SMS/email (single and bulk), listing resources, checking status, and verifying webhooks. There is no overlap; even the two 'send' tools are clearly differentiated by single vs. bulk, and each 'list' tool targets a specific resource type.

Naming Consistency4/5

All tools use a consistent verb_noun pattern in snake_case (get_, list_, send_, verify_). There is a minor inconsistency: 'list_sms_sender_ids' uses 'sender_ids' while the email counterparts use 'senders' (list_email_senders). The deviation is small but slightly breaks the pattern.

Tool Count5/5

10 tools is a well-scoped set for a messaging API. It covers essential operations (sending, listing, status, credit, webhook) without being overwhelming. The count falls comfortably within the ideal 3-15 range.

Completeness3/5

The server covers basic send, status, and listing operations but lacks several expected capabilities: no bulk email sending, no way to list sent messages or search history, no update/delete for resources like sender IDs or domains, and no cancellation of scheduled messages. These gaps are notable for a full messaging lifecycle.

Maintenance

ActivitySlowing
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
    A
    maintenance
    Enables AI assistants and MCP-compatible clients to send and manage SMS messages through the 46elks API, leveraging Swedish telecommunications infrastructure.
    6
    MIT
  • 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

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/mojawave/mojawave-mcp'

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