Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Descripción del creador (original en inglés)
Test inboxes for AI agents testing your app: block until the OTP or magic link arrives.
Estos tres nunca se combinan en una sola puntuación: las opiniones, las mediciones y la popularidad son cosas distintas.
Todavía no escribimos un resumen sencillo para este. Abajo están los datos que leímos del registro.
Elige la app de IA que usas y copia la configuración.
MAILSOCKET_API_KEY, MAILSOCKET_BASE_URL, AuthorizationLos valores marcados como secretos son llaves de tu cuenta. Nunca los compartas ni los pegues en un chat.
Necesitas
¿Qué app usas?
Elige tu app arriba. La recordamos, así que la próxima vez el botón dirá “Instalar en …”.
Esta dirección necesita una clave en un header de la solicitud, y el menú para agregar conectores no puede ponerla. Usa Claude Code, Cursor o VS Code.
Abre Claude Desktop → Settings → Developer → Edit Config y pega esto en claude_desktop_config.json
{
"mcpServers": {
"mailsocket": {
"command": "uvx",
"args": [
"mailsocket-mcp"
],
"env": {
"MAILSOCKET_API_KEY": "your-value",
"MAILSOCKET_BASE_URL": "your-value"
}
}
}
}Ejecuta esto en tu terminal
claude mcp add --transport http mailsocket https://mcp.mailsocket.app/mcp --header 'Authorization: your-value'claude mcp add mailsocket --env MAILSOCKET_API_KEY=your-value --env MAILSOCKET_BASE_URL=your-value -- uvx mailsocket-mcpCompleta los valores vacíos antes de ejecutarlo.
Pégalo en .cursor/mcp.json de tu proyecto, o en ~/.cursor/mcp.json
{
"mcpServers": {
"mailsocket": {
"url": "https://mcp.mailsocket.app/mcp",
"headers": {
"Authorization": "your-value"
}
}
}
}Pégalo en .cursor/mcp.json de tu proyecto, o en ~/.cursor/mcp.json
{
"mcpServers": {
"mailsocket": {
"command": "uvx",
"args": [
"mailsocket-mcp"
],
"env": {
"MAILSOCKET_API_KEY": "your-value",
"MAILSOCKET_BASE_URL": "your-value"
}
}
}
}Tu navegador te pide permiso para abrir la app; luego la app muestra la configuración y te pide confirmar. Los valores de las claves quedan vacíos para que los completes tú.
Pégalo en .vscode/mcp.json de tu proyecto
{
"servers": {
"mailsocket": {
"type": "http",
"url": "https://mcp.mailsocket.app/mcp",
"headers": {
"Authorization": "your-value"
}
}
}
}Pégalo en .vscode/mcp.json de tu proyecto
{
"servers": {
"mailsocket": {
"type": "stdio",
"command": "uvx",
"args": [
"mailsocket-mcp"
],
"env": {
"MAILSOCKET_API_KEY": "your-value",
"MAILSOCKET_BASE_URL": "your-value"
}
}
}
}Tu navegador te pide permiso para abrir la app; luego la app muestra la configuración y te pide confirmar. Los valores de las claves quedan vacíos para que los completes tú.
Esta dirección necesita una clave en un header de la solicitud, y el menú para agregar conectores no puede ponerla. Usa Claude Code, Cursor o VS Code.
Tu elección se guarda en una cookie en este dispositivo; no necesitas cuenta.
MAILSOCKET_BASE_URL envAuthorization secreto obligatorio HTTP headerEsta configuración se genera a partir de la ficha del creador en el registro. Si el README dice otra cosa, sigue el README.
Todavía no hemos leído la lista de herramientas de este servidor; revisamos los endpoints por turnos.
Revisamos información que cualquiera puede ver; no hemos leído el código. Las revisiones que no aplican no se cuentan. · Revisado el 6 nov 2026
El nombre en el registro se verificó con el dominio mailsocket.app (el registro comprueba quién es dueño del dominio)
Todavía no hemos leído este repo en GitHub
Todavía no hemos leído este repo en GitHub
Aún sin revisar; revisamos los endpoints por turnos
Aún sin revisar; revisamos los endpoints por turnos
Aún sin revisar; leemos la lista de herramientas cuando revisamos el endpoint
Comparado con todos los servidores activos de esta categoría en el registro. Las estrellas solo cuentan cuando quien lo publica es dueño del repo.
Superó 1 de 1 revisiones básicas aplicables. No hemos leído el código. Antes de agregar una clave o un token, revisa qué acceso pide el servidor y usa una clave que tenga solo los permisos que necesitas.
Debes completar: MAILSOCKET_API_KEY, Authorization
Funciona de las dos formas: instálalo en tu computadora o conéctate a la versión en la nube.
El repo de GitHub cambió por última vez –, y la última versión (0.4.2) llegó al registro hace 5 días.
Las apps compatibles con MCP, como Claude Desktop, Claude Code, Cursor y VS Code. Se conecta por URL, así que también funcionan las apps que aceptan servidores MCP remotos, como ChatGPT en modo desarrollador.
En la misma categoría: Spec Driven Development, Remote Desktop Commander, Dechonet MCP
Servidores de la misma categoría hechos por otros creadores, ordenados por estrellas.
Cómo leer una tarjeta:★ Estrellas de GitHubiTres pilares: reseñas · revisiones · usoiActualizado = fecha en que se publicó la última versión en el registroi
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
30 security tools for AI agents: phishing links, exposure maps, DNS, SSL, PQC, history, pivots.
Copiado tal cual del repo del creador. PopNx MCP no lo ha revisado ni lo respalda. Se quitaron HTML, imágenes y scripts. Los enlaces llevan fuera de este sitio.
An MCP server that exposes mailsocket to AI coding agents as native tools, so an agent can create a per-test inbox and block on the OTP or magic link without writing any polling code. For testing apps you own or are authorized to test. Not for creating accounts on services you don't control.
It wraps the Python SDK — no second HTTP client, no re-implemented polling.
| Tool | What the agent gets |
|---|---|
create_inbox(label?) | a fresh inbox id + address |
wait_for_otp(inbox_id, timeout?=60, min_confidence?=0, since?) | the headline — blocks (bounded: requested deadline clamped to 120s locally, 55s on the remote server) and returns the OTP string + confidence + subject/from/id/received_at. Default since omitted: only messages arriving after this call are matched. |
wait_for_link(inbox_id, timeout?=60, since?) | the extracted magic link (returned, *not* followed) + subject/from/id/received_at. Default since omitted: only messages arriving after this call are matched. |
list_inboxes(limit?, cursor?) | one page of inboxes owned by the key (server default page size 25) + next_cursor/has_more |
list_messages(inbox_id, has_otp?, subject_contains?, sender?, limit?, cursor?) | one page of messages, optionally filtered (server default page size 25) + next_cursor/has_more |
get_latest(inbox_id) | the newest message, without blocking |
send_test_code(inbox_id) | puts one sample OTP email straight into the inbox (no mail server) and returns its message_id + sent_at, so you can check the wait loop without real email. 5 per inbox / 20 per account per hour. |
delete_inbox(inbox_id) | remove an inbox when done |
Errors from the SDK (AuthError / NotFound / RateLimited / WaitTimeout) are turned into clean MCP tool errors — no stack traces, and the API key is never echoed back.
create_inbox needs no since — a fresh inbox only ever has new messages. By default, wait_for_otp/wait_for_link omit since entirely, so the server matches only messages arriving AFTER the call (the request start time). But if you reuse an existing inbox (e.g. to request a second OTP/link), pass since explicitly: otherwise a call with no since will correctly ignore anything already sitting in the inbox, which is right for most reuse, but if you actually WANT to catch a code that already arrived before you called the tool, pass either the time right before you triggered the new email (ISO8601 or unix seconds), or the id of the last message you saw (msg_..., meaning "only messages after that one") — both tools return id/received_at on the matched message so you can chain since= into the next call on that same inbox.
send_test_code does not go through the mail server, so the code is already in the inbox when the tool returns. Take a cutoff first: the id from get_latest (or since=0 if the inbox is empty), or the current time. Then call send_test_code(inbox_id), then wait_for_otp(inbox_id, since= ). Without since the wait only sees mail that arrives during the wait, so it would miss the test code.
POST /api/v1/agents/register.No install needed with uv:
uvx mailsocket-mcp
Or install with pip:
pip install mailsocket-mcp
mailsocket-mcp
Either way, it reads MAILSOCKET_API_KEY (and optional MAILSOCKET_BASE_URL) from the environment. If the key is missing it exits with a clear message and status 2; the key is never logged.
Add this to your client's MCP config file — claude_desktop_config.json for Claude Desktop, ~/.cursor/mcp.json for Cursor:
{
"mcpServers": { "mailsocket": { "command": "uvx", "args": ["mailsocket-mcp"], "env": { "MAILSOCKET_API_KEY": "ms_live_..." } } } }
claude mcp add mailsocket -e MAILSOCKET_API_KEY=ms_live_... -- uvx mailsocket-mcp
Any other MCP-compatible client works the same way: point it at the mailsocket-mcp executable (or uvx mailsocket-mcp) over stdio and pass the key through the environment.
The same tools are hosted at `https://mcp.mailsocket.app/mcp` over Streamable HTTP. Send your key on every request as a header: Authorization: Bearer ms_live_.... Never put the key in the URL; a ?api_key= request is rejected.
claude mcp add --transport http mailsocket https://mcp.mailsocket.app/mcp \
--header "Authorization: Bearer ms_live_..."
~/.cursor/mcp.json){
"mcpServers": { "mailsocket": { "url": "https://mcp.mailsocket.app/mcp", "headers": { "Authorization": "Bearer ms_live_..." } } } }
.vscode/mcp.json){
"servers": { "mailsocket": { "type": "http", "url": "https://mcp.mailsocket.app/mcp", "headers": { "Authorization": "Bearer ms_live_..." } } } }
Any client that can set a custom HTTP header works the same way (OpenAI Agents SDK, the n8n MCP Client node, your own code).
Things to know:
wait_for_otp / wait_for_link wait at most 55s per call, which keeps each response under proxy timeouts. On a timeout, call the tool again.mailsocket-mcp-http runs the same server (see mailsocket_mcp/remote.py for its env vars).| Variable | Required | Description |
|---|---|---|
MAILSOCKET_API_KEY | yes (secret) | Your mailsocket API key (ms_live_...). |
MAILSOCKET_BASE_URL | no | Override the API base URL. Defaults to https://dash.mailsocket.app/api/v1. |
pip install -e ".[dev]"
pytest
Tests make no external or live-API requests. The SDK client is faked, and the remote-transport tests talk to a local fake upstream on 127.0.0.1.
mailsocket>=0.3.1: wait_for_otp / wait_for_link called without since no longer miss a message that lands between the SDK's internal long-poll calls (each follow-up call sends the cutoff the server reported in Mailsocket-Wait-Since). No tool signature changes.send_test_code(inbox_id) tool (stdio and the hosted remote server, under the same per-key caps as the other non-wait tools): puts one sample OTP email into your own inbox without going through the mail server. Requires mailsocket>=0.3.0 (Client.send_test_code).mailsocket>=0.2.0): wait_for_otp / wait_for_link now omit since by default instead of forwarding 0 ("any message already in the inbox"). The old default could return a STALE OTP/link already sitting in a reused inbox; the new default matches only messages arriving after the call. Pass since=0 explicitly to keep the old behaviour. Hosted server (mcp.mailsocket.app, deployed from the repo, no new PyPI release): per-key concurrent waits raised 3 → 10 (= the Pro plan cap; the API still enforces each plan's own cap) and the shared wait pool 16 → 32, following the backend's raised wait capacity (global 64).wait_for_otp / wait_for_link accept an optional since (ISO8601, unix seconds or a message id) so a reused inbox returns the NEW code; results include the message id and received_at.mailsocket>=0.1.3 (stricter _seg id validation in the underlying Python SDK).