
Tree-Hugger-JS
STDIOJavaScript/TypeScript code analysis and transformation server using tree-hugger-js library.
JavaScript/TypeScript code analysis and transformation server using tree-hugger-js library.
An MCP (Model Context Protocol) server that provides AI agents with powerful JavaScript/TypeScript code analysis and transformation capabilities using the tree-hugger-js library.
function
, class[name="MyClass"]
)Try immediately with npx - no installation required:
# Use with Claude Code or any MCP client npx tree-hugger-js-mcp
# Install globally for repeated use npm install -g tree-hugger-js-mcp # Then run anywhere tree-hugger-js-mcp
# Clone and build from source git clone https://github.com/qckfx/tree-hugger-js-mcp.git cd tree-hugger-js-mcp npm install npm run build npm start
Add to your MCP client configuration:
{ "mcpServers": { "tree-hugger-js": { "command": "npx", "args": ["tree-hugger-js-mcp"] } } }
{ "mcpServers": { "tree-hugger-js": { // If installed globally "command": "tree-hugger-js-mcp" // Or if built from source "command": "node", "args": ["/path/to/tree-hugger-js-mcp/build/index.js"] } } }
parse_code
Parse JavaScript/TypeScript code from file or string.
Parameters:
source
(string): File path or code string to parseisFilePath
(boolean, optional): Whether source is a file path (auto-detected if not provided)language
(string, optional): Language to use (javascript, typescript, jsx, tsx)Example:
// Parse a file await callTool("parse_code", { source: "./src/app.js", isFilePath: true }); // Parse code string await callTool("parse_code", { source: "function hello() { console.log('world'); }" });
find_pattern
Find first node matching a pattern.
Parameters:
pattern
(string): Pattern to match using tree-hugger-js syntaxExamples:
// Find any function await callTool("find_pattern", { pattern: "function" }); // Find async functions await callTool("find_pattern", { pattern: "function[async]" }); // Find class by name await callTool("find_pattern", { pattern: "class[name='MyClass']" });
find_all_pattern
Find all nodes matching a pattern.
Parameters:
pattern
(string): Pattern to matchlimit
(number, optional): Maximum matches to returnget_functions
Get all functions with details.
Parameters:
includeAnonymous
(boolean, optional): Include anonymous functions (default: true)asyncOnly
(boolean, optional): Only return async functions (default: false)get_classes
Get all classes with methods and properties.
Parameters:
includeProperties
(boolean, optional): Include class properties (default: true)includeMethods
(boolean, optional): Include class methods (default: true)get_imports
Get all import statements.
Parameters:
includeTypeImports
(boolean, optional): Include TypeScript type-only imports (default: true)rename_identifier
Rename all occurrences of an identifier.
Parameters:
oldName
(string): Current identifier namenewName
(string): New identifier namepreview
(boolean, optional): Return preview only (default: false)Example:
await callTool("rename_identifier", { oldName: "fetchData", newName: "fetchUserData", preview: true });
remove_unused_imports
Remove unused import statements.
Parameters:
preview
(boolean, optional): Return preview only (default: false)transform_code
Apply multiple transformations in sequence.
Parameters:
operations
(array): Array of transformation operationspreview
(boolean, optional): Return preview only (default: false)Example:
await callTool("transform_code", { operations: [ { type: "rename", parameters: { oldName: "oldFunc", newName: "newFunc" } }, { type: "removeUnusedImports" }, { type: "replaceIn", parameters: { nodeType: "string", pattern: /localhost/g, replacement: "api.example.com" } } ], preview: true });
insert_code
Insert code before or after nodes matching a pattern.
Parameters:
pattern
(string): Pattern to match for insertion pointscode
(string): Code to insertposition
(string): "before" or "after"preview
(boolean, optional): Return preview only (default: false)get_node_at_position
Get AST node at specific line and column.
Parameters:
line
(number): Line number (1-based)column
(number): Column number (0-based)analyze_scopes
Analyze variable scopes and bindings.
Parameters:
includeBuiltins
(boolean, optional): Include built-in identifiers (default: false)The server provides three resources for accessing internal state:
ast://current
Current parsed AST state with metadata and statistics.
ast://analysis
Results from the most recent code analysis (functions, classes, imports).
ast://transforms
History of code transformations and available operations.
Tree-hugger-js uses intuitive patterns instead of verbose tree-sitter node types:
function
- Any function (declaration, expression, arrow, method)class
- Class declarations and expressionsstring
- String and template literalsimport
/export
- Import/export statementscall
- Function callsloop
- For, while, do-while loops[name="foo"]
- Nodes with specific name[async]
- Async functions[text*="test"]
- Nodes containing textclass method
- Methods inside classesfunction > return
- Return statements directly in functions:has()
and :not()
pseudo-selectors// Parse and analyze a React component await callTool("parse_code", { source: "./components/UserProfile.jsx" }); // Get all functions const functions = await callTool("get_functions", { asyncOnly: true }); // Find JSX elements const jsxElements = await callTool("find_all_pattern", { pattern: "jsx" });
// Rename a function and remove unused imports await callTool("transform_code", { operations: [ { type: "rename", parameters: { oldName: "getUserData", newName: "fetchUserProfile" } }, { type: "removeUnusedImports" } ] });
// Find all async functions that call console.log await callTool("find_all_pattern", { pattern: "function[async]:has(call[text*='console.log'])" }); // Find classes with constructor methods await callTool("find_all_pattern", { pattern: "class:has(method[name='constructor'])" });
# Install dependencies npm install # Build the project npm run build # Watch mode for development npm run dev # Test with MCP inspector npm run inspector
The server provides detailed error messages and suggestions:
MIT