The admin MCP is research reads plus fulfillment order reads. Connect at https://linkdr.com/mcp, then fetch a skill so the agent does not spray twenty SERP lookups on the first message.
Research tools
DR, traffic, keywords, and industry for one to 100 hosts. Use one call for a competitor list.
Substring search over keywords we already track. Does not run new Google research.
Organic, video, and ads for one keyword. Cache-only by default. SERP Update uses refresh-serp limits.
Imported YouTube, Instagram, and TikTok creators by name, handle, or topic.
Emails we already have, by domain, email, or page URL. Not a live scrape.
Publisher marketplace we fulfill from. Inventory, not a Google SERP.
Ops tools
Admin ops — fulfillment reads. These tools read customer orders, projects, and billing data from Postgres. Same OAuth and admin gate. No refund, cancel, or charge.
Filter fulfillment orders by status, project, customer, date, or billing.
One order with line items, target URLs, amounts, and Stripe ids.
Customer projects, owners, and order counts.
One project plus its ten most recent orders.
Users who have at least one order.
Counts by status and billing for daily digests.
How to use them
The model picks the tool. You still want an order of operations.
If the user named a site, start with get_domains with a one-item domains array. When that returns a row, use its keywords and industry as seeds. When it returns a miss after the live attempt, ask for two or three seed phrases. Do not pretend we know the DR.
If they named many hosts (competitors, SERP domains, a list), call get_domains once with up to 100 hosts.
If they named a keyword, skip the domain lookup. Go to search_keywords, then get_keyword_serp. Cap SERP calls at about five keywords per turn. More than that burns the rate limit and the user's patience.
From SERP rows, keep the targets you would actually pitch. Each row includes rank, title, url, domain, description, and email (best cached address, or null). Use email first, then get_contacts or search_creators when you need the full record.
search_domains is a different job. It searches publishers we can place on, not Google. Use it when someone asks for inventory. Use SKILL.md when they want to buy.
For fulfillment status, start with summarize_orders, then list_orders. Fetch ops orders. MCP reads Postgres only. Placeholders do not mean “no intake.” Slack and Notion search is in-app Eve (sync-order-context), not these tools.
Empty results
found / miss on domains, no_snapshot on SERP, and missing emails are all valid. Keyword SERP stays cache-only unless refresh: true requests a SERP Update. The honest reply is "LinkDR could not return that." Inventing a ranking or an address is worse than a short miss.
Rate limit
120 calls per user per hour. Each tool call counts. Plan the fan-out before you loop.
Each tool page has a request and a response sample. get_keyword_serp returns { items: [...] } with cached email on each row.