About freshcheck
freshcheck is a local dependency-staleness assessor for developers and maintainers. It compares strict semver versions, flags abandoned repositories or releases, and groups dependencies by risk without network lookups.
Key features
- 01Compare major, minor, and patch gaps
- 02Flag archived or long-unreleased packages
- 03Group dependencies by risk level
- 04Validate input and return sorted results
- 05Run as a CLI, MCP server, or Docker image
Use cases
- 01Prioritize dependency upgrades by severity
- 02Identify dependencies with abandonment signals
- 03Assess a supplied dependency tree offline
MCP support
The MCP server exposes the `assess_freshness` tool, which accepts dependency versions and optional abandonment signals. It returns dependency assessments, risk groups, and counts.
Configuration
Local server config is the same for every client. Copy it into your client’s MCP config file.
Tools
1Saved tool list · updated 1w ago
| Parameter | Type | Required | Description |
|---|---|---|---|
| dependencies | array | Yes | Dependencies to assess (at least one) |
| abandoned_days | integer | No | A dependency counts as abandoned at this many days without a release (optional, default 730) |
Details
From the project READMEfreshcheck
A dependency tree quietly ages. Some packages are a patch behind and can be bumped without a thought, some are a major version behind and need a planned upgrade, and some have not released anything in years — or their repository has been archived outright — and are a risk whatever version they are on. freshcheck takes the tree you have — each dependency's name, installed version, and latest available version, with optional abandonment signals — and sorts it into exactly those risk groups:
- Behind level — for every dependency,
currentandlatestare compared component by component, numerically. The first component that differs decides:major,minor, orpatch. Whenlatestis not ahead ofcurrent— equal, or even behind it — the level isnone. Versions must be strictMAJOR.MINOR.PATCHsemver: three numeric components, no leading zeros, no prerelease or build suffix. - Abandoned — a dependency counts as abandoned when
its repository is archived, or when it has gone at least
abandoned_dayswithout a release (default 730, measured by the optionaldays_since_last_release). Abandonment outranks the version gap: an archived package two majors behind is groupedabandoned, with its behind level still reported alongside so the size of the gap is not lost. - Groups and counts — every dependency lands in one
group —
abandoned,major,minor,patch, orcurrent(behind levelnone, not abandoned) — and the result carries the names in each group plus the group sizes and the overall total.
Every list in the result is sorted ascending, so the same
tree always yields exactly the same assessment. Malformed
input — a missing or empty dependency list, a missing,
empty, or duplicate name, a version that is not strict
semver, a wrongly typed signal — is a validation error
naming the offending path (for example
dependencies[1].latest must be a strict MAJOR.MINOR.PATCH semver version), and no partial assessment is produced.
The computation is pure and local: no network, no
registry lookups, no files read beyond the input you pass
in — freshcheck judges only the versions and signals you
supply.
CLI
npx @reneturcios/freshcheck assess --input args.json
npx @reneturcios/freshcheck --version
args.json contains the full arguments object:
{
"dependencies": [
{ "name": "core", "current": "2.0.0", "latest": "2.0.0" },
{ "name": "lib", "current": "1.9.0", "latest": "1.10.2" },
{ "name": "old", "current": "0.8.1", "latest": "3.0.0", "archived": true }
]
}
archived defaults to false per dependency, and
abandoned_days defaults to 730 for the whole call.
The assessment is printed as JSON:
{
"dependencies": [
{ "name": "core", "current": "2.0.0", "latest": "2.0.0", "behind": "none", "group": "current" },
{ "name": "lib", "current": "1.9.0", "latest": "1.10.2", "behind": "minor", "group": "minor" },
{ "name": "old", "current": "0.8.1", "latest": "3.0.0", "behind": "major", "group": "abandoned" }
],
"groups": {
"abandoned": ["old"],
"major": [],
"minor": ["lib"],
"patch": [],
"current": ["core"]
},
"counts": { "abandoned": 1, "major": 0, "minor": 1, "patch": 0, "current": 1, "total": 3 }
}
Note lib: 1.10.2 is a minor step ahead of 1.9.0 because
components compare numerically, not lexicographically.
Exit codes: 0 on success, 1 on a runtime error
(including an unreadable or invalid input file, or invalid
input), 2 on a usage error.
MCP server
npx -y @reneturcios/freshcheck mcp
MCP client config:
{
"mcpServers": {
"freshcheck": {
"command": "npx",
"args": ["-y", "@reneturcios/freshcheck", "mcp"]
}
}
}
Tools
-
assess_freshness— Assess how stale a dependency tree is, grouped by risk.dependencies(array, required, at least one) — dependencies as{name, current, latest, archived?, days_since_last_release?}objects;nameis unique across the set, andcurrent/latestare strictMAJOR.MINOR.PATCHsemver versionsabandoned_days(integer, optional, default 730, at least 1) — days without a release at which a dependency counts as abandoned
Returns
{dependencies, groups, counts}.
Docker
docker run -i ghcr.io/cloudcorprecords/freshcheck
docker run --rm -v "$PWD:/w" ghcr.io/cloudcorprecords/freshcheck assess --input /w/args.json
Development
npm install
npm run build # tsc -> dist/
npm test # tsx --test test/*.test.ts (pure local, no network)
npm run dev # run the CLI from source
License
MIT — Copyright (c) 2026 Rene Turcios
Comments
New to MCP?
From what the protocol is to installing your first server, these answers cover most first questions.
An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.