UK B2B data for agents, agent to agent
Twenty-two tools to count, preview, quote and, with a human's approval, buy UK B2B data. Looking is free. Spending needs a quote and a person.
The MCP server for MyDataHub by Emailmovers, at https://mydatahub.emailmovers.com/mcp, gives an AI agent 22 tools. They count UK business contacts, preview them, quote an order and, with a human's approval, buy and fetch the records. 19 of the tools are always free, 2 spend credits, and the price of lookup_company is to be confirmed.
Looking needs no token. Spending needs a quote_id from quote_order plus a human's confirmation, and a confirmation flag set by the model is never consent. The server's name is mydatahub, its version is 2.0.0 and it speaks streamable HTTP.
How do you connect an agent?
Add https://mydatahub.emailmovers.com/mcp as a remote MCP server in any client that supports streamable HTTP. The path /mcp is
accepted as an alias.
The server supports MCP revision 2026-07-28 and keeps 2025-11-25 clients working. Authentication is lazy: catalogue, counts, previews, quotes and pricing need no token, and the first 401 arrives only when a tool needs your account.
At launch an assistant connects with the same mdh_live_ API key that works on the REST API, sent as a bearer token. Signing in with OAuth 2.1 and PKCE from the client, with no key to copy, is planned for after launch. The server's instructions read: "Count first, preview second, quote third, then create_order. Counting, previewing and quoting are free; one credit buys one complete UK record. create_order needs a quote_id from quote_order."
What are the 22 tools?
The tools come back in this fixed order every time, so a host's prompt cache keeps hitting. Each has a title, a description of three to six sentences, an input schema, an output schema and read or write hints. Errors return isError true with a code, a detail, a next_step and a did_you_mean.
| Tool | Purpose | Cost | Hints | Scope |
|---|---|---|---|---|
get_plans | Plans, credit prices, licence terms, trial | Free | read | none |
get_account | Balance, plan, per-action prices, rate limit, key budget | Free | read | account:read |
list_filters | Every dimension with slug, type and value count, plus the dataset list | Free | read | none |
search_filter_values | Values in one dimension by text, with counts and did_you_mean | Free | read | none |
expand_job_titles | Keywords or a bundle expanded into an editable title list | Free | read | none |
resolve_location | Free text to region, county, town, postcode or radius | Free | read | none |
compile_audience | Plain English brief to an audience definition and a readback | Free | read | none |
count_audience | Total, New to you, Emailable, breakdowns, quality, compliance_summary, estimate, count id | Free | read | none; exact small counts need a paid plan |
preview_records | Masked rows with verification badges and why each matches | Free | read | none (10 rows in the app, up to 25 by API) |
save_audience | Create or update a named audience shared across the organisation | Free | write | audiences:write |
list_audiences | Saved audiences with current counts and last refresh | Free | read | audiences:read |
list_field_sets | Field bundles with exact columns and credits per record | Free | read | none |
quote_order | Machine quote: records after overlap and suppression, credits, GBP, licence, 24 hour quote_id | Free | read | none |
create_order | Spends credits against a quote_id after human confirmation or within an agent key budget | 1 credit per record | write | orders:write |
get_order | Status, counts, download and receipt links, or the recent list | Free | read | orders:read |
fetch_order_records | Token-budgeted pages, JSON or CSV, licence block per page | Free under licence | read | records:read |
push_to_crm | Dry run by default; live push needs approval; records only, never sends | Free | write, open world | pushes:write |
lookup_company | Companies House fields and contacts held, by number, domain or name; no contact details | To be confirmed (0 credits proposed) | read | none |
enrich_contact | Full record for one known person, charged only on a confident match | 1 credit on match | write | enrich:write |
check_suppression | Suppression status per record id before a send | Free | read | suppressions:read |
report_objection | Records an objection and propagates it to every licensee | Free | write | suppressions:write |
get_compliance_receipt | Signed JWS receipt and PDF for an order | Free | read | orders:read |
Read means readOnlyHint true. Write means readOnlyHint false, destructiveHint false and idempotentHint true. Only push_to_crm is open world. Phase 2 tools, reserved behind scopes: verify_emails, list_signals, create_alert, refresh_audience, delete_audience.
Each tool description states in one sentence the lawful basis (UK GDPR Article 6(1)(f)) and the corporate subscriber rule, so an agent repeats the right rule to its user.
How does an agent spend safely?
Looking is free, and every spend follows a signed machine quote. A machine quote lasts 24 hours and is bound to one dataset version. A human sales quote is a different object: it lasts 14 days and is a PDF payable by card or invoice link.
- Quote first. create_order without a live quote_id fails with "Call quote_order first; a quote is valid for 24 hours" and nothing is charged. It is idempotent on the quote_id plus an Idempotency-Key, so a retry never double-charges.
- Human proof. On hosts that support elicitation, create_order returns a confirmation form such as "Spend 5,000 credits for 5,000 contacts, 12 month multi-use licence", with the price bought the cheapest way. Hosts without forms open a confirmation page on mydatahub.emailmovers.com, which returns a token bound to the signed-in user.
- Hard limits. A pre-authorised agent key skips the human step only when its per-order cap covers the quote and its monthly budget remains. Agent keys are planned for phase 2 (February to May 2027), so at launch every order takes the human step.
When the balance is short, the response is 402 insufficient-credits with the quote and a Stripe Checkout top-up link on mydatahub.emailmovers.com. Money never moves inside a Claude connector or ChatGPT app. When no human is present and no key covers the spend, no order is created, and the agent keeps the quote_id for a person to approve later in the app.
What does a run look like?
A Claude user asks for "300 finance directors at law firms in Manchester". The steps are the same for any client.
- The assistant calls compile_audience, then count_audience, and shows you the chips and the count.
- It calls preview_records for a masked sample, then quote_order for the credits, priced the cheapest way.
- create_order returns the confirmation form, and you accept it.
- fetch_order_records returns the rows in token-budgeted pages, and get_compliance_receipt returns the signed receipt.
A quote can also move between agents. If one agent cannot spend, it hands the quote id to a colleague's agent in the same organisation. That agent calls GET /v1/quotes/{id}, then create_order with its own credentials and its human's confirmation. Outside the organisation the audience is re-quoted on the payer's plan, and the original quote is never charged.
How does an agent prove a list is licensed?
Every order issues a compliance receipt as a JWS signed with ES256, with the public key at https://mydatahub.emailmovers.com/.well-known/jwks.json and a PDF twin in the app. It records the order, the dataset version, the records delivered and the suppressions removed. It also holds the counts by subscriber class, TPS and CTPS status and Article 14 status, the lawful basis, the licence block and a hash of the file.
POST /v1/compliance/receipts/verify takes the receipt without an account and returns valid, order_exists, licence_in_force_until and revoked. One agent can therefore prove to another that a list is licensed, and the receipt shows how its numbers are labelled for TPS and CTPS.
Which resources and prompts does the server offer?
| Resource | Visibility | Cached for |
|---|---|---|
mydatahub://catalogue | public | 24 hours |
mydatahub://pricing | public | 1 hour |
mydatahub://compliance | public | 24 hours |
mydatahub://datasets | public | 24 hours |
mydatahub://audiences/{id} | private | not cached |
mydatahub://orders/{id} | private | not cached |
Prompts: build_list (who, where, how_many), senior_decision_makers (sector, area), quote_from_brief (brief), refresh_saved_audience (audience_id), explain_compliance (use_case).
What do agents get for free?
- The filter catalogue, with values and counts.
- Title expansion, so the agent sees every title it will match.
- Location resolution, which asks when a place is ambiguous instead of guessing.
- Counts and breakdowns, with the compliance summary and the credit estimate.
- Masked samples, up to 25 rows by API and none when the count is under 25.
- Machine quotes, plans, datasets and the trust documents.
How does it compare with other vendors' MCP servers?
Tool counts are ranges because vendors change them. Everything below was read on 26 September 2026.
| Server | Tools | Authentication | Spend control |
|---|---|---|---|
| MyDataHub | 22 | The same API key as REST at launch; OAuth 2.1 with PKCE planned | Signed 24-hour quote, then a human's confirmation |
| Apollo | About 40 to 50 | OAuth, or a master X-Api-Key for headless use | Cost stated in tool descriptions |
| ZoomInfo | 22 to 26 | OAuth with PKCE plus client credentials | Charged after completion |
| Lusha | 21 to 24 | OAuth or x-api-key | Tools default to enriching and spend on the first call |
| Cognism | Not live (announced) | Not applicable | Not applicable |
Sources: Apollo MCP documentation, GTM.AI for ZoomInfo and Lusha MCP documentation.
What happens to the current MyDataHub MCP server?
It stays at https://mcp.mydatahub.uk, on today's MyDataHub, until the new server supports OAuth sign-in for clients, so the connector installs made there keep working. The new server is at https://mydatahub.emailmovers.com/mcp, and at launch an assistant connects to it with an API key.
Which machine-readable files are there?
| File | Where | Content |
|---|---|---|
/llms.txt, /llms-full.txt | mydatahub.emailmovers.com and emailmovers.com/mydatahub/docs | Product, pricing, compliance, API, MCP, guides; every docs page has a .md twin |
/pricing.json | mydatahub.emailmovers.com | Plans, credit prices in GBP ex VAT, meters, refunds, action path |
/agents.json | mydatahub.emailmovers.com | MCP endpoint, authorization oauth2, protocols, skills link |
/v1/openapi.json | mydatahub.emailmovers.com | OpenAPI 3.1 with x-cost-credits per operation; schemas shared with the MCP outputSchema |
/licence.json, /compliance.json, /trust.json | mydatahub.emailmovers.com | Licence terms per plan, compliance statement, trust page as JSON |
/.well-known/agent-card.json, security.txt, oauth-protected-resource, jwks.json | mydatahub.emailmovers.com | A2A card, RFC 9116, RFC 9728, compliance receipt signing key |
Frequently asked questions
Which clients can connect?
Any client that supports remote MCP servers over streamable HTTP can connect to https://mydatahub.emailmovers.com/mcp with a MyDataHub API key. Listings in the Claude directory, then in ChatGPT apps and Cursor, are planned and are not live yet.
Does an agent need an account?
Not to look. Counting, previewing, expanding titles, resolving places and quoting are free and need no token. The first call that needs your account returns a sign-in challenge.
Can an agent spend without asking me?
Not at launch. Every order needs a quote_id plus your confirmation through the client, and a confirmation flag set by the model is never consent. Budgeted agent keys, which let you pre-authorise spending up to a limit you set, are planned for phase 2.
What stops an agent buying the wrong list?
A quote spells out the records, credits, GBP total, licence and warranty before anything is charged, and the confirmation names the amount. A quote is bound to one dataset version and expires after 24 hours.
Can another agent check that a list is licensed?
Yes. Every order issues a signed compliance receipt, and POST /v1/compliance/receipts/verify takes the receipt without an account and returns whether it is valid, whether the order exists and when the licence ends.