The MCP server io.github.Jfromtheroc/the-profound-agency provides functionality for finding and comparing press placement options, including pricing, and supports ordering press placements across 1,600+ publications. It also offers free AI-visibility audits.
🛠️ Key Features
Search press placements
Price information for placements
Order press placements
Free AI-visibility audits
🚀 Use Cases
Evaluating press opportunities across 1,600+ publications
Comparing placement costs before ordering
Running AI-visibility audits as part of press planning
⚡ Developer Benefits
Consistent access to search, pricing, and ordering workflows for press placements
Retrieval of free AI-visibility audit results
⚠️ Limitations
Available details provided describe press placements for 1,600+ publications only; no other scope is specified.
Search the publisher network for editorial placements. Filter by price, Domain Authority, Domain Rating, category, region, turnaround and whether the outlet is Google-indexed or LLM-ready, link type and availability. Returns a page of matches, highest Domain Authority first by default. Each result carries the same fields as get_placement.
Parameters15
query
string
optional
Free text matched against publication name, domain and categories.
categories
array
optional
Match any of these categories, e.g. ["Crypto", "Health"].
minPrice
number
optional
Minimum price in USD.
maxPrice
number
optional
Maximum price in USD.
minDomainAuthority
number
optional
Minimum Moz Domain Authority (0-100).
minDomainRating
number
optional
Minimum Ahrefs Domain Rating (0-100).
maxTurnaroundDays
number
optional
Longest acceptable turnaround, in days.
region
string
optional
Substring match on the outlet's region.
googleIndexed
boolean
optional
Only outlets known to be indexed by Google.
llmReady
boolean
optional
Only outlets flagged as readable by AI crawlers.
linkFollow
string
optional
Only placements with this linkAttributes value. Today the catalog records dofollow only; every other listing is "unspecified", so nofollow, sponsored and ugc match nothing yet.
available
boolean
optional
true for placements that can be ordered now, false for unavailable ones.
sort
string
optional
limit
integer
optional
Results per page, 1-100. Default 20.
offset
integer
optional
Result offset, for paging.
Raw schema
{
"type": "object",
"properties": {
"query": {
"description": "Free text matched against publication name, domain and categories.",
"type": "string"
},
"categories": {
"description": "Match any of these categories, e.g. [\"Crypto\", \"Health\"].",
"type": "array",
"items": {
"type": "string"
}
},
"minPrice": {
"description": "Minimum price in USD.",
"type": "number"
},
"maxPrice": {
"description": "Maximum price in USD.",
"type": "number"
},
"minDomainAuthority": {
"description": "Minimum Moz Domain Authority (0-100).",
"type": "number"
},
"minDomainRating": {
"description": "Minimum Ahrefs Domain Rating (0-100).",
"type": "number"
},
"maxTurnaroundDays": {
"description": "Longest acceptable turnaround, in days.",
"type": "number"
},
"region": {
"description": "Substring match on the outlet's region.",
"type": "string"
},
"googleIndexed": {
"description": "Only outlets known to be indexed by Google.",
"type": "boolean"
},
"llmReady": {
"description": "Only outlets flagged as readable by AI crawlers.",
"type": "boolean"
},
"linkFollow": {
"description": "Only placements with this linkAttributes value. Today the catalog records dofollow only; every other listing is \"unspecified\", so nofollow, sponsored and ugc match nothing yet.",
"type": "string",
"enum": [
"dofollow",
"nofollow",
"sponsored",
"ugc",
"unspecified"
]
},
"available": {
"description": "true for placements that can be ordered now, false for unavailable ones.",
"type": "boolean"
},
"sort": {
"type": "string",
"enum": [
"price_asc",
"price_desc",
"da_desc",
"dr_desc",
"turnaround_asc"
]
},
"limit": {
"description": "Results per page, 1-100. Default 20.",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"offset": {
"description": "Result offset, for paging.",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
}
},
"$schema": "http://json-schema.org/draft-07/schema#"
}
get_placement
Full detail for one publication by its id (the slug from search_placements), including price, price with the 3.5% checkout processing fee, authority scores, turnaround, disclosure policy, link type (linkAttributes: "dofollow" where the store sells it as dofollow, otherwise "unspecified"; dofollowVariantId points to a separate dofollow package for the same outlet), whether it can be ordered now (available), the outlet's logo, and an example article where one is published.
Price a set of placements exactly as the store's checkout would, including the 3.5% processing fee. Use this to give a client a total before creating an order. Quoting does not reserve anything. Placements that are not available are refused.
Recommend a set of publications for a goal, audience and budget — already quoted, total inside budget including the 3.5% processing fee. Use this when a buyer says what they want to achieve and what they can spend, rather than naming publications. The shareUrl opens the store with the planned placements in the cart; the plan recommends, it reserves nothing.
Parameters5
goal
string
optional
What the coverage is for, e.g. "seo backlinks", "launch buzz".
audience
array
optional
Catalog categories, e.g. ["Crypto", "Health"].
budget
number
required
Maximum spend in USD, including the processing fee.
count
integer
optional
How many placements to aim for. Default 5.
minDomainAuthority
number
optional
Minimum Moz Domain Authority.
Raw schema
{
"type": "object",
"properties": {
"goal": {
"description": "What the coverage is for, e.g. \"seo backlinks\", \"launch buzz\".",
"type": "string"
},
"audience": {
"description": "Catalog categories, e.g. [\"Crypto\", \"Health\"].",
"type": "array",
"items": {
"type": "string"
}
},
"budget": {
"type": "number",
"exclusiveMinimum": 0,
"description": "Maximum spend in USD, including the processing fee."
},
"count": {
"description": "How many placements to aim for. Default 5.",
"type": "integer",
"minimum": 1,
"maximum": 20
},
"minDomainAuthority": {
"description": "Minimum Moz Domain Authority.",
"type": "number",
"minimum": 0,
"maximum": 100
}
},
"required": [
"budget"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}
create_order
Open a pending order for a client and return a payment link. IMPORTANT: this does not pay for anything. The order stays unpaid until a human opens the returned payUrl and pays on the store's checkout. Give the link to the client or to someone at your agency — you cannot complete payment yourself, and you must not tell the client the placement is bought until check_order_status reports paid: true. Confirm the placements and the total with a human before calling this. No account or API key is required, but an unpaid order is deleted automatically after 72 hours, so send the link promptly.
Parameters5
items
array
required
contact
object
required
placedBy
string
optional
Who you are — your agency or product name. Recorded as an unverified claim, purely so we can tell orders apart.
clientReference
string
optional
Your own reference for this client or campaign.
notes
string
optional
Anything the editorial team should know.
Raw schema
{
"type": "object",
"properties": {
"items": {
"minItems": 1,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Placement id."
},
"quantity": {
"description": "Defaults to 1.",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
}
},
"required": [
"id"
]
}
},
"contact": {
"type": "object",
"properties": {
"firstName": {
"type": "string",
"description": "Billing first name — whoever will pay."
},
"lastName": {
"type": "string"
},
"email": {
"type": "string",
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"description": "The payment link and receipt go here. Required to look the order up later."
},
"company": {
"description": "The client's brand or company.",
"type": "string"
},
"phone": {
"type": "string"
}
},
"required": [
"firstName",
"lastName",
"email"
]
},
"placedBy": {
"description": "Who you are — your agency or product name. Recorded as an unverified claim, purely so we can tell orders apart.",
"type": "string"
},
"clientReference": {
"description": "Your own reference for this client or campaign.",
"type": "string"
},
"notes": {
"description": "Anything the editorial team should know.",
"type": "string"
}
},
"required": [
"items",
"contact"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}
submit_campaign_brief
Submit a paid media brief for a client and have the team come back with a quote — impressions, placements and a recommendation. Use this for advertising campaigns (display, video, Connected TV, social, search, audio, out-of-home), which are priced per campaign; use create_order instead for buying a press placement from the publisher catalogue, which has a fixed price. Nothing is purchased or committed here: it opens a conversation, and a human prices it and replies. Pick capabilities when you know the outcome the client wants, products when you know the channels, or both. The response scores the brief's completeness (0-100) and lists the most valuable missing details — the brief is filed regardless, so ask the human for the gaps to get priced faster. Confirm the details with a human before sending.
Parameters9
contact
object
required
capabilities
array
optional
Outcomes the client wants, by slug. Use list_capabilities to see them.
channels
array
optional
Specific product slugs, as returned by search_placements or list_channels.
goal
string
optional
What the campaign should achieve.
geography
string
optional
Where it should run — cities, states, ZIPs or a radius.
budget
string
optional
Monthly budget, or a range.
timing
string
optional
When they want to start.
notes
string
optional
Anything else the team should know.
referredBy
string
optional
Who you are — your agent, agency or product. Recorded on the brief as an unverified claim so we can see which agents send work.
Raw schema
{
"type": "object",
"properties": {
"contact": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Who we should reply to."
},
"email": {
"type": "string",
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"description": "Where the quote goes."
},
"company": {
"description": "The client's brand or company.",
"type": "string"
},
"phone": {
"type": "string"
},
"website": {
"description": "The client's website.",
"type": "string"
}
},
"required": [
"name",
"email"
]
},
"capabilities": {
"description": "Outcomes the client wants, by slug. Use list_capabilities to see them.",
"type": "array",
"items": {
"type": "string",
"enum": [
"geo-fencing",
"website-retargeting",
"visit-tracking",
"identity-resolution",
"behavioural-targeting",
"custom-audience-lookalike",
"keyword-content-targeting",
"address-targeting",
"cross-platform",
"ai-optimisation",
"weather-trigger",
"lead-capture"
]
}
},
"channels": {
"description": "Specific product slugs, as returned by search_placements or list_channels.",
"type": "array",
"items": {
"type": "string"
}
},
"goal": {
"description": "What the campaign should achieve.",
"type": "string"
},
"geography": {
"description": "Where it should run — cities, states, ZIPs or a radius.",
"type": "string"
},
"budget": {
"description": "Monthly budget, or a range.",
"type": "string"
},
"timing": {
"description": "When they want to start.",
"type": "string"
},
"notes": {
"description": "Anything else the team should know.",
"type": "string"
},
"referredBy": {
"description": "Who you are — your agent, agency or product. Recorded on the brief as an unverified claim so we can see which agents send work.",
"type": "string"
}
},
"required": [
"contact"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}
request_audit
Request a free audit of whether AI systems — ChatGPT, Perplexity, Google's AI Overviews and crawling agents — can reach, read and quote a website. Scored out of 100 across crawler access, structured data, answer readiness, agent files, off-site authority and freshness, from public data only: no logins, no analytics access and nothing installed. Free, and nothing is purchased or committed. Use this when a client wants to know why assistants do not mention them; use submit_campaign_brief when they already want to buy media. A person reviews every audit and replies to the contact email — this tool does not return a score.
Parameters6
contact
object
required
website
string
required
The site to audit. A domain is enough.
track
string
optional
What is being audited: a brand or organisation, a local business with a physical catchment, or an individual and their personal brand. Shapes what we look at.
concerns
array
optional
What the client is worried about, in their own words — for example that a competitor gets named instead, or that their site is invisible to assistants.
notes
string
optional
Anything else worth knowing before we look.
referredBy
string
optional
Who you are — your agent, agency or product. Recorded as an unverified claim.
Raw schema
{
"type": "object",
"properties": {
"contact": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Who we should address the audit to."
},
"email": {
"type": "string",
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"description": "Where the audit goes."
},
"company": {
"description": "The client's brand or company.",
"type": "string"
},
"phone": {
"type": "string"
}
},
"required": [
"name",
"email"
]
},
"website": {
"type": "string",
"description": "The site to audit. A domain is enough."
},
"track": {
"description": "What is being audited: a brand or organisation, a local business with a physical catchment, or an individual and their personal brand. Shapes what we look at.",
"type": "string",
"enum": [
"brand",
"local",
"individual"
]
},
"concerns": {
"description": "What the client is worried about, in their own words — for example that a competitor gets named instead, or that their site is invisible to assistants.",
"type": "array",
"items": {
"type": "string"
}
},
"notes": {
"description": "Anything else worth knowing before we look.",
"type": "string"
},
"referredBy": {
"description": "Who you are — your agent, agency or product. Recorded as an unverified claim.",
"type": "string"
}
},
"required": [
"contact",
"website"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}
list_capabilities
The outcomes we can deliver — geo-fencing, website retargeting, visit tracking, identity resolution and so on — each in plain language with the products that provide it. Use this to translate what a client wants into what to ask for.
Every paid media product we run — Meta, Connected TV, geo-targeted mobile, search, audio, out-of-home and the rest — each with a one or two sentence description. The slugs are what submit_campaign_brief takes as channels. Use get_channel for the full detail of one.
The full detail for one paid media product: what it is, where the ads run, the creative formats, the targeting that can be layered on, and caveats — the limits and prerequisites a buyer should know before submitting a brief. Also lists the capabilities it delivers. Priced per campaign, so no price is returned; submit_campaign_brief gets a quote.
Parameters1
slug
string
required
Channel slug from list_channels, e.g. "geo-targeted-mobile".
Whether a restricted category — alcohol, cannabis/CBD, tobacco, casinos, firearms, supplements, political, housing, loans, crypto and the rest — can run on a channel, and with what limits (age gates, restricted targeting, pre-approval). Give a channel slug from list_channels to check one, or leave it out to see every channel; add a two-letter state for state-level rules. Policy changes without notice, so treat the answer as guidance to confirm with the team.
Parameters3
category
string
required
What is being advertised, e.g. "CBD", "casino", "real estate".
channel
string
optional
A channel slug from list_channels, e.g. "meta".
state
string
optional
US state as a two-letter code, e.g. "NJ".
Raw schema
{
"type": "object",
"properties": {
"category": {
"type": "string",
"minLength": 2,
"description": "What is being advertised, e.g. \"CBD\", \"casino\", \"real estate\"."
},
"channel": {
"description": "A channel slug from list_channels, e.g. \"meta\".",
"type": "string"
},
"state": {
"description": "US state as a two-letter code, e.g. \"NJ\".",
"type": "string"
}
},
"required": [
"category"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}
compare_placements
Two to four publications side by side: price, Domain Authority and Rating, turnaround, region, disclosure, indexing and categories, with which is cheapest, fastest and highest in authority. Use ids from search_placements. Figures only — which is better depends on what the client wants.
Five basics of whether AI systems can read a website, checked instantly from its public pages: AI crawlers allowed in robots.txt, an llms.txt, Organization and FAQ structured data, and a title and description. Free, no score, nothing stored. For the full audit — scored out of 100 and reviewed by a person — use request_audit.
Parameters1
website
string
required
The site to check. A domain is enough, e.g. "example.com".
Raw schema
{
"type": "object",
"properties": {
"website": {
"type": "string",
"minLength": 3,
"description": "The site to check. A domain is enough, e.g. \"example.com\"."
}
},
"required": [
"website"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}
get_catalog_changes
What each weekly catalogue sync changed: publications added and removed, and price changes, newest first. Filter by a date (only newer syncs), a maximum price, one or more categories, a minimum Domain Authority, additions only, or price drops only — so an agent can watch for new outlets or cheaper placements without re-reading the whole catalogue.
Parameters7
since
string
optional
ISO date; only syncs after it. Use the newest date you have seen.
maxPrice
number
optional
Only publications at or under this price, in USD.
category
string
optional
Only publications in a category, e.g. "Crypto".
categories
array
optional
Only publications in any of these categories.
minDomainAuthority
number
optional
Only publications at or above this Moz Domain Authority.
newOnly
boolean
optional
Only additions — the weekly "what's new" watch.
priceDropsOnly
boolean
optional
Only price reductions.
Raw schema
{
"type": "object",
"properties": {
"since": {
"description": "ISO date; only syncs after it. Use the newest date you have seen.",
"type": "string"
},
"maxPrice": {
"description": "Only publications at or under this price, in USD.",
"type": "number"
},
"category": {
"description": "Only publications in a category, e.g. \"Crypto\".",
"type": "string"
},
"categories": {
"description": "Only publications in any of these categories.",
"type": "array",
"items": {
"type": "string"
}
},
"minDomainAuthority": {
"description": "Only publications at or above this Moz Domain Authority.",
"type": "number",
"minimum": 0,
"maximum": 100
},
"newOnly": {
"description": "Only additions — the weekly \"what's new\" watch.",
"type": "boolean"
},
"priceDropsOnly": {
"description": "Only price reductions.",
"type": "boolean"
}
},
"$schema": "http://json-schema.org/draft-07/schema#"
}
ask
A question in plain words, answered from theprofound.agency with source URLs: publication prices, whether a category can advertise on a channel, the fee, refund terms, definitions, channel requirements, and anything the FAQs, glossary, channel pages or articles cover. Answers are quoted or read from live data, never generated; answer is null when the site does not cover it.
Parameters1
question
string
required
The question, e.g. "How much does USA Today cost?"
Raw schema
{
"type": "object",
"properties": {
"question": {
"type": "string",
"minLength": 3,
"maxLength": 500,
"description": "The question, e.g. \"How much does USA Today cost?\""
}
},
"required": [
"question"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}
get_availability
Real open slots from the agency's appointment calendar: 30-minute meetings on weekdays, booked in the agency's timezone. Returns each slot's start, end and a readable label. A slot is not a booking — hand the human a link from create_booking_link so they confirm it.
Parameters2
daysAhead
integer
optional
How many days out to look. Default 7, max 30.
durationMinutes
integer
optional
Meeting length in minutes. Default 30.
Raw schema
{
"type": "object",
"properties": {
"daysAhead": {
"description": "How many days out to look. Default 7, max 30.",
"type": "integer",
"minimum": 1,
"maximum": 30
},
"durationMinutes": {
"description": "Meeting length in minutes. Default 30.",
"type": "integer",
"minimum": 15,
"maximum": 120
}
},
"$schema": "http://json-schema.org/draft-07/schema#"
}
create_booking_link
The agency's booking URL for a 30-minute meeting, returned with the human's name and email as separate fields. Give the human the URL and ask them to enter the name and email on the booking page — the meeting does not exist until they confirm it there. Never present a meeting as booked on the strength of this link alone, and never put the name or email into the URL yourself.
Parameters2
name
string
required
The human's full name, to show them alongside the booking link.
email
string
required
The human's email, to show them alongside the booking link.
Raw schema
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"description": "The human's full name, to show them alongside the booking link."
},
"email": {
"type": "string",
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"description": "The human's email, to show them alongside the booking link."
}
},
"required": [
"name",
"email"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}
create_text_link
A text message to the agency's number, (908) 448-4001, prepared for the human to send from their own phone: returns the message and an sms: link that opens their messaging app with it filled in. Nothing is sent until the human taps send, so show them the message first and never send it for them without their go-ahead. For a scheduled call, create_booking_link is better; use this for a quick question or to ask for a call back.
Parameters3
name
string
required
The human's name, as it should appear in the text.
message
string
required
What they want to say or ask, in their words.
company
string
optional
Their business, if they want it in the text.
Raw schema
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"description": "The human's name, as it should appear in the text."
},
"message": {
"type": "string",
"minLength": 1,
"maxLength": 400,
"description": "What they want to say or ask, in their words."
},
"company": {
"description": "Their business, if they want it in the text.",
"type": "string"
}
},
"required": [
"name",
"message"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}
check_order_status
Payment and fulfilment state for an order you created. Requires the billing email the order was placed with, which is what stops anyone reading anyone else's order. Returns paid: false plus the payment link while it is still awaiting payment. An order that was never paid and has been swept will report as not found.
Parameters2
orderId
integer
required
The orderId returned by create_order.
email
string
required
The billing email on that order.
Raw schema
{
"type": "object",
"properties": {
"orderId": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "The orderId returned by create_order."
},
"email": {
"type": "string",
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"description": "The billing email on that order."
}
},
"required": [
"orderId",
"email"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}
submit_article_draft
File the client's article draft against a paid order. The order id plus the billing email on the order prove ownership — a wrong pairing reads exactly like a missing order. The order must be paid: an unpaid order has bought nothing yet. The draft goes to the editorial team; a human reviews and approves it before anything is published, so never tell the client it is published or scheduled. Confirm the draft text with a human before filing.
Parameters6
orderId
integer
required
The orderId returned by create_order.
email
string
required
The billing email on that order.
draft
string
required
The article text the client wrote.
title
string
optional
Working title for the piece.
authorName
string
optional
Byline, if the client wants one.
referredBy
string
optional
Who you are — your agent, agency or product. Recorded as an unverified claim so we can see which agents send work.
Raw schema
{
"type": "object",
"properties": {
"orderId": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "The orderId returned by create_order."
},
"email": {
"type": "string",
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"description": "The billing email on that order."
},
"draft": {
"type": "string",
"minLength": 1,
"maxLength": 50000,
"description": "The article text the client wrote."
},
"title": {
"description": "Working title for the piece.",
"type": "string"
},
"authorName": {
"description": "Byline, if the client wants one.",
"type": "string"
},
"referredBy": {
"description": "Who you are — your agent, agency or product. Recorded as an unverified claim so we can see which agents send work.",
"type": "string"
}
},
"required": [
"orderId",
"email",
"draft"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}
get_client_order
For a paid order: its stage, what we need next, the content the client sent, the latest outline or draft we wrote, and the publication with a sample of its writing. Needs the client's private order link, which only they have; a wrong or revoked link reads like a missing order.
Parameters1
orderLink
string
required
The client's private order link (https://theprofound.agency/order/<id>/#t=…), or just the token after #t=. It is the "Open your order page" button in the order confirmation email sent when the order is paid.
Raw schema
{
"type": "object",
"properties": {
"orderLink": {
"type": "string",
"minLength": 10,
"description": "The client's private order link (https://theprofound.agency/order/<id>/#t=…), or just the token after #t=. It is the \"Open your order page\" button in the order confirmation email sent when the order is paid."
}
},
"required": [
"orderLink"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}
submit_content
What the article should be built from, the same as the form on the client's order page. Needs at least who they are and what the article should say, or a draft of their own. Only while the order is waiting for content; sending again replaces the earlier version. We then write an outline for the client to approve. Confirm the content with the client before sending.
Parameters9
orderLink
string
required
The client's private order link (https://theprofound.agency/order/<id>/#t=…), or just the token after #t=. It is the "Open your order page" button in the order confirmation email sent when the order is paid.
about
string
optional
Who the client is, in a few sentences.
angle
string
optional
Their news, launch, milestone or point of view.
facts
string
optional
Proof points: numbers, results, credentials, awards, a quote from them in their exact words.
links
array
optional
Up to three links; most publications allow two or three.
name
string
optional
How the article should name them: a person, a business or a pen name.
photo
string
optional
A link to a photo.
draft
string
optional
A draft of their own, if they have one. Client-written articles are more likely to be turned down by editors, so expect edits.
notes
string
optional
Anything else.
Raw schema
{
"type": "object",
"properties": {
"orderLink": {
"type": "string",
"minLength": 10,
"description": "The client's private order link (https://theprofound.agency/order/<id>/#t=…), or just the token after #t=. It is the \"Open your order page\" button in the order confirmation email sent when the order is paid."
},
"about": {
"description": "Who the client is, in a few sentences.",
"type": "string",
"maxLength": 1500
},
"angle": {
"description": "Their news, launch, milestone or point of view.",
"type": "string",
"maxLength": 2000
},
"facts": {
"description": "Proof points: numbers, results, credentials, awards, a quote from them in their exact words.",
"type": "string",
"maxLength": 3000
},
"links": {
"description": "Up to three links; most publications allow two or three.",
"maxItems": 3,
"type": "array",
"items": {
"type": "object",
"properties": {
"url": {
"type": "string"
},
"anchor": {
"type": "string"
}
},
"required": [
"url"
]
}
},
"name": {
"description": "How the article should name them: a person, a business or a pen name.",
"type": "string",
"maxLength": 200
},
"photo": {
"description": "A link to a photo.",
"type": "string",
"maxLength": 500
},
"draft": {
"description": "A draft of their own, if they have one. Client-written articles are more likely to be turned down by editors, so expect edits.",
"type": "string",
"maxLength": 20000
},
"notes": {
"description": "Anything else.",
"type": "string",
"maxLength": 1000
}
},
"required": [
"orderLink"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}
review_content
The client's decision on the latest outline or draft from get_client_order. Approving an outline starts the draft; approving the draft sends it to our editors for a final read, and cannot be undone. Show the client the full text and get their explicit go-ahead first. Changes can be asked for twice per piece; after that our team works with the client directly.
Parameters4
orderLink
string
required
The client's private order link (https://theprofound.agency/order/<id>/#t=…), or just the token after #t=. It is the "Open your order page" button in the order confirmation email sent when the order is paid.
piece
string
required
action
string
required
feedback
string
optional
With action "changes": what to change, in the client's words.
Raw schema
{
"type": "object",
"properties": {
"orderLink": {
"type": "string",
"minLength": 10,
"description": "The client's private order link (https://theprofound.agency/order/<id>/#t=…), or just the token after #t=. It is the \"Open your order page\" button in the order confirmation email sent when the order is paid."
},
"piece": {
"type": "string",
"enum": [
"outline",
"draft"
]
},
"action": {
"type": "string",
"enum": [
"approve",
"changes"
]
},
"feedback": {
"description": "With action \"changes\": what to change, in the client's words.",
"type": "string",
"maxLength": 2000
}
},
"required": [
"orderLink",
"piece",
"action"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}
Your AI agent can now buy press. 1,600+ publications. Zero touch points. No API key.
Your AI agent can now buy press. This is a hosted MCP server that gives any AI assistant direct access to The Profound Agency's network of 1,600+ publications: search placements by price and authority, price a set of them, build a plan for a budget, and open an order. It can also quote paid-media campaigns and run AI-visibility checks on any website.
No API key, no account, no signup. Point your client at the endpoint and go.
Endpoint:https://theprofound.agency/api/mcp/ (Streamable HTTP, stateless, no auth)
search_placements searches 1,600+ press publications by price, Domain Authority, Domain Rating, category, region, turnaround time, Google indexing status, and AI-crawler readiness.
quote_placements returns exact checkout pricing including fees, plus a link that opens the store with those placements in the cart. It reserves nothing.
plan_placements takes a goal, an audience, and a budget, and returns a recommended set of publications, already quoted and inside budget.
create_order opens an unpaid order and returns a human-readable payment link. A human must open the link and pay. Unpaid orders are deleted after 72 hours.
request_audit requests a free AI-visibility audit scored out of 100. A person runs it and replies by email.
quick_visibility_check instantly checks five AI-visibility basics for any site: AI crawlers in robots.txt, llms.txt, structured data, title, and description.
submit_campaign_brief asks for a quote on a paid media campaign across display, CTV, social, search, audio, and out-of-home. A person prices it and replies. It buys nothing.
No tool can access a payment method. No tool spends money.
See it work
A real session, start to finish:
You: My startup is launching next month. I have $3,000 for press. What can I get?
Agent: I'll search the network for startup-friendly publications under your budget. (calls search_placements: category "startups", max price 3000)
Agent: I found 14 options. The strongest three for a launch are Mid-Day (DA 78, $621, dofollow, 5-day turnaround), The Detroit Journal (DA 64, $440), and The American Reporter (DA 71, $890). Total: $1,951, leaving room for a second wave. (calls quote_placements to lock in exact pricing)
Agent: Exact total with fees: $2,048. Here's your order link, nothing is reserved until you pay: (calls create_order, returns payment link)
You: Done, paid. What's next?
Agent: Your content is due in 21 days. When your draft is ready I can submit it through submit_content.
No emails, no calls, no back and forth. The agent did the research, the comparison, the quoting, and the paperwork. The human only paid.
Recipes
Copy, paste, adapt:
Plan a launch campaign
I have a $5,000 budget to promote my sustainable skincare brand launching in March. Search the press network for beauty and lifestyle publications, compare them on price and Domain Authority, and build me a plan that stays inside budget.
Audit my AI visibility
Run a quick visibility check on example.com, then request the full free audit.
Price a media buy
I want to run display and CTV ads for a DTC beverage brand with a $20k monthly budget. Submit a campaign brief and tell me what happens next.
Who it's for
Founders and marketers who want to plan and price PR from inside Claude, Cursor, or any MCP client
Agencies building agents that quote press placements for their clients
Anyone who wants to know whether AI assistants can find and cite their website
claude mcp add --transport http profound-agency https://theprofound.agency/api/mcp/
Tools
24 tools, 22 of them read-only. The ones you'll use most:
Tool
What it does
search_placements
Search the network by price, Domain Authority, Domain Rating, category, region, turnaround, Google indexing and AI-crawler readiness.
quote_placements
Price a set of placements exactly as checkout would, fees included. Returns a link that opens the store with those placements in the cart. Reserves nothing.
plan_placements
Give it a goal, audience and budget; get back a recommended set of publications, already quoted and inside budget.
submit_campaign_brief
Ask for a quote on a paid media campaign (display, CTV, social, search, audio, out-of-home). A person prices it and replies. Buys nothing.
quick_visibility_check
An instant check of five AI-visibility basics for any site: AI crawlers in robots.txt, llms.txt, structured data, title and description.
request_audit
Request the full, free AI-visibility audit, scored out of 100. A person runs it and replies by email.
The rest cover publication detail and comparisons, categories, advertising channels and restricted-category rules, meeting availability, order status, and the client content workflow. The full list with descriptions is in the manifest and on the docs page.