# MSG91

> Find and call the right MSG91 API for SMS, OTP, WhatsApp, Email and Voice.

- name: com.msg91.mcp/mcp
- version: 1.0.0
- connection class: R0 (autonomous)
- trust: 96/100
- quality: 88/100 (good)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/com.msg91.mcp%2Fmcp
- tools: https://api.protogrid.dev/v1/servers/com.msg91.mcp%2Fmcp/tools

**An agent can connect right now, no human step.** Remote endpoint, no authentication, reachable on the last probe.

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "mcp": {
      "type": "http",
      "url": "https://mcp.msg91.com/mcp"
    }
  }
}
```


## Trust

- hygiene: 100
- liveness: 100
- freshness: 100
- provenance: 85
- drivers: +repository +dns-namespace +website +reachable +uptime-100% +updated-15d-ago
- Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed.

## Quality 88/100 (good)

### protocol: 75 (weight 25)

- warn `protocol.modern`: newest supported version is 2025-11-25; 2026-07-28 not supported, older versions are deprecated until 2027-07-28
- n/a `protocol.stateless`: only applies to 2026-07-28 servers
- pass `protocol.transport`: streamable HTTP
- n/a `protocol.list_ttl`: only applies to 2026-07-28 servers

### authorization: n/a (weight 15)

- n/a `auth.prm`, `auth.as_metadata`, `auth.cimd`: no remote uses OAuth
- n/a `auth.secret_in_url`: no templated URL

### tool hygiene: 94 (weight 30)

- pass `tools.descriptions`: every tool has a description
- pass `tools.description_length`: descriptions are concise
- pass `tools.schemas`: every tool has an object input schema
- pass `tools.annotations`: 3 of 3 tools declare readOnlyHint or destructiveHint
- warn `tools.directory_hints`: 2 of 3 tools declare all four hints; missing: quickstart-msg91 (idempotentHint)
- pass `tools.token_cost`: about 510 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump
- pass `tools.hidden_text`: no hidden text in tool names, descriptions, schemas or annotations

### stability: 100 (weight 15)

- pass `stability.changes`: 4 tool changes in 30 days
- pass `stability.rug_pull`: no tool changed its meaning under the same name
- pass `stability.new_links`: no tool change named a new site

### dependencies: n/a (weight 15)

- n/a `deps.known_vulns`, `deps.mcp_sdk_version`, `deps.resolvable`: no npm or PyPI package

- tools: 3, about 510 tokens to load them all
- tool set hash: cabcafb5f71a450cbb7af3240a8da58a
- tools last changed: 2026-11-12T15:07:17.301Z
- badge: [![protogrid quality](https://protogrid.dev/badge/com.msg91.mcp/mcp.svg)](https://protogrid.dev/servers/com.msg91.mcp/mcp)
- Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed.

### Tool changes

- 2026-11-12 `call_any_read_api_of_msg91` removed
  - Read from any MSG91 API endpoint with a GET request for the user and return its response. Use it once you know the exact endpoint: look it up with get_msg91_api_docs first to get its URL, headers, query params and body, unless the skill or a dedicated tool on this server already gives them exactly. Load the quickstart-msg91 skill first: it explains which tool to use when. For POST, PUT, PATCH and DELETE use call_any_api_of_msg91. Pass the full url with path variables filled in, the headers the docs list, and query params in `query` (not in the url). For the auth header the docs name (Authorization, proxy_auth_token, x-api-key, ...), pass it with an empty value "": the signed-in user's token is filled in automatically. Never put a real or made-up token there; if the docs name no auth header, leave it out and the token is sent as Authorization. If the API needs the user to sign in, they're asked the first time. Returns { status, ok, headers, data }: the HTTP status and the response body, including error details on failure.
- 2026-11-12 `call_any_api_of_msg91` removed
  - Send a POST, PUT, PATCH or DELETE request to any MSG91 API endpoint for the user and return its response. Use it once you know the exact endpoint: look it up with get_msg91_api_docs first to get its URL, headers, query params and body, unless the skill or a dedicated tool on this server already gives them exactly. Load the quickstart-msg91 skill first: it explains which tool to use when. For GET requests use call_any_read_api_of_msg91. Pass the full url with path variables filled in, the headers the docs list, query params in `query` (not in the url) and the JSON body in `body`. For the auth header the docs name (Authorization, proxy_auth_token, x-api-key, ...), pass it with an empty value "": the signed-in user's token is filled in automatically. Never put a real or made-up token there; if the docs name no auth header, leave it out and the token is sent as Authorization. If the API needs the user to sign in, they're asked the first time. Returns { status, ok, headers, data }: the HTTP status and the response body, including error details on failure.
- 2026-11-11 `call_any_read_api_of_msg91` added
  - Read from any MSG91 API endpoint with a GET request for the user and return its response. Use it once you know the exact endpoint: look it up with get_msg91_api_docs first to get its URL, headers, query params and body, unless the skill or a dedicated tool on this server already gives them exactly. Load the quickstart-msg91 skill first: it explains which tool to use when. For POST, PUT, PATCH and DELETE use call_any_api_of_msg91. Pass the full url with path variables filled in, the headers the docs list, and query params in `query` (not in the url). For the auth header the docs name (Authorization, proxy_auth_token, x-api-key, ...), pass it with an empty value "": the signed-in user's token is filled in automatically. Never put a real or made-up token there; if the docs name no auth header, leave it out and the token is sent as Authorization. If the API needs the user to sign in, they're asked the first time. Returns { status, ok, headers, data }: the HTTP status and the response body, including error details on failure.
- 2026-11-11 `call_any_api_of_msg91` added
  - Send a POST, PUT, PATCH or DELETE request to any MSG91 API endpoint for the user and return its response. Use it once you know the exact endpoint: look it up with get_msg91_api_docs first to get its URL, headers, query params and body, unless the skill or a dedicated tool on this server already gives them exactly. Load the quickstart-msg91 skill first: it explains which tool to use when. For GET requests use call_any_read_api_of_msg91. Pass the full url with path variables filled in, the headers the docs list, query params in `query` (not in the url) and the JSON body in `body`. For the auth header the docs name (Authorization, proxy_auth_token, x-api-key, ...), pass it with an empty value "": the signed-in user's token is filled in automatically. Never put a real or made-up token there; if the docs name no auth header, leave it out and the token is sent as Authorization. If the API needs the user to sign in, they're asked the first time. Returns { status, ok, headers, data }: the HTTP status and the response body, including error details on failure.

Full history: https://api.protogrid.dev/v1/servers/com.msg91.mcp%2Fmcp/changes

## Remotes

- https://mcp.msg91.com/mcp (streamable-http, auth none, reachable true, uptime30d 1)

## Packages

_none_

## Tools (3)

- `get_msg91_api_docs`: Browse the MSG91 API docs, one level at a time. Call it without arguments to get the top level: the modules and pages with a short description and the endpoints they hold. Call it with `path` set to a module's or page's link (or path) to get what is inside it; each listing links the next level. Call it with `path` set to an endpoint's link ending in ".openapi.yml" to get that endpoint as an OpenAPI file: method, url, headers, query params, path variables, a request body example and sample responses. Fetch only the level you need.
- `quickstart-msg91`: Quickstart for the MSG91 API Call this to load the full instructions for this skill before doing the task.
- `search_msg91_docs`: Search the MSG91 documentation with a natural-language question. Returns the most relevant passages with their page URLs.
