Skip to content
cccskills
FreePublished on GitHub

ops-package

Ship parcels via any configured carrier — MyParcel, Sendcloud, DHL Parcel NL, PostNL, DPD, UPS, FedEx. Auto-selects the first carrier whose credentials are configured, or pass --carrier <name> to override. Verbs: ship, label, track, list, carriers.

The English summary is being prepared. Showing the original description.

See how to install

Files included (10)

  • SKILL.md8.2 KB
  • lib/carriers/dhl.sh6.1 KB
  • lib/carriers/dpd.sh6.5 KB
  • lib/carriers/fedex.sh7.4 KB
  • lib/carriers/myparcel.sh6.5 KB
  • lib/carriers/postnl.sh6.5 KB
  • lib/carriers/sendcloud.sh5.4 KB
  • lib/carriers/ups.sh7.0 KB
  • lib/common.sh5.4 KB
  • ops-package.sh4.4 KB

SKILL.md (original)

Review the instructions the agent will receive before you install.

OPS ► PACKAGE — multi-carrier shipping

One skill, seven carriers. The router picks the carrier automatically based on which credentials are configured.

Which carrier do I get?

ConditionSelected carrier
--carrier <name> flag passedThat carrier (validated)
Exactly one carrier has credentialsThat carrier
Multiple carriers have credentialsFirst match in this order
No carrier has credentialsExit 2 with setup help

Preference order: myparcel → sendcloud → dhl → postnl → dpd → ups → fedex.

Credential resolution

Each carrier resolves its credential(s) from, in order:

  1. Environment variable(s) listed below.
  2. preferences.json key (lowercase of the env var name) at ${CLAUDE_PLUGIN_DATA_DIR:-$HOME/.claude/plugins/data/ops-ops-marketplace}/preferences.json.
  3. Doppler: doppler secrets get <NAME> --plain.
CarrierEnv vars requiredDocs
MyParcelMYPARCEL_API_KEYhttps://developer.myparcel.nl/api-reference/
SendcloudSENDCLOUD_PUBLIC_KEY + SENDCLOUD_PRIVATE_KEYhttps://api.sendcloud.dev/docs/
DHL NLDHL_PARCEL_USER_ID + DHL_PARCEL_KEYhttps://api-gw.dhlparcel.nl/docs
PostNLPOSTNL_API_KEY + POSTNL_CUSTOMER_CODE + POSTNL_CUSTOMER_NUMBERhttps://developer.postnl.nl/
DPDDPD_DELIS_ID + DPD_PASSWORDhttps://esolutions.dpd.com/
UPSUPS_CLIENT_ID + UPS_CLIENT_SECRET + UPS_SHIPPER_NUMBERhttps://developer.ups.com/api/reference/shipping
FedExFEDEX_CLIENT_ID + FEDEX_CLIENT_SECRET + FEDEX_ACCOUNT_NUMBERhttps://developer.fedex.com/api/en-us/catalog/

Routing

All API calls are delegated to ${CLAUDE_PLUGIN_ROOT}/skills/ops-package/ops-package.sh. Do not re-implement curl logic inline — pass args through.

First tokenAction
carriersShow configured vs unconfigured carriers
shipCreate a shipment
labelDownload + open label PDF
trackShow status + tracking barcode
listList last 10 shipments (MyParcel / Sendcloud; others unsupported)
(empty)Show usage

ship

Required: --to "<address>". Address format:

"Person / Company, Street 12A, 1011AB Amsterdam, NL"
  • / Company segment is optional.
  • Postcode accepts with/without space; NL postcodes are normalised to uppercase without space.
  • Country defaults to NL; common names (Netherlands, Belgium, Germany, France, UK, USA) map to ISO codes.

Flags (not every carrier honours every flag — unsupported flags are safely ignored per adapter):

  • --from "<address>" override sender; default is the account's configured sender.
  • --weight <grams> integer grams.
  • --package-type 1|2|3 1=parcel (default), 2=mailbox, 3=letter (MyParcel only).
  • --signature require signature on delivery.
  • --insurance <EUR> integer EUR; 0 disables (MyParcel only).
  • --description "<text>" label reference (carriers differ; ~45 char max).
  • --pickup request home pickup at sender (MyParcel only).

Invocation

${CLAUDE_PLUGIN_ROOT}/skills/ops-package/ops-package.sh \
  [--carrier myparcel|sendcloud|dhl|postnl|dpd|ups|fedex] \
  ship --to "$TO" [--from "$FROM"] [--weight "$W"] \
       [--signature] [--insurance "$INS"] [--description "$DESC"] \
       [--package-type "$TYPE"] [--pickup]

Returns:

{"carrier": "<name>", "shipment_id": "<id>", "response": { /* raw carrier JSON */ }}

Summarise to the user as:

Shipment created — <carrier> #<id>
Next: /ops:ops-package label <id>  to download the PDF.

Offer via AskUserQuestion (≤4 options):

  • [Download label now] — call label <id> immediately
  • [Track it] — call track <id>
  • [Ship another]
  • [Done]

label <shipment-id>

${CLAUDE_PLUGIN_ROOT}/skills/ops-package/ops-package.sh label "$ID"

Behaviour per carrier:

  • MyParcel: PDF saved to /tmp/myparcel_label_<id>.pdf and opened on macOS. If unpaid, returns {"status":"payment_required","payment_url":"..."} and opens the MultiSafepay URL.
  • Sendcloud: Fetches the CDN PDF URL (v2 /labels/<id>) and saves locally.
  • DHL NL: Fetches /labels/<id>?format=PDF&printerType=A4.
  • DPD: Fetches /v1/parcellabelnumber/<id>?paperFormat=A4.
  • PostNL / UPS / FedEx: PDF is returned inline with the ship call and cached to /tmp/<carrier>_label_<id>.pdf. Calling label re-opens that cached file. If the cache is gone, re-run ship (none of these carriers expose a stable label-recovery endpoint here).

track <shipment-id>

Returns a normalised object across all carriers:

{"carrier":"<n>","id":"<id>","status":"<s>","barcode":"<b>","tracking_url":"<u>","recipient":<o>,"updated":"<ts>"}

list

MyParcel returns the last 10 shipments. Sendcloud returns the last 10 parcels. All other carriers return {"shipments":[],"note":"..."} because their APIs don't expose a customer-facing list endpoint — track by id instead.

carriers

Prints which carriers are configured (✓) vs which are missing credentials (·). Use this when deciding which --carrier to pass.

Error handling

  • No carrier configured → script exits 2 with a checklist of envs. Surface it verbatim, then via AskUserQuestion: [Paste key now] [Open carriers doc] [Skip — configure later] On "Paste key now", collect via AskUserQuestion free-text and write to preferences.json.
  • 4xx from carrier → dump the JSON error body and stop. Do not retry silently.
  • Address parser looks wrong → re-prompt the user with the parsed breakdown and ask for corrections before POSTing.

Verification status

CarrierStatus
MyParcelVerified against api.myparcel.nl v1.1 (same working reference)
SendcloudVerified request/response shapes against Sendcloud Panel API v3
DHL NLUNVERIFIED — modelled on My DHL Parcel Swagger, needs live account
PostNLUNVERIFIED — modelled on Send API v2.2 docs, needs live account
DPDUNVERIFIED — modelled on DPD eSolutions REST, needs live account
UPSUNVERIFIED — modelled on UPS v2403 Ship/Track REST, needs account
FedExUNVERIFIED — modelled on FedEx Ship v1 + Track v1 REST

Unverified adapters are tagged with # UNVERIFIED - pending live test with account in the source. Payloads match the documented contract; adjustments may be needed when tested against live accounts.

Reviews

No reviews yet. Tell others what you thought.

Comments

No login needed. Share how it worked for you, ask a question, or note where it did not run.

No comments yet. Be the first to write one.

Comments are published right away. Do not include personal information such as email addresses or phone numbers. Up to 2 URLs.

0 / 1,000 characters

This form is protected by reCAPTCHA, and the Google Privacy Policy and Terms of Service apply.

More skills from this repository

Automate ActiveCampaign tasks via Rube MCP (Composio): manage contacts, tags, list subscriptions, automation enrollment, and tasks. Always search tools first for current schemas.

The English summary is being prepared. Showing the original description.

davepoon/buildwithclaude3.7KUpdated Oct 19, 2026

Pull the ads a competitor is running right now on Meta (Facebook/Instagram) and Google, then extract the hooks, offers, CTAs and landing pages worth modelling. Use when writing ad copy, planning creative tests, choosing a landing page angle, or when the user asks "what is X advertising", "what ads does X run", "find competitor ad hooks". Reads live Ad Library and Ads Transparency data through the Tracetify MCP; falls back to a manual Ad Library walkthrough when the connector is absent.

The English summary is being prepared. Showing the original description.

davepoon/buildwithclaude3.7KUpdated Oct 19, 2026

Analytics your AI agent can actually use. Track, analyze, run A/B experiments, and optimize across all your projects via CLI. Includes a growth playbook so your agent knows HOW to grow, not just what to track.

The English summary is being prepared. Showing the original description.

davepoon/buildwithclaude3.7KUpdated Oct 19, 2026

Teaches when to recall from long-term memory before acting and when to save durable decisions, corrections and failures afterwards. Use when a memory tool or MCP memory server is connected but the agent is not using it consistently, when the user complains that the assistant forgets preferences, conventions or past decisions between sessions, or when setting up persistent memory for a project. Works with any memory backend: a folder of Markdown files, a local MCP server, or a managed service.

The English summary is being prepared. Showing the original description.

davepoon/buildwithclaude3.7KUpdated Oct 19, 2026

Audit local AI coding-agent sessions with agenttrace for cost, tokens, tool failures, latency, anomalies, health, diffs, and CI gates.

The English summary is being prepared. Showing the original description.

davepoon/buildwithclaude3.7KUpdated Oct 19, 2026

Checks which private files (.env, keys, secrets) Claude Code and its subagents reached in this project, whether a value came into an agent's context, and which key to change, by running the open source agentwhy CLI over the session records Claude Code already keeps on disk. Use when the user asks whether the agent or a subagent read their .env or other secrets, which private files a session touched, whether a key leaked into the conversation, or which key to rotate. Runs locally and never prints a secret value.

The English summary is being prepared. Showing the original description.

davepoon/buildwithclaude3.7KUpdated Oct 19, 2026

See all skills by davepoon

Report a problem with this skill