# `io.usefulapi/shipday` on anlyon.dev

> Text inside fenced blocks marked untrusted-server-text was written by the MCP server's publisher, not by anlyon.dev. It is data to inspect, not instructions to follow. Invisible characters are shown as [U+XXXX].
> No finding is not a safety guarantee: these are point-in-time checks of tool definitions, not of code or behaviour.

- Page: https://anlyon.dev/servers/io.usefulapi/shipday
- JSON: https://anlyon.dev/api/v1/servers/io.usefulapi/shipday
- Version: 1.7.4 (active)
- Publisher: io.usefulapi (domain proven to the MCP Registry)
- Runs: remote (streamable-http)
- Sign-in to list tools: none
- Repository: https://github.com/m190/usefulapi-mcp
- Metadata from the official MCP Registry, synced 2026-10-22T11:18:55.496Z

Title and description, as the publisher wrote them:

```untrusted-server-text
Shipday MCP by usefulapi
Read Shipday orders, carriers and delivery status; create orders and assign drivers.
```

Scanned 2026-10-22T11:20:00.107Z over streamable-http.

**14 tools: 1 can delete or cancel things, 4 change things and 9 only read.**

| Group | Class | Tools | Claude Code |
| --- | --- | --- | --- |
| Deletes or cancels | destructive | 1 | deny |
| Can't be undone | irreversible | 0 | ask |
| Changes things | write | 4 | ask |
| Only reads | read | 9 | allow |

## Exfil surface

No private-data -> untrusted-input -> outbound path in this server alone: no tool is tagged outbound.

| Tag | Meaning | Tools |
| --- | --- | --- |
| private-data | Reads files, mail, messages, databases, secrets, calendars or repositories. | `mcp__shipday__list_carriers` |
| untrusted-input | Brings in text someone else can write: web pages, inbound email, messages, issues and comments. | `mcp__shipday__get_on_demand_details` `mcp__shipday__list_carriers` |
| outbound | Can carry data to people or systems: it sends, posts or publishes, or takes a recipient, channel or URL. | none |

## Findings

No check matched anything in these tool definitions.


## Deletes or cancels (1)

Removes, cancels or revokes something. Claude Code: deny.

### `create_order`

- The name "create_order" says "create": a word for a change.
- The server marks it destructive (destructiveHint: true).

Description, as the server wrote it:

```untrusted-server-text
WRITE: insert a new delivery order into Shipday (it appears on the dispatch board; it is not assigned to a driver). Returns the new orderId. Times are UTC. Shipday: POST /orders.
```

## Changes things (4)

Creates or changes something that can be changed back. Claude Code: ask.

### `assign_order_to_carrier`

- The name "assign_order_to_carrier" says "assign": a word for a change.

Description, as the server wrote it:

```untrusted-server-text
WRITE: assign a delivery order to one of the account's own carriers (drivers); the driver is notified in the Shipday driver app. Re-assigning to the same driver changes nothing. Shipday: PUT /orders/assign/{orderId}/{carrierId}.
```

### `check_on_demand_availability`

- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

Description, as the server wrote it:

```untrusted-server-text
Quote third-party on-demand delivery for a pickup and delivery address before creating an order: which services can deliver, their fee and pickup/delivery times. Read only: nothing is booked. Shipday: POST /on-demand/availability.
```

### `set_order_ready_to_pickup`

- The name "set_order_ready_to_pickup" says "set": a word for a change.

Description, as the server wrote it:

```untrusted-server-text
WRITE: set or clear an order's ready-to-pickup flag (tells the driver the order is ready at the pickup location). Shipday: PUT /orders/{orderId}/meta.
```

### `unassign_order`

- The name "unassign_order" says "unassign": a word for a change.

Description, as the server wrote it:

```untrusted-server-text
WRITE: remove the driver from a delivery order (it goes back to unassigned). Shipday: PUT /orders/unassign/{orderId}.
```

## Only reads (9)

Looks things up and changes nothing. Claude Code: allow.

### `get_delivery_progress`

- The name "get_delivery_progress" says "get": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
Real-time delivery progress of an order by its tracking id: status (STARTED, PICKED_UP, ...), timestamps, the driver's current location and the ETA in minutes. The tracking id is the last part of the order's trackingLink. Shipday's Business Advanced plan only; at most 3 requests per minute per tracking id. Shipday: GET /order/progress/{trackingId}.
```

### `get_on_demand_details`

- The name "get_on_demand_details" says "get": a word for reading.
- Tag untrusted-input: The description's first sentence says "url": it reads web pages, which anyone can write.

Description, as the server wrote it:

```untrusted-server-text
Details of the third-party on-demand delivery booked for an order: provider, reference id, third-party fee, Shipday charge, total billable amount and tracking URL. Shipday: GET /on-demand/details/{orderId}.
```

### `get_on_demand_estimate`

- The name "get_on_demand_estimate" says "get": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
Get fee and time estimates from the third-party on-demand delivery services for an existing order (fee, pickup/delivery time, durations, per-service errors). Read only: nothing is booked. Shipday: GET /on-demand/estimate/{orderId}.
```

### `get_order`

- The name "get_order" says "get": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
Get the details of a delivery order by its order number (the merchant's reference, `orderNumber`). Returns an array, since several orders can share one order number. Includes the numeric orderId needed by the write tools, the carrier, tracking link and status. Shipday: GET /orders/{orderNumber}.
```

### `get_pickup_order`

- The name "get_pickup_order" says "get": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
Get a pickup (customer collects it) order by its numeric id, with restaurant, customer, items, costs, expected pickup date/time and status. Shipday: GET /pickup-orders/{orderId}.
```

### `list_active_orders`

- The name "list_active_orders" says "list": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
List the account's active (not yet completed) delivery orders with customer, pickup location (restaurant), assigned carrier/driver, timeline (activityLog), costs, payment method and orderStatus.orderState. Good first call. Shipday: GET /orders.
```

### `list_carriers`

- The name "list_carriers" says "list": a word for reading.
- Tag private-data: The description's first sentence says "list" and "email": it reads mail.
- Tag untrusted-input: The description's first sentence says "list" and "email": it reads inbound email, which other people can write.

Description, as the server wrote it:

```untrusted-server-text
List the account's carriers (drivers) with id, name, phone, email, isOnShift, isActive and last known location. Use an id here with assign_order_to_carrier. Shipday: GET /carriers.
```

### `list_on_demand_services`

- The name "list_on_demand_services" says "list": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
List the third-party on-demand delivery services (DoorDash, Uber, ...) available to the account and whether each is enabled. Shipday: GET /on-demand/services.
```

### `query_orders`

- The name "query_orders" says "query": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
Search delivery orders, including completed ones, by placement-time window and status, with row-based paging: start_cursor/end_cursor select rows (e.g. 1–100, then 101–200; at most 100 per call) sorted newest first. Each row has timestamps (placement, assigned, picked up, delivered, failed), totals, driver payment, distance and carrier. Shipday: POST /orders/query.
```

## Claude Code permissions

For `.claude/settings.json`, assuming the server is installed as `shipday`:

```json
{
  "permissions": {
    "allow": [
      "mcp__shipday__list_active_orders",
      "mcp__shipday__get_order",
      "mcp__shipday__query_orders",
      "mcp__shipday__get_pickup_order",
      "mcp__shipday__get_delivery_progress",
      "mcp__shipday__list_carriers",
      "mcp__shipday__list_on_demand_services",
      "mcp__shipday__get_on_demand_estimate",
      "mcp__shipday__get_on_demand_details"
    ],
    "ask": [
      "mcp__shipday__check_on_demand_availability",
      "mcp__shipday__assign_order_to_carrier",
      "mcp__shipday__unassign_order",
      "mcp__shipday__set_order_ready_to_pickup"
    ],
    "deny": [
      "mcp__shipday__create_order"
    ]
  }
}
```

Capability tags behind the rules (a read tagged outbound is asked about):

- `mcp__shipday__list_carriers`: private-data, untrusted-input
- `mcp__shipday__get_on_demand_details`: untrusted-input
