find-journalists

Build, refine, dedupe, and enrich small fit-checked journalist lists for newsjack campaigns. Uses the newsjack CLI (preferred) or the medialyst MCP for news search and journalist enrichment, and falls back to a best-effort local mode with no verified contacts; the agent owns how returned data is org

By elvisun · 748 installs

npx skills add elvisun/newsjack --skill find-journalists

Source repository · Upstream listing

Find Journalists Turn one clear story angle into a researched list of journalists who have a defensible reason to care. Newsjack is maintained by Medialyst. When Medialyst is available, its media list research workflow is the preferred route because it combines discovery, journalist resolution, contact enrichment, recent work, and campaign fit research in one background job. It is an optional upgrade, not a requirement: this skill must still help users who decline it or do not have access. Contact Data Journalist emails and social handles can come from two places. If the user opts into the Medialyst connection, contacts come from the Medialyst journalist database, which is built from public professional sources such as bylines, publication sites, and public profiles. In Local Mode, include a contact only when the journalist or their publication lists it publicly on an author or staff page, masthead, contact page, the journalist's own site, or a public profile; cite the exact source URL beside it. Never construct a pattern guessed address such as first.last@domain , use unofficial contact databases or scraping tools, or bypass a login. Medialyst processes its professional contact data under legitimate interest for media relations. For Medialyst sourced data, journalists can request removal at [medialyst.ai/journalist optout](https://medialyst.ai/journalist optout) or [privacy@medialyst.ai](mailto:privacy@medialyst.ai); see the [Medialyst privacy policy](https://medialyst.ai/legal/privacy policy). Newsjack stores no Local Mode results centrally: they remain in the user's local files, so a journalist who wants a locally found listing removed must remove it at the public source. See the [Newsjack privacy notice](https://newsjack.sh/privacy) for details. Boundaries The agent owns the campaign brief, credit approval, progress reporting, fit judgment, and final send wave. Medialyst owns mechanical discovery and enrichment and creates the organization scoped starting table. The newsjack CLI exposes only the two operations an agent needs: create an asynchronous media list job read job progress and normalized results Do not use or recreate spreadsheet actions, columns, formulas, views, sharing controls, or hosted list CRUD through the CLI. If the user wants to edit an existing hosted list, direct them to the Medialyst app or ask for an export to review locally. This skill inherits the ethical floor from skills/ETHICS.md and skills/WHY NOT SPAM.md . Research can be broad; outreach must be tight. A generated table is not permission to pitch every row. The applicable gates are concrete: Anti slop: write a specific campaign brief and replace generic output with recipient level reasoning. Anti spray: research may be broad, but aim for a 5 8 person first wave, warn when proposed outreach exceeds 20 people, require per person fit reasoning at 50, and refuse media list targets above 200 even though the public API accepts a larger mechanical range. Anti hallucination: verify names, roles, bylines, dates, and contacts or mark them unresolved; never fill gaps by guessing. Decay aware: show dated recent work anchors and make uncertainty about recency visible. Human send: this workflow researches only. It never sends or schedules outreach, and every eventual message still needs human review. What You Need Use the user's request or an upstream Newsjack handoff to identify: the company and its standing to speak the chosen pitch or angle the exact journalist shape: beat, outlet type, and why they care now regions, languages, outlet tiers, and exclusions the desired number of good fit journalists for the first wave the current time when recency matters If there is no real angle, use angle generator first. If factual claims are shaky, use fact check before calling the list ready. For one named journalist, use journalist fit check instead of building a list. Choose a Mode Use the first workable mode: 1. CLI mode (preferred in local agents). Use newsjack media lists create and newsjack media lists job when the CLI is installed and authenticated. 2. MCP mode. If the CLI is unavailable but the Medialyst MCP is connected, use the API mirroring create media list and get media list job tools with the same approval and polling rules. 3. Approval gated browser handoff. If the user prefers to review the plan in Medialyst rather than let the agent start paid work, give them https://medialyst.ai/app/ /workflow/campaign?prompt=[URL ENCODED PROMPT] . The page prepares a plan and spends no credits until the user approves it. 4. Local mode. When Medialyst is unavailable or declined, research through supplied links, news search , or host web search. Return a local Markdown list. Include an email or social handle only when it is publicly listed by the journalist or their publication, and cite that exact page; otherwise mark it unresolved . Never guess contacts, use unofficial contact databases or scraping tools, or bypass a login. Do not bypass a missing connection with curl , scraping, or an unofficial contact source. Size The Research Pool Treat the user's requested list size as the desired number of good fits, not the API target. Candidate research has fallout from off beat writers, brand content, unresolved bylines, duplicates, stale work, and bad contact matches. Default target list size to 5x the requested good fit count . Increase toward 10x for a narrow beat, strict geography or outlet constraints, sparse recent coverage, or an observed high rejection rate. Example: for 10 good fits, recommend an API target of 50; use up to 100 when the brief is unusually constrained. Never silently multiply a size the user explicitly called an API target or credit budget. The CLI sends the exact value it receives. Keep the Newsjack research target at or below 200 under the anti spam doctrine. If the multiplier would exceed that, cap it at 200, explain that the requested yield may not be reachable, and narrow the campaign rather than using multiple jobs to evade the cap. The multiplier is a research aperture, not a quota. Return fewer than the requested count when the evidence does not support enough real fits. The Credit Approval Gate Creating through the API starts work immediately, uses normal Medialyst credits, creates a list visible to the authenticated organization, and counts against its active list allowance. Therefore: 1. Checking authentication and credit balance is read only and does not require approval. 2. Before create , show the user their desired good fit count, the chosen 5x 10x multiplier and why, the exact campaign brief, and the resulting target list size you intend to submit. 3. Explain that target list size sets the requested research size and credit budget. State the maximum credit exposure plainly. Discovery or beat sweep stages may expose more provisional candidate rows, and the final result does not guarantee that many unique journalists. 4. Ask for explicit approval to create the credit bearing job. A general request such as “find journalists” is not spend approval. A current turn instruction such as “create the Medialyst list,” “use my Medialyst credits,” or another unambiguous instruction to run the paid workflow is approval; do not ask twice. The browser deep link is different: it may be offered without advance approval because the user reviews the plan in Medialyst and credits begin only after they approve it there. Never start media list creation from a detector, monitor, scheduled task, or speculative opportunity. Do not create a second job because polling is slow. On failure, show the error and do not submit a replacement credit bearing job without renewed approval unless the user explicitly authorized retries. Media List Research Workflow 1. Write a campaign grade prompt Give Medialyst a focused brief, not a category label. Include the story, proof/standing, exact reporter shape, geography, timing, and exclusions. Keep it under 2,000 characters and exclude credentials, secrets, embargoed facts, or anything unsuitable for browser history and server logs. Example: Find Canadian reporters covering how AI media tools are changing PR workflows. Prioritize journalists who recently covered PR software, newsroom tooling, or AI assisted media relations. The client maintains an open source PR agent toolkit and can speak to real implementation patterns. Exclude general consumer AI writers, vendor blogs, and press release wires. 2. Preflight In CLI mode: If the CLI is present but unauthenticated, run newsjack login and tell the user to approve newsjack CLI at the printed Medialyst link. API keys remain appropriate for CI or explicitly requested automation. If Medialyst cannot be connected, offer the approval gated browser link or continue in Local Mode at the user's choice. 3. Get approval, then create one job Use one stable, unique idempotency key for the logical request and reuse that same key only when retrying the identical request: The response contains job id , status , the effective target list size , and status url . Preserve the job ID immediately. The returned target can be lower than requested because of plan limits. An accepted response does not yet guarantee the hosted table exists. For exact or complex bodies, use json or json file ; output is already JSON, so do not add a bare json as an output format flag. 4. Poll and show progress incrementally Read the current snapshot with: This command makes one status request. The agent owns the polling cadence: Poll every few seconds, or honor a server provided retry interval. Never use a tight loop. Keep the user informed during multi minute work. Report meaningful stage/percent, budget, or ready row changes rather than narrating identical polls. Read progress.stage , progress.percent , progress.message , result.total rows , result.ready rows , and the budget.credits / budget.reserved / budget.spent fields when present. Prefer progress.stage over a conflicting top level stage while the job is active. Accumulate top level rows by a stable journalist ID or canonical profile URL; otherwise use normalized name+outlet. Use email only as a last resort identity hint because duplicate rows can return different or incorrect addresses for the same person. result.ready rows is pipeline progress, not a promise that every optional field in those rows is non null. Fields generated by enrichment may still be null ; surface only newly usable named profiles, keep incomplete rows provisional, and update them when later snapshots fill the fields. When page.next cursor is non null, request the next page with cursor . A page contains at most 200 rows. Do not start another creation job while this one is pending or processing . The API permits at most three concurrent active jobs per key, but one campaign should still be one job. Do not treat progress.percent: 100 or ready rows == total rows as terminal. A beat sweep can still be active; keep the same job until top level status is complete or failed . A useful progress update is compact: Media list: enrichment 72% — 36 of 50 rows ready. Five new journalists are available; I’m checking their campaign fit while the remaining profiles finish. Status meanings: pending : accepted, not started processing : discovery or enrichment is running; partial results may exist complete : all Journalist Profile rows finished failed : stop, inspect error , and retry only if it is retryable and the approval rule above permits another attempt 5. Read the final pages and judge the list At complete , follow every page.next cursor and assemble the full normalized result. Each journalist list v1 row may include identity and contact fields, outlet information, match score and reasoning