MCP Server Beta
Conectá un agente IA —Claude, Cursor, o el asistente que estés construyendo— directamente a tu operación logística. Toda la API REST se expone como 73 herramientas nativas que el agente descubre e invoca solo. Vos describís el resultado que querés; el agente lo ejecuta contra +Simple.
Por qué importa
El Model Context Protocol convirtió a los agentes IA en una nueva interfaz para operar software B2B: en vez de que cada cliente escriba una integración, el agente descubre lo que tu plataforma sabe hacer y lo ejecuta conversando. El MCP Server de +Simple lleva eso a la logística — sin SDKs, sin glue code, sin esperar a un equipo de ingeniería.
Integración sin código
El agente descubre las 73 tools solo, desde el contrato OpenAPI. No escribís SDK ni mapeás endpoints: conectás la key y ya opera.
Tu operación, en lenguaje natural
«Armá la ruta de mañana con los envíos pendientes de zona norte y asigná al chofer con más capacidad». El agente encadena las tools y lo resuelve.
Cero drift con la API
Las tools se generan del mismo contrato que la API REST. Si la API cambia, las tools se actualizan en la misma versión — nunca quedan desincronizadas.
Seguro por diseño
Least-privilege por default, datos aislados por empresa, rate limiting y audit log en cada llamada. Revocás o rotás la key en un click.
¿Qué es MCP?
Model Context Protocol es un estándar abierto para que las aplicaciones de IA descubran y usen herramientas externas. Cualquier cliente compatible (Claude Desktop, Claude en web, Cursor, Cline, etc.) puede conectarse a un servidor MCP y usar las tools que expone.
El servidor MCP de +Simple es un adaptador puro sobre nuestra API REST /v1: cada operación de la API se convierte automáticamente en una tool que el agente puede invocar. No hay lógica nueva ni un contrato aparte — es la misma API que documenta el API Reference, expuesta en el lenguaje de los agentes.
create_shipment con los datos correctos. +Simple valida, acepta la orden y la despacha.
Cómo funciona
Las 73 tools se generan a partir del mismo contrato OpenAPI que documenta la API REST. Esto garantiza cero drift: si la API cambia, las tools se actualizan en la misma versión del servidor, sin trabajo manual.
El flujo de una conversación es siempre el mismo:
| Paso | Qué pasa |
|---|---|
| 1. Descubrimiento | El cliente pide tools/list y recibe las 73 tools con sus schemas (nombre, descripción, parámetros). |
| 2. Decisión | El agente elige la tool según tu pedido en lenguaje natural y arma los argumentos. |
| 3. Ejecución | El cliente llama tools/call. El servidor traduce esa llamada a un request HTTP autenticado contra /v1. |
| 4. Respuesta | La API responde JSON; el servidor se lo devuelve al agente, que lo interpreta y te contesta. |
La autenticación, los scopes, el rate limiting y el audit log son exactamente los mismos que los de la API REST: el MCP no abre una puerta nueva, reusa la que ya existe.
Conectá en 2 minutos
La forma recomendada es el conector remoto: la API key viaja en la URL del conector y el servidor resuelve tu empresa y permisos por request. No hay que instalar nada.
Generá una API key de tipo MCP
En el dashboard, andá a Integraciones → Key Manager → Nueva key → Tipo: MCP. Elegí un preset de rol (por default arranca en Solo lectura, lo más seguro para un cliente LLM).
La key se ve UNA sola vez al crearla. Guardala en tu gestor de secretos. Formato: mss_test_* en sandbox, mss_live_* en producción.
read-only. Es revocable y rotable desde el dashboard en cualquier momento.
Agregá el conector remoto en tu cliente
En Claude: Configuración → Conectores → Agregar conector personalizado. Pegá la URL con tu key en el path:
https://api.massimple.la/mcp/k/<TU_API_KEY>
El cliente hace el handshake (initialize → tools/list) y carga las 73 tools. Sin API key en la URL, la conexión se rechaza con 401.
api.massimple.la. Escribinos para coordinar el acceso.
Probalo
Pedile algo al agente en lenguaje natural. Por ejemplo:
El agente va a llamar list_shipments y get_operations_summary, y te va a responder con los números reales de tu empresa. Si tu key tiene scopes de escritura, también puede crear envíos, armar rutas y asignar conductores. Mirá los ejemplos.
Alternativa: servidor local (stdio)
Para entornos de escritorio (Claude Desktop, Cursor) también podés correr el servidor localmente vía stdio, apuntándolo al entorno que quieras:
{
"mcpServers": {
"massimple": {
"command": "npx",
"args": ["@massimple/mcp-server"],
"env": {
"MASSIMPLE_API_KEY": "mss_test_...",
"MASSIMPLE_BASE_URL": "https://api.massimple.la/v1"
}
}
}
}
@massimple/mcp-server se distribuye bajo demanda durante la beta. Escribinos para obtenerlo; el conector remoto (arriba) no requiere instalación y es la vía recomendada.
Autenticación y entornos
La API key identifica a tu empresa y trae los scopes que definís al crearla. Cada tool call se ejecuta con esos permisos y queda acotada a tu empresa — un agente nunca ve datos de otra.
| Concepto | Valor |
|---|---|
| Endpoint MCP (GA) | https://api.massimple.la/mcp/k/<api_key> — el del beta se entrega al sumarte |
| Base URL de la API | https://api.massimple.la/v1 |
| Formato de key | mss_test_* (sandbox) · mss_live_* (producción) |
| Identidad | Empresa + scopes de la key. get_whoami confirma a quién apunta. |
| Transporte | JSON-RPC sobre HTTP (stateless). Métodos: initialize, tools/list, tools/call, ping. |
Sanity check inmediato: pedile al agente "¿a qué empresa apunta mi conexión?" y va a llamar get_whoami:
{
"application": {
"id": "...",
"name": "Mi asistente",
"env": "test",
"scopes": ["shipments:read", "routes:read", "analytics:read"]
},
"company_id": "..."
}
Ejemplos de uso
Cada ejemplo muestra el pedido en lenguaje natural, la tool call que arma el agente y la respuesta que devuelve +Simple.
Consultar métricas de la operación
El agente llama get_operations_summary (scope analytics:read). Devuelve una foto now más ventanas de 24h/7d/30d con su rango exacto — los mismos números que ves en el dashboard:
{
"as_of": "2026-07-12T14:30:00.000Z",
"sla_minutes": 240,
"now": {
"active_routes": 12,
"active_assignments": 9
},
"windows": {
"24h": {
"from": "2026-07-11T14:30:00.000Z",
"to": "2026-07-12T14:30:00.000Z",
"shipments_by_status": { "pending": 34, "in_route": 21, "delivered": 78 },
"shipments_with_activity": 133,
"sla_performance": 0.94,
"completion_rate": 0.97,
"avg_delivery_minutes": 186
}
},
"hint": "Para desglose por hora/ruta y export, usá el Dashboard."
}
Listar envíos por estado
El agente llama list_shipments con filtros (scope shipments:read). Además de status y date, soporta rangos created_from/created_to y updated_from/updated_to:
// tools/call → list_shipments
{
"status": "pending",
"created_from": "2026-07-06",
"created_to": "2026-07-12",
"limit": 50
}
Respuesta (listado paginado):
{
"data": [
{
"_id": "...",
"trackingNumber": "MS-2026-000123",
"status": "pending",
"destination": { "destinyName": "Juan Pérez", "address": "Av. Corrientes 1234, CABA" },
"createdAt": "2026-07-10T11:02:00.000Z"
}
],
"pagination": { "total": 34, "limit": 50, "offset": 0 }
}
Crear un envío
Con scope shipments:write, el agente llama create_shipment:
// tools/call → create_shipment
{
"originDistributionCenter": "<ID-DC>",
"destination": {
"destinyName": "Juan Pérez",
"address": "Av. Corrientes 1234, CABA",
"latitude": -34.6037,
"longitude": -58.3816,
"contactPhone": "+5491155557777"
},
"content": "Caja con dos productos",
"amountToCollect": 0,
"scheduledDate": "2026-07-13",
"status": "pending"
}
Respuesta 201 con el envío creado, incluyendo _id y trackingNumber autogenerado. El agente te confirma el número de seguimiento.
Flujo completo de distribución
Con un rol de Operador de distribución, un agente puede encadenar tools en una sola conversación: list_available_shipments → create_route → optimize_route → create_assignment (conductor + vehículo). Vos describís el objetivo; el agente resuelve el orden.
Catálogo de tools
73 tools, una por cada operación de la API. Los nombres son el operationId en snake_case. Para el detalle de parámetros y respuestas de cada una, mirá el API Reference (mismo contrato).
Envíos · 15
| Tool | Método | Qué hace |
|---|---|---|
create_shipment | POST | Crear un envío |
list_shipments | GET | Listar envíos |
list_available_shipments | GET | Listar envíos disponibles para rutear |
bulk_create_shipments | POST | Crear envíos en lote |
bulk_delete_shipments | POST | Eliminar envíos en lote |
get_shipment_by_external_id | GET | Obtener envío por external_id |
update_shipment_by_external_id | PATCH | Actualizar envío por external_id |
delete_shipment_by_external_id | DELETE | Eliminar envío por external_id |
cancel_shipment_by_external_id | POST | Cancelar envío por external_id |
recreate_shipment_by_external_id | POST | Recrear envío por external_id |
recreate_shipment | POST | Recrear envío |
cancel_shipment | POST | Cancelar envío |
get_shipment | GET | Obtener un envío |
update_shipment | PATCH | Actualizar un envío |
delete_shipment | DELETE | Eliminar un envío |
Rutas · 16
| Tool | Método | Qué hace |
|---|---|---|
create_route | POST | Crear ruta |
list_routes | GET | Listar rutas |
get_route_by_external_id | GET | Obtener ruta por external_id |
update_route_by_external_id | PATCH | Actualizar ruta por external_id |
delete_route_by_external_id | DELETE | Eliminar ruta por external_id |
optimize_route_by_external_id | POST | Optimizar ruta por external_id |
unassign_route_by_external_id | POST | Desasignar ruta por external_id |
get_route_stops_by_external_id | GET | Listar paradas de ruta por external_id |
update_route_stops_sequence_by_external_id | PATCH | Reordenar paradas por external_id |
get_route | GET | Obtener ruta |
update_route | PATCH | Actualizar ruta |
delete_route | DELETE | Eliminar ruta |
optimize_route | POST | Optimizar ruta |
unassign_route | POST | Desasignar ruta |
get_route_stops | GET | Listar paradas de ruta |
update_route_stops_sequence | PATCH | Reordenar paradas |
Vehículos · 9
| Tool | Método | Qué hace |
|---|---|---|
create_vehicle | POST | Crear un vehículo |
list_vehicles | GET | Listar vehículos |
bulk_create_vehicles | POST | Crear vehículos en lote |
get_vehicle_by_external_id | GET | Obtener vehículo por external_id |
update_vehicle_by_external_id | PATCH | Actualizar vehículo por external_id |
delete_vehicle_by_external_id | DELETE | Eliminar vehículo por external_id |
get_vehicle | GET | Obtener un vehículo |
update_vehicle | PATCH | Actualizar un vehículo |
delete_vehicle | DELETE | Eliminar un vehículo |
Conductores · 11
| Tool | Método | Qué hace |
|---|---|---|
create_driver | POST | Crear un conductor |
list_drivers | GET | Listar conductores |
bulk_create_drivers | POST | Crear conductores en lote |
get_driver_by_external_id | GET | Obtener conductor por external_id |
update_driver_by_external_id | PATCH | Actualizar conductor por external_id |
delete_driver_by_external_id | DELETE | Eliminar conductor por external_id |
change_driver_password | POST | Cambiar contraseña de un conductor |
change_driver_password_by_external_id | POST | Cambiar contraseña por external_id |
get_driver | GET | Obtener un conductor |
update_driver | PATCH | Actualizar un conductor |
delete_driver | DELETE | Eliminar un conductor |
Asignaciones · 10
| Tool | Método | Qué hace |
|---|---|---|
create_assignment | POST | Crear una asignación |
list_assignments | GET | Listar asignaciones |
get_assignment_by_external_id | GET | Obtener asignación por external_id |
update_assignment_by_external_id | PATCH | Actualizar asignación por external_id |
delete_assignment_by_external_id | DELETE | Eliminar asignación por external_id |
unassign_assignment_by_external_id | POST | Desasignar por external_id |
get_assignment | GET | Obtener una asignación |
update_assignment | PATCH | Actualizar una asignación |
delete_assignment | DELETE | Eliminar una asignación |
unassign_assignment | POST | Desasignar conductor de vehículo |
Webhooks · 7
| Tool | Método | Qué hace |
|---|---|---|
create_webhook | POST | Registrar un webhook |
list_webhooks | GET | Listar webhooks |
get_webhook | GET | Obtener un webhook |
delete_webhook | DELETE | Eliminar un webhook |
pause_webhook | POST | Pausar un webhook |
resume_webhook | POST | Reanudar un webhook pausado |
rotate_webhook_secret | POST | Rotar el secret del webhook |
Eventos, métricas y sistema · 5
| Tool | Método | Qué hace |
|---|---|---|
list_events | GET | Listar eventos de la empresa |
get_operations_summary | GET | Resumen operativo (multi-ventana) |
get_health | GET | Verificar salud de la API |
get_openapi_spec | GET | Especificación OpenAPI (JSON) |
get_whoami | GET | Identificar la aplicación que llama |
Roles y scopes
Una key MCP lleva un bundle de scopes que define qué puede hacer el agente. Al crearla en el dashboard elegís un preset de rol; podés ajustar los scopes finos después. Las keys MCP arrancan en Solo lectura por default.
| Preset | Qué puede hacer | Scopes |
|---|---|---|
| Solo lectura / Analista recomendado MCP |
Lee todo (envíos, rutas, flota, eventos) y métricas. No modifica nada. | *:read + analytics:read |
| Operador de pickup | Consulta acotada de envíos y rutas + métricas. Sin escritura. | shipments:read, routes:read, analytics:read |
| Operador de distribución | Opera la distribución: crea/actualiza envíos, arma y optimiza rutas, asigna conductor+vehículo. Lee todo. No elimina ni gestiona webhooks. | lectura + shipments:write, routes:write, routes:optimize, assignments:write |
| Admin de empresa | Acceso total: leer, operar, eliminar y gestionar webhooks/contraseñas. | todos los scopes |
Formato de respuestas
El servidor devuelve datos, no prosa: el JSON crudo de la API, para que el agente lo interprete con precisión. Algunos principios de diseño:
| Principio | Qué significa |
|---|---|
| Foto vs. ventana | get_operations_summary separa el estado actual (now) de las métricas por ventana temporal (windows), cada una con su rango from/to. |
| Fechas siempre explícitas | Toda ventana ecoa su rango exacto, para que el agente no tenga que inferir "las últimas 24h". |
| Coherencia con el dashboard | Las métricas reusan la misma lógica que el dashboard corporativo: los números cierran. |
| Listados paginados | Los list_* devuelven data + pagination (total, limit, offset). |
Seguridad
- Least-privilege por default. Las keys MCP arrancan read-only; los scopes de escritura son opt-in explícito.
- Aislamiento por empresa. Cada tool call queda acotado al
company_idde la key. Un agente nunca ve datos de otra empresa. - Rate limiting. Límite de requests por minuto por key, con
Retry-Afteral excederlo. - Audit log. Cada request queda registrado (empresa, tipo de key, endpoint, status) para trazabilidad.
- Revocable y rotable. Podés desactivar o rotar cualquier key desde el dashboard en cualquier momento.
- TLS end-to-end. La key viaja en la URL del conector sobre HTTPS; tratala como un secreto.
Límites actuales
El MCP está en beta por invitación. Para ser transparentes sobre lo que todavía no hace:
- Sin OAuth / identidad de usuario. La key identifica a la empresa, no a la persona. El "rol" es el bundle de scopes de la key, no el rol real de un usuario logueado. El login por usuario (SSO nativo en Claude) llega en una fase posterior.
- Solo modo path en el conector. La forma soportada es
/mcp/k/<key>en la URL. Los modos header (Authorization: Bearer) y query (?k=) no están disponibles en el dominio actual. - Sin streaming server→cliente (SSE). El transporte es JSON-RPC stateless: una request, una respuesta. No hay notificaciones push desde el servidor.
- Sin data-scoping por centro. Los presets dan lectura a nivel empresa; acotar a un centro de distribución específico llega con la fase de OAuth.
- Entorno. En beta por invitación; el acceso general (GA) llega después. Escribinos para sumarte.
Recursos
- API Reference — el contrato completo del que se generan las tools.
- Guía ultra simple — integración directa con la API REST en 5 pasos.
- Contactanos — para acceso a la beta, el paquete local o coordinar producción.