Skip to main content
Glama
sudzikcoin

PingPoint Freight MCP Server

by sudzikcoin

PingPoint — MCP-сервер и SDK для отслеживания грузоперевозок

Отслеживание грузоперевозок в реальном времени и видимость загрузки для логистического ПО и ИИ-агентов: MCP-сервер и TypeScript SDK, которые дают любому агенту живую GPS-позицию водителя для грузовой перевозки в США — создайте груз через API, водитель подключается по SMS-ссылке примерно за минуту, и с этого момента позиция, ETA, таймлайн остановок и статистика после поездки — в одном вызове. Никакой интеграции с ELD-провайдером, никакого корпоративного контракта, никаких звонков продавцов.

Пакет

npm

Что это

@suverselabs/pingpoint-mcp

npm i @suverselabs/pingpoint-mcp

MCP-сервер — 7 инструментов через stdio, для Claude и любого агента, поддерживающего MCP

@suverselabs/pingpoint-sdk

npm i @suverselabs/pingpoint-sdk

Типизированный API-клиент — ноль зависимостей, типизированные ошибки, идемпотентные повторы

Полная документация API: https://pingpoint.suverse.io/docs · Спецификация OpenAPI 3.1: /docs/openapi.json

Проблема

Большинство перевозчиков в грузоперевозках США — это компании с одним или двумя грузовиками. У них нет корпоративного телематического стека, контракта на видимость и ИТ-отдела — грузовик и есть компания. Когда брокеру нужно узнать, где находится груз, единственный надёжный инструмент — телефонный звонок водителю.

Именно поэтому «AI track & trace» от большинства вендоров сегодня означает робота, который звонит человеку и спрашивает. Сами данные о позиции никогда не становятся машиночитаемыми — они живут в голове одного водителя, по одному звонку за раз. PingPoint делает саму позицию доступной через API: водитель устанавливает одно приложение по SMS-ссылке, и с этого момента любое ПО — или любой ИИ-агент через MCP — читает живую GPS-позицию, а не просит кого-то набрать номер.

Related MCP server: ThinAir Geo

Как это работает

1. Груз создается через API

POST /v1/agent/loads с телефоном водителя и остановками. Обязательные: driverPhone (E.164 — ссылка для водителя отправляется по SMS на этот номер) и массивы pickups / deliveries; каждая остановка требует address, city, state, zip. Поддерживаются многоостановочные грузы — несколько заборов и несколько доставок, в порядке массивов.

Ответ содержит loadNumber (используется во всех последующих вызовах), публичную trackingLink для клиента и ссылки для водителя (web/app). Две страховки от двойного списания:

  • customerRef также служит ключом дедупликации — повторная отправка того же reference возвращает существующий груз (deduplicated: true) вместо создания дубликата;

  • заголовок Idempotency-Key делает повторные попытки после сетевого сбоя безопасными — баланс списывается и груз создаётся не более одного раза.

2. Водитель подключается по SMS-ссылке

PingPoint автоматически отправляет водителю ссылку по SMS. Ссылка открывает онбординг: установите приложение, пройдите согласие, готово — примерно минута времени водителя, один раз. Под капотом ссылка содержит одноразовый токен загрузки, который приложение обменивает на постоянный токен устройства, так что следующий груз на тот же номер телефона привязывается без какой-либо новой настройки.

3. Позиция поступает по двум независимым каналам

  • Телефон водителя — фоновая геолокация из приложения.

  • ELD-донгл на диагностическом порту грузовика — передаёт данные автомобиля по Bluetooth в приложение, которое их ретранслирует. Протестировано с оборудованием IOSiX и Pacific Track PT30. Донгл излучает кадры с частотой 1 Гц; приложение прореживает их перед загрузкой, чтобы сохранённый трек оставался достаточно плотным для геозон, не перегружая конвейер.

Телефон остаётся шлюзом для обоих каналов — донгл общается с приложением, а не с сетью. Смысл двух источников в том, что они отказывают по-разному: донгл продолжает передавать позиции, пока работает двигатель, даже если GPS телефона не может получить сигнал или ОС ограничила фоновую геолокацию. Кадры донгла также несут собственные временные метки, взятые из самого кадра, а не из момента загрузки — поэтому когда буферизованный бэклог сбрасывается после офлайн-периода, записанные времена являются реальными.

4. Статусы обновляются по геозонам — никогда с клавиатуры

Каждая остановка забора и доставки получает геозону. Вход в зону забора переводит груз в AT_PICKUP, выход — в IN_TRANSIT, вход в зону доставки — в AT_DELIVERY, а DELIVERED устанавливается, когда грузовик покидает финальную зону доставки, а не по прибытии. Единственное исключение — явный (бесплатный) вызов delivery-confirm (BOL на руках), который завершает груз, когда грузовик находится на остановке доставки. Временные метки остановок arrivedAt / departedAt берутся из тех же событий геозон.

Внешние записи статуса намеренно закрыты: PATCH …/status всегда отвечает 410 STATUS_DOOR_CLOSED. Это гарантия целостности данных, а не отсутствующая функция — статус, который вы читаете, никогда не был установлен вручную; за ним стоит записанная позиция.

5. Чтение данных

GET /v1/agent/loads/{loadNumber} возвращает живое состояние: статус, GPS-трек (до 500 последних точек), таймлайн остановок с временными метками прибытия/отправления, пройденное расстояние, время простоя, флаг своевременности и блок ETA, вычисленный на основе сохранённой геометрии маршрута и последней позиции. После поездки GET …/trip-stats возвращает агрегированную сводку, вычисленную по каждому записанному пингу. Вебхуки могут отправлять события груза на ваш эндпоинт по мере их возникновения (см. документацию).

 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)

Быстрый старт

Получить ключ

  1. Зарегистрируйтесь на pingpoint.suverse.io (e-mail или Google/GitHub).

  2. В кабинете откройте Integrations → Agent API и нажмите Issue key.

  3. Ключ sup_agent_… приходит по e-mail. PingPoint никогда не хранит секрет — если он потерян, выпустите новый с той же страницы.

Первый вызов

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"
}

Ссылка для водителя уже отправлена на +15551234567 по SMS. Отсюда GET /v1/agent/loads/LD-2026-042317 читает живую позицию.

Подключение MCP-сервера

Claude Code, одна строка:

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

Claude Desktop (claude_desktop_config.json) или любой агент, поддерживающий MCP:

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

Перезапустите агента — инструменты появятся.

MCP-инструменты

Подробный справочник по каждому инструменту с полными примерами запросов/ответов: docs/tools/.

Инструмент

Что делает

Параметры

Возвращает

Цена

create_load

Создаёт груз; PingPoint отправляет водителю ссылку на driverPhone

driverPhone, pickups[], deliveries[] (обязательные); shipperName, carrierName, equipmentType, customerRef, rate, miles, weight, truckNumber, idempotencyKey (необязательные)

loadNumber, публичная trackingLink, ссылки для водителя (web/app), driverResolution, флаг дедупликации

$0.65

get_load_position

Живое состояние груза

loadNumber

статус, GPS-трек (последние 500 точек), остановки с временными метками прибытия/отправления, расстояние, флаг своевременности, время простоя, блок ETA

$0.02

get_trip_stats

Агрегированная сводка всей GPS-поездки (предназначена для груза со статусом DELIVERED; в середине поездки возвращает поездку на текущий момент)

loadNumber

stats: расстояние, длительность, средняя/макс. скорость, количество резких ускорений/торможений, доли город/трасса/стоянка/ночь, GPS-покрытие, первый/последний пинг

$0.02

update_load_status

Намеренно закрыт — статусы проверяются по GPS

loadNumber, status

всегда HTTP 410 STATUS_DOOR_CLOSED

бесплатно

confirm_delivery

BOL получен → груз на остановке доставки переходит в DELIVERED (идемпотентно)

loadNumber, bolReceivedAt (необязательно, ISO 8601)

{ ok, oldStatus, newStatus: "DELIVERED" }

бесплатно

get_pricing

Текущий прайс-лист в USD

{ currency, prices }

бесплатно

get_balance

Предоплаченный баланс

{ currency, balanceUsd }

бесплатно

Описания инструментов написаны для вызывающей модели: каждый указывает, сколько он стоит, когда его использовать, а когда нет (например, get_load_position отвечает на вопрос «где грузовик сейчас», get_trip_stats — «как прошла завершённая поездка», и оба предупреждают о цикличном опросе, потому что каждый вызов тарифицируется).

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

Методы: createLoad(input, { idempotencyKey? }), getPosition(loadNumber), getTripStats(loadNumber), updateStatus(loadNumber, status) (документирован как выбрасывающий намеренный 410), confirmDelivery(loadNumber, { bolReceivedAt? }), getPricing(), getBalance(). Полный справочник: docs/sdk.md.

Каждый ответ не-2xx выбрасывает типизированный подкласс PingPointAgentError с .status и сырым .body:

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 (использует глобальный fetch), ESM + CJS, ноль зависимостей времени выполнения.

Модель данных

Позиция (get_load_position / getPosition)

Поле

Единица / формат

Значение

status

перечисление

PLANNED, AT_PICKUP, IN_TRANSIT, AT_DELIVERY, DELIVERED, CANCELLED — автоматически продвигается по событиям GPS и геозоны

gpsTrack[]

До 500 последних точек, сначала старые

gpsTrack[].lat / lng

градусы

Координаты

gpsTrack[].speed

миль/ч, 1 десятичный знак

Скорость по земле; null, когда в точке нет данных о скорости

gpsTrack[].heading

градусы 0–359, 0 = север

null, если неизвестно

gpsTrack[].ts

ISO 8601 UTC

Временная метка точки

distanceMiles

мили

Расстояние по формуле Хаверсина по всему маршруту трек (не только по 500 возвращённым точкам); null, пока не набралось ≥ 2 точек

stops[].arrivedAt / departedAt

ISO 8601 UTC

Заполняется по прибытии/убытии из геозоны

stops[].windowFrom / windowTo

ISO 8601 UTC

Плановые окна; null, если не заданы

onTime

булево

Доставлено в окно доставки (льгота 15 минут); null, пока не доставлено или окно не задано

delayMinutes, pickupDwellMinutes, deliveryDwellMinutes

минуты

null, когда ещё неизвестно

pingCount

счётчик

Общее число зафиксированных для груза координат

eta

объект

Следующая остановка, расстояние до неё (мили), время вождения (ч), флаг движения, окно расчётного времени прибытия; fail-soft — при недостатке данных сводится только к объекту с причиной

Статистика рейса (get_trip_stats / getTripStats)

Поле

Единица

Значение

dataPoints

количество

GPS-пинги, записанные для перевозки

durationSeconds

с

lastAt − firstAt

estimatedDistanceMiles

мили

Расстояние расстояния по формуле Хаверсина по всему пути записанному треке

avgSpeedMph

миль/ч

По всему интервалу времени, включая остановки

maxSpeedMph

миль/ч

Максимальная зафиксированная скорость по земле

hardAccelCount

количество

Увеличение скорости > +15 миль/ч за минуту при скорости > 20 миль/ч

hardBrakeCount

количество

Снижение скорости < −20 миль/ч за минуту при скорости > 20 миль/ч

cityMilesPct

% 0–100

Доля миль на скорости 5–40 миль/ч

highwayMilesPct

% 0–100

Доля миль на скорости выше 45 миль/ч

parkedTimePct

% 0–100

Доля пингов при ≤5 миль/ч

nightPct

% 0–100

Доля пингов в период 23:00–07:00 UTC

coveragePct

% ≤100

Отношение полученных пингов к ожидаемому одному пингу в минуту за период

firstAt / lastAt

ISO 8601 UTC

Время первого/последнего записанного пинга; null, если пингов не было

Коды ошибок

Код

Значение

400 MISSING_FIELDS

Обязательные поля отсутствуют — body перечисляет их в fields[] (пути через точку, например pickups.0.zip). Также 400 INVALID_DRIVER_PHONE, когда номер не соответствует E.164.

401

Отсутствует или недействителен ключ.

402 INSUFFICIENT_FUNDS

Баланс предоплаты не покрывает операцию. Ничего не списано и ничего не создано. body содержит balanceUsd, priceUsd, billingUrl.

403

Перевезка принадлежит другому аккаунте.

404

Такая перевозка не существует.

410 STATUS_DOOR_CLOSED

Ответ на любую внешную запись статусаba. Не сбой — так предусмотрено design. Не повторнаve запр.

422 UNKNOWN_BROKER

Аккаунт ключа не зарегистрирован в PingPoint.

422 + reason: bol_received_before_geofence_arrive

Достижение подтверждения отправлено до того, как грузовик приехал в пункт доставки. Не повторяйте — как только грузовик будет on месте, подтверждение пройдёт успешно; без него перевозка завершится автоматически при выходе из зоны доставки.

503 BILLING_UNAVAILABLE

Платёжный backend временно недоступен — ничего не списано, повторите позже.

Биллинг

Предоплаченный баланс, оплата за каждый вызов, без подписния. Подробности: abusiness/billing. —

actually need include link: [docs/billing.md](docs/billing.md) — now doing.

Пje pl dis: W? The link should be: docs/billing.md and the translated phrase before says "Подробности в [docs/billing.md]. Let's write.

Операция

Цена

Создать перевозку

$0.65

Получить позицию перевозки

$0.02 за запрос

Сводная статистика рейса

$0.02 за запрос

Подтверждение доставки, получение статуса, тарифы, баланс

бесплатно

  • Пополнить баланс можно в личном кабинете в разделе BillingБесплатные операции работаю при нулевом балансе.

  • 402 означает, что запрос был отклонён до совершения каких-либо изменений: ничего не создано и ничего не списано.

  • Повторные вызовы createLoad с тем же Idempotency-Key безопасны — списание происходит не более одного раза; customerRef исключает дубли на уровне бизнес-логики.

  • Цены в реальном времени отдаются через GET /v1/agent/pricing — считайте это источником истины и никогда не зашивайте их.

Что это не такое

  • Не сертифицированный ELD. PingPoint читает GPS (и данных о дойле данные шины двигателя) для видимости. Это не зарегистрированный в FMCSA ELD и не формирует записи о соответствии HOS/RODS.

  • Не проверка перевозчиков. Живая позиция показывает, где находится грузовик, а не является ли перевозчик надёжным, застрахованным или реальным. Сохраняйте все существующие проверки при онбординге.

  • Водитель должен установить приложение. Одна ссылка по SMS, одна установка, около минуты — но это настоящий шаг, требующий cooperation. Если линейка not connected phone? Exactly: "Перевозка без связанного phone и detachme" We will not publish.

  • Водителю нужно установить приложение. Одна SMS-ссылка, однаью, rue, un действия; a not— dose: no: "No connected phone" -> "без подключённого телефона и без донгла" positions "не даёт позиций".

Как это compares

Корпоративные платформы отслеживания хотят, что у перевозчика уже есть телематика, а у брокера — контракт; vendors based on звонках вставлять телефонный звонок (живу, human or system) into every check. У PingPoint другой подход: one driver install in exchange for an API with payment for every call, public prices and no minimums. Фактическая и построчный сравнение с обеими группами — порядок выдачи ключей, публичные цены, API, MCP/SDK, — maintained at pingpoint.suverse.io/compare.

##Силк

Лицензия

MIT © 2026 Sudzik Group Inc.

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