LastFolk MCP by usefulapi
Price, dispatch, track and cancel same-day courier deliveries in LastFolk.
Should I use this
Quality & Safety
Findings (1)
- LOWin lastfolk_update_billing_profile
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
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-httpWhat it can do
Tool inventory
Tools (9)
🟢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
Evidence