NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #4415 most downloaded on pub.dev
DevTools extension for Riverpod - inspect providers in real-time, now with MCP support for AI coding tools.
Last release 2 months ago
16 Jul 2026
Release timing varies
gaps range from 8 days to 5 months
Nearly every release is documented
notes for 15 of 15 stable releases
Nothing withdrawn
no release was ever pulled
9 months old
15 releases · first in 2025
One column per month.
Patch release: one performance fix and one compatibility fix. No API changes.
Patch release: one performance fix and one compatibility fix. No API changes.
Perf: dart run riverpod_devtools:analyze is dramatically faster on large projects. The CLI resolved every file semantically (AnalysisContextCollection + getResolvedUnit), which re-resolves each file's transitive imports — near "files × whole program" work, taking minutes on provider-heavy apps. But the extraction is purely syntactic (provider patterns, ref.watch/read/listen by name, @riverpod by annotation name) and never used the resolution, so the analyzer now does a plain syntax-only parse per file (parseFile). Cost is proportional to source size only — typically minutes → well under a second — and the generated riverpod_dependencies.json is identical. --watch re-analysis gets the same speedup. (#117)
Fix: dart run riverpod_devtools:analyze no longer fails to compile on analyzer 14+. ArgumentList.arguments's element type changed from NodeList<Expression> to NodeList<Argument> (a new sealed interface implemented by both Expression and the new NamedArgument; the old NamedExpression was removed) — a genuine breaking type change that can't be bridged with a single static type. The ref.watch/read/listen argument extractor now resolves the argument's expression dynamically instead of relying on either shape, restoring compatibility across the package's full declared analyzer: >=6.0.0 <15.0.0 range. (#118)
Published to pub.dev: https://pub.dev/packages/riverpod_devtools/versions/1.1.2
dart run riverpod_devtools:analyze is dramatically faster on
large projects. The CLI resolved every file semantically
(AnalysisContextCollection + getResolvedUnit), which re-resolves each
file's transitive imports — near "files × whole program" work, taking
minutes on provider-heavy apps. But the extraction is purely syntactic
(provider patterns, ref.watch/read/listen by name, @riverpod by
annotation name) and never used the resolution, so the analyzer now does a
plain syntax-only parse per file (parseFile). Cost is proportional to
source size only — typically minutes → well under a second — and the
generated riverpod_dependencies.json is identical. --watch re-analysis
gets the same speedup. A file that fails to read/parse now skips only
itself (matching the previous per-file behavior), and the pipeline no
longer needs a resolvable SDK, which also made analyze() end-to-end
testable.dart run riverpod_devtools:analyze no longer fails to compile on
analyzer 14+. ArgumentList.arguments's element type changed from
NodeList<Expression> to NodeList<Argument> (a new sealed interface
implemented by both Expression and the new NamedArgument; the old
NamedExpression was removed) — a genuine breaking type change that can't
be bridged with a single static type, since Argument/NamedArgument
don't exist pre-14 and NamedExpression doesn't exist on 14+. The
ref.watch/read/listen argument extractor now resolves the argument's
expression dynamically instead of relying on either shape, restoring
compatibility across the package's full declared analyzer: >=6.0.0 <15.0.0 range instead of breaking on whichever version pub get
resolves.Patch release: two crash/correctness fixes plus documentation improvements. No API changes.
Patch release: two crash/correctness fixes plus documentation improvements. No API changes.
Fix: non-finite numbers no longer crash the observer. A provider value containing double.infinity, double.negativeInfinity, or double.nan could throw an uncaught Converting object to an encodable object failed: Infinity from developer.postEvent, because those are valid nums that Dart's json.encode (with no toEncodable fallback) rejects. Both routes that let a non-finite number reach the payload are now sealed: the toJson() sanitizer (_jsonSafe) rewrites non-finite doubles to their string form ("Infinity"/"-Infinity"/"NaN"), and the toString() parser no longer turns num.tryParse('Infinity') into a live non-finite double (it keeps the original string). Finite numbers are unaffected. (#111)
Fix: dart run riverpod_devtools:analyze now detects @riverpod code-generated providers. The analyzer previously only recognized hand-written final xProvider = SomeProvider(...) top-level declarations. Apps using riverpod_generator (@riverpod functions/classes) got zero matching static metadata for those providers — even though riverpod_dependencies.json loaded successfully, every runtime event for them reported dependenciesSource: 'name_mismatch', since the generated provider variable (in the excluded .g.dart file) never appeared in the analyzer's output. @riverpod/@Riverpod(...)-annotated functions and classes are now recognized in the source file, and named using riverpod_generator's own convention (<lowerCamelCase(name)>Provider), so their static dependencies attach correctly at runtime. (#105)
Docs: MCP setup for monorepo / subdirectory / FVM Flutter apps. MCP.md now documents the shell-wrapper .mcp.json config needed when the Flutter package (the one depending on riverpod_devtools) lives below the directory .mcp.json is read from — a common monorepo layout — including an FVM example (fvm dart run ...). (#106)
Docs: MCP connection diagnostics. TROUBLESHOOTING.md's MCP Issues section now leads with a quick diagnostic checklist (debug mode, observer registered, curl .../ping health check with the expected response shape, running from the right package directory, MCP client restarted after .mcp.json changes) so a broken setup can be isolated to app-side vs. MCP-client-side without guesswork. MCP.md now calls out that most MCP clients only read .mcp.json at startup, so tools added mid-session need a client restart/reload. (#107)
Published to pub.dev: https://pub.dev/packages/riverpod_devtools/versions/1.1.1
Reliability and lightness release: bounded serialization cost for large state, faster MCP tool calls, a snappier extension under event bursts, and set
Reliability and lightness release: bounded serialization cost for large state, faster MCP tool calls, a snappier extension under event bursts, and setup failures that explain themselves instead of degrading silently.
Serialization is now bounded at the source. serializeValue previously capped only recursion depth; a provider holding a huge List/Map/Set (or an object with a very long toString()) was fully re-serialized on every update, on both the DevTools and MCP paths. Collections now serialize only their first 100 elements — flagged with truncated: true and the true totalItems — and the stored string form is capped at 4000 chars. Anything trimmed carries the existing lossy: true marker, and MCP compact summaries report the true (pre-cap) collection size. Large-state apps can keep the observer enabled without paying an unbounded per-event cost.
Dependency-JSON load failures are now visible everywhere. A broken riverpod_dependencies.json used to degrade silently to "no dependencies":
RiverpodDevToolsRegistry.loadError).get_dependency_graph returns a dedicated edgesNote with the actual parse error (distinct from "never loaded" and "name mismatch").dependenciesSource: 'load_error' plus the reason (dependenciesLoadError), and the DevTools extension's Dependencies section shows a "Dependency Data Failed to Load" panel with the error and the fix command — instead of the generic setup instructions.catch (_) {}.MCP: app discovery is cached (~5s). Tool calls that omit port no longer re-ping all 10 ports (1s timeout each) on every call; a failed request to a cached port invalidates the cache so a restarted app on a new port is re-discovered automatically. One HttpClient is used per scan instead of one per port. list_riverpod_apps always scans fresh.
MCP: get_dependency_graph explains an empty edges — when no static dependency data is loaded (or none of the running providers match it by name), the response carries an edgesNote describing why edges is empty and how to fix it, instead of being indistinguishable from "no dependencies". The note survives the compact view.
MCP: the server reports its real version in the initialize handshake (was hardcoded to 0.1.0); tool/release.sh keeps it in sync.
Extension: smoother under event bursts. The event list is rebuilt in a single pass per event (previously a full copy plus a head insert), and the per-provider stats recompute is throttled to at most once per 250ms with a trailing pass so the final state after a burst is never stale.
Reliability fixes:
ext.riverpod_devtools.command service extension is only marked registered after registration actually succeeds, so a transient failure no longer permanently disables DevTools Invalidate/Refresh for the rest of the isolate's life.POST /commands invalid-body error message no longer contains a truncated placeholder ("value"?: } → "value"?: <primitive>}), so an AI reading it can self-correct against valid JSON.Examples build from a fresh clone — the generated riverpod_dependencies.json is now committed for both example apps, so flutter run works immediately and the dependency-graph demo is live out of the box.
Docs: TROUBLESHOOTING.md gained an MCP section covering the real failure modes (app not found / port forwarding, first-launch compile timeout, empty graph edges, ambiguous: true, supported: false, multi-app port selection); MCP.md links to it and notes the one-time ~10–20s first-launch compile of the MCP server.
Published to pub.dev: https://pub.dev/packages/riverpod_devtools/versions/1.1.0
First stable release. This milestone makes the bundled MCP server a first-class, token-efficient interface for AI coding tools — reading live provider
First stable release. This milestone makes the bundled MCP server a first-class, token-efficient interface for AI coding tools — reading live provider state and driving it — and rounds out the DevTools extension with an interactive dependency graph and a per-provider performance dashboard. The public API (RiverpodDevToolsObserver, the analyzer CLI, the MCP server) is now stable and follows semantic versioning.
Published to pub.dev: https://pub.dev/packages/riverpod_devtools/versions/1.0.0
set_provider_value — set a provider's state to a specific primitive value (int/double/bool/String/null) for providers with a writable notifier (StateProvider, NotifierProvider); unsupported providers are rejected with supported: false. Complements invalidate_provider (reset to build()).view parameter (compact/summary/full), since/until windowing on logs, and tool descriptions tightened ~50% (fixed per-session saving).instanceId and a nameIsUnique flag, so same-named providers no longer collide; commands accept a name or an exact instanceId and reject ambiguous names with the candidate ids.lossy: true, so an AI can tell a placeholder from an accurate reading.get_provider_stats (and GET /stats) returns per-provider update rate, async load duration, and dispose→re-create churn.8788–8797; list_riverpod_apps reports each running app so tools can target one with port.watch/read/listen edge styling, status coloring, cycle highlighting, click-to-focus, and pan/zoom.^3.7.0 and Flutter >=3.32.0.Full changelog: https://github.com/yutsuki3/riverpod_devtools/blob/main/packages/riverpod_devtools/CHANGELOG.md
Full diff: v0.6.1...v1.0.0
First stable release. This milestone makes the bundled MCP server a first-class, token-efficient interface for AI coding tools — reading live provider state and driving it — and rounds out the DevTools extension with an interactive dependency graph and a per-provider performance/health dashboard. The public API (RiverpodDevToolsObserver, the analyzer CLI, the MCP server) is now considered stable and follows semantic versioning.
Added the set_provider_value MCP tool: set a provider's state to a specific primitive value (int/double/bool/String/null) for providers with a writable notifier (StateProvider, NotifierProvider). Unsupported providers are rejected with supported: false.
MCP: flag lossy/approximate serialized values: cyclic references and values truncated by the depth limit now carry lossy: true in both the raw and compact serialized forms, so an AI reading the value can tell it's a placeholder rather than an accurate reading.
MCP: token-efficient responses:
get_riverpod_logs and get_provider_state now return a compact representation by default — slim events/entries with summarized values, dropping the repeated static-dependency metadata, providerId, and the verbose nested {type, string, items/entries} value trees that the GUI needs but an AI does not. In a realistic case the compact log payload is about a quarter the size of the raw one, so far more history fits in an AI's context per call.view parameter: get_riverpod_logs accepts compact (default), summary (per-provider counts by kind plus each provider's latest value — "what happened" without the full stream), and full (the complete raw events, for when you need a value the compact form summarized). get_provider_state accepts compact (default) and full.get_dependency_graph and get_provider_stats are compact by default too: the graph returns just the topology (dropping per-edge file/line/column and node bookkeeping — view: "full" restores them), and stats drop the 30-bucket sparkline array and near-zero fields, ordered most-interesting-first (flagged providers, then by update rate) so "which provider is misbehaving?" is answered from the top (view: "full" returns the raw stats).get_riverpod_logs gained since/until parameters (a timestamp window in epoch ms), so an AI can pull just a recent slice of the event history without clearing the buffer. The GET /logs endpoint accepts the same query parameters.MCP: robust provider identity:
instanceId, and each event / state snapshot carries it plus a nameIsUnique flag. Previously providers were tracked purely by display name, so two unnamed providers of the same type (both Provider<int>) or two providers sharing an explicit name: collided: one silently overwrote the other in the state snapshot and the command target map, so get_provider_state hid one of them and invalidate_provider could hit the wrong one. Distinct providers are now kept distinct and individually addressable.invalidate_provider (and the POST /commands endpoint / DevTools command extension) accept either a provider name or an exact instanceId. When a name is shared by more than one provider the command is rejected with ambiguous: true and the list of candidate instanceIds, instead of silently acting on an arbitrary one. A successful command echoes back the resolved provider name and instanceId.GET /providers keeps a separate entry per instance for same-named providers and can be filtered by instanceId as well as by name; the dependency-graph runtime status merges same-named instances with "active" winning over "failed".Fixes:
<Cyclic Reference>. The recursion-depth guard ran after a value was added to the cycle-detection set but returned without removing it, so an object first reached past the depth limit stayed marked as "seen" and a later, shallower occurrence of the same object was wrongly flagged as a cycle. The depth check now runs before cycle tracking.Invalidate / Refresh reliability:
Provider "…" is not alive error when invalidating or refreshing the same provider a second time. Invalidate/refresh disposes the provider, and its rebuild is not always reported back before the next command, so tracking "what is live right now" made the second command think the still-in-use provider was gone. Commands now target the stable provider definition (kept across dispose, bounded to avoid unbounded growth), so a provider can be invalidated/refreshed repeatedly. invalidate_provider (MCP) gains the same robustness — a provider that has been observed stays targetable, and refresh recreates it even if it was since disposed.Flexible title competing with a Spacer used to leave a dead gap after the actions at wide layouts.Infrastructure & UX (#57):
8788–8797 instead of failing when 8788 is taken, so two debug apps can run at once. The MCP server discovers running apps by probing the range; a new list_riverpod_apps tool reports each app's port / provider count / event count, and every tool accepts an optional port to target a specific app (auto-selected when only one is running).Performance diagnostics: update frequency, async load duration, churn (#56):
loading→data/error transitions), and dispose→re-create churn count, aggregated from the event log. Rows that exceed a threshold are highlighted and sorted to the top by default (with a "needs attention" count in the header); a legend explains the thresholds. Click a column header to re-sort; click a row to jump to that provider in the Inspector view.get_provider_stats MCP tool (and GET /stats on the local HTTP endpoint) returning the same aggregation — including per-provider updateBuckets (30s update histogram) — so AI tools can be asked "which provider is rebuilding excessively?" without pulling and analyzing the full event log.Interactive dependency graph view (#55):
watch solid, read dashed, listen dotted), status coloring (active / disposed / failed with error badge), and dependency-cycle highlighting.dependencyDetails (kind + source location per dependency, from the static-analysis registry) to provider_added events so the extension can style edges.State operations: invalidate / refresh from DevTools and MCP (#54):
invalidate / refresh commands against them. Debug mode only.ext.riverpod_devtools.command service extension so the DevTools extension can run commands on any platform; the DevTools Provider Details panel gains Invalidate and Refresh buttons (disabled for disposed providers, with inline success/error feedback).invalidate_provider MCP tool (and POST /commands on the local HTTP endpoint) so AI tools can reproduce flows end-to-end: clear logs → invalidate → read logs. The tool description flags it as a state-mutating action.MCP tool expansion (#53):
get_provider_state MCP tool (and GET /providers on the local HTTP endpoint): a current-state snapshot of live providers — name, status (active/failed), latest value, error details when failed, and last-update timestamp — so AI tools no longer need to replay the event log to answer "what is the current state". Disposed providers are evicted from the snapshot; clear_riverpod_logs does not affect it.get_dependency_graph MCP tool (and GET /graph): nodes with runtime status merged in, plus directed dependency edges (watch/read/listen, with source locations) from the static-analysis registry. An optional provider parameter returns only that provider's transitive dependencies and dependents.First-class error capture (#52):
providerDidFail (Riverpod 2.x and 3.x signatures) and emits a provider_failed event carrying the error's runtime type, message (capped at 2000 chars), and a trimmed stack trace (Riverpod-internal frames dropped, max 20 frames).get_riverpod_logs and GET /logs accept a new type filter (e.g. provider_failed to fetch only errors).Causality chain (why did this provider rebuild?) (#51):
seq number for unambiguous ordering (timestamps collide within a millisecond).provider_updated events now carry triggeredBy — the dependency update(s) that likely caused the recomputation, inferred from the static dependency graph plus temporal proximity and marked triggerConfidence: "inferred".get_riverpod_logs automatically, so AI tools can trace update cascades.MCP:
get_riverpod_logs now accepts optional limit (most recent N events) and provider (exact provider name) parameters, so AI tools can fetch only the relevant slice of the buffer instead of up to 1000 full events. The local HTTP endpoint (GET /logs) accepts the same values as query parameters.Performance:
RiverpodDevToolsObserver is now near-zero overhead when nothing can consume its events (release/profile builds without a DevTools client attached): value serialization is skipped entirely instead of running on every provider change.==/hashCode calls (e.g. freezed models with large collections) on every event, and no longer builds an object's toString() when it serializes via toJson().NoSuchMethodError on every event on Riverpod 2.x.Fixes:
AsyncValue states (data/loading/error) are shown again in the extension UI — the asyncState marker was unreachable in serialization because the structured toString() parser returned first.Dev:
vm_service constraint to >=14.0.0 <16.0.0 so it resolves with Flutter >=3.32 (which pins vm_service 15.0.0).Highlighted MCP support in the README (badge, tagline, Features list, dedicated section) and pub.dev metadata (description, topics) — no code changes.
description, topics) — no code changes.Published to pub.dev: https://pub.dev/packages/riverpod_devtools/versions/0.6.1
Published to pub.dev: https://pub.dev/packages/riverpod_devtools/versions/0.6.1
analyzer constraint from ^6.0.0 to >=6.0.0 <15.0.0 to cover the current latest analyzer release and improve the pub.dev "Support up-to-date dependencies" score.StateProvider with NotifierProvider/Notifier in the bundled example so it keeps compiling across the full supported flutter_riverpod range (2.3.0–4.0.0), including when resolved to Riverpod 3.x.Full diff: v0.6.0...v0.6.1
analyzer constraint from ^6.0.0 to >=6.0.0 <15.0.0 to cover the current latest analyzer release and improve the pub.dev "supports latest dependencies" score.StateProvider with NotifierProvider/Notifier in the bundled example so it keeps compiling across the full supported flutter_riverpod range (2.3.0–4.0.0), including when resolved to Riverpod 3.x.Published to pub.dev: https://pub.dev/packages/riverpod_devtools/versions/0.6.0
Published to pub.dev: https://pub.dev/packages/riverpod_devtools/versions/0.6.0
dart run riverpod_devtools:riverpod_devtools_mcp) so AI tools like Claude Code can read live Riverpod provider event logs from a running app. See MCP.md.RiverpodDevToolsObserver now starts a local, debug-only HTTP server (localhost:8788) that the MCP server reads from.dart:developer instead of being silently swallowed.^3.7.0 and Flutter >=3.32.0 to accommodate the MCP server's dart_mcp dependency. If you can't upgrade yet, stay on riverpod_devtools: ^0.5.0.tool/release.sh to automate version sync across the package, the DevTools extension config, and the extension source package, plus the extension build/copy step.Full diff: v0.4.4...v0.6.0
Static Dependency Analysis (CLI):
dart run riverpod_devtools:analyze to generate lib/riverpod_dependencies.json.RiverpodDevToolsRegistry for loading static metadata in your app.ListUtils, deduplicated observer event payload building.feat: improve data serialization, enhance Tree View/Event Log UI, and…
feat: improve data serialization, enhance Tree View/Event Log UI, and…
toString() output.entity metadata key in the JSON tree view, allowing for better representation of complex objects.feat: enhance Riverpod DevTools UI, tree view, and event log, and fix…
feat: enhance Riverpod DevTools UI, tree view, and event log, and fix…
entries over string representation).Fixed missing DevTools extension build files (index.html and other assets) that prevented the extension from loading properly
chore: Bump version to 0.4.1 and fix config.yaml version mismatch
chore: Bump version to 0.4.1 and fix config.yaml version mismatch
feat: Add build files for the extension and update related documentat…
feat: Add build files for the extension and update related documentat…
Recomputed status for invalidation waves)invalidate, refresh, rebuild, dependencyChangeEvent, and asyncCompleteString, int) in Tree Viewflutter_riverpod dependency range to >=2.3.0 <4.0.0Refresh provider list UI and add filtering feature
collections, lifecycle, todo, async) and new demos for Set, Map, and nested collectionsInitial release of access to the Riverpod DevTools extension.
RiverpodDevToolsObserver to track provider events.Your coding agent can read these notes before it upgrades. Set up the MCP server →