树拥抱者JS
STDIOJavaScript/TypeScript代码分析与转换服务器
JavaScript/TypeScript代码分析与转换服务器
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_codeParse 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_patternFind 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_patternFind all nodes matching a pattern.
Parameters:
pattern (string): Pattern to matchlimit (number, optional): Maximum matches to returnget_functionsGet all functions with details.
Parameters:
includeAnonymous (boolean, optional): Include anonymous functions (default: true)asyncOnly (boolean, optional): Only return async functions (default: false)get_classesGet all classes with methods and properties.
Parameters:
includeProperties (boolean, optional): Include class properties (default: true)includeMethods (boolean, optional): Include class methods (default: true)get_importsGet all import statements.
Parameters:
includeTypeImports (boolean, optional): Include TypeScript type-only imports (default: true)rename_identifierRename 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_importsRemove unused import statements.
Parameters:
preview (boolean, optional): Return preview only (default: false)transform_codeApply 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_codeInsert 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_positionGet AST node at specific line and column.
Parameters:
line (number): Line number (1-based)column (number): Column number (0-based)analyze_scopesAnalyze variable scopes and bindings.
Parameters:
includeBuiltins (boolean, optional): Include built-in identifiers (default: false)The server provides three resources for accessing internal state:
ast://currentCurrent parsed AST state with metadata and statistics.
ast://analysisResults from the most recent code analysis (functions, classes, imports).
ast://transformsHistory 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