⏱ Time savings estimate
Developers building internal tools typically spend 1–3 hours per shipping feature integrating individual carrier APIs. With AI Parcels and Claude, you describe the task in plain English and Claude fetches the prices directly. Teams report saving hours per sprint on logistics automation.
Two ways to set this up
Choose the approach that matches how you use Claude:
- Option A — Claude.ai Projects (zero code): Paste the SKILL.md into a Project. Perfect for personal use and non-technical users. Takes 60 seconds.
- Option B — Anthropic Tool Use API: Map the AI Parcels OpenAPI schema to Claude's tool definitions for a fully automated pipeline.
Option A — Claude.ai Projects
This takes under 60 seconds:
- Open claude.ai and click Projects in the sidebar.
- Create a new project — e.g. "Shipping Assistant".
- Click Add content and paste the full contents of the AI Parcels SKILL.md.
- Add a system prompt: "You are a UK parcel shipping assistant. Use the AI Parcels skill to fetch live quotes. Present prices in £ and include delivery dates."
- Open a new chat within the project and ask for a quote.
Option B — Anthropic Tool Use API
For production apps, use Claude's native Tool Use API to map AI Parcels endpoints as callable tools. Here's a minimal TypeScript example:
shipping-tool.ts
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic();
const tools = [
{
name: "get_shipping_quotes",
description: "Fetch real-time UK parcel quotes from Evri, DPD, Royal Mail and more.",
input_schema: {
type: "object",
properties: {
originPostcode: { type: "string", description: "UK origin postcode" },
destinationPostcode: { type: "string", description: "Destination postcode" },
weight: { type: "number", description: "Parcel weight in kg" },
length: { type: "integer", description: "Length in cm" },
width: { type: "integer", description: "Width in cm" },
height: { type: "integer", description: "Height in cm" },
},
required: ["originPostcode", "destinationPostcode", "weight"],
},
},
];
async function getQuotes(input: Record<string, unknown>) {
const params = new URLSearchParams(input as Record<string, string>);
const res = await fetch(
`https://api.ai.parcels.dotnethelp.co.uk/.api/quote/shipments/GB/GB?${params}`
);
return res.json();
}
const response = await client.messages.create({
model: "claude-opus-4-5",
max_tokens: 1024,
tools,
messages: [{ role: "user", content: "Cheapest parcel SW1A 2AA to EH2 2EQ, 2kg?" }],
});
if (response.stop_reason === "tool_use") {
const toolUse = response.content.find((b) => b.type === "tool_use");
if (toolUse?.type === "tool_use") {
const quotes = await getQuotes(toolUse.input as Record<string, unknown>);
console.log(quotes);
}
}