Developers

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/mcp

Most 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 Authorization header (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>

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

ScopeNeeded for
Valid credential; no special scopePolling the zero-credit journalist-request feed; all six platforms are included for free
Active Scale plan; no special scopePolling the zero-credit journalist-moves feed
news:searchSearching recent news coverage
media_lists:manageLooking up articles/publications, enriching journalists, and polling enrichment jobs

Connect Your Agent

Claude.ai and ChatGPT (OAuth)

Add Medialyst as a custom connector with just the URL — no header, no key:

  1. Settings → Connectors → Add custom connector
  2. Name: Medialyst
  3. Remote MCP server URL: https://medialyst.ai/api/mcp
  4. 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:

/mcp

Claude 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 list

Command line (newsjack)

newsjack is the open-source PR CLI built on Medialyst. Connect it with one command:

newsjack login

Approve 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 toolBacking public surfaceScope
get_credit_balanceGET /api/v1/credits/balanceAPI key
lookup_articleGET /api/v1/articles/lookupmedia_lists:manage
lookup_articlesPOST /api/v1/articles/lookup:batchmedia_lists:manage
lookup_publicationGET /api/v1/publications/lookupmedia_lists:manage
lookup_publicationsPOST /api/v1/publications/lookup:batchmedia_lists:manage
list_journalist_requestsMCP-onlyAny valid credential; no special scope
list_journalist_movesGET /api/v1/journalist-movesAPI key; active Scale plan
search_newsPOST /api/v1/news/searchnews:search
query_pr_calendarPOST /api/v1/pr-calendar/querynews:search
enrich_journalistsPOST /api/v1/journalists/enrichmedia_lists:manage
get_journalist_enrichment_jobGET /api/v1/journalist-enrichment-jobs/:jobIdmedia_lists:manage

Only these 11 tools are exposed. The public OpenAPI operations POST /api/v1/media-lists:create-async and GET /api/v1/jobs/:jobId are deliberately REST-only and are not hosted MCP tools. Workflow row reads and share-link creation also stay outside the hosted MCP surface.

Example Workflows

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:

  1. Call list_journalist_requests with since and an optional limit from 1 to 250.
  2. Process the returned requests idempotently by stable id.
  3. While page.has_more is true, call the tool again with only page.next_cursor as cursor.
  4. When page.has_more is 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:

  1. Call list_journalist_moves with since and an optional limit from 1 to 250.
  2. Process the returned moves idempotently by stable id.
  3. While page.has_more is true, call the tool again with only page.next_cursor as cursor.
  4. When page.has_more is 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:

  1. get_credit_balance
  2. query_pr_calendar when the user needs planning moments or pitch timing
  3. search_news with a specific recency window when discovering journalists from coverage
  4. enrich_journalists with a known journalist reference or a selected article URL, plus fit_context.pitch
  5. get_journalist_enrichment_job until 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_requests requires exactly one of an exclusive RFC 3339 since timestamp or the preceding opaque cursor. 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_requests response carries a mandatory top-level notice field. Screening, ranking, filtering, and summarizing are permitted; automating outreach is a Terms of Service violation. See Journalist Requests.
  • list_journalist_moves requires exactly one of an exclusive RFC 3339 since timestamp or the preceding opaque cursor. 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_news returns up to 10 results per call. Use page: 2, page: 3, and so on for deeper coverage. Do not use the deprecated num parameter.
  • query_pr_calendar is free, costs 0 credits per successful call, and returns source-backed PR moments with pitch timing fields.
  • lookup_article accepts one absolute HTTP(S) URL and optional include_markdown; lookup_articles accepts 1-10 absolute URLs and has no Markdown option.
  • lookup_publication accepts one absolute HTTP(S) URL and optional force_refresh; lookup_publications accepts 1-25 URLs normally or at most five with force_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:manage and use the public REST routes, so auth, scopes, logs, credits, rate limits, and errors match direct API calls.
  • journalist_reference requires name plus at least one of publication, domain, or url. Use it when the journalist is already known.
  • article_url remains supported for enriching the author of a real article. Reference and article sources can be mixed in the same request.
  • enrich_journalists is async-only and returns a job id immediately. fit_context.pitch returns scored journalist research and personalized angle output when available.
  • options.wait and options.timeout_ms on enrich_journalists are deprecated compatibility no-ops. Poll get_journalist_enrichment_job instead.
  • Public v1 has no send endpoint. Review and sending stay in the Medialyst app.

Troubleshooting

SymptomWhat to check
401 UnauthorizedMissing, 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 ForbiddenThe credential is valid but lacks the required scope.
402 Payment RequiredCredits or usage limits block the operation.
Fewer tools visible than expectedAsk your client to refresh or search MCP tools by name. The current public surface has 11 tools.
Validation errorsLookup 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.