---
name: linkdr-ops-orders
description: >-
  Read LinkDR fulfillment orders, projects, and customers from the admin MCP.
  Use for daily digests, onboarding status, and open-order review. Connect
  https://linkdr.com/mcp and complete LinkDR OAuth as an admin. Fetch
  https://linkdr.com/docs/admin/skills/ops-orders/SKILL.md.
version: 0.1.0
homepage: https://linkdr.com/docs/admin/skills/ops-orders/SKILL.md
---

# LinkDR: ops orders

**Start here:** You are reading `https://linkdr.com/docs/admin/skills/ops-orders/SKILL.md`. The file is complete only if the last line is `END SKILL v0.1.0`.

This skill uses the **LinkDR admin MCP**. It reads Postgres orders. It does **not** buy backlinks and it does **not** talk to Stripe as a coder plugin. For new placements, fetch `https://linkdr.com/SKILL.md` instead.

## Connect

Add the MCP URL only. The client must use MCP OAuth (401 + Protected Resource Metadata). Do not ask the user to paste a token in chat.

```json
{
  "mcpServers": {
    "linkdr": {
      "url": "https://linkdr.com/mcp"
    }
  }
}
```

Sign-in is the user's LinkDR account. These tools require an admin user. Non-admins receive 403.

Ops tools you may call: `summarize_orders`, `list_orders`, `get_order`, `list_projects`, `get_project`, `list_customers`.

Research tools stay available on the same server. Do not invent order rows. `miss` means LinkDR could not find that id.

This MCP does **not** search Slack or Notion. `get_project` may include `adminReport` after Eve synced those workspaces. `pending-*.linkdr.local` is a sentinel because `OrderItem.domain` is required; it is not a pipeline stage. Unmatched slots do not prove missing intake.

## Decision tree

1. Open queue / “what is open?” → `summarize_orders({})` then `list_orders({ status: "ACCEPTED", pageSize: 20 })` and `list_orders({ status: "WORKING", pageSize: 20 })`. Do not pass `createdFrom`, `createdTo`, `q`, or `customerEmail` to `list_orders`. Active orders may have been created before today.
2. New intake today → `summarize_orders({ createdFrom: "<start of today UTC>" })`. Pass `createdFrom` to `list_orders` only when the user asks for orders **created** today.
3. One order id from Slack or email (`BSKF-2EW8-L9NT`) → `get_order({ orderId })`. Hyphens are optional. Use `items[].targetUrl`, `items[].status`, and Stripe ids only when present.
4. A site, slug, or target URL → `list_orders({ q: "reelsfarm" })`. Or `list_projects({ q })` / `get_project({ slug })`.
5. A customer email → `list_orders({ customerEmail })` or `list_customers({ q })`.

`billing` on orders is inferred from `Order.metadata.billing === "monthly"`. There is no `Order.billingType` column.

## Example: morning digest (open queue)

1. `summarize_orders({})`
2. `list_orders({ status: "ACCEPTED", pageSize: 20 })`
3. `list_orders({ status: "WORKING", pageSize: 20 })`
4. For each attention order, `get_order` only when line items are needed.

Write a short card: counts, then one line per open order (id, project domain, status, item progress). Do not refund, cancel, or charge.

## Do not

- Quote backlink prices from this file
- Send users to `/onboarding`
- Ask the user to paste an access token in chat
- Call refund, cancel, or charge APIs
- Dump customer emails into a public channel
- Pass `createdFrom`, `createdTo`, `q`, or `customerEmail` to `list_orders` during an open-queue digest unless the user asks for a narrower list

END SKILL v0.1.0
