Skip to main content
Glama

PyPI Python CI Index build License: MIT

When an agent hits ImportError, AttributeError or "unexpected keyword argument" in a fast-moving library, one call to DepTime says what changed, in which release, and what to use instead. Answers are computed from static diffs of every indexed release, not from docs or model memory.

Free, open source (MIT), and local: your code and errors never leave your machine.

TypeError: Client.__init__() got an unexpected keyword argument 'proxies'
{
  "symbol": "httpx.Client.__init__(proxies)",
  "issue": "param_removed",
  "installed_version": "0.28.1",
  "last_version_with": "0.27.2",
  "first_version_without": "0.28.0",
  "deprecated_in": "0.26.0",
  "replacements": [
    {"target": "proxy", "confidence": 0.8, "source": "deprecation_message"},
    {"target": "mounts", "confidence": 0.79, "source": "deprecation_message"}
  ],
  "pin_to_restore": "httpx<=0.27.2",
  "confidence": "high"
}

That's the real explain_error answer from the published index, trimmed. The full answer also quotes the deprecation message DepTime found in httpx's own source, and adds a one-sentence explanation for your agent to pass on.

Status: alpha. The prebuilt index is rebuilt nightly. Known gaps are tracked in BACKLOG.md.

Install

Requires uv.

# Claude Code. Cursor, Codex, VS Code and Claude Desktop take the same
# command (uvx deptime mcp) in their MCP config.
claude mcp add deptime -- uvx deptime mcp

On first launch DepTime downloads its prebuilt index (one file from this repo's GitHub Releases) in the background, then checks for a newer one at most once a day. Set DEPTIME_OFFLINE=1 to never touch the network.

Claude Code users can also install the plugin in integrations/claude-code with /plugin marketplace add cschmertz/deptime, then /plugin install deptime@deptime. It adds a skill and a local hook that suggests DepTime when a Python version-change error appears in a command's output.

Related MCP server: driftwatch-mcp

Tools

Tool

Use it when

explain_error(traceback, installed_versions?, pip_freeze?)

An import or call into a library just failed

symbol_history(package, path)

Before trusting an API you remember

check_symbols(package, version, symbols[{path, kwargs}])

Pre-flight check of the symbols and kwargs you're about to use

diff_versions(package, from_version | date, to_version?, used_symbols?)

Upgrading, or "what changed since my training cutoff?"

coverage()

What's indexed (52 fast-moving packages: AI/agent stack + libraries with known breaking changes)

Every answer carries evidence and a confidence level. If a package isn't covered, DepTime says so instead of guessing. The contracts are in docs/03-product-spec.md.

CLI

uvx deptime explain --installed httpx==0.28.1 < traceback.txt
uvx deptime history httpx Client.__init__
uvx deptime check httpx 0.28.1 'httpx.Client:proxies,proxy'
uvx deptime diff httpx 0.27.2 0.28.1
uvx deptime diff pydantic 2024-06-01              # everything since a date
uvx deptime index status | pull

How it works

Every night, GitHub Actions reads each new release's public API with griffe, which parses the source without running it, diffs it against the previous release, and publishes the result as one file, index.sqlite.gz, on this repo's Releases. On your machine, deptime mcp checks that file's sha256 and schema before swapping it in, then answers every question locally in milliseconds. The full design is in docs/04-architecture.md, and the decisions are in docs/adr/.

Hosting (optional)

Local mode covers coding agents. For web clients that only accept a URL, or for a public demo, run deptime serve (MCP at /mcp, JSON at /v1/*) on Cloud Run (likely free) or Fly.io (about $3–6/month). It has a Dockerfile and fly.toml, plus anonymous rate limits. See docs/05-hosting-and-sustainability.md.

Prior art and credits

  • griffe does the static analysis.

  • since-cutoff diffs your pinned dependencies against a model's training cutoff, locally and on demand. DepTime differs by shipping a prebuilt cross-version index and starting from a traceback.

  • Context7 and Ref serve version-specific docs. DepTime answers symbol-level "when and what replaced it" questions.

Contributing

The most useful contributions are wrong-answer reports, which become benchmark cases. See CONTRIBUTING.md. Development setup:

uv sync && uv run pytest
# build a small local index from real PyPI wheels
uv run deptime ingest httpx --versions 0.27.2 0.28.1

Docs

Product spec · Architecture · Hosting & sustainability · Launch & adoption · Risks & spikes · Privacy & security

License

MIT

Available Tools

5 tools
check_symbolsCheck symbols and kwargs against an installed versionA
Read-onlyIdempotent

Batch-check that symbols, and the keyword arguments you plan to pass, exist in a specific version of a package. Returns present/missing per symbol, rejected kwargs, deprecation notes, and hints.

NameRequiredDescriptionDefault
packageYes
symbolsYes
versionYesInstalled version, e.g. '0.28.1'.

Output Schema

NameRequiredDescription
noteNo
exactYes
packageYes
resultsYes
resolved_versionYesNearest indexed version <= requested_version.
requested_versionYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, closed-world behavior, so safety is covered. The description adds real value by disclosing the response contents: present/missing per symbol, rejected kwargs, deprecation notes, and hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action and resource, followed by a compact enumeration of outputs. Two sentences, no filler; only the title repeats some of the same ground.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, annotations cover the safety profile, and the description still sketches the return shape. For a read-only validation tool with three parameters, nothing an agent needs in order to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 33%: 'version' and the nested 'path'/'kwargs' fields are documented in the schema, but 'package' and the 'symbols' array carry no description at all. The description reinforces that kwargs are names you intend to pass but adds nothing about the package identifier format or the 100-symbol cap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: batch-checking that symbols and keyword arguments exist in a given package version. The scope (batch, per-symbol) is clear enough to distinguish it from the siblings, but no sibling is named or contrasted.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'you plan to pass' implies a pre-flight validation use case, but the description never says when to choose this over symbol_history, diff_versions, or coverage. Usage must be inferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coverageWhat DepTime indexesA
Read-onlyIdempotent

Lists indexed packages and version ranges. If a package is missing, DepTime cannot answer about it.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
policyYes
packagesYes
index_built_atYes
configured_but_not_indexedNo

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish readOnly, idempotent, and closed-world, so safety is covered. The description adds genuine behavioral context not in the structured fields: coverage is a hard boundary, and queries about unindexed packages will not be answerable. It does not describe output shape, but an output schema exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, no filler: the first states what is returned, the second states the consequence. Front-loaded and every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only listing tool with an output schema and full annotation coverage, the description supplies what structured fields cannot: the meaning of a gap in coverage. Only a brief hint about calling it as a first step before other queries would make it fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline for a no-param tool applies. The description correctly implies an unfiltered full inventory rather than a scoped query.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Lists indexed packages and version ranges.' The title reinforces it as a coverage/inventory lookup, which is clearly distinct from siblings like diff_versions or symbol_history. It stops short of explicitly contrasting with a sibling, but the resource is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The line 'If a package is missing, DepTime cannot answer about it' implies you should consult this before expecting answers on a package, which is useful framing. However, it never states when to call this versus the sibling tools or that it takes no arguments, leaving the trigger to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

diff_versionsBreaking changes between versionsA
Read-onlyIdempotent

Breaking changes and deprecations of a package between two versions, or since a date such as your training cutoff ('YYYY-MM-DD'). Optionally restrict to the symbols your code uses. Most severe first.

NameRequiredDescriptionDefault
limitNo
packageYes
to_versionNoDefaults to the latest indexed release.
from_versionYesVersion, or a date 'YYYY-MM-DD' (nearest release on/before).
used_symbolsNo
include_addedNo

Output Schema

NameRequiredDescription
noteNo
eventsYes
packageYes
truncatedNo
to_versionYes
from_versionYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint=false, so safety is covered. The description adds useful behavioral context by stating results are ordered most severe first and can be restricted to used symbols, though it does not mention the result limit or pagination behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: it names the core purpose first, then the date alternative, then the optional symbol restriction and ordering. Every clause adds useful information without waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema and read-only/idempotent annotations already present, the description covers the core invocation context well. It is slightly incomplete because it does not explain include_added or limit, but an agent can still understand the main operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is low at 33%, so the description carries more burden. It explains the date format for from_version and the used_symbols restriction, but leaves include_added and limit unexplained beyond their schema names, creating clear gaps for a 6-parameter tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the specific resource and operation: breaking changes and deprecations of a package between two versions or since a date. It distinguishes itself from general symbol tools by focusing on version-to-version breaking changes, though it does not explicitly name sibling tools as alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear usage context: comparing two versions, comparing since a date such as a training cutoff, and optionally restricting to symbols your code uses. It lacks explicit when-not-to-use guidance or named alternatives like check_symbols or symbol_history.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

explain_errorExplain a Python import/attribute/signature errorA
Read-onlyIdempotent

Call this when a third-party Python library raises ImportError ('cannot import name'), ModuleNotFoundError, AttributeError ('has no attribute'), or TypeError ('unexpected keyword argument' / 'missing required argument'). Returns what changed, in which release, the deprecation message, replacement candidates with evidence, and the version pin that restores the old API. Pass installed versions for an exact answer.

NameRequiredDescriptionDefault
tracebackYesTraceback text, or at least the final 'SomeError: message' line. Long logs are fine: only the last 20,000 characters are analysed.
pip_freezeNoOutput of `pip freeze` / `uv pip freeze` / `pip list`.
installed_versionsNoInstalled versions, e.g. {"httpx": "0.28.1"}.

Output Schema

NameRequiredDescription
noteNo
signalYes
findingsYes
not_coveredNoPackages involved in the error that DepTime does not index.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, closed-world), so the bar is lower; the description nonetheless adds real behavioral context: it produces change history, release, deprecation text, replacement candidates with evidence, and a restorative version pin. 'Pass installed versions for an exact answer' discloses an important accuracy tradeoff not encoded anywhere in the schema, and 'third-party Python library' implicitly bounds scope.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, zero waste: trigger conditions first, then the returned diagnostic payload, then the accuracy hint. Every sentence carries distinct information and nothing is repeated from structured fields.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 3 params at full schema coverage and an output schema present, the description is nearly complete: call conditions, output contents and optional-input payoff are all covered. What is absent is fallback behavior when no matching release change is found, and explicit confirmation that non-version-related errors are out of scope.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3; the description earns an extra point by explaining why the optional inputs matter ('Pass installed versions for an exact answer'), which the schema only describes as 'Installed versions'. It does not otherwise add syntax guidance beyond the schema, so it stays below 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (explain/diagnose) tied to a precise resource: third-party Python import/attribute/signature errors, enumerated by exception class and quoted message fragments. An agent can immediately distinguish this from siblings like symbol_history, check_symbols, diff_versions and coverage, which address symbols, checks and coverage rather than runtime error diagnosis.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The opening sentence is an explicit trigger: 'Call this when a third-party Python library raises ImportError ... ModuleNotFoundError ... AttributeError ... TypeError', which is unusually actionable routing guidance. It does not name sibling tools or state when-not to use it (e.g. stdlib errors or non-version-related failures), which keeps it out of the top band.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

symbol_historyVersion history of one symbolA
Read-onlyIdempotent

Version history of one public symbol, e.g. package='httpx', path='httpx.Client.init': first and last release it exists in, signature changes, deprecations, removals, and replacement candidates. Use before writing code against an API you remember from training data.

NameRequiredDescriptionDefault
pathYesPublic dotted path; the package prefix may be omitted.
packageYesPyPI distribution name, e.g. 'langchain-core'.

Output Schema

NameRequiredDescription
noteNo
pathYes
eventsNo
indexedYesFalse when the package is not in DepTime's coverage; see the `coverage` tool.
packageYes
ever_seenNoFalse means no indexed version ever exposed this public path.
last_seenNo
first_seenNo
replacementsNo
present_in_latestNo
latest_indexed_versionNo
signature_at_last_seenNo

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, and closed-world, so the safety profile needs no restating. The description adds value beyond them by disclosing the scope restriction to *public* symbols and by naming the categories of change surfaced, so the agent knows what it will learn.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, both earning their place: the first specifies content, the second specifies timing. The scope-and-payload sentence is front-loaded before the usage advice, with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and both parameters fully documented, the description needn't explain return values and correctly doesn't. The only remaining gap is behavior on an unknown or private symbol (error vs. empty result), which would matter for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both parameters are already documented as a PyPI distribution name and a public dotted path. The description's example (package='httpx' alongside path='httpx.Client.__init__') usefully demonstrates that the path may redundantly carry the package prefix, but otherwise it does not extend the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The definition gives a specific verb and resource ('version history of one public symbol') and enumerates exactly what the history contains: first/last release, signature changes, deprecations, removals, and replacement candidates. This is clearly distinct from diff_versions and check_symbols in scope, though it does not name a sibling to route away from.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use before writing code against an API you remember from training data' supplies a concrete triggering situation, which is exactly the class of guidance most tools lack. It stops short of exclusions or an explicit 'use X instead when...' handoff to check_symbols or diff_versions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 5 tool updatesv0.1.0
    • First observedcheck_symbols
    • First observedcoverage
    • First observeddiff_versions
    • First observedexplain_error
    • First observedsymbol_history

TDQS

A4.1/5.0

Scored across 5 tools

Disambiguation5/5

Each tool occupies a distinct workflow stage: explaining a live error, tracing one symbol's history, batch-checking planned symbols, diffing package versions, and checking index coverage. Overlap is minimal and descriptions make boundaries explicit.

Naming Consistency4/5

All names use consistent snake_case and are readable. Most are verb_noun (explain_error, check_symbols, diff_versions), while symbol_history and coverage are noun-style, a minor deviation.

Tool Count5/5

Five tools is well-scoped for a focused dependency-API compatibility server. Each tool covers a distinct need without obvious redundancy.

Completeness4/5

The surface covers error diagnosis, symbol history, preflight checks, version diffs, and index coverage, which is strong lifecycle coverage. Minor gaps like package/symbol search or upgrade-path recommendations remain but are workaroundable.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    B
    maintenance
    Enables AI agents to index local Python repositories and retrieve code intelligence through semantic search, caller lookups, hybrid context expansion, and visualization.
    5
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI coding agents to identify exactly what broke between two dependency versions, with citations for every claim, and to verify package existence to catch typosquatting, all without requiring an API key.
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables AI coding agents to inspect project dependency versions, resolve version constraints, and audit Python code for deprecated or incompatible APIs using authoritative evidence and local AST analysis.
    3
    14 npm
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Provides a local, version-exact API index for installed Python and TypeScript packages, enabling accurate lookups and static code checking that catches hallucinated or misused APIs without executing the code.
    9
    MIT