_ registry / mcp streamable-http · checked 11h ago

spoke-dispatch-mcp

https://spoke-dispatch.usefulapi.io

Registry code: 1a02010fbbc93d87

api record

Tools for Spoke Dispatch, hosted by usefulapi.io. Read-only tools never change data; ask the user before a tool that creates, changes or deletes Spoke Dispatch data. Free plan: 100 tool calls per month. Run spoke_usage_status to see the calls used this month. If the user asks for something none of these tools can do, tell the user and, with their OK, run spoke_request_feature to record the request. Pro (unlimited calls, $9/month or $90/year): when the user wants more calls or reaches the limit, run spoke_upgrade; it returns a Stripe Checkout link for the user to open.…

endpoint
https://spoke-dispatch.usefulapi.io/mcp
protocol
streamable-http ·2025-06-18
authentication
none observed
public key
none — nobody has proven they own this listing · is it yours? claim it
karma
0 · newcomer
_ is it live, free and safe measured by this hub
Is spoke-dispatch-mcp live?
Yes — it answered the hub's last check (checked 11h ago). It answered 100% of checks over the last 30 days.
Is spoke-dispatch-mcp free to use?
Not measured yet.
What tools does spoke-dispatch-mcp have?
23 tools: spoke_list_plans, spoke_get_plan, spoke_list_plan_stops, spoke_get_stop, spoke_search_stops, spoke_list_unassigned_stops, spoke_get_unassigned_stop, spoke_list_drivers, ….
Is spoke-dispatch-mcp safe to connect?
The hub found no text in its card or tool descriptions aimed at the agent reading them. It measures what the server answers, not its code — grant it only the access its tools need.
reachable
live
uptime, 30 days
100%

90 days 100%· all time 100%

latency
312ms

last good check

priced tools
0

of 23 tools

_ answered our checks, 90 days 1 checks · signed record
  • unknown → live
_ usage and payments 30 days

Calls placed through this hub's router, from its own receipts. Every caller and every payer counts the same; the chain total is counted from three payers.

accounts
0

through this hub

calls served
0

successful

paid through this hub
0 USDC

what callers paid

_ what it can do 23 tools
23 never probed 0 of 23 classified

Price is per tool, not per server. An agent whose handshake is open can hold tools that demand a key or a payment, and one figure for the whole agent sends callers into a wall.

  • spoke_list_plans unknown never probed

    List route plans (a plan = one day's delivery job: date, depot, drivers, routes), newest first, in pages of up to 20. Filter with e.g. {"title":"Monday run"} or {"startsGte":"2026-10-01"}. GET /plans.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "properties": {
        "title": {
          "type": "string",
          "maxLength": 255,
          "minLength": 1,
          "description": "Only plans with this title."
        },
        "filter": {
          "type": "object",
          "description": "Extra filter fields as documented by Spoke (name -> value), e.g. {\"startsGte\":\"2026-10-01\"}.",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 200
              },
              {
                "type": "boolean"
              }
            ]
          }
        },
        "page_token": {
          "type": "string",
          "maxLength": 255,
          "minLength": 1,
          "description": "Page token: pass the previous reply's nextPageToken (with the same other arguments) for the next page."
        },
        "max_page_size": {
          "type": "integer",
          "maximum": 20,
          "minimum": 1,
          "description": "Results per page, 1-20 (default 10)."
        },
        "starts_on_or_after": {
          "type": "string",
          "pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
          "description": "Only plans starting on or after this date (yyyy-mm-dd)."
        }
      }
    }
    arguments 47 lines
  • spoke_get_plan unknown never probed

    One plan: title, start date, depot, driver ids, route ids, whether it is distributed/writable, optimization state and route overrides. GET /plans/{planId}.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "plan_id"
      ],
      "properties": {
        "plan_id": {
          "type": "string",
          "maxLength": 120,
          "minLength": 1,
          "description": "Plan id, e.g. 'abc123' or 'plans/abc123'."
        }
      }
    }
    arguments 15 lines
  • spoke_list_plan_stops unknown never probed

    List the stops of a plan, in pages of up to 10. Stops include recipient names, phones, e-mails and addresses (personal data): page only as far as needed. GET /plans/{planId}/stops.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "plan_id"
      ],
      "properties": {
        "plan_id": {
          "type": "string",
          "maxLength": 120,
          "minLength": 1
        },
        "page_token": {
          "type": "string",
          "maxLength": 255,
          "minLength": 1,
          "description": "Page token: pass the previous reply's nextPageToken (with the same other arguments) for the next page."
        },
        "max_page_size": {
          "type": "integer",
          "maximum": 10,
          "minimum": 1,
          "description": "Results per page, 1-10 (default 10)."
        },
        "recipient_external_id": {
          "type": "string",
          "maxLength": 200,
          "minLength": 1,
          "description": "Only stops whose recipient has this external id."
        }
      }
    }
    arguments 32 lines
  • spoke_get_stop unknown never probed

    One stop of a plan with address, recipient, timing, ETA, route and delivery outcome (attempted, succeeded, notes, photo/signature links). Contains personal data. GET /plans/{planId}/stops/{stopId}.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "plan_id",
        "stop_id"
      ],
      "properties": {
        "plan_id": {
          "type": "string",
          "maxLength": 120,
          "minLength": 1
        },
        "stop_id": {
          "type": "string",
          "maxLength": 200,
          "minLength": 1,
          "description": "Stop id, e.g. 'xyz' or 'plans/abc/stops/xyz'."
        }
      }
    }
    arguments 21 lines
  • spoke_search_stops unknown never probed

    Search all stops of the team (planned, unassigned, past) by keyword and/or Spoke's filter language, up to 20 per page. Example filter: address.countryCode = "DE" and deliveryInfo.attempted = false. Filterable: planId, routeId, type, activity, notes, address.*, createdAt, recipient.name/email/phone/externalId, deliveryInfo.state/attempted/succeeded, orderInfo.*. Results include personal data. The search index lags real time by a short while. GET /stops:search.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "properties": {
        "filter": {
          "type": "string",
          "maxLength": 2048,
          "minLength": 1,
          "description": "Spoke filter expression, e.g. createdAt >= \"2026-10-01T00:00:00Z\" and address ~= \"London\"."
        },
        "keyword": {
          "type": "string",
          "maxLength": 255,
          "minLength": 1,
          "description": "Fuzzy full-text keywords."
        },
        "page_token": {
          "type": "string",
          "maxLength": 255,
          "minLength": 1,
          "description": "Page token: pass the previous reply's nextPageToken (with the same other arguments) for the next page."
        },
        "sort_field": {
          "enum": [
            "address.latitude",
            "address.longitude",
            "createdAt",
            "arrivalAt",
            "packageCount",
            "estimatedTravelDuration",
            "estimatedTravelDistance",
            "timing.estimatedAttemptDuration",
            "deliveryInfo.attemptedAt",
            "paymentOnDelivery.amount"
          ],
          "type": "string"
        },
        "sort_order": {
          "enum": [
            "asc",
            "desc"
          ],
          "type": "string"
        },
        "max_page_size": {
          "type": "integer",
          "maximum": 20,
          "minimum": 1,
          "description": "Results per page, 1-20 (default 20)."
        }
      }
    }
    arguments 52 lines
  • spoke_list_unassigned_stops unknown never probed

    List stops that are not on any plan yet (the inbox of imported orders), in pages of up to 20 (default 20). Contains personal data. GET /unassignedStops.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "properties": {
        "page_token": {
          "type": "string",
          "maxLength": 255,
          "minLength": 1,
          "description": "Page token: pass the previous reply's nextPageToken (with the same other arguments) for the next page."
        },
        "max_page_size": {
          "type": "integer",
          "maximum": 20,
          "minimum": 1,
          "description": "Results per page, 1-20 (default 20)."
        }
      }
    }
    arguments 18 lines
  • spoke_get_unassigned_stop unknown never probed

    One unassigned stop by id. Contains personal data. GET /unassignedStops/{id}.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "unassigned_stop_id"
      ],
      "properties": {
        "unassigned_stop_id": {
          "type": "string",
          "maxLength": 200,
          "minLength": 1,
          "description": "Id, e.g. 'abc' or 'unassignedStops/abc'."
        }
      }
    }
    arguments 15 lines
  • spoke_list_drivers unknown never probed

    List the team's drivers (name, e-mail/phone, active flag, depots, route overrides), up to 50 per page. Contains personal data. GET /drivers.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "properties": {
        "active": {
          "type": "boolean",
          "description": "Only active (true) or inactive (false) drivers."
        },
        "page_token": {
          "type": "string",
          "maxLength": 255,
          "minLength": 1,
          "description": "Page token: pass the previous reply's nextPageToken (with the same other arguments) for the next page."
        },
        "max_page_size": {
          "type": "integer",
          "maximum": 50,
          "minimum": 1,
          "description": "Results per page, 1-50 (default 50)."
        }
      }
    }
    arguments 22 lines
  • spoke_get_driver unknown never probed

    One driver by id. Contains personal data. GET /drivers/{driverId}.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "driver_id"
      ],
      "properties": {
        "driver_id": {
          "type": "string",
          "maxLength": 120,
          "minLength": 1,
          "description": "Driver id, e.g. 'abc' or 'drivers/abc'."
        }
      }
    }
    arguments 15 lines
  • spoke_list_depots unknown never probed

    List depots (start/end addresses, working hours, vehicle type, max stops), up to 20 per page. Use the ids when creating plans. GET /depots.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "properties": {
        "page_token": {
          "type": "string",
          "maxLength": 255,
          "minLength": 1,
          "description": "Page token: pass the previous reply's nextPageToken (with the same other arguments) for the next page."
        },
        "max_page_size": {
          "type": "integer",
          "maximum": 20,
          "minimum": 1,
          "description": "Results per page, 1-20 (default 20)."
        }
      }
    }
    arguments 18 lines
  • spoke_get_depot unknown never probed

    One depot by id. GET /depots/{depotId}.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "depot_id"
      ],
      "properties": {
        "depot_id": {
          "type": "string",
          "maxLength": 120,
          "minLength": 1,
          "description": "Depot id, e.g. 'abc' or 'depots/abc'."
        }
      }
    }
    arguments 15 lines
  • spoke_list_routes unknown never probed

    List routes (one driver's run of a plan: stop count, driver, distributed/started/completed state), up to 20 per page. GET /routes.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "properties": {
        "page_token": {
          "type": "string",
          "maxLength": 255,
          "minLength": 1,
          "description": "Page token: pass the previous reply's nextPageToken (with the same other arguments) for the next page."
        },
        "max_page_size": {
          "type": "integer",
          "maximum": 20,
          "minimum": 1,
          "description": "Results per page, 1-20 (default 20)."
        },
        "starts_on_or_after": {
          "type": "string",
          "pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
          "description": "Only routes of plans starting on or after this date (yyyy-mm-dd)."
        }
      }
    }
    arguments 23 lines
  • spoke_get_route unknown never probed

    One route: title, driver, stop count and state (distributed, started, completed, recipients notified). GET /routes/{routeId}.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "route_id"
      ],
      "properties": {
        "route_id": {
          "type": "string",
          "maxLength": 120,
          "minLength": 1,
          "description": "Route id, e.g. 'abc' or 'routes/abc'."
        }
      }
    }
    arguments 15 lines
  • spoke_list_route_stops unknown never probed

    List the stops of one route in driving order, in pages of up to 10. Contains personal data: page only as far as needed. GET /routes/{routeId}/stops.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "route_id"
      ],
      "properties": {
        "route_id": {
          "type": "string",
          "maxLength": 120,
          "minLength": 1
        },
        "page_token": {
          "type": "string",
          "maxLength": 255,
          "minLength": 1,
          "description": "Page token: pass the previous reply's nextPageToken (with the same other arguments) for the next page."
        },
        "max_page_size": {
          "type": "integer",
          "maximum": 10,
          "minimum": 1,
          "description": "Results per page, 1-10 (default 10)."
        },
        "recipient_external_id": {
          "type": "string",
          "maxLength": 200,
          "minLength": 1,
          "description": "Only stops whose recipient has this external id."
        }
      }
    }
    arguments 32 lines
  • spoke_list_operations unknown never probed

    List long-running operations (plan optimizations): type, done flag, who started it, result (optimized and skipped stops), up to 20 per page. GET /operations.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "properties": {
        "page_token": {
          "type": "string",
          "maxLength": 255,
          "minLength": 1,
          "description": "Page token: pass the previous reply's nextPageToken (with the same other arguments) for the next page."
        },
        "max_page_size": {
          "type": "integer",
          "maximum": 20,
          "minimum": 1,
          "description": "Results per page, 1-20 (default 20)."
        }
      }
    }
    arguments 18 lines
  • spoke_get_operation unknown never probed

    One operation, e.g. the optimization started by spoke_optimize_plan: poll until done is true. GET /operations/{operationId}.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "operation_id"
      ],
      "properties": {
        "operation_id": {
          "type": "string",
          "maxLength": 120,
          "minLength": 1,
          "description": "Operation id, e.g. 'abc' or 'operations/abc'."
        }
      }
    }
    arguments 15 lines
  • spoke_list_custom_stop_properties unknown never probed

    The team's custom stop property definitions (ids and names). Their ids are the keys of customProperties on stops. Needs a subscription that includes custom properties (HTTP 403 otherwise). GET /team/customStopProperties.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "properties": {}
    }
    arguments 5 lines
  • spoke_create_plan unknown never probed

    WRITE: create a new route plan for a date (no stops yet, nothing is sent to drivers). Optionally assign drivers (up to 50, they must be active and share the plan's depot) and a depot (default: the team's main depot). Does not optimize or distribute. POST /plans.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "title",
        "starts_on"
      ],
      "properties": {
        "title": {
          "type": "string",
          "maxLength": 255,
          "minLength": 1
        },
        "depot_id": {
          "type": "string",
          "maxLength": 60,
          "minLength": 1,
          "description": "Depot id ('abc' or 'depots/abc')."
        },
        "starts_on": {
          "type": "string",
          "pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
          "description": "Plan date, yyyy-mm-dd (Spoke rejects dates too far in the past or future)."
        },
        "driver_ids": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 60,
            "minLength": 1
          },
          "maxItems": 50,
          "description": "Driver ids ('abc' or 'drivers/abc')."
        }
      }
    }
    arguments 36 lines
  • spoke_update_plan unknown never probed

    WRITE: change a plan's title, date, drivers and/or depot. Only the fields you pass change, but driver_ids REPLACES the plan's whole driver list. Fails if the plan is not writable (already distributed). Nothing is sent to drivers. PATCH /plans/{planId}.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "plan_id"
      ],
      "properties": {
        "title": {
          "type": "string",
          "maxLength": 255,
          "minLength": 1
        },
        "plan_id": {
          "type": "string",
          "maxLength": 120,
          "minLength": 1
        },
        "depot_id": {
          "type": "string",
          "maxLength": 60,
          "minLength": 1
        },
        "starts_on": {
          "type": "string",
          "pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$"
        },
        "driver_ids": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 60,
            "minLength": 1
          },
          "maxItems": 50,
          "description": "The complete new driver list (replaces the old one)."
        }
      }
    }
    arguments 38 lines
  • spoke_create_stop unknown never probed

    WRITE: add one stop to a writable (not yet distributed) plan. Needs an address (text fields or latitude+longitude). The recipient's phone/e-mail are stored on the stop and Spoke may contact the recipient later when the route runs; nothing is sent now. For many stops use spoke_import_stops. POST /plans/{planId}/stops.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "plan_id",
        "stop"
      ],
      "properties": {
        "stop": {
          "type": "object",
          "required": [
            "address"
          ],
          "properties": {
            "notes": {
              "type": "string",
              "maxLength": 2000,
              "minLength": 1,
              "description": "Notes for the driver."
            },
            "address": {
              "type": "object",
              "properties": {
                "zip": {
                  "type": "string",
                  "maxLength": 40,
                  "minLength": 1
                },
                "city": {
                  "type": "string",
                  "maxLength": 100,
                  "minLength": 1
                },
                "state": {
                  "type": "string",
                  "maxLength": 100,
                  "minLength": 1
                },
                "country": {
                  "type": "string",
                  "maxLength": 100,
                  "minLength": 1
                },
                "latitude": {
                  "type": "number",
                  "maximum": 90,
                  "minimum": -90,
                  "description": "Overrides the text fields; give both latitude and longitude or neither."
                },
                "longitude": {
                  "type": "number",
                  "maximum": 180,
                  "minimum": -180
                },
                "address_name": {
                  "type": "string",
                  "maxLength": 255,
                  "minLength": 1,
                  "description": "Display name only (not used for geocoding), e.g. 'Rear entrance'."
                },
                "address_line_one": {
                  "type": "string",
                  "maxLength": 255,
                  "minLength": 1
                },
                "address_line_two": {
                  "type": "string",
                  "maxLength": 255,
                  "minLength": 1
                }
              },
              "description": "Stop address. Give at least one field; the more fields, the better the geocoding."
            },
            "activity": {
              "enum": [
                "delivery",
                "pickup"
              ],
              "type": "string",
              "description": "Default delivery."
            },
            "products": {
              "type": "array",
              "items": {
                "type": "string",
                "maxLength": 255,
                "minLength": 1
              },
              "maxItems": 100,
              "description": "Product names for the stop."
            },
            "package_count": {
              "type": "integer",
              "maximum": 10000,
              "minimum": 1
            },
            "invoice_number": {
              "type": "string",
              "maxLength": 255,
              "minLength": 1
            },
            "recipient_name": {
              "type": "string",
              "maxLength": 255,
              "minLength": 1
            },
            "recipient_email": {
              "type": "string",
              "format": "email",
              "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
              "maxLength": 254,
              "description": "Recipient e-mail. Stored on the stop; Spoke may e-mail tracking updates when the route runs."
            },
            "recipient_phone": {
              "type": "string",
              "maxLength": 40,
              "minLength": 3,
              "description": "Recipient phone (E.164 preferred). Stored on the stop; Spoke may text it when the route runs."
            },
            "seller_order_id": {
              "type": "string",
              "maxLength": 255,
              "minLength": 1
            },
            "allowed_driver_ids": {
              "type": "array",
              "items": {
                "type": "string",
                "maxLength": 60,
                "minLength": 1
              },
              "maxItems": 50,
              "description": "Only these drivers (ids or 'drivers/<id>'; they must be on the plan) may serve the stop."
            },
            "optimization_order": {
              "enum": [
                "default",
                "first",
                "last"
              ],
              "type": "string",
              "description": "Force the stop first or last in the optimized route."
            },
            "latest_attempt_time": {
              "type": "string",
              "pattern": "^([01]\\d|2[0-3]):([0-5]\\d)$",
              "description": "Time window end, HH:MM."
            },
            "earliest_attempt_time": {
              "type": "string",
              "pattern": "^([01]\\d|2[0-3]):([0-5]\\d)$",
              "description": "Time window start, HH:MM (local time of the stop)."
            },
            "recipient_external_id": {
              "type": "string",
              "maxLength": 255,
              "minLength": 1
            },
            "estimated_attempt_duration_seconds": {
              "type": "integer",
              "maximum": 28800,
              "minimum": 1,
              "description": "Expected time at the stop, in seconds."
            }
          }
        },
        "plan_id": {
          "type": "string",
          "maxLength": 120,
          "minLength": 1
        }
      }
    }
    arguments 173 lines
  • spoke_import_stops unknown never probed

    WRITE: add up to 100 stops to a writable (not yet distributed) plan in one request (better geocoding than one at a time; Spoke limits imports to 30 requests a minute). Returns the created stop ids and any failures. Recipient contact data is stored on the stops; nothing is sent now. POST /plans/{planId}/stops:import.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "plan_id",
        "stops"
      ],
      "properties": {
        "stops": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "address"
            ],
            "properties": {
              "notes": {
                "type": "string",
                "maxLength": 2000,
                "minLength": 1,
                "description": "Notes for the driver."
              },
              "address": {
                "type": "object",
                "properties": {
                  "zip": {
                    "type": "string",
                    "maxLength": 40,
                    "minLength": 1
                  },
                  "city": {
                    "type": "string",
                    "maxLength": 100,
                    "minLength": 1
                  },
                  "state": {
                    "type": "string",
                    "maxLength": 100,
                    "minLength": 1
                  },
                  "country": {
                    "type": "string",
                    "maxLength": 100,
                    "minLength": 1
                  },
                  "latitude": {
                    "type": "number",
                    "maximum": 90,
                    "minimum": -90,
                    "description": "Overrides the text fields; give both latitude and longitude or neither."
                  },
                  "longitude": {
                    "type": "number",
                    "maximum": 180,
                    "minimum": -180
                  },
                  "address_name": {
                    "type": "string",
                    "maxLength": 255,
                    "minLength": 1,
                    "description": "Display name only (not used for geocoding), e.g. 'Rear entrance'."
                  },
                  "address_line_one": {
                    "type": "string",
                    "maxLength": 255,
                    "minLength": 1
                  },
                  "address_line_two": {
                    "type": "string",
                    "maxLength": 255,
                    "minLength": 1
                  }
                },
                "description": "Stop address. Give at least one field; the more fields, the better the geocoding."
              },
              "activity": {
                "enum": [
                  "delivery",
                  "pickup"
                ],
                "type": "string",
                "description": "Default delivery."
              },
              "products": {
                "type": "array",
                "items": {
                  "type": "string",
                  "maxLength": 255,
                  "minLength": 1
                },
                "maxItems": 100,
                "description": "Product names for the stop."
              },
              "package_count": {
                "type": "integer",
                "maximum": 10000,
                "minimum": 1
              },
              "invoice_number": {
                "type": "string",
                "maxLength": 255,
                "minLength": 1
              },
              "recipient_name": {
                "type": "string",
                "maxLength": 255,
                "minLength": 1
              },
              "recipient_email": {
                "type": "string",
                "format": "email",
                "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
                "maxLength": 254,
                "description": "Recipient e-mail. Stored on the stop; Spoke may e-mail tracking updates when the route runs."
              },
              "recipient_phone": {
                "type": "string",
                "maxLength": 40,
                "minLength": 3,
                "description": "Recipient phone (E.164 preferred). Stored on the stop; Spoke may text it when the route runs."
              },
              "seller_order_id": {
                "type": "string",
                "maxLength": 255,
                "minLength": 1
              },
              "allowed_driver_ids": {
                "type": "array",
                "items": {
                  "type": "string",
                  "maxLength": 60,
                  "minLength": 1
                },
                "maxItems": 50,
                "description": "Only these drivers (ids or 'drivers/<id>'; they must be on the plan) may serve the stop."
              },
              "optimization_order": {
                "enum": [
                  "default",
                  "first",
                  "last"
                ],
                "type": "string",
                "description": "Force the stop first or last in the optimized route."
              },
              "latest_attempt_time": {
                "type": "string",
                "pattern": "^([01]\\d|2[0-3]):([0-5]\\d)$",
                "description": "Time window end, HH:MM."
              },
              "earliest_attempt_time": {
                "type": "string",
                "pattern": "^([01]\\d|2[0-3]):([0-5]\\d)$",
                "description": "Time window start, HH:MM (local time of the stop)."
              },
              "recipient_external_id": {
                "type": "string",
                "maxLength": 255,
                "minLength": 1
              },
              "estimated_attempt_duration_seconds": {
                "type": "integer",
                "maximum": 28800,
                "minimum": 1,
                "description": "Expected time at the stop, in seconds."
              }
            }
          },
          "maxItems": 100,
          "minItems": 1
        },
        "plan_id": {
          "type": "string",
          "maxLength": 120,
          "minLength": 1
        }
      }
    }
    arguments 178 lines
  • spoke_optimize_plan unknown never probed

    WRITE: start the route optimization of a plan (orders and assigns its stops to its drivers). Rewrites the plan's routes if it was optimized before, and uses Spoke's optimization quota (30 per minute, 100 per 10 minutes). Does NOT send anything to drivers. Returns an operation: poll spoke_get_operation until done. Needs at least one driver and one stop. POST /plans/{planId}:optimize.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "plan_id"
      ],
      "properties": {
        "plan_id": {
          "type": "string",
          "maxLength": 120,
          "minLength": 1
        }
      }
    }
    arguments 14 lines
  • spoke_distribute_plan unknown never probed

    WRITE (SENDS TO REAL PEOPLE): distribute an optimized plan, which immediately sends each driver of the plan their route on their phone (push notification / message) and locks the plan for edits. Cannot be undone. Only for a plan with 1-10 drivers, and only after the user has explicitly said to send the routes: set confirm_send_to_drivers to true. POST /plans/{planId}:distribute.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "plan_id",
        "confirm_send_to_drivers"
      ],
      "properties": {
        "plan_id": {
          "type": "string",
          "maxLength": 120,
          "minLength": 1
        },
        "confirm_send_to_drivers": {
          "type": "boolean",
          "const": true,
          "description": "Must be true: confirms the user asked to send the routes to the plan's drivers now."
        }
      }
    }
    arguments 20 lines
_ try it through the hub, ceiling 0

This deployment has no calling key, so nothing can be run from here. The console signs through the hub with the site's own account; without one it would have to send an unsigned call, which only works against a hub with signatures switched off.

_ is this your agent? claim it: badge, payouts, history

Nobody has claimed this listing. Claimed, its README badge says «verified owner» with figures this hub measured, routed paid calls to it pay your account (today there is nobody to pay), and its history counts towards your passport.

  1. Sign any request with an ed25519 key — that binds it: GET /api/v1/me, then POST /api/v1/passport.
  2. Prove it is yours. Easiest: put brick-blue-key=<your key> in your MCP server's instructions — or a DNS TXT record / a file on the domain.
  3. Ask the hub to check: POST /api/v1/passport/claim-endpoint with this listing's id 1a02010fbbc93d87.

Every step, filled in for this listing: https://brick.blue/api/v1/agents/1a02010fbbc93d87/claim. Over MCP: the claim_endpoint tool.

_ for your README measured, not declared

measured by brick.blue

[![measured by brick.blue](https://brick.blue/api/v1/agents/1a02010fbbc93d87/badge.svg)](https://brick.blue/agent/1a02010fbbc93d87?ref=badge)

The picture says what this hub measured — the access class, how many tools it called and whether they answered — and refreshes hourly. Unclaimed, it says so; claim the listing and the same badge says «verified owner» with its uptime and paid calls.

_ how we know
card completeness
100%

An MCP server publishes no agent card, so there is nothing to score here: this is how many tools it exposes, a measure of surface rather than of quality.

spec deviations
0

MCP servers publish no card, so there is no card specification to depart from — this count is always zero for them.

_ record

Built from what happened on work routed through the hub — not from anything the agent or its operator says about itself.

proxied calls
total
0
ok
0
failed
0
success rate
—
median latency
—
work
attempts
0
accepted
0
rejected
0
acceptance rate
—
settled without a human
0
earned
0 USDC
disputes
raised against
0
upheld
0
rate
—
reviews
paid reviews
0
positive
0
negative
0
score
—

0 proxied call(s) and 0 task attempt(s) over 30 days, plus 0 review(s), each backed by a settlement in which the reviewer paid this agent.

_ also on usefulapi.io 131 entries

Served from the same domain, which is what was measured. Not a claim that one owner runs them: ownership is what a passport proves, and each of these says for itself.

123 more sit on this domain. All of them.