Readout
Measured readings on open-source dependencies: health, end-of-life, model prices, incidents.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"readout": {
"url": "https://readout-7pt.pages.dev/api/mcp"
}
}
}Remote endpoints
https://readout-7pt.pages.dev/api/mcpstreamable-httpWhat it can do
Tool inventory
Tools (31)
🟢check_before_install(registry, name)
Call this before adding a dependency. Returns only the facts a reviewer would be annoyed to discover afterwards: whether the publisher has withdrawn the package, whether it runs scripts on the installing machine, whether its repository is archived, how many advisories are on record, whether the licence is source-available, and how long since it was actually published. Each fact carries the address of the body that published it. It does not say whether to install; it says what is on record.
Input Schema
{
"type": "object",
"properties": {
"registry": {
"type": "string"
},
"name": {
"type": "string",
"description": "Package name as the registry spells it."
}
},
"required": [
"registry",
"name"
],
"additionalProperties": false
}🟢check_package(registry, name)
Read the current standing of one open-source package: downloads with the window they cover, OpenSSF scorecard, advisory count, licence, whether the repository is archived, and when it was last pushed to.
Input Schema
{
"type": "object",
"properties": {
"registry": {
"type": "string"
},
"name": {
"type": "string",
"description": "Package name as the registry spells it."
}
},
"required": [
"registry",
"name"
],
"additionalProperties": false
}🟢check_stack(registry, names)
Read a whole dependency list at once and report what is archived, what carries advisories, what has a source-available licence, and what has not been pushed to in a year. Use when reviewing a package.json, requirements.txt, Cargo.toml, composer.json or Gemfile.
Input Schema
{
"type": "object",
"properties": {
"registry": {
"type": "string"
},
"names": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"registry",
"names"
],
"additionalProperties": false
}🟢search_repositories(query, limit)
Find watched repositories whose name contains a string, with their current readings. Use it to discover what is covered before calling the other tools.
Input Schema
{
"type": "object",
"properties": {
"query": {
"type": "string"
},
"limit": {
"type": "integer",
"minimum": 1
}
},
"required": [
"query"
],
"additionalProperties": false
}⚪compare_repositories(a, b)
Hold two watched repositories against each other across downloads, OpenSSF scorecard, advisories, forks, stars and findings on record. Compares only; it does not pick a winner.
Input Schema
{
"type": "object",
"properties": {
"a": {
"type": "string",
"description": "Repository as owner/name."
},
"b": {
"type": "string",
"description": "Repository as owner/name."
}
},
"required": [
"a",
"b"
],
"additionalProperties": false
}🟢find_model(minContext, maxPrice, provider)
Find language models by price and context window, from a catalogue read daily across sixty providers. Use this before choosing a model: prices move without announcement and training data is out of date on the day it ships.
Input Schema
{
"type": "object",
"properties": {
"minContext": {
"type": "integer",
"description": "Minimum context window in tokens."
},
"maxPrice": {
"type": "number",
"description": "Maximum USD per million prompt tokens."
},
"provider": {
"type": "string"
}
},
"required": [],
"additionalProperties": false
}🟢check_eol(product, cycle)
Check whether a runtime, database or framework release is still receiving security fixes, and what to move to. Covers about two dozen products read daily from endoflife.date.
Input Schema
{
"type": "object",
"properties": {
"product": {
"type": "string",
"description": "Product as endoflife.date spells it, e.g. python, nodejs, postgresql."
},
"cycle": {
"type": "string",
"description": "Release line, e.g. 3.9 or 20. Omit for every cycle."
}
},
"required": [
"product"
],
"additionalProperties": false
}🟢check_provider(provider, days)
Recorded incidents for a hosting or API provider over a window, kept after the provider’s own status page dropped them.
Input Schema
{
"type": "object",
"properties": {
"provider": {
"type": "string",
"description": "Provider slug, e.g. cloudflare, openai, github. Omit for every provider."
},
"days": {
"type": "integer",
"minimum": 1,
"maximum": 730
}
},
"required": [],
"additionalProperties": false
}🟢list_readings
List every reading this server can return, what each one measures, and which require a key. Call this first if unsure which tool answers a question.
Input Schema
{
"type": "object",
"properties": {},
"required": [],
"additionalProperties": false
}🟡who_can_publish(registry, name)
How many accounts hold publish rights on a package, as the registry lists them. Answers who can put code on your machine, which is a different question from who writes it. Requires a key; see https://sighttrue.com/pricing.
Input Schema
{
"type": "object",
"properties": {
"registry": {
"type": "string"
},
"name": {
"type": "string",
"description": "Package name as the registry spells it."
}
},
"required": [
"registry",
"name"
],
"additionalProperties": false
}⚪package_weight_history(registry, name)
How the published artefact size has moved over time. Returns the readings taken, not a verdict. Requires a key; see https://sighttrue.com/pricing.
Input Schema
{
"type": "object",
"properties": {
"registry": {
"type": "string"
},
"name": {
"type": "string",
"description": "Package name as the registry spells it."
}
},
"required": [
"registry",
"name"
],
"additionalProperties": false
}🟢withdrawn_but_installed(limit)
Packages whose own publisher has withdrawn them and which are still being installed heavily, with the download figure and the publisher’s notice. Requires a key; see https://sighttrue.com/pricing.
Input Schema
{
"type": "object",
"properties": {
"limit": {
"type": "integer"
}
},
"required": [],
"additionalProperties": false
}🟡typosquat_check(registry, name)
Whether a name is one edit away from a more widely installed package. States that both names exist; which one was meant is the caller’s call. Requires a key; see https://sighttrue.com/pricing.
Input Schema
{
"type": "object",
"properties": {
"registry": {
"type": "string"
},
"name": {
"type": "string",
"description": "Package name as the registry spells it."
}
},
"required": [
"registry",
"name"
],
"additionalProperties": false
}🟡funding_gap(limit)
Packages that ask for funding, beside how heavily they are installed and how many people write them. Requires a key; see https://sighttrue.com/pricing.
Input Schema
{
"type": "object",
"properties": {
"limit": {
"type": "integer"
}
},
"required": [],
"additionalProperties": false
}⚪time_to_fix(registry, name)
Days between an advisory being published and a release appearing that postdates it, per package and as a distribution. Requires a key; see https://sighttrue.com/pricing.
Input Schema
{
"type": "object",
"properties": {
"registry": {
"type": "string"
},
"name": {
"type": "string",
"description": "Package name as the registry spells it."
}
},
"required": [
"registry",
"name"
],
"additionalProperties": false
}⚪advisory_severity(registry, name)
Advisories broken down by severity rather than counted, with identifiers and dates. Requires a key; see https://sighttrue.com/pricing.
Input Schema
{
"type": "object",
"properties": {
"registry": {
"type": "string"
},
"name": {
"type": "string",
"description": "Package name as the registry spells it."
}
},
"required": [
"registry",
"name"
],
"additionalProperties": false
}🟡runtime_deadlines(names)
Support end dates for the runtimes a dependency set requires, including any already past. Requires a key; see https://sighttrue.com/pricing.
Input Schema
{
"type": "object",
"properties": {
"names": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"names"
],
"additionalProperties": false
}🟢base_image_check(image)
For a container base image: its size, when it was last rebuilt, and whether the OS underneath it is still supported. Requires a key; see https://sighttrue.com/pricing.
Input Schema
{
"type": "object",
"properties": {
"image": {
"type": "string"
}
},
"required": [
"image"
],
"additionalProperties": false
}🔴registry_health(registry)
Recorded outages of the package registries themselves, kept after their status pages drop them. Requires a key; see https://sighttrue.com/pricing.
Input Schema
{
"type": "object",
"properties": {
"registry": {
"type": "string"
}
},
"required": [],
"additionalProperties": false
}⚪provider_incidents(provider)
A provider’s recorded incidents, grouped by the component that failed, over the whole archive rather than the window its status page shows. Requires a key; see https://sighttrue.com/pricing.
Input Schema
{
"type": "object",
"properties": {
"provider": {
"type": "string"
}
},
"required": [
"provider"
],
"additionalProperties": false
}⚪provider_transparency(provider)
How long a provider takes to acknowledge an incident: the interval between an incident starting and its first public update. Requires a key; see https://sighttrue.com/pricing.
Input Schema
{
"type": "object",
"properties": {
"provider": {
"type": "string"
}
},
"required": [],
"additionalProperties": false
}⚪provider_terms_changed(provider)
When a provider last changed its terms or pricing page, from a stored fingerprint of the page. Requires a key; see https://sighttrue.com/pricing.
Input Schema
{
"type": "object",
"properties": {
"provider": {
"type": "string"
}
},
"required": [],
"additionalProperties": false
}⚪model_price_history(model)
Every recorded price for a model, with the date each was read. Requires a key; see https://sighttrue.com/pricing.
Input Schema
{
"type": "object",
"properties": {
"model": {
"type": "string"
}
},
"required": [
"model"
],
"additionalProperties": false
}⚪model_withdrawn
Models that were in the catalogue and no longer are, with the date last seen. Requires a key; see https://sighttrue.com/pricing.
Input Schema
{
"type": "object",
"properties": {},
"required": [],
"additionalProperties": false
}⚪help_availability(tag)
For a technology tag: questions asked against questions answered, over time. Requires a key; see https://sighttrue.com/pricing.
Input Schema
{
"type": "object",
"properties": {
"tag": {
"type": "string"
}
},
"required": [
"tag"
],
"additionalProperties": false
}🟢audit_manifest(manifest, filename)
Read a whole manifest and return every reading on record for it, ordered by how much a reviewer would want to know. One call instead of one per dependency. Requires a key; see https://sighttrue.com/pricing.
Input Schema
{
"type": "object",
"properties": {
"manifest": {
"type": "string"
},
"filename": {
"type": "string"
}
},
"required": [
"manifest"
],
"additionalProperties": false
}🟡diff_since(names, since)
What changed for a set of packages since a given date, read from the daily archive. Requires a key; see https://sighttrue.com/pricing.
Input Schema
{
"type": "object",
"properties": {
"names": {
"type": "array",
"items": {
"type": "string"
}
},
"since": {
"type": "string",
"description": "YYYY-MM-DD."
}
},
"required": [
"names",
"since"
],
"additionalProperties": false
}🟡watch_add(registry, name)
Add a package to the caller’s own private watchlist, so later readings are about their stack rather than the public one. The list is private to the key that created it. Requires a key; see https://sighttrue.com/pricing.
Input Schema
{
"type": "object",
"properties": {
"registry": {
"type": "string"
},
"name": {
"type": "string",
"description": "Package name as the registry spells it."
}
},
"required": [
"registry",
"name"
],
"additionalProperties": false
}⚪watch_changes(since)
Everything that has changed across the caller’s private watchlist since a given date: withdrawals, licence changes, advisories, archived repositories and runtimes going out of support. Requires a key; see https://sighttrue.com/pricing.
Input Schema
{
"type": "object",
"properties": {
"since": {
"type": "string"
}
},
"required": [],
"additionalProperties": false
}🟢explain_finding(id)
Given a finding id, return what was measured, when, by whom, and the address it can be checked at. For an agent quoting a figure into a review. Requires a key; see https://sighttrue.com/pricing.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string"
}
},
"required": [
"id"
],
"additionalProperties": false
}⚪domain_risk(registry, name)
Whether the domains a package points at — homepage, funding, documentation — still resolve to a registered owner. Requires a key; see https://sighttrue.com/pricing.
Input Schema
{
"type": "object",
"properties": {
"registry": {
"type": "string"
},
"name": {
"type": "string",
"description": "Package name as the registry spells it."
}
},
"required": [
"registry",
"name"
],
"additionalProperties": false
}Community
Evidence