LastFolk MCP by usefulapi

Price, dispatch, track and cancel same-day courier deliveries in LastFolk.

Should I use this

Quality & Safety

A
Description quality
98%
Schema completeness
72%
Naming quality
98%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Findings (1)

  • LOWTool 'lastfolk_update_billing_profile' name length outside 3-30 rangein lastfolk_update_billing_profile

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~3,090Tokens (tool definitions)
~2.6 KBTypical response size
Significant attention impact (2.41% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "lastfolk": {
      "url": "https://lastfolk.usefulapi.io/mcp"
    }
  }
}

Remote endpoints

https://lastfolk.usefulapi.io/mcpstreamable-http

What it can do

Tool inventory

Tools (9)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢lastfolk_whoami

Show which LastFolk tenant and environment (sandbox or production) this API key belongs to, plus the key prefix and last four characters. Use it to confirm the key works. GET /v1/whoami.

Input Schema

{
  "type": "object",
  "properties": {},
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢lastfolk_check_environment

Check that the API key environment matches the connected courier provider account, before any delivery is created. Returns match: true when they agree. A mismatch is an error. GET /v1/environment.

Input Schema

{
  "type": "object",
  "properties": {},
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢lastfolk_create_quote(pickup, dropoff, manifest)

Price a pickup-to-dropoff delivery and get a quote_id. Reserves nothing and charges nothing. The quote is single-use and expires at expires_at; pass quote_id to lastfolk_create_delivery before then. Price amounts are decimal strings: never parse them as floats. POST /v1/quotes.

Input Schema

{
  "type": "object",
  "properties": {
    "pickup": {
      "type": "object",
      "properties": {
        "address": {
          "type": "string",
          "description": "Full human-readable address line. Shown in LastFolk surfaces."
        },
        "street_address": {
          "type": "string",
          "description": "Street line ONLY: no city and no country."
        },
        "city": {
          "type": "string"
        },
        "country": {
          "type": "string",
          "pattern": "^[A-Za-z]{2}$",
          "description": "ISO 3166-1 alpha-2 country code, for example CL. Required: it is never inferred."
        },
        "state": {
          "description": "Subdivision, where the country uses one.",
          "type": "string"
        },
        "postal_code": {
          "type": "string"
        },
        "latitude": {
          "type": "number",
          "minimum": -90,
          "maximum": 90
        },
        "longitude": {
          "type": "number",
          "minimum": -180,
          "maximum": 180
        },
        "details": {
          "description": "Apartment, floor, access notes.",
          "type": "string"
        }
      },
      "required": [
        "address",
        "street_address",
        "city",
        "country"
      ],
      "description": "Where the courier collects the order."
    },
    "dropoff": {
      "type": "object",
      "properties": {
        "address": {
          "type": "string",
          "description": "Full human-readable address line. Shown in LastFolk surfaces."
        },
        "street_address": {
          "type": "string",
          "description": "Street line ONLY: no city and no country."
        },
        "city": {
          "type": "string"
        },
        "country": {
          "type": "string",
          "pattern": "^[A-Za-z]{2}$",
          "description": "ISO 3166-1 alpha-2 country code, for example CL. Required: it is never inferred."
        },
        "state": {
          "description": "Subdivision, where the country uses one.",
          "type": "string"
        },
        "postal_code": {
          "type": "string"
        },
        "latitude": {
          "type": "number",
          "minimum": -90,
          "maximum": 90
        },
        "longitude": {
          "type": "number",
          "minimum": -180,
          "maximum": 180
        },
        "details": {
          "description": "Apartment, floor, access notes.",
          "type": "string"
        }
      },
      "required": [
        "address",
        "street_address",
        "city",
        "country"
      ],
      "description": "Where the courier delivers the order."
    },
    "manifest": {
      "description": "Optional declared contents of the shipment.",
      "type": "object",
      "properties": {
        "items": {
          "minItems": 1,
          "maxItems": 45,
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "maxLength": 120
              },
              "quantity": {
                "type": "integer",
                "minimum": 1,
                "maximum": 9007199254740991
              },
              "weight": {
                "description": "Per-unit weight in GRAMS.",
                "type": "integer",
                "minimum": 1,
                "maximum": 9007199254740991
              },
              "dimensions": {
                "type": "object",
                "properties": {
                  "length": {
                    "type": "number",
                    "exclusiveMinimum": 0,
                    "description": "Centimeters."
                  },
                  "height": {
                    "type": "number",
                    "exclusiveMinimum": 0,
                    "description": "Centimeters."
                  },
                  "depth": {
                    "type": "number",
                    "exclusiveMinimum": 0,
                    "description": "Centimeters."
                  }
                },
                "required": [
                  "length",
                  "height",
                  "depth"
                ]
              },
              "price": {
                "description": "Per-unit price in subunits x100 of the order currency (CLP 12.500 is 1250000).",
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "must_be_upright": {
                "type": "boolean"
              }
            },
            "additionalProperties": false
          },
          "description": "Declared lines. Aggregate lines instead of one line per unit."
        },
        "total_value": {
          "description": "Declared goods value in subunits x100 of the order currency.",
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        }
      },
      "required": [
        "items"
      ]
    }
  },
  "required": [
    "pickup",
    "dropoff"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢lastfolk_list_deliveries(status, external_order_id, created_after, created_before, limit, ...)

List your deliveries, newest first, with status, tracking URL and ETAs. Filter by status, your external_order_id, or a created date range. Page with next_cursor. The dropoff PIN is not in lists: use lastfolk_get_delivery. GET /v1/deliveries.

Input Schema

{
  "type": "object",
  "properties": {
    "status": {
      "description": "Only these statuses. Repeat values to match several.",
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "pending",
          "dispatched",
          "pickup",
          "in_transit",
          "delivered",
          "cancelled",
          "failed",
          "returned"
        ]
      }
    },
    "external_order_id": {
      "description": "Your own order id. Not unique: returns every match.",
      "type": "string"
    },
    "created_after": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
      "description": "ISO 8601 date-time, for example 2026-11-01T09:00:00Z."
    },
    "created_before": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
      "description": "ISO 8601 date-time, for example 2026-11-01T09:00:00Z."
    },
    "limit": {
      "description": "Page size, 1 to 100 (default 25).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "cursor": {
      "description": "next_cursor from the previous page. Pass it back unchanged.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢lastfolk_get_delivery(delivery_id)

Read one delivery: status, tracking URL, ETAs, timestamps, and the dropoff verification_pin the recipient gives the courier. The PIN is a secret: share it only with the recipient. GET /v1/deliveries/{delivery_id}.

Input Schema

{
  "type": "object",
  "properties": {
    "delivery_id": {
      "type": "string",
      "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
      "description": "The delivery_id returned when the delivery was created."
    }
  },
  "required": [
    "delivery_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴lastfolk_create_delivery(quote_id, idempotency_key, external_order_id, dropoff, customer_email, ...)

DISPATCHES a real courier job against a quote_id from lastfolk_create_quote, and starts the billing for it. The quote must be unused and not expired. Use a unique idempotency_key per delivery (an order id works): a retry with the same key and body returns the original delivery and never dispatches a second courier. The same key with a different body is refused. dropoff.phone must be a real, reachable number. POST /v1/deliveries.

Input Schema

{
  "type": "object",
  "properties": {
    "quote_id": {
      "type": "string",
      "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
      "description": "quote_id from lastfolk_create_quote. Single-use."
    },
    "idempotency_key": {
      "type": "string",
      "minLength": 1,
      "maxLength": 255,
      "description": "Unique per delivery attempt, 1 to 255 characters, sent as the Idempotency-Key header. An order id works."
    },
    "external_order_id": {
      "description": "Your own order reference. Echoed on the delivery and in webhooks.",
      "type": "string"
    },
    "dropoff": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "description": "Recipient name."
        },
        "phone": {
          "type": "string",
          "pattern": "^\\+[1-9]\\d{6,14}$",
          "description": "Recipient phone, E.164. The courier calls this number."
        }
      },
      "required": [
        "name",
        "phone"
      ],
      "description": "Recipient contact."
    },
    "customer_email": {
      "type": "string"
    },
    "pickup_notes": {
      "description": "Instructions for the courier at pickup.",
      "type": "string"
    },
    "manifest": {
      "description": "Optional declared contents of the shipment.",
      "type": "object",
      "properties": {
        "items": {
          "minItems": 1,
          "maxItems": 45,
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "maxLength": 120
              },
              "quantity": {
                "type": "integer",
                "minimum": 1,
                "maximum": 9007199254740991
              },
              "weight": {
                "description": "Per-unit weight in GRAMS.",
                "type": "integer",
                "minimum": 1,
                "maximum": 9007199254740991
              },
              "dimensions": {
                "type": "object",
                "properties": {
                  "length": {
                    "type": "number",
                    "exclusiveMinimum": 0,
                    "description": "Centimeters."
                  },
                  "height": {
                    "type": "number",
                    "exclusiveMinimum": 0,
                    "description": "Centimeters."
                  },
                  "depth": {
                    "type": "number",
                    "exclusiveMinimum": 0,
                    "description": "Centimeters."
                  }
                },
                "required": [
                  "length",
                  "height",
                  "depth"
                ]
              },
              "price": {
                "description": "Per-unit price in subunits x100 of the order currency (CLP 12.500 is 1250000).",
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "must_be_upright": {
                "type": "boolean"
              }
            },
            "additionalProperties": false
          },
          "description": "Declared lines. Aggregate lines instead of one line per unit."
        },
        "total_value": {
          "description": "Declared goods value in subunits x100 of the order currency.",
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        }
      },
      "required": [
        "items"
      ]
    }
  },
  "required": [
    "quote_id",
    "idempotency_key",
    "dropoff"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴lastfolk_cancel_delivery(delivery_id)

Cancel a delivery that the courier has not collected yet (status pending or pickup). Cancelling a delivery that is already cancelled succeeds with changed: false. After pickup, the API refuses with delivery_not_cancellable. Cancelling moves no money in the same call. POST /v1/deliveries/{delivery_id}/cancel.

Input Schema

{
  "type": "object",
  "properties": {
    "delivery_id": {
      "type": "string",
      "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
      "description": "The delivery to cancel."
    }
  },
  "required": [
    "delivery_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢lastfolk_get_billing_profile

Read the account's fiscal identity: legal company name, tax ID and type, and billing address. Exactly seven fields, each text or null. GET /v1/billing-profile.

Input Schema

{
  "type": "object",
  "properties": {},
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴lastfolk_update_billing_profile(legal_company_name, tax_id, tax_id_type, billing_address_street, billing_address_city, ...)

Change the account's fiscal identity. Fields you omit or send empty keep their stored value. Send null to clear one field. The tax ID is checked against the resulting billing country, and the whole update is refused if it fails. Changes flow to billing records and invoices. PUT /v1/billing-profile.

Input Schema

{
  "type": "object",
  "properties": {
    "legal_company_name": {
      "type": [
        "string",
        "null"
      ]
    },
    "tax_id": {
      "type": [
        "string",
        "null"
      ]
    },
    "tax_id_type": {
      "anyOf": [
        {
          "type": "string",
          "enum": [
            "VAT",
            "RUT",
            "RFC",
            "EIN",
            "CUIT",
            "NIT",
            "OTHER"
          ]
        },
        {
          "type": "null"
        }
      ]
    },
    "billing_address_street": {
      "type": [
        "string",
        "null"
      ]
    },
    "billing_address_city": {
      "type": [
        "string",
        "null"
      ]
    },
    "billing_address_postal_code": {
      "type": [
        "string",
        "null"
      ]
    },
    "billing_address_country": {
      "description": "ISO 3166-1 alpha-2 country code.",
      "type": [
        "string",
        "null"
      ]
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded9 tools