Medialyst MCP
Medialyst is the data layer for your agent. The remote MCP server exposes a small set of authenticated research and monitoring tools:
https://medialyst.ai/api/mcpMost tools share a service contract with Medialyst's public developer API.
list_journalist_requests is intentionally MCP-only.
Want a full PR agent, not just tools?
Medialyst provides the data; newsjack.sh is the open-source agent that turns it into a full PR team — angles, fit-scored journalist lists, and drafted pitches. If you'd rather not wire the primitives together yourself, start there.
Authentication
You have two ways to connect, and both grant the same scoped, org-level access:
- OAuth — for chat clients like Claude.ai and ChatGPT. Paste the MCP URL, authorize Medialyst when prompted, pick your organization, and you're in. No API key to paste.
- API key — for clients that send an
Authorizationheader (Claude Code, Cursor, Codex) and for CI. Create a key from Developers, store it in secret storage or an environment variable, and send it as a bearer token:
Authorization: Bearer <YOUR_API_KEY>Existing connections
Existing full-access connections were upgraded automatically. If you deliberately narrowed a credential, create a new key or reconnect to grant project access.
Clients without custom headers or OAuth
If a client can't attach an Authorization header or use OAuth, pass the key on the URL as ?api_key=<YOUR_API_KEY>. The server strips the query parameter and treats it as the same bearer token. Because the key sits in the URL, intermediate proxies, CDNs, or access logs may record it — use a dedicated key with the minimum scopes, and revoke and rotate it from Developers if it leaks.
Required Scopes
| Scope | Needed for |
|---|---|
| Valid credential; no special scope | Polling the zero-credit journalist-request feed; all six platforms are included for free |
| Active Scale plan; no special scope | Polling the zero-credit journalist-moves feed |
news:search | Searching recent news coverage |
media_lists:manage | Creating, polling, and reading media lists; looking up articles/publications; enriching journalists; and polling enrichment jobs |
projects:manage | Creating and maintaining projects, durable memory, project files, and Radar; the organization must also have the relevant feature enabled |
Connect Your Agent
Claude.ai and ChatGPT (OAuth)
Add Medialyst as a custom connector with just the URL — no header, no key:
- Settings → Connectors → Add custom connector
- Name:
Medialyst - Remote MCP server URL:
https://medialyst.ai/api/mcp - Leave advanced settings empty. Add it, then authorize Medialyst with OAuth when prompted and choose your organization.
ChatGPT custom connectors are currently rolling out for Plus and Pro.
Claude Code
export MEDIALYST_API_KEY="<YOUR_API_KEY>"
claude mcp add --transport http --scope user medialyst https://medialyst.ai/api/mcp \
--header "Authorization: Bearer $MEDIALYST_API_KEY"Verify in Claude Code:
/mcpClaude Desktop
{
"mcpServers": {
"medialyst": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://medialyst.ai/api/mcp",
"--header",
"Authorization: ${AUTH_HEADER}"
],
"env": {
"AUTH_HEADER": "Bearer <YOUR_API_KEY>"
}
}
}
}Cursor
{
"mcpServers": {
"medialyst": {
"url": "https://medialyst.ai/api/mcp",
"headers": {
"Authorization": "Bearer ${env:MEDIALYST_API_KEY}"
}
}
}
}Then start Cursor from a shell where the key is exported:
export MEDIALYST_API_KEY="<YOUR_API_KEY>"
cursor .Codex
[mcp_servers.medialyst]
url = "https://medialyst.ai/api/mcp"
bearer_token_env_var = "MEDIALYST_API_KEY"Then export the key before starting Codex:
export MEDIALYST_API_KEY="<YOUR_API_KEY>"
codex mcp listCommand line (newsjack)
newsjack is the open-source PR CLI built on Medialyst. Connect it with one command:
newsjack loginApprove the browser prompt and the CLI authenticates with OAuth device login — no API key to copy out of the terminal. Install instructions live at newsjack.sh. CI and power users can still set a MEDIALYST_API_KEY instead.
Other Clients
Use the Streamable HTTP endpoint and bearer header directly:
MCP URL: https://medialyst.ai/api/mcp
Transport: Streamable HTTP
Header: Authorization: Bearer <YOUR_API_KEY>If your client only supports stdio servers, bridge to the remote endpoint with
mcp-remote.
Tool Surface
| MCP tool | Backing public surface | Scope |
|---|---|---|
get_credit_balance | GET /api/v1/credits/balance | API key |
create_media_list | POST /api/v1/media-lists:create-async | media_lists:manage |
get_media_list_job | GET /api/v1/jobs/:jobId | media_lists:manage |
get_media_list | GET /api/v1/media-lists/:mediaListId | media_lists:manage |
list_projects | GET /api/v1/projects | projects:manage |
create_project | POST /api/v1/projects | projects:manage |
get_project | GET /api/v1/projects/:projectId | projects:manage |
update_project | PATCH /api/v1/projects/:projectId | projects:manage |
delete_project | DELETE /api/v1/projects/:projectId | projects:manage |
get_project_memory | GET /api/v1/projects/:projectId/memory | projects:manage |
get_radar | GET /api/v1/projects/:projectId/radar | projects:manage |
set_up_radar | POST /api/v1/projects/:projectId/radar | projects:manage |
run_radar | POST /api/v1/projects/:projectId/radar/run | projects:manage |
update_radar | PUT /api/v1/projects/:projectId/radar | projects:manage |
update_radar_settings | PATCH /api/v1/projects/:projectId/radar | projects:manage |
list_radar_opportunities | GET /api/v1/projects/:projectId/radar | projects:manage |
send_radar_feedback | POST /api/v1/projects/:projectId/radar/opportunities/:opportunityId/feedback | projects:manage |
get_radar_today | GET /api/v1/radar/today | projects:manage |
set_project_memory | PUT /api/v1/projects/:projectId/memory | projects:manage |
add_project_memory_line | POST /api/v1/projects/:projectId/memory/lines | projects:manage |
upload_project_file | POST /api/v1/projects/:projectId/files:upload-text | projects:manage |
list_project_files | GET /api/v1/projects/:projectId/files | projects:manage |
get_project_file | GET /api/v1/projects/:projectId/files/:fileId | projects:manage |
delete_project_file | DELETE /api/v1/projects/:projectId/files/:fileId | projects:manage |
lookup_article | GET /api/v1/articles/lookup | media_lists:manage |
lookup_articles | POST /api/v1/articles/lookup:batch | media_lists:manage |
lookup_publication | GET /api/v1/publications/lookup | media_lists:manage |
lookup_publications | POST /api/v1/publications/lookup:batch | media_lists:manage |
list_journalist_requests | MCP-only | Any valid credential; no special scope |
list_journalist_moves | GET /api/v1/journalist-moves | API key; active Scale plan |
search_news | POST /api/v1/news/search | news:search |
query_pr_calendar | POST /api/v1/pr-calendar/query | news:search |
enrich_journalists | POST /api/v1/journalists/enrich | media_lists:manage |
get_journalist_enrichment_job | GET /api/v1/journalist-enrichment-jobs/:jobId | media_lists:manage |
Only these 34 tools are exposed. Media-list creation, polling, and completed table reads use the same public API operations shown above; other table mutations and share-link creation stay outside the hosted MCP surface.
Example Workflows
Set up a project from one prompt
Ask your agent:
Create a Medialyst project for Acme, add our durable client facts and ranking preferences, upload the launch brief as Markdown, and tell me when the file is ready for media-list planning.Expected sequence:
- Call
create_projectand save the returned project id. - Call
add_project_memory_lineonce per durable fact. Use one ofAbout the client,Ranking preferences,Never, orPitch voice; a ranking preference or hard exclusion needs a reason after a colon. - Call
upload_project_filewith a human-readable title and its text content. The title may omit an extension: Medialyst appends.mdby default or.txtformime_type: "text/plain". With nomime_type,.txtselects plain text and.md/.markdownselects Markdown. An explicit format and extension must agree. - Poll
get_project_fileuntil its status isreadyorfailed.
All project tools require projects:manage. Memory and file tools follow the app's plan rules and return PROJECT_CONTEXT_UPGRADE_REQUIRED on the Free plan. set_project_memory is a full-document compare-and-set operation: call get_project_memory first and pass its version as expected_version.
To set up Radar, use list_projects → get_project_memory → set_up_radar →
list_radar_opportunities. Ground all five required RADAR.md sections in project memory;
the API never auto-enrolls an organization when the Radar flag is off.
Use run_radar for an additional scan. The setup-time scan does not count;
two Scan-now runs are allowed per Radar local day.
Call get_radar before update_radar and pass its markdownVersion as
expected_version. Use update_radar_settings to pause or resume scanning or
change the local scan hour or digest setting. Slack delivery uses a per-Radar
Incoming Webhook: pass slack_webhook_url plus slack_digest_enabled: true,
and optionally send_test: true. During setup, a supplied webhook enables
Slack unless slack_digest_enabled is explicitly false. Later URL replacements
preserve the current enabled state. Set slack_webhook_url to null or an
empty string to remove the destination and disable Slack. Webhooks are
write-only secrets: get_radar and mutation responses return only redacted
delivery.slack status and a masked tail, never the URL. These calls reuse the
existing projects:manage scope. Send verdicts with
send_radar_feedback, including undo, and use get_radar_today for the
paginated, markdown-free organization view. list_radar_opportunities returns at most 50 items;
when page.truncated is true, call it again with page.next_cursor.
Build and inspect a media list
Ask your agent:
Build a media list of up to 40 credits for US journalists covering enterprise AI infrastructure, wait for it to finish, and show me the completed rows.Expected sequence:
- Call
create_media_listwithprompt,target_list_size, and a stablerequest_options.idempotency_key.target_list_sizeis the maximum credit budget, not a promised number of journalists. - Save
job_id,media_list_id,workflow_id,media_list_url, andresults_urlfrom the accepted response. - Poll
get_media_list_jobwithjob_idevery 10 to 15 seconds untilstatusiscomplete,failed, orcancelled. The response'snext_toolfield gives the next call and arguments. - On
complete, callget_media_listwith the returnedmedia_list_id,include_rows: true,row_detail: "full", andlimit: 100. - Continue with
page.next_cursoruntil it isnull.
{
"prompt": "Find US journalists covering enterprise AI infrastructure.",
"target_list_size": 40,
"request_options": {
"idempotency_key": "enterprise-ai-launch-2026-09"
}
}The three MCP tools are thin adapters over the canonical REST create, poll,
and read operations. Authentication, organization isolation, scopes, plan and
free-tier gates, effective credit budget, idempotency, errors, and response
fields therefore follow the public API contract. A 404 from a poll or read
may mean that the identifier belongs to another organization; do not guess or
substitute identifiers.
Screen new journalist requests
Ask your agent to screen new source requests every hour:
List journalist requests observed after 2026-08-09T13:00:00Z. Keep draining pages, screen each request, and save the final next cursor for the next hourly run.Expected sequence:
- Call
list_journalist_requestswithsinceand an optionallimitfrom 1 to 250. - Process the returned requests idempotently by stable
id. - While
page.has_moreis true, call the tool again with onlypage.next_cursorascursor. - When
page.has_moreis false, save that same cursor for the next hour.
See the Journalist Requests MCP guide for timestamp collision handling, the normalized schema, source exclusions, privacy policy, and a checkpointing cron example.
Track journalist moves
Ask your agent to poll journalist moves every morning (requires a Scale plan):
List journalist moves observed after 2026-08-14T00:00:00Z. Keep draining pages, record each move, and save the final next cursor for tomorrow's run.Expected sequence:
- Call
list_journalist_moveswithsinceand an optionallimitfrom 1 to 250. - Process the returned moves idempotently by stable
id. - While
page.has_moreis true, call the tool again with onlypage.next_cursorascursor. - When
page.has_moreis false, save that same cursor for the next morning.
See the Journalist Moves API guide for the de-duplication rule, the match-state default, and a checkpointing cron example.
Look up articles and publications
Use lookup_article when you need canonical metadata for one known article;
set include_markdown: true only when the extracted body is needed. Use
lookup_articles for 1-10 URLs. Batch article lookup never includes Markdown.
Use lookup_publication to resolve an article or outlet URL to canonical
publication metadata. Use lookup_publications for 1-25 cached/default URLs.
When force_refresh: true, publication batches are capped at five URLs and may
be rate-limited more aggressively, so prefer cached/default lookup unless stale
metadata is unacceptable.
Article lookup costs 0.1 credit per successful URL. Publication lookup costs 0.01 credit per successful URL. Per-URL failures cost 0 credits for both, so batch budgets depend on successful results rather than submitted URL count.
{
"urls": [
"https://example.com/story-one",
"https://example.org/story-two"
],
"force_refresh": true
}Research news and enrich journalists
Ask your agent:
Search recent AI agents coverage and find 5 journalists I should pitch on a related angle.Expected sequence:
get_credit_balancequery_pr_calendarwhen the user needs planning moments or pitch timingsearch_newswith a specific recency window when discovering journalists from coverageenrich_journalistswith a known journalist reference or a selected article URL, plusfit_context.pitchget_journalist_enrichment_jobuntil the job is complete or failed
For a known journalist, use this canonical input:
{
"from": [
{
"type": "journalist_reference",
"name": "Jane Doe",
"publication": "The Daily Example"
}
]
}Notes
list_journalist_requestsrequires exactly one of an exclusive RFC 3339sincetimestamp or the preceding opaquecursor. It is free, costs zero credits, requires no special scope, and returns at most 250 records per page.- The journalist-request feed includes Connectively (formerly Featured), HARO, Twitter/X, LinkedIn, MentionMatch, and Substack for every authenticated account, all for free. The feed does not expose private email, paid contact data, upstream IDs, or credentials.
- Every
list_journalist_requestsresponse carries a mandatory top-levelnoticefield. Screening, ranking, filtering, and summarizing are permitted; automating outreach is a Terms of Service violation. See Journalist Requests. list_journalist_movesrequires exactly one of an exclusive RFC 3339sincetimestamp or the preceding opaquecursor. It requires an active Scale plan, costs zero credits, returns at most 250 de-duplicated moves per page, and filters on when Medialyst observed each move — not the move's effective date.search_newsreturns up to 10 results per call. Usepage: 2,page: 3, and so on for deeper coverage. Do not use the deprecatednumparameter.query_pr_calendaris free, costs 0 credits per successful call, and returns source-backed PR moments with pitch timing fields.lookup_articleaccepts one absolute HTTP(S) URL and optionalinclude_markdown;lookup_articlesaccepts 1-10 absolute URLs and has no Markdown option.lookup_publicationaccepts one absolute HTTP(S) URL and optionalforce_refresh;lookup_publicationsaccepts 1-25 URLs normally or at most five withforce_refresh: true.- Article lookups cost 0.1 credit per successful URL; publication lookups cost 0.01 credit per successful URL; per-URL failures cost 0 credits.
- All four lookup tools require
media_lists:manageand use the public REST routes, so auth, scopes, logs, credits, rate limits, and errors match direct API calls. - MCP tools inherit the REST rate limits: 60 requests per minute per credential across the API, 10 article lookups per minute, 10 active enrichment jobs, and 30 polls per minute each for
list_journalist_requestsandlist_journalist_moves. There is no daily cap. See Rate Limits, Journalist Requests errors, and Journalist Moves errors. journalist_referencerequiresnameplus at least one ofpublication,domain, orurl. Use it when the journalist is already known.article_urlremains supported for enriching the author of a real article. Reference and article sources can be mixed in the same request.enrich_journalistsis async-only and returns a job id immediately.fit_context.pitchreturns scored journalist research and personalized angle output when available.options.waitandoptions.timeout_msonenrich_journalistsare deprecated compatibility no-ops. Pollget_journalist_enrichment_jobinstead.- Public v1 has no send endpoint. Review and sending stay in the Medialyst app.
Troubleshooting
| Symptom | What to check |
|---|---|
401 Unauthorized | Missing, expired, or revoked credential. For OAuth clients, reconnect the connector to re-authorize. For API-key clients, verify the bearer header or api_key query fallback. |
403 Forbidden | The credential is valid but lacks the required scope. |
402 Payment Required | Credits or usage limits block the operation. |
| Fewer tools visible than expected | Ask your client to refresh or search MCP tools by name. The current public surface has 34 tools. |
| Validation errors | Lookup URLs must be absolute HTTP(S) URLs. Article batches accept at most 10 URLs and no Markdown option. Publication batches accept 25 URLs normally or five with force_refresh: true. For list_journalist_requests or list_journalist_moves, provide exactly one since or cursor; reuse the last successful cursor. For journalist_reference, provide name plus publication, domain, or a real identifying url. |
Build a Full Agent
Medialyst is the data layer. If you want the whole PR workflow — finding angles, building a fit-scored journalist list, and drafting pitches — use newsjack.sh, the open-source agent built on Medialyst by the team behind it. It connects with OAuth device login and ships opinionated skills for the full PR loop, so you don't have to assemble the primitives yourself.
Prefer to build your own agent on the raw primitives? See PR Agents on Medialyst.