Pure Report — Neutral News

Neutral, bias-scored news for AI agents: compare left/right media-bias framing, fact-check receipts.

사용해야 할까요

품질 및 안전성

A
설명 품질
100%
스키마 완전성
97%
이름 품질
93%
오염 위험
100%
권한 일치
100%
프로토콜 준수
100%

도구 정의와 프로토콜 준수에 대한 자동 분석을 기반으로 합니다.

컨텍스트 비용

~2,412토큰 (도구 정의)
~2.6 KB일반적인 응답 크기
중간 정도의 주의 영향 (128k 컨텍스트의 1.88%)

이는 서버의 도구가 모델의 컨텍스트에 로드될 때마다 소비되는 대략적인 토큰 수입니다. 수치가 높을수록 다른 작업에 사용할 수 있는 주의가 줄어듭니다.

설치

원클릭 설치

`claude_desktop_config.json` 파일에 다음을 추가하세요:

{
  "mcpServers": {
    "news": {
      "url": "https://pure-report.fly.dev/mcp"
    }
  }
}

원격 엔드포인트

https://pure-report.fly.dev/mcpstreamable-http
https://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_research
Search for information about [topic] using Pure Report — Neutral News
예상 도구: search_news
find_specific
Find [specific item] using Pure Report — Neutral News
예상 도구: search_news
retrieve_data
Get details about [item] from Pure Report — Neutral News
예상 도구: get_event
fetch_info
Fetch [information type] using Pure Report — Neutral News
예상 도구: get_event
research_workflow
Search for [topic], then get detailed information about the top results using Pure Report — Neutral News
예상 도구: search_newsget_event

커뮤니티

이 서버 평가하기

증거

최근 관측

검증됨버전이 기록되지 않음도구 8개
검증됨버전이 기록되지 않음도구 8개
검증됨버전이 기록되지 않음도구 8개
검증됨버전이 기록되지 않음도구 8개