Pure Report — Neutral News
Neutral, bias-scored news for AI agents: compare left/right media-bias framing, fact-check receipts.
Sollte ich dies verwenden
Qualität und Sicherheit
Basierend auf einer automatisierten Analyse der Tool-Definitionen und der Einhaltung des Protokolls.
Kontextkosten
Dies ist die ungefähre Anzahl der Tokens, die jedes Mal verbraucht werden, wenn die Tools des Servers in den Kontext eines Modells geladen werden. Höhere Werte verringern die Aufmerksamkeit, die für andere Aufgaben verfügbar ist.
Installieren
Installation mit einem Klick
Fügen Sie dies Ihrer Datei `claude_desktop_config.json` hinzu:
{
"mcpServers": {
"news": {
"url": "https://pure-report.fly.dev/mcp"
}
}
}Remote-Endpunkte
https://pure-report.fly.dev/mcpstreamable-httphttps://pure.report/mcpstreamable-httpWas es kann
Tool-Inventar
Tools (8)
🟢search_news(query, topic, limit, offset, published_after, ...)
Search Pure Report's neutral, bias-scored news. Returns articles rewritten to remove loaded language; bias_score (0-100) rates the ORIGINAL source reporting before neutralization (0 = wire-neutral, 100 = advocacy), NOT the returned rewrite, which is neutral by design. Each result also lists the event(s) it belongs to — pass an event slug to get_event for the neutral writeup or compare_coverage for cross-outlet framing. Ranked by relevance and recency.
Eingabe-Schema
{
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "Keywords or phrase, e.g. \"Iran sanctions\" or \"2026 election\"."
},
"topic": {
"type": "string",
"enum": [
"politics",
"business",
"world",
"technology",
"health",
"science",
"justice",
"defense",
"climate-energy",
"media",
"education",
"culture",
"sports",
"local",
"opinion",
"real-estate"
],
"description": "Optional topic-slug filter. An unrecognized value searches all topics and returns a warning."
},
"limit": {
"type": "integer",
"description": "Max results to RETURN, 1-40 (default 15). Does not affect total_matches, which always reports how many articles matched."
},
"offset": {
"type": "integer",
"description": "Skip this many matches — page through results beyond the 40-row limit. The response echoes offset/returned/next_offset; next_offset is null on the last page."
},
"published_after": {
"type": "string",
"description": "Only articles published on/after this date. 'YYYY-MM-DD' or full ISO. Use with published_before to bound a period, e.g. coverage during June."
},
"published_before": {
"type": "string",
"description": "Only articles published on/before this date. 'YYYY-MM-DD' or full ISO."
}
},
"required": [
"query"
]
}Ausgabe-Schema
{
"type": "object",
"properties": {
"query": {
"type": "string"
},
"applied_topic": {
"type": [
"string",
"null"
]
},
"total_matches": {
"type": "integer",
"description": "TOTAL articles matching the query, independent of `limit` — not the number returned. len(results) < total_matches means more exist."
},
"warning": {
"type": "string"
},
"offset": {
"type": "integer"
},
"returned": {
"type": "integer"
},
"next_offset": {
"type": [
"integer",
"null"
]
},
"result_composition": {
"type": "object",
"description": "Factual description of what the returned set is ABOUT. Search is lexical, so every query term appears in every result; this reports whether a term is the SUBJECT (title/entities/lede) or only a body mention, plus the entity distribution. Measurements only — no verdict."
},
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"title": {
"type": [
"string",
"null"
]
},
"summary": {
"type": [
"string",
"null"
]
},
"source": {
"type": [
"string",
"null"
]
},
"bias_score": {
"type": [
"number",
"null"
]
},
"events": {
"type": "array",
"items": {
"type": "object",
"properties": {
"slug": {
"type": "string"
},
"name": {
"type": [
"string",
"null"
]
}
}
}
},
"published_at": {
"type": [
"string",
"null"
]
},
"url": {
"type": "string"
}
}
}
}
},
"required": [
"query",
"total_matches",
"results"
]
}🟢trending_events(limit)
List the news events with the most current coverage activity. Each event clusters many outlets' articles about one story and includes has_account (boolean): true means get_event returns a full verification-gated writeup, false means only the coverage census is available yet. Returns slugs to pass to get_event / compare_coverage.
Eingabe-Schema
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"description": "Max events, 1-25 (default 10)."
}
}
}Ausgabe-Schema
{
"type": "object",
"properties": {
"events": {
"type": "array",
"items": {
"type": "object",
"properties": {
"slug": {
"type": "string"
},
"name": {
"type": [
"string",
"null"
]
},
"article_count": {
"type": [
"integer",
"null"
]
},
"first_seen": {
"type": [
"string",
"null"
]
},
"has_account": {
"type": "boolean"
},
"url": {
"type": "string"
}
}
}
}
},
"required": [
"events"
]
}🟢get_event(slug)
Get the full neutral writeup of one news event by slug: a verification-gated account (lede, what-we-know bullets with verbatim source receipts, single-source attributed items) plus a coverage census (how many outlets by political lean, earliest report). If no gated account exists yet, the coverage census is still returned.
Eingabe-Schema
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "Event slug from trending_events or a search_news result, e.g. \"tyler-robinson-trial-for-charlie-kirk-murder\"."
}
},
"required": [
"slug"
]
}Ausgabe-Schema
{
"type": "object",
"properties": {
"slug": {
"type": "string"
},
"name": {
"type": [
"string",
"null"
]
},
"status": {
"type": [
"string",
"null"
]
},
"article_count": {
"type": [
"integer",
"null"
]
},
"first_seen": {
"type": [
"string",
"null"
]
},
"account": {
"type": [
"object",
"null"
]
},
"coverage_report": {
"type": [
"object",
"null"
]
},
"account_note": {
"type": [
"string",
"null"
]
},
"coverage": {
"type": "object"
},
"url": {
"type": "string"
}
},
"required": [
"slug",
"coverage",
"url"
]
}🟢compare_coverage(slug)
Show how outlets across the political spectrum framed one event: a per-outlet bias-score spectrum and, where they editorialized, the verbatim framing quotes grouped by left/center/right. The core 'compare the coverage' view — use it to detect slant and consensus.
Eingabe-Schema
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "Event slug from trending_events or a search_news result."
}
},
"required": [
"slug"
]
}Ausgabe-Schema
{
"type": "object",
"properties": {
"slug": {
"type": "string"
},
"name": {
"type": [
"string",
"null"
]
},
"framing_spectrum": {
"type": [
"object",
"null"
]
},
"how_each_side_framed_it": {
"type": [
"object",
"null"
]
},
"url": {
"type": "string"
}
},
"required": [
"slug",
"url"
]
}🟢get_article(article_id)
Fetch one article by id: neutral rewritten title + body, a bias_score for the ORIGINAL source (not the rewrite), source, extracted entities, and the events it belongs to.
Eingabe-Schema
{
"type": "object",
"properties": {
"article_id": {
"type": "integer",
"description": "Numeric article id (from search_news results)."
}
},
"required": [
"article_id"
]
}Ausgabe-Schema
{
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"title": {
"type": [
"string",
"null"
]
},
"content": {
"type": [
"string",
"null"
]
},
"summary": {
"type": [
"string",
"null"
]
},
"source_name": {
"type": [
"string",
"null"
]
},
"source_url": {
"type": [
"string",
"null"
]
},
"published_at": {
"type": [
"string",
"null"
]
},
"bias_score": {
"type": [
"number",
"null"
]
},
"entities": {
"type": [
"object",
"array",
"null"
]
},
"events": {
"type": "array"
},
"url": {
"type": "string"
}
},
"required": [
"id",
"url"
]
}🟢about_pure_report(report_subject, report_body, report_kind, article_id, event_slug)
How Pure Report works — the bias scale, neutralization method, the two-gate verification for event accounts, lean labeling, coverage scope (topic list), and the support contact. Call this to cite the source or explain its methodology to a user.
Eingabe-Schema
{
"type": "object",
"properties": {
"report_subject": {
"type": "string",
"description": "Optional. Providing this (with report_body) files feedback and returns a ref under \"filed\" — use only if submit_feedback is missing from your tools."
},
"report_body": {
"type": "string",
"description": "Optional. The detail needed to act."
},
"report_kind": {
"type": "string",
"enum": [
"bug",
"dx",
"data_error",
"data_gap",
"feature",
"question",
"other"
],
"description": "Optional, defaults to bug."
},
"article_id": {
"type": "integer",
"description": "Optional context for the report."
},
"event_slug": {
"type": "string",
"description": "Optional context for the report."
}
}
}Ausgabe-Schema
{
"type": "object",
"properties": {
"name": {
"type": "string"
},
"what_it_is": {
"type": "string"
},
"bias_scale": {
"type": "string"
},
"neutralization": {
"type": "string"
},
"verification_gate": {
"type": "string"
},
"lean_labeling": {
"type": "string"
},
"coverage_scope": {
"type": "object"
},
"freshness": {
"type": "string"
},
"website": {
"type": "string"
},
"support": {
"type": "string"
},
"reporting_problems": {
"type": "string"
},
"reporting_problems_if_submit_feedback_is_missing": {
"type": "string"
},
"filed": {
"type": [
"object",
"null"
]
}
},
"required": [
"bias_scale",
"support"
]
}🟡submit_feedback(category, subject, body, article_id, event_slug, ...)
Report a problem or request to Pure Report's operator and get a tracking ref back. Use this when the data looks wrong — a bias score or outlet lean that doesn't match the source, an event cluster mixing unrelated stories, a missing neutral writeup, a broken article — or to ask a methodology question or request a capability. Include the article_id or event_slug you were looking at; that context is what makes a report actionable. A human reads these: replies take time and are not guaranteed. Call check_feedback with the returned ref to read the reply.
Eingabe-Schema
{
"type": "object",
"properties": {
"category": {
"type": "string",
"enum": [
"bug",
"dx",
"data_error",
"data_gap",
"feature",
"question",
"other"
],
"description": "bug = broken or erroring; dx = developer-experience friction; data_error = wrong/miscategorised data; data_gap = missing coverage or field; feature = a capability request; question = methodology or usage; other. Defaults to bug."
},
"subject": {
"type": "string",
"description": "One line, max 200 chars."
},
"body": {
"type": "string",
"description": "The detail needed to act: what you expected, what you got, and how to reproduce it. Max 12000 chars."
},
"article_id": {
"type": "integer",
"description": "Optional article the report concerns."
},
"event_slug": {
"type": "string",
"description": "Optional event slug the report concerns."
},
"kind": {
"type": "string",
"enum": [
"bug",
"dx",
"data_error",
"data_gap",
"feature",
"question",
"other"
],
"description": "DEPRECATED alias for category; still accepted."
}
},
"required": [
"subject",
"body"
]
}Ausgabe-Schema
{
"type": "object",
"properties": {
"ref": {
"type": "string"
},
"status": {
"type": "string"
},
"message": {
"type": "string"
},
"how_to_check": {
"type": "string"
}
},
"required": [
"ref",
"status"
]
}🟢check_feedback(ref)
Look up feedback you filed with submit_feedback, using the ref it returned (e.g. PR-7F3K2Q). Returns the current status (open, answered, closed) and the operator's reply once one exists. Replies are written by a human and are not immediate — poll sparingly, on the order of hours or days, not seconds.
Eingabe-Schema
{
"type": "object",
"properties": {
"ref": {
"type": "string",
"description": "The ref from submit_feedback, e.g. 'PR-7F3K2Q'."
}
},
"required": [
"ref"
]
}Ausgabe-Schema
{
"type": "object",
"properties": {
"ref": {
"type": "string"
},
"status": {
"type": "string"
},
"kind": {
"type": "string"
},
"subject": {
"type": "string"
},
"submitted_at": {
"type": [
"string",
"null"
]
},
"reply": {
"type": [
"string",
"null"
]
},
"replied_at": {
"type": [
"string",
"null"
]
},
"message": {
"type": "string"
}
},
"required": [
"ref",
"status"
]
}Empfohlene Prompts
search_newssearch_newsget_eventget_eventsearch_newsget_eventCommunity
Nachweis