Skip to content

Know what a provider API change breaks

A model gets retired, an SDK drops a parameter. Avert shows the exact line, the route and the team it breaks, and opens the fix.

External APIs change underneath running code. Some changes have a version to bump. Many don’t: a retired model id, a sunset API version, a parameter removed on the server. Dependency bots only read manifests, and changelogs go unread. None of them connect a provider’s change to the lines, routes and teams it reaches, or remember what was decided last time.

Avert indexes your repository into a FalkorDB graph, tracks provider changes from machine-readable sources, and joins the two. It is a neutral tool: any provider with a published SDK is covered by the same machinery.

Here is a real finding from the demo service. A rolling alias, claude-3-5-sonnet-latest, resolves to a model that was retired on 2025-10-28. Nothing in the manifest changed, and no version could have been bumped. The path below is what Avert returns.

avert blast examples/acme lifecycle:anthropic:claude-3-5-sonnet-20241022
ChangeEvent retired: claude-3-5-sonnet-20241022 retired on 2025-10-28; replacement claude-sonnet-5-5
-AFFECTS->
Value "claude-3-5-sonnet-20241022"
<-RESOLVES_TO-
Value "claude-3-5-sonnet-latest" (unpinned alias)
<-PASSES-
CallSite msg = claude.messages.create( (support/app/llm.py:19)
<-HAS_CALL_SITE-
Function answer() (support/app/llm.py:10)
<-CALLS-
Function draft_reply() (support/app/main.py:19)
<-CALLS-
Function reply() (support/app/main.py:15)
<-HANDLED_BY-
Route POST /support/reply (support/app/main.py:14)
(file support/app/llm.py) <-OWNS-
Team @acme/support-ai

See this path drawn in the live demo.

Avert’s core question, which routes and teams does this change break?, is a path through links of unknown depth. That is the shape of problem a graph database answers directly, and FalkorDB is where Avert keeps and queries its data.

  • One query, the whole path. A change goes down the API surface to your call sites, and up the call chain to routes and owners. The database returns the nodes and edges it matched, so every finding comes with the evidence path you saw above.
  • Algorithms next to the data. PageRank ranks findings by how central their code is, and connected components group related findings into a single issue, both run inside FalkorDB.
  • Coordination without a lock service. FalkorDB applies writes to a graph one at a time, so claiming a finding is a single conditional write and two agents can never take the same one.
  • Memory in the same graph. Decisions and fix recipes sit next to the findings they are about, so later sessions recall them.

How Avert uses FalkorDB, with the queries.

  1. Index. Tree-sitter reads Python and TypeScript and writes routes, functions, call chains and every external API call site, resolved to a provider, operation, parameter and value.

  2. Detect. Avert diffs the SDK your manifest declares against the latest release, and reads published model lifecycle data. Changes become events attached to the API surface, and only the ones your code actually calls become findings.

  3. Trace and act. One graph query walks from the change down the API surface to your call sites, then up the call chain to routes and owners. Agents rank the findings, group them into batches, and open an issue or pull request with the path as evidence.

Named domain tools

16 MCP tools such as blast_radius, rank_findings and claim_finding, not a raw Cypher box. See the tool reference.

Shared memory

Decisions, sessions and fix recipes live in the graph. A second client, or a second repository, recalls them without being told.

Safe coordination

Agents claim findings atomically, so parallel migrators never collide. Pull requests are never merged automatically.

Read the queries

Every Cypher query and algorithm call is in one file and documented. See the query reference.

Avert is an MCP server. Install it from npm as avert-mcp and your agent gets sixteen named tools to find, trace, rank and fix API changes, with FalkorDB running locally:

Terminal window
docker run -d -p 127.0.0.1:6380:6379 falkordb/falkordb:v4.22.1
claude mcp add avert -e FALKORDB_URL=falkor://localhost:6380 -- npx -y avert-mcp mcp

Then ask your agent to index a repository and tell you what the latest provider changes break. Or try the read-only hosted server first, with nothing to install:

Terminal window
claude mcp add --transport http avert-demo https://avert-web.bravetree-b234f308.uaenorth.azurecontainerapps.io/mcp

Cursor, the MCP Inspector and the full configuration are on the Connect an agent page.

Provider Detected from
OpenAI npm + PyPI SDK diffs, model lifecycle data
Anthropic npm + PyPI SDK diffs, model lifecycle data
Google Gemini npm + PyPI SDK diffs, model lifecycle data
Stripe npm + PyPI SDK diffs
Twilio npm + PyPI SDK diffs

Providers are data, not code: adding one is a few lines of YAML (Contributing). Avert indexes Python and TypeScript. See Limits and roadmap for what it cannot see.

  • Hosted, read-only: claude mcp add --transport http avert-demo https://avert-web.bravetree-b234f308.uaenorth.azurecontainerapps.io/mcp, then ask for the findings in avert:acme.
  • Locally: npx -y avert-mcp mcp (see Connect an agent), or follow the Quickstart.