Pure Report — Neutral News
Neutral, bias-scored news for AI agents: compare left/right media-bias framing, fact-check receipts.
사용해야 할까요
품질 및 안전성
도구 정의와 프로토콜 준수에 대한 자동 분석을 기반으로 합니다.
컨텍스트 비용
이는 서버의 도구가 모델의 컨텍스트에 로드될 때마다 소비되는 대략적인 토큰 수입니다. 수치가 높을수록 다른 작업에 사용할 수 있는 주의가 줄어듭니다.
설치
원클릭 설치
`claude_desktop_config.json` 파일에 다음을 추가하세요:
{
"mcpServers": {
"news": {
"url": "https://pure-report.fly.dev/mcp"
}
}
}원격 엔드포인트
https://pure-report.fly.dev/mcpstreamable-httphttps://pure.report/mcpstreamable-http할 수 있는 일
도구 목록
도구 (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.
입력 스키마
{
"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"
]
}출력 스키마
{
"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.
입력 스키마
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"description": "Max events, 1-25 (default 10)."
}
}
}출력 스키마
{
"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.
입력 스키마
{
"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"
]
}출력 스키마
{
"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.
입력 스키마
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "Event slug from trending_events or a search_news result."
}
},
"required": [
"slug"
]
}출력 스키마
{
"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.
입력 스키마
{
"type": "object",
"properties": {
"article_id": {
"type": "integer",
"description": "Numeric article id (from search_news results)."
}
},
"required": [
"article_id"
]
}출력 스키마
{
"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.
입력 스키마
{
"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."
}
}
}출력 스키마
{
"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.
입력 스키마
{
"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"
]
}출력 스키마
{
"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.
입력 스키마
{
"type": "object",
"properties": {
"ref": {
"type": "string",
"description": "The ref from submit_feedback, e.g. 'PR-7F3K2Q'."
}
},
"required": [
"ref"
]
}출력 스키마
{
"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"
]
}권장 프롬프트
search_newssearch_newsget_eventget_eventsearch_newsget_event커뮤니티
증거