Skip to main content
Glama
sudzikcoin

PingPoint Freight MCP Server

by sudzikcoin

PingPoint — servidor MCP y SDK de seguimiento de carga

Seguimiento de carga en tiempo real y visibilidad de envíos para software logístico y agentes de IA: un servidor MCP y un SDK de TypeScript que proporcionan a cualquier agente la posición GPS en vivo del conductor para un envío de carga completa en el transporte por carretera de EE. UU. — crea una carga a través de la API, el conductor se conecta desde un enlace SMS en aproximadamente un minuto, y a partir de entonces la posición, la hora estimada de llegada (ETA), el cronograma de paradas y las estadísticas posteriores al viaje están a una sola llamada de distancia. Sin integración con proveedores de ELD, sin contrato corporativo, sin llamada de ventas.

Paquete

npm

Qué es

@suverselabs/pingpoint-mcp

npm i @suverselabs/pingpoint-mcp

Servidor MCP — 7 herramientas sobre stdio, para Claude y cualquier agente compatible con MCP

@suverselabs/pingpoint-sdk

npm i @suverselabs/pingpoint-sdk

Cliente API tipado — cero dependencias, errores tipados, reintentos idempotentes

Documentación completa de la API: https://pingpoint.suverse.io/docs · Especificación OpenAPI 3.1: /docs/openapi.json

El problema

La mayoría de los transportistas en el transporte por carretera de EE. UU. son empresas de uno o dos camiones. No tienen una plataforma telemática corporativa, ni contrato de visibilidad, ni departamento de TI: el camión es la empresa. Cuando un bróker necesita saber dónde está una carga, el único instrumento fiable es una llamada telefónica al conductor.

Por eso, el «seguimiento y localización con IA» de la mayoría de los proveedores actuales significa un robot que llama a un humano y pregunta. Los datos de posición en sí nunca se vuelven legibles por máquina: viven en la cabeza de un conductor, una llamada a la vez. PingPoint hace que la propia posición esté disponible a través de una API: el conductor instala una aplicación desde un enlace SMS y, desde ese momento, cualquier software —o cualquier agente de IA a través de MCP— lee el GPS en vivo en lugar de pedirle a alguien que marque un número.

Related MCP server: ThinAir Geo

Cómo funciona

1. Una carga se crea a través de la API

POST /v1/agent/loads con el teléfono del conductor y las paradas. Obligatorios: driverPhone (E.164 — el enlace del conductor se envía por SMS a este número) y los arrays pickups / deliveries; cada parada necesita address, city, state, zip. Se admiten cargas de múltiples paradas: varias recogidas y varias entregas, en el orden del array.

La respuesta incluye el loadNumber (utilizado en todas las llamadas posteriores), un trackingLink público para el cliente y los enlaces web/aplicación del conductor. Dos redes de seguridad contra la doble facturación:

  • customerRef actúa también como clave de deduplicación: reenviar la misma referencia devuelve la carga existente (deduplicated: true) en lugar de crear un duplicado;

  • una cabecera Idempotency-Key hace que los reintentos tras un fallo de red sean seguros: el saldo se debita y la carga se crea como máximo una vez.

2. El conductor se conecta desde un enlace SMS

PingPoint envía automáticamente un enlace al conductor por SMS. El enlace abre la incorporación: instala la aplicación, acepta el consentimiento, listo: aproximadamente un minuto del tiempo del conductor, una sola vez. Internamente, el enlace lleva un token de carga de un solo uso que la aplicación intercambia por un token de dispositivo persistente, de modo que la siguiente carga al mismo número de teléfono se vincula sin ninguna configuración nueva.

3. La posición llega a través de dos canales independientes

  • El teléfono del conductor — geolocalización en segundo plano desde la aplicación.

  • Un dongle ELD en el puerto de diagnóstico del camión — transmite datos del vehículo por Bluetooth a la aplicación, que los retransmite. Probado con hardware IOSiX y Pacific Track PT30. El dongle emite tramas a 1 Hz; la aplicación las reduce antes de la subida para que la pista almacenada siga siendo lo bastante densa para la geocerca sin saturar el canal.

El teléfono sigue siendo la puerta de enlace para ambos canales: el dongle habla con la aplicación, no con la red. La idea de tener dos fuentes es que fallan de forma distinta: el dongle sigue proporcionando posiciones mientras el motor esté en marcha, incluso cuando el GPS del teléfono no puede obtener una señal o el sistema operativo ha limitado la geolocalización en segundo plano. Las tramas del dongle también llevan sus propias marcas de tiempo, tomadas de la propia trama en lugar del momento de la subida, de modo que cuando se vacía un backlog almacenado tras un periodo sin conexión, los tiempos registrados son los reales.

4. Los estados avanzan mediante geocercas, nunca desde un teclado

Cada parada de recogida y entrega tiene una geocerca. Entrar en la zona de recogida mueve la carga a AT_PICKUP, salir de ella la mueve a IN_TRANSIT, entrar en la zona de entrega a AT_DELIVERY — y DELIVERED se establece cuando el camión sale de la zona de entrega final, no cuando llega. El único atajo es la llamada explícita (gratuita) delivery-confirm (con el BOL en mano), que completa la carga una vez que el camión está en su parada de entrega. Las marcas de tiempo arrivedAt / departedAt de las paradas provienen de los mismos eventos de geocerca.

Las escrituras externas de estado están cerradas a propósito: PATCH …/status siempre responde 410 STATUS_DOOR_CLOSED. Esto es una garantía de integridad de datos, no una función ausente: un estado que lees nunca fue establecido manualmente por nadie; hay posición registrada detrás de él.

5. Leer los datos

GET /v1/agent/loads/{loadNumber} devuelve el estado en vivo: estado, la pista GPS (hasta los 500 puntos más recientes), el cronograma de paradas con marcas de tiempo de llegada/salida, distancia recorrida, tiempos de permanencia, indicador de puntualidad y un bloque ETA calculado a partir de la geometría de ruta almacenada y la posición más reciente. Después del viaje, GET …/trip-stats devuelve un resumen agregado calculado sobre cada ping registrado. Los webhooks pueden enviar eventos de carga a tu endpoint a medida que ocurren (consulta la documentación).

 SMS link          +---------------------+
 (sent by  ------> |  Driver phone app   |--- background GPS ---+
  PingPoint)       +---------------------+                      |
                                                                v
                   +---------------------+   1 Hz frames   +--------------------+
                   |  ELD dongle on the  |---------------->| ingest (thinning)  |
                   |  diagnostic port,   |   via the app   +--------------------+
                   |  BLE (IOSiX, PT30)  |                      |
                   +---------------------+                      v
                                                       +-----------------+
                                                       |  position store |
                                                       +-----------------+
                                                            |        |
                                     geofence engine <------+        |
                                            |                        |
        PLANNED -> AT_PICKUP -> IN_TRANSIT -> AT_DELIVERY -> DELIVERED
                                            |                        |
                                            v                        v
                  webhooks -> your endpoint      GET /v1/agent/loads/{n}   (position, ETA)
                                                 GET .../trip-stats        (post-trip summary)

Inicio rápido

Obtener una clave

  1. Regístrate en pingpoint.suverse.io (correo electrónico o Google/GitHub).

  2. En el panel, abre Integraciones → Agent API y pulsa Emitir clave.

  3. La clave sup_agent_… llega por correo electrónico. PingPoint nunca almacena el secreto: si se pierde, emite una nueva desde la misma página.

Primera llamada

curl -X POST https://api.suverse.io/v1/agent/loads \
  -H "Authorization: Bearer sup_agent_…" \
  -H "Content-Type: application/json" \
  -d '{
    "driverPhone": "+15551234567",
    "pickups":    [{ "address": "6492 Tower Lane", "city": "Claremore", "state": "OK", "zip": "74017" }],
    "deliveries": [{ "address": "6499 Caldwell Park Dr", "city": "Charlotte", "state": "NC", "zip": "28269" }],
    "customerRef": "PO-483920"
  }'
{
  "success": true,
  "loadId": "3b9f6a2e-1c47-4d8a-9e02-7f5b1c8d4a63",
  "loadNumber": "LD-2026-042317",
  "trackingLink": "https://pingpoint.suverse.io/track/trk_…",
  "driverWebLink": "https://pingpoint.suverse.io/driver/drv_…",
  "driverAppLink": "pingpoint://driver/drv_…",
  "driverResolution": "none"
}

El enlace del conductor ya está de camino a +15551234567 por SMS. Desde aquí, GET /v1/agent/loads/LD-2026-042317 lee la posición en vivo.

Conectar el servidor MCP

Claude Code, una línea:

claude mcp add pingpoint --env PINGPOINT_AGENT_KEY=sup_agent_… -- npx -y @suverselabs/pingpoint-mcp

Claude Desktop (claude_desktop_config.json) o cualquier agente compatible con MCP:

{
  "mcpServers": {
    "pingpoint": {
      "command": "npx",
      "args": ["-y", "@suverselabs/pingpoint-mcp"],
      "env": {
        "PINGPOINT_AGENT_KEY": "sup_agent_…"
      }
    }
  }
}

Reinicia el agente y las herramientas aparecerán.

Herramientas MCP

Referencia detallada por herramienta con ejemplos completos de solicitud/respuesta: docs/tools/.

Tool

Qué hace

Parámetros

Devuelve

Precio

create_load

Crea una carga de mercancías; PingPoint envía el enlace del conductor por SMS a driverPhone

driverPhone, pickups[], deliveries[] (obligatorios); shipperName, carrierName, equipmentType, customerRef, rate, miles, weight, truckNumber, idempotencyKey (opcional)

loadNumber, trackingLink público, enlaces web/aplicación del conductor, driverResolution, indicador de deduplicación

$0.65

get_load_position

Estado en vivo de una carga

loadNumber

estado, pista GPS (últimos 500 puntos), paradas con marcas de tiempo de llegada/salida, distancia, indicador de puntualidad, tiempos de permanencia, bloque ETA

$0.02

get_trip_stats

Resumen agregado de todo el viaje GPS (pensado para una carga DELIVERED; a mitad de viaje devuelve el trayecto hasta el momento)

loadNumber

stats: distancia, duración, velocidad media/máxima, conteos de aceleración/frenada brusca, proporciones ciudad/carretera/aparcado/noche, cobertura GPS, primer/último ping

$0.02

update_load_status

Cerrado a propósito — los estados se verifican por GPS

loadNumber, status

siempre HTTP 410 STATUS_DOOR_CLOSED

gratis

confirm_delivery

BOL recibido → la carga en su parada de entrega cambia a DELIVERED (idempotente)

loadNumber, bolReceivedAt (opcional, ISO 8601)

{ ok, oldStatus, newStatus: "DELIVERED" }

gratis

get_pricing

Lista de precios actual en USD

{ currency, prices }

gratis

get_balance

Saldo prepagado

{ currency, balanceUsd }

gratis

Las descripciones de las herramientas están escritas para el modelo que las invoca: cada una indica cuánto cuesta, cuándo usarla y cuándo no (p. ej., get_load_position responde «dónde está el camión ahora», get_trip_stats responde «cómo fue el viaje terminado», y ambas advierten contra el sondeo en bucle porque cada llamada se factura).

SDK

npm install @suverselabs/pingpoint-sdk
import { PingPointAgent, InsufficientFundsError, DeliveryNotReadyError } from "@suverselabs/pingpoint-sdk";

const pp = new PingPointAgent({ apiKey: process.env.PINGPOINT_AGENT_KEY! });

// $0.65 — driver gets the app link by SMS
const load = await pp.createLoad(
  {
    driverPhone: "+15551234567",
    pickups: [{ address: "6492 Tower Lane", city: "Claremore", state: "OK", zip: "74017" }],
    deliveries: [{ address: "6499 Caldwell Park Dr", city: "Charlotte", state: "NC", zip: "28269" }],
    customerRef: "PO-483920",
  },
  { idempotencyKey: "PO-483920" },
);

const pos = await pp.getPosition(load.loadNumber);   // $0.02
const trip = await pp.getTripStats(load.loadNumber); // $0.02, best after DELIVERED
await pp.confirmDelivery(load.loadNumber, { bolReceivedAt: new Date() }); // free

Métodos: createLoad(input, { idempotencyKey? }), getPosition(loadNumber), getTripStats(loadNumber), updateStatus(loadNumber, status) (documentado para lanzar el 410 intencional), confirmDelivery(loadNumber, { bolReceivedAt? }), getPricing(), getBalance(). Referencia completa: docs/sdk.md.

Toda respuesta que no sea 2xx lanza una subclase tipada de PingPointAgentError que lleva .status y el .body sin procesar:

try {
  await pp.createLoad(input);
} catch (err) {
  if (err instanceof InsufficientFundsError) {
    console.log(`balance $${err.balanceUsd}, need $${err.priceUsd} — nothing was charged`);
  } else if (err instanceof DeliveryNotReadyError) {
    // driver hasn't arrived yet — do NOT retry; the load completes automatically when the truck departs the delivery zone
  }
}

Node ≥ 18 (usa fetch global), ESM + CJS, cero dependencias en tiempo de ejecución.

Modelo de datos

Posición (get_load_position / getPosition)

Campo

Unidad / formato

Significado

status

enumerado

PLANNED, AT_PICKUP, IN_TRANSIT, AT_DELIVERY, DELIVERED, CANCELLED — se actualiza automáticamente a partir de eventos de GPS y geocercas

gpsTrack[]

Hasta los 500 puntos más recientes, los más antiguos primero

gpsTrack[].lat / lng

grados

Fijación de posición

gpsTrack[].speed

mph, 1 decimal

Velocidad sobre el terreno; null cuando la fijación no la incluye

gpsTrack[].heading

grados 0–359, 0 = norte

null cuando se desconoce

gpsTrack[].ts

ISO 8601 UTC

Marca de tiempo de la fijación

distanceMiles

millas

Haversine sobre el recorrido completo (no solo los 500 puntos devueltos); null hasta que haya ≥ 2 fijaciones

stops[].arrivedAt / departedAt

ISO 8601 UTC

Se establecen mediante la llegada/salida de la geocerca

stops[].windowFrom / windowTo

ISO 8601 UTC

Ventanas planificadas, null cuando no están definidas

onTime

booleano

Entregado dentro de la ventana de entrega (15 min de margen); null hasta que se entregue o sin ventana

delayMinutes, pickupDwellMinutes, deliveryDwellMinutes

minutos

null cuando aún no se conocen

pingCount

recuento

Total de pings registrados para la carga

eta

objeto

Próxima parada, distancia hasta ella (mi), tiempo de conducción (h), indicador de movimiento, ventana ETA; a prueba de fallos — se degrada a un objeto solo con el motivo cuando no hay datos suficientes

Estadísticas del viaje (get_trip_stats / getTripStats)

Campo

Unidad

Significado

dataPoints

recuento

Pings de GPS registrados para la carga

durationSeconds

s

lastAt − firstAt

estimatedDistanceMiles

millas

Haversine sobre el recorrido completo registrado

avgSpeedMph

mph

Sobre todo el intervalo, paradas incluidas

maxSpeedMph

mph

Velocidad máxima registrada sobre el terreno

hardAccelCount

recuento

Aumento de velocidad > +15 mph/min mientras se circula a > 20 mph

hardBrakeCount

recuento

Caída de velocidad < −20 mph/min mientras se circula a > 20 mph

cityMilesPct

% 0–100

Proporción de millas a 5–45 mph

highwayMilesPct

% 0–100

Proporción de millas a más de 45 mph

parkedTimePct

% 0–100

Proporción de pings a ≤ 5 mph

nightPct

% 0–100

Proporción de pings entre las 23:00–07:00 UTC

coveragePct

% ≤ 100

Pings frente a la expectativa de uno por minuto en el intervalo

firstAt / lastAt

ISO 8601 UTC

Primer/último ping registrado; null cuando no hay pings

Códigos de error

Código

Significado

400 MISSING_FIELDS

Faltan campos obligatorios — el cuerpo los enumera en fields[] (rutas con puntos, p. ej. pickups.0.zip). También 400 INVALID_DRIVER_PHONE cuando el teléfono no es E.164.

401

Falta la clave o no es válida.

402 INSUFFICIENT_FUNDS

El saldo prepagado no cubre la operación. No se cobró nada y no se creó nada. El cuerpo incluye balanceUsd, priceUsd, billingUrl.

403

La carga pertenece a otra cuenta.

404

No existe tal carga.

410 STATUS_DOOR_CLOSED

Respuesta a cualquier escritura de estado externa. No es una incidencia — es por diseño. No reintentar.

`422

A
license - permissive license
Not graded
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides shipment tracking api and logistics management capabilities through the TrackMage API. Enables creation and monitoring of shipments and orders, carrier detection, tracking checkpoint retrieval, and comprehensive logistics workflow automation.
    2
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Quote, book, and track real LTL, FTL, cargo van, and box-truck freight through the Warp network - 20 tools, in-chat login, Stripe-charged bookings, and real carrier dispatch. Quoting is keyless; booking needs a free Warp account with a card on file.
    20
    395
    3
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to manage global shipping operations, including rate comparison, shipment creation, label purchasing, tracking, pickup scheduling, address validation, billing, and analytics, via natural language.
    30
    MIT

View all related MCP servers

Related MCP Connectors

  • Quote, book, and track LTL, FTL, cargo van, and box-truck freight via the Warp API.

  • Multi-carrier shipping for AI agents: compare rates, buy labels, track packages, validate addresses

  • Neutral freight reference + validation layer for AI agents: ADR, HS, UN/LOCODE, freight math

View all MCP Connectors

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/sudzikcoin/pingpoint-freight-mcp'

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