
Ast Impact Mapper Mcp
io.github.vola-treblaPublished by GitHub account vola-treblav0.3.1Updated Oct 24, 2026
MCP server that uses TypeScript AST to find which tests are affected by a code change
Overview
Local MCP server that parses TypeScript/JavaScript projects with an AST to find which tests a code change affects and to inspect dependency graphs.
- What you can do
- Map changed files or a git branch diff to the tests that transitively import them, and explain the import chain behind each match, including rename-aware diffs and generated runner commands for jest, vitest or playwright. Separate type-only changes from runtime changes and tell whether a file's public API changed or only its internals. Trace declaration-level symbol dependencies and render a file's direct imports and importers as JSON or a Mermaid flowchart. Find dead code, circular imports, files never imported by tests, and summarize test coverage and high-risk modules. Generate token-light file skeletons and refresh the cached AST and dependency graphs.
- When to use it
- Useful when an assistant works on a TypeScript or JavaScript repository and you want it to run only the tests affected by a change, to justify why a test is relevant, or to audit imports, dead code and circular dependencies.
- Requirements
- Runs as a local stdio process, installed from the npm package ast-impact-mapper-mcp (for example via npx) and configured in the client. Needs Node.js and a local TypeScript/JavaScript project; git is needed for the branch-diff tools. No authentication, environment variables or headers are declared.
Installation
In SourceWeft
- Open Ast Impact Mapper Mcp in the dashboard and add it to a workspace.
- Enable the server for the chats that should use its tools.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Other MCP clients
Follow the launch instructions in the repository.
README
🗺️ ast-impact-mapper-mcp ✨
[npm version] [npm downloads] [CI] [License: MIT]
"Stop boiling the ocean. Run only the tests that actually care about your changes." 🐸
ast-impact-mapper-mcp is an advanced Model Context Protocol (MCP) server that analyzes your TypeScript/JavaScript codebase using AST parsing (ts-morph) and dependency graph tracing. It helps AI agents (like Claude or Cursor) target only the relevant tests, find dead code, identify circular import dependencies, and trace API mutations.
🧐 Why import graphs?
Guessing affected tests based on matching filenames (e.g. auth.ts -> auth.test.ts) is highly inaccurate. Running the entire test suite on every minor change is extremely slow.
Import graphs do not lie. If a test file transitively imports a modified source file, it must be run. ast-impact-mapper-mcp builds a bidirectional file dependency graph and answers "which tests should I run?" in milliseconds.
💡 Quick Showcase (Real-World e2e Flow)
Imagine your AI agent modifies a shared helper: src/utils/auth.ts. Instead of blindly running all tests or guessing by name, the agent uses this MCP server:
1. Identify Affected Tests
The agent calls get_affected_tests with the changed file:
2. Explain the Connection
To understand why checkout.spec.ts depends on auth.ts, the agent calls explain_impact:
Aha! The checkout spec imports the user-fixture, which imports auth!
3. Check for Runtime Impact
If the change in auth.ts was only adding a TypeScript interface (type-only change), calling differentiate_type_impact tells the agent:
Success! Since it is a type-only change, the agent can skip running tests entirely, saving precious CPU cycles and time.
4. Run Minimal Tests
If it does contain runtime changes, the agent requests the execution command:
🛠️ MCP Tools Reference
All tools are configured with consistent, type-safe schemas (arguments in snake_case).
1. Impact Mapping & Tracing
-
get_affected_testsFinds all test files transitively importing changed source files.
- Arguments:
project_root(string, required): Absolute path to the TypeScript project.changed_files(string[], optional): Modified file paths.git_diff(string, optional): Raw stdout ofgit diff --name-only.
- Returns: Detailed map of changed files, affected tests, and totals.
- Arguments:
-
get_affected_tests_by_branchAutomatically diffs the current state against a base branch using git to find affected tests.
- Arguments:
project_root(string, required)base_branch(string, default:"main"): Branch to compare against.
- Arguments:
-
get_rename_aware_diffHighly robust branch impact analysis that tracks file moves/renames (via
git diff -M) and ignores formatting/whitespace changes.- Arguments:
project_root(string, required)base_branch(string, default:"main")similarity_threshold(number, default:90): % similarity threshold to declare a move.
- Arguments:
-
explain_impactTraces and explains the exact chain of imports showing why a changed source file affects a specific test.
- Arguments:
project_root(string, required)changed_file(string, required)test_file(string, required)
- Arguments:
-
generate_test_commandConstructs CLI commands for test runners (
vitest,jest, orplaywright) matching the affected tests subset.- Arguments:
project_root(string, required)changed_files(string[], required)runner(enum:jest,vitest,playwright, default:vitest)
- Arguments:
2. TypeScript-specific Deep Code Analysis
-
differentiate_type_impactInspects imports and types to isolate type-only changes (interfaces, types, or
import typeexports). Helps skip test execution entirely if the changes do not impact the runtime bundle!- Arguments:
project_root(string, required)changed_files(string[], required)
- Arguments:
-
analyze_api_surface_mutationCompares a file against its
HEADversion and determines if it modifies the public API (breaking_api_change) or only contains internal implementation edits (internal_refactor).- Arguments:
project_root(string, required)file_path(string, required)
- Arguments:
-
generate_skeleton_viewGenerates a token-optimized skeleton of a file by stripping out function and method bodies, keeping only signatures, JSDocs, and line numbers.
- Arguments:
project_root(string, required)file_path(string, required)include_jsdoc(boolean, default:true)include_private_members(boolean, default:false)
- Arguments:
-
get_symbol_dependency_graphTraces declaration-level dependencies (functions, classes, variables) across files, finding internal declarations usage.
- Arguments:
project_root(string, required)file_path(string, required)symbol_name(string, optional): Specific export symbol to map.direction(enum:forward,reverse,bidirectional, default:bidirectional)
- Arguments:
3. Codebase Health & Graph Insights
-
identify_unreachable_modulesFinds orphaned source files that have zero incoming imports (dead code safe to prune). Automatically respects standard entry points.
- Arguments:
project_root(string, required)entry_points(string[], optional): Explicit entry-points to exclude from warning.limit(number, default:50)
- Arguments:
-
detect_architectural_cyclesLocates circular dependency loops (e.g.
A → B → C → A) which cause unpredictable module initialization orders.- Arguments:
project_root(string, required)
- Arguments:
-
get_dependency_graphReturns direct imports/importers of a file in JSON format or as a visual Mermaid TD flowchart.
- Arguments:
project_root(string, required)file_path(string, required)format(enum:json,mermaid, default:json)
- Arguments:
-
get_coverage_gapsIdentifies files with zero import coverage — those that are never imported by any test file.
- Arguments:
project_root(string, required)source_dirs(string[], optional)limit(number, default:50)
- Arguments:
-
get_test_summaryProvides a high-level view of test coverage rate, deepest import chains, and high-risk most-imported modules.
- Arguments:
project_root(string, required)
- Arguments:
-
refresh_projectInvalidates AST and dependency graphs cache. Run this after checking out branches or pulling remote git updates.
- Arguments:
project_root(string, required)
- Arguments:
🚀 Installation & Setup
1. Global Installation
2. Configure Editor / Agent Client
VS Code / Cursor
Add the following to your .cursor/mcp.json or .vscode/mcp.json:
Claude Code CLI
💬 Example Scenario
Imagine you modify a shared page component: src/pages/login-page.ts.
- AI Agent runs
get_rename_aware_diff: It detects that onlytests/auth.spec.tsimports the page object transitively. - AI Agent runs
differentiate_type_impact: It sees you only added a type definition interface, classifying it astype_only_change-> it skips running the test execution completely, saving developer cycles! - AI Agent runs
explain_impact: If asked whytests/auth.spec.tsdepends on it, it renders the path:tests/auth.spec.ts→src/fixtures/app.ts→src/pages/login-page.ts.
🔗 The Ecosystem
ast-impact-mapper-mcpanswers: "Which tests are affected by my changes?" 🗺️flakiness-graph-mcpanswers: "Of those affected tests, which ones are historically unstable?" 📊- Together, they form a perfect feedback loop for running a prioritized, resilient, and minimal test suite.
🛠️ CLI Development
📄 License
MIT © vola-trebla 🐸
Source: README.md at commit f895ef2
Tools
0Version history
1- v0.3.1LatestSep 16, 2026
Score
50% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
- Reached in the last 30 days25 pts
Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.
- Auth declared10 pts
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
- Tools listed15 pts
Answer tools/list without a credential, or ship a package that starts in a sandbox without one.
- DescriptionRequired15 pts
- Logo10 pts
- Documentation15 pts
- License10 pts