My coding agent kept suggesting dead model IDs. So I gave it a freshness layer.
Yesterday I asked my coding agent to scaffold a small Python service. It picked claude-3-5-sonnet as the LLM model. It picked python:3.9 as the Docker base. It picked django==3.2 as a dependency.
All three were sensible choices in 2024. In May 2026 they are, respectively: shut down (Anthropic retired the 3-5 snapshots in October 2025), end-of-life (Python 3.9 dropped support October 2025), and carrying 30 open security advisories from CVE-2021-31542 onward. The agent had no way to know any of this. Its training data ended before any of it happened.
So I built a small MCP server that gives the agent a freshness layer. It's at https://dev.miralinhart.com, free, stateless, no auth. Three tools.
The three tools
check_model_currency — pass it a provider + model ID, get back the current deprecation status, days until shutdown if relevant, and what to migrate to. Sources deprecations.info's tracked feed across OpenAI, Anthropic, Google, Vertex, Cohere, Bedrock, xAI.
check_dep_health — pass it an ecosystem (npm / pypi / cargo / go / maven / nuget), a package name, optionally a version. Get back the current latest stable, target-version freshness, deduplicated CVE/GHSA advisories sorted by severity, licenses, risk flags. Stitches deps.dev + OSV.dev + the ecosystem registries.
check_runtime_eol — pass it a runtime / framework / OS / database (node, python, ubuntu, postgresql, ruby, anything on endoflife.date's 455+ tracked products), optionally a version cycle. Get back active-support status, EOL date, days remaining, recommended LTS target. Fully-retired products (CentOS, Windows 7) return curated successor names.
What a call looks like
Default concise mode strips the heavy data block and returns just the verdict + key facts. The agent reads a few hundred tokens of structured truth instead of burning a few thousand reasoning through provider documentation pages.
Agent: "I'll use claude-3-5-sonnet for the LLM call." →
check_model_currency({provider: "Anthropic", model_id: "claude-3-5-sonnet"})Response: 🔴 SHUT DOWN as of 2025-10-28. Replacement: claude-sonnet-4-6.
Agent: "Let's add django for the API layer." →
check_dep_health({ecosystem: "pypi", package: "django", version: "3.2"})Response: 🔴 30 open advisories. Latest stable: 6.0.5. Risk flags: not_latest_stable, target_over_2y_old.
Agent: "Dockerfile FROM python:3.9-slim." →
check_runtime_eol({product: "python", version: "3.9"})Response: 🔴 END-OF-LIFE since 2025-10-31. Recommended: python:3.14 (EOL 2030-10-31).
All three tools also support mode: "json" (full structured response with the complete data block — top 10 advisories with CVSS scores, full cycle matrix, etc.) and mode: "pretty" (markdown formatted for harness rendering — Claude Desktop, Cursor, Codex lay it out as a visual card).
Every response carries {as_of: <iso-timestamp>, sources: [{url, fetched_at}]} — so the freshness claim is auditable. You can see exactly which upstream the answer came from and when it was fetched.
Five-minute Claude Desktop integration
{
"mcpServers": {
"agent-build-sanity": {
"type": "http",
"url": "https://dev.miralinhart.com"
}
}
}
Restart Claude Desktop, and the three tools show up. Cursor and Codex pick it up the same way (Streamable HTTP transport). For stdio-only clients there's the mcp-remote proxy.
Or just curl, if you'd rather see the JSON for yourself before connecting:
curl -X POST https://dev.miralinhart.com \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{
"name":"check_model_currency",
"arguments":{"provider":"Anthropic","model_id":"claude-3-5-sonnet"}}}'
Why this exists
Every model has a training cutoff. The world keeps moving past it. By the time the model has been trained, evaluated, deployed, and you're using it, the cutoff is at least three months stale, often more. Inside that window: provider deprecations land, CVEs get published, runtimes hit EOL, packages get hijacked, defaults change. A single MCP call that's current about any of this saves the agent from confidently picking an answer the world abandoned six months ago.
That's the whole pitch. Free, stateless, audit-trailed. Try it. If it catches a stale recommendation in your next session, I'd love to hear about it. If it returns garbage, tell me — feedback while the surface is still small is the best thing for the project.
Source: github.com/mira-linhart/agent-build-sanity (MIT). Landing with full examples in each mode: miralinhart.com/dev/.