Skip to main content
Glama

Send a code by SMS

send_message
Idempotent

Send one transactional SMS to a Georgian mobile number. The text comes from a built-in template; there is no free text (every template: https://n0t1fy.dev/templates).

Team templates (service_down, service_up, incident_opened, support_ticket_urgent, job_failed, agent_alert) go only to numbers the project's owner confirmed on the dashboard's team page; with a test key, use the test numbers +995512345670 to +995512345679. A recipient_not_on_team error means the number is not confirmed on the team: ask the human to add it on the dashboard, and never retry by yourself. With a live key, a service or job must be a name on the owner's list there.

With a test key (sk_test_) nothing is really sent: a simulator answers. These recipients simulate outcomes: +995512345671 rejected (status failed); +995512345672 provider unreachable (error provider_unavailable: nothing was sent, retry with the same idempotency_key); +995512345673 ambiguous (status unknown); +995512345674 accepted, then undeliverable. Any other valid number is accepted, then delivered, within about 30 seconds. With a live key it sends a real SMS and spends one credit per segment.

Read message.status in the result. submitted: the provider accepted it, which is not yet delivery to the phone. failed: refused; message.error says why. unknown: it may or may not have been sent, so do not send it again automatically. replayed: true: this idempotency_key and request were already processed, and no second SMS was sent. Call get_message to learn the final outcome.

Input Schema

NameRequiredDescriptionDefault
toYesRecipient in E.164 format: `+9955` followed by eight digits. No other country or format is accepted, and numbers are never normalized on your behalf.
localeNoLanguage of the message: `ka` (Georgian, the default) or `en`.ka
api_keyNoAn sk_test_ key, for example from create_test_key. Leave it out to use the key in this MCP server's Authorization header. A live key (sk_live_) is refused here: tool arguments are kept in the conversation, so a live key belongs in the header.
templateYesWhich message to send. Message text is never free-form: every message is rendered from one of these templates. - `verification_code` (`code`): Your verification code is {code}. Do not share it with anyone. - `login_code` (`code`): Your sign-in code is {code}. If you did not request it, ignore this message. - `password_reset_code` (`code`, `minutes`): Your password reset code is {code}. It expires in {minutes} minutes. - `service_down` (`service`): Alert: {service} is down. Team only. - `service_up` (`service`): Resolved: {service} is up again. Team only. - `incident_opened` (`incident`): Urgent: incident {incident} needs attention. Team only. - `support_ticket_urgent` (`ticket`): Urgent: support ticket {ticket} is waiting for a reply. Team only. - `job_failed` (`job`): Failed: scheduled job {job} did not finish. Team only. - `agent_alert` (`agent`, `count`): {agent}: {count} new updates. Check your app. Team only. Team templates go only to numbers confirmed on the project's team on the dashboard (a test key: the test numbers only); any other number answers `403 recipient_not_on_team`. Every template, its blanks and who it may go to: /templates.
variablesYesValues for the template's placeholders, all as JSON strings. A `code` is 4 to 8 digits; `minutes` is 1 to 999; an `incident` or `ticket` 1 to 8 digits; a `count` 1 to 99; an `agent` `your_agent` or `ai_assistant`; a `service` or `job` a name on the project's team page (a live key). Values that look like a link, a web address, or a phone number are refused.
idempotency_keyYesA new unique value (a UUID) for each logical message. Reuse it only to retry the identical request: the retry then returns the original message instead of sending a second SMS.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changed
    • changedInput schema / properties / template / description
      Previous value: -"Which message to send. Message text is never free-form: every message is rendered from one of these templates.\n\n- `verification_code` (`code`): Your verification code is {code}. Do not share it with anyone.\n- `login_code` (`code`): Your sign-in code is {code}. If you did not request it, ignore this message.\n- `password_reset_code` (`code`, `minutes`): Your password reset code is {code}. It expires in {minutes} minutes."New value: +"Which message to send. Message text is never free-form: every message is rendered from one of these templates.\n\n- `verification_code` (`code`): Your verification code is {code}. Do not share it with anyone.\n- `login_code` (`code`): Your sign-in code is {code}. If you did not request it, ignore this message.\n- `password_reset_code` (`code`, `minutes`): Your password reset code is {code}. It expires in {minutes} minutes.\n- `service_down` (`service`): Alert: {service} is down. Team only.\n- `service_up` (`service`): Resolved: {service} is up again. Team only.\n- `incident_opened` (`incident`): Urgent: incident {incident} needs attention. Team only.\n- `support_ticket_urgent` (`ticket`): Urgent: support ticket {ticket} is waiting for a reply. Team only.\n- `job_failed` (`job`): Failed: scheduled job {job} did not finish. Team only.\n- `agent_alert` (`agent`, `count`): {agent}: {count} new updates. Check your app. Team only.\n\nTeam templates go only to numbers confirmed on the project's team on the dashboard (a test key: the test numbers only); any other number answers `403 recipient_not_on_team`. Every template, its blanks and who it may go to: /templates."
    • changedInput schema / properties / template / enum
      Previous value: -[
      -  "verification_code",
      -  "login_code",
      -  "password_reset_code"
      -]New value: +[
      +  "verification_code",
      +  "login_code",
      +  "password_reset_code",
      +  "service_down",
      +  "service_up",
      +  "incident_opened",
      +  "support_ticket_urgent",
      +  "job_failed",
      +  "agent_alert"
      +]
    • changedInput schema / properties / variables / description
      Previous value: -"Values for the template's placeholders, all as JSON strings. A `code` is 4 to 8 digits; `minutes` is 1 to 999. Values that look like a link, a web address, or a phone number are refused."New value: +"Values for the template's placeholders, all as JSON strings. A `code` is 4 to 8 digits; `minutes` is 1 to 999; an `incident` or `ticket` 1 to 8 digits; a `count` 1 to 99; an `agent` `your_agent` or `ai_assistant`; a `service` or `job` a name on the project's team page (a live key). Values that look like a link, a web address, or a phone number are refused."
  2. First observed

TDQS

A4.4/5.0
Behavior5/5

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

Goes far beyond the annotations: test-key simulator behavior per recipient number, that a live send spends one credit per segment, that 'submitted' is not yet delivery, that 'unknown' must not be retried automatically, and that 'replayed: true' means no second SMS. This is exactly the operational context an agent needs before firing a side-effecting call.

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?

Well front-loaded: purpose, then access rules, then test behavior, then result interpretation. It is long and duplicates the template/placeholder list already present in the schema, which costs a point, but every paragraph carries operational 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?

For a complex, side-effecting tool with no output schema, the description covers recipient restrictions, template semantics, idempotency behavior, and how to read message.status and message.error. An agent could call it correctly, including failure handling, from this text alone.

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 the baseline is 3. The description mostly restates what the template and idempotency_key schema entries already say (template list, no free text, reuse keys only for identical retries), though it adds the cross-field constraint that a team template combined with an unconfirmed recipient returns recipient_not_on_team.

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 states a specific verb, resource, channel and geographic scope: 'Send one transactional SMS to a Georgian mobile number.' It also clarifies the hard constraint that text is never free-form. It does not differentiate itself from the sibling start_verification, which plausibly also triggers an SMS, so an agent must infer the boundary.

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 gives when-to-use conditions (team templates only to dashboard-confirmed numbers, test numbers with a test key), when-not (live key requires service/job names from the owner's list), and error routing ('ask the human to add it on the dashboard, and never retry by yourself'). It also routes to the sibling get_message for the final outcome, so nothing is left to inference.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources