Server data from the Official MCP Registry
Decodes React DevTools Profiler exports into render summaries and memoization advice for AI agents.
Decodes React DevTools Profiler exports into render summaries and memoization advice for AI agents.
Valid MCP server (1 strong, 1 medium validity signals). No known CVEs in dependencies. Package registry verified. Imported from the Official MCP Registry. Trust signals: trusted author (14/14 approved).
5 files analyzed Β· 1 issue found
Security scores are indicators to help you make informed decisions, not guarantees. Always review permissions before connecting any MCP server.
This plugin requests these system permissions. Most are normal for its category.
Add this to your MCP configuration file:
{
"mcpServers": {
"io-github-vola-trebla-react-render-profile-mcp": {
"args": [
"-y",
"react-render-profile-mcp"
],
"command": "npx"
}
}
}From the project's GitHub README.
An MCP server that decodes React DevTools Profiler exports into actionable render summaries for AI agents.
Your agent just refactored a context provider. Now 80 components re-render on every keystroke. It has no idea.
AI agents modify React state management, restructure component trees, and refactor context β and they're completely blind to the performance impact.
The React DevTools Profiler can capture exactly what happened: which components re-rendered, why, and how long it took. But the exported .json is a dense structure with Fiber IDs, encoded operations, and microsecond timing data across hundreds of commits.
{
"version": 5,
"dataForRoots": [{
"commitData": [{
"fiberActualDurations": [[3, 15.2], [4, 8.1], [142, 3.2], ...],
"fiberSelfDurations": [[3, 3.9], [4, 4.9], [142, 3.2], ...],
"changeDescriptions": { "4": { "props": [], "didHooksChange": false, ... } },
...
}],
...
}]
}
The agent can't parse this. Even if it could, it can't run the aggregation to identify which components are wasting renders β it's raw tick data, not a performance summary.
This MCP server loads the profiler export and gives agents exactly what they need:
key prop)React.memo candidates β and which are too fast for memo to helpget_render_summaryHigh-level overview: total commits, total render time, top 5 slowest components, total spurious render count. Each component includes lifecycle counts so the agent can spot key-instability patterns.
{
"total_commits": 24,
"total_render_ms": 312.4,
"total_spurious_renders": 18,
"top_components": [
{
"component": "ProductList",
"render_count": 24,
"mount_count": 1,
"unmount_count": 0,
"update_count": 23,
"lifecycle_anomaly": false,
"total_self_ms": 89.2,
"pct_of_total": 28.55
},
{
"component": "ListItem",
"render_count": 20,
"mount_count": 20,
"unmount_count": 19,
"update_count": 0,
"lifecycle_anomaly": true,
"total_self_ms": 61.1,
"pct_of_total": 19.56
}
]
}
lifecycle_anomaly: true means the component is being destroyed and recreated on every render instead of updating β the classic unstable key prop bug. React rebuilds the entire DOM subtree each time.
Use first to understand the scale of the problem.
find_spurious_rendersComponents that re-rendered unnecessarily, with the root cause classified so the agent knows the correct fix.
{
"spurious_renders": [
{
"component": "ProductList",
"render_count": 24,
"spurious_count": 23,
"wasted_ms": 84.3,
"render_trigger": "UNSTABLE_PARENT_REF",
"concurrent_yield": false,
"recommendation": "Wrap with React.memo β re-renders are driven by unstable object/function/array references from the parent."
},
{
"component": "UserAvatar",
"render_count": 12,
"spurious_count": 11,
"wasted_ms": 18.7,
"render_trigger": "CONTEXT_UPDATE",
"concurrent_yield": false,
"recommendation": "React.memo cannot help here β context updates bypass memo. Stabilize the context value with useMemo, or split the context."
},
{
"component": "DeferredList",
"render_count": 8,
"spurious_count": 6,
"wasted_ms": 24.1,
"render_trigger": "UNSTABLE_PARENT_REF",
"concurrent_yield": true,
"recommendation": "INTENTIONAL_CONCURRENT_YIELD β all spurious renders happened during startTransition/useDeferredValue commits. This is expected React 18 behavior; do not add React.memo."
}
]
}
UNSTABLE_PARENT_REF β fix with React.memoCONTEXT_UPDATE β fix by stabilizing the context value; React.memo does nothing hereconcurrent_yield: true β React 18 intentionally renders these multiple times during transitions; do not optimizeget_hottest_componentsTop N components by self CPU time (excluding children). Includes transition_render_count so the agent can see what fraction of renders are React 18 deferred work.
{
"total_profile_ms": 312.4,
"components": [
{
"component": "ProductList",
"render_count": 24,
"transition_render_count": 3,
"total_self_ms": 89.2,
"avg_self_ms": 3.72,
"pct_of_total": 28.55
}
]
}
trace_render_cascadeFor a specific commit, shows what triggered it and every component that re-rendered as a result, sorted by duration. Now includes is_concurrent_commit so the agent knows whether this is a React 18 transition render.
{
"commit_index": 7,
"is_concurrent_commit": true,
"trigger": "SearchInput",
"total_commit_ms": 28.4,
"cascade": [
{
"component": "ProductList",
"self_ms": 18.2,
"actual_ms": 18.2,
"reason": "parent re-rendered (unstable props reference)"
},
{
"component": "SearchInput",
"self_ms": 9.1,
"actual_ms": 9.1,
"reason": "hook changed"
}
]
}
is_concurrent_commit: true means this commit was triggered by startTransition or useDeferredValue. React intentionally re-renders and discards incomplete trees in these lanes β flagging them as regressions would be wrong.
Use to understand propagation β why did 40 components re-render from one click?
suggest_memoizationMemoization suggestions with viability scores. Not every component with spurious renders benefits from React.memo β for components that render in under 2ms, the Object.is() comparison overhead can exceed the render cost.
{
"suggestions": [
{
"component": "ProductList",
"render_count": 24,
"spurious_count": 23,
"wasted_ms": 84.3,
"avg_render_ms": 3.72,
"prop_stability": "UNSTABLE_REFERENCES",
"recommendation": "MEMOIZE",
"reasoning": "Re-rendered 23Γ/24 times with unchanged props, wasting 84.3ms. Wrap with React.memo to skip renders when props are shallowly equal."
},
{
"component": "Badge",
"render_count": 30,
"spurious_count": 28,
"wasted_ms": 4.2,
"avg_render_ms": 0.15,
"prop_stability": "UNSTABLE_REFERENCES",
"recommendation": "DO_NOT_MEMOIZE",
"reasoning": "avg render time (0.15ms) is below 2ms β React.memo comparison overhead likely exceeds render cost. Fix the unstable reference in the parent instead."
},
{
"component": "DeferredList",
"render_count": 8,
"spurious_count": 6,
"wasted_ms": 24.1,
"avg_render_ms": 3.01,
"prop_stability": "UNSTABLE_REFERENCES",
"recommendation": "INTENTIONAL_CONCURRENT_YIELD",
"reasoning": "All spurious renders occurred during startTransition/useDeferredValue commits. React 18 intentionally renders these components multiple times while resolving deferred work β do not add React.memo."
}
]
}
MEMOIZE β high ROI, wrap with React.memoDO_NOT_MEMOIZE β too fast; memo overhead exceeds render cost; fix the parent reference insteadINTENTIONAL_CONCURRENT_YIELD β React 18 concurrent behavior; do not optimize{
"mcpServers": {
"react-render-profile": {
"command": "npx",
"args": ["-y", "react-render-profile-mcp"]
}
}
}
{
"react-render-profile": {
"command": "npx",
"args": ["-y", "react-render-profile-mcp"]
}
}
.json fileprofile_pathThe parser decodes the React DevTools Profiler export format (version 5):
snapshots (primary) or the encoded operations integer array (fallback)changeDescriptions.props === [] β React records an empty array when the props object reference changed but no individual prop keys differedchangeDescriptions.context === true β surfaced separately because React.memo cannot prevent theseisFirstMount per commit and TREE_OPERATION_REMOVE opcodes in the operations arraycommit.priorityLevel β "Low Priority" and "Idle" indicate startTransition/useDeferredValue lanesNo React dependency. No DevTools packages. Pure JSON parsing.
1. get_render_summary β understand the scale; spot lifecycle_anomaly (key instability)
2. find_spurious_renders β classify root cause: UNSTABLE_PARENT_REF vs CONTEXT_UPDATE vs concurrent_yield
3. trace_render_cascade β understand propagation; check is_concurrent_commit before flagging as regression
4. suggest_memoization β get verdicts: MEMOIZE / DO_NOT_MEMOIZE / INTENTIONAL_CONCURRENT_YIELD
Built alongside:
MIT
Be the first to review this server!
by Modelcontextprotocol Β· Developer Tools
Web content fetching and conversion for efficient LLM usage
by Modelcontextprotocol Β· Developer Tools
Read, search, and manipulate Git repositories programmatically
by Toleno Β· Developer Tools
Toleno Network MCP Server β Manage your Toleno mining account with Claude AI using natural language.