Skip to main content
Glama
qckfx

Tree-Hugger-JS MCP Server

by qckfx
README.md
# Tree-Hugger-JS MCP Server

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.

<a href="https://glama.ai/mcp/servers/@qckfx/tree-hugger-js-mcp">
  <img width="380" height="200" src="https://glama.ai/mcp/servers/@qckfx/tree-hugger-js-mcp/badge" alt="Tree-Hugger-JS Server MCP server" />
</a>

## Features

### 🔍 Code Analysis
- Parse JavaScript, TypeScript, JSX, and TSX files or code strings
- Find patterns using intuitive syntax (e.g., `function`, `class[name="MyClass"]`)
- Extract functions, classes, imports with detailed metadata
- Navigate AST nodes and analyze code structure
- Get nodes at specific positions

### 🔧 Code Transformation
- Rename identifiers throughout code
- Remove unused imports
- Chain multiple transformations
- Insert code before/after patterns
- Preview transformations before applying

### 📊 Code Intelligence
- Scope analysis and variable binding
- Pattern matching with CSS-like selectors
- Support for async functions, classes, methods
- TypeScript type import handling

## Installation & Usage

### 🚀 Quick Start (Recommended)

Try immediately with npx - no installation required:

```bash
# Use with Claude Code or any MCP client
npx tree-hugger-js-mcp
```

### 📦 Global Installation

```bash
# Install globally for repeated use
npm install -g tree-hugger-js-mcp

# Then run anywhere
tree-hugger-js-mcp
```

### 🔧 Development Setup

```bash
# 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
```

## MCP Client Configuration

### Using with Claude Code

Add to your MCP client configuration:

```json
{
  "mcpServers": {
    "tree-hugger-js": {
      "command": "npx",
      "args": ["tree-hugger-js-mcp"]
    }
  }
}
```

### Alternative Configurations

```json
{
  "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"]
    }
  }
}
```

## Tools

### Code Analysis Tools

#### `parse_code`
Parse JavaScript/TypeScript code from file or string.

**Parameters:**
- `source` (string): File path or code string to parse
- `isFilePath` (boolean, optional): Whether source is a file path (auto-detected if not provided)
- `language` (string, optional): Language to use (javascript, typescript, jsx, tsx)

**Example:**
```javascript
// 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 syntax

**Examples:**
```javascript
// 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 match
- `limit` (number, optional): Maximum matches to return

#### `get_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)

### Code Transformation Tools

#### `rename_identifier`
Rename all occurrences of an identifier.

**Parameters:**
- `oldName` (string): Current identifier name
- `newName` (string): New identifier name
- `preview` (boolean, optional): Return preview only (default: false)

**Example:**
```javascript
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 operations
- `preview` (boolean, optional): Return preview only (default: false)

**Example:**
```javascript
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 points
- `code` (string): Code to insert
- `position` (string): "before" or "after"
- `preview` (boolean, optional): Return preview only (default: false)

### Navigation Tools

#### `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)

## Resources

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.

## Pattern Syntax

Tree-hugger-js uses intuitive patterns instead of verbose tree-sitter node types:

### Basic Patterns
- `function` - Any function (declaration, expression, arrow, method)
- `class` - Class declarations and expressions
- `string` - String and template literals
- `import`/`export` - Import/export statements
- `call` - Function calls
- `loop` - For, while, do-while loops

### Attribute Selectors
- `[name="foo"]` - Nodes with specific name
- `[async]` - Async functions
- `[text*="test"]` - Nodes containing text

### CSS-like Selectors
- `class method` - Methods inside classes
- `function > return` - Return statements directly in functions
- `:has()` and `:not()` pseudo-selectors

## Examples

### Basic Code Analysis
```javascript
// 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" });
```

### Code Refactoring
```javascript
// Rename a function and remove unused imports
await callTool("transform_code", {
  operations: [
    { type: "rename", parameters: { oldName: "getUserData", newName: "fetchUserProfile" } },
    { type: "removeUnusedImports" }
  ]
});
```

### Pattern Matching
```javascript
// 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'])" 
});
```

## Development

```bash
# Install dependencies
npm install

# Build the project
npm run build

# Watch mode for development
npm run dev

# Test with MCP inspector
npm run inspector
```

## Error Handling

The server provides detailed error messages and suggestions:
- File not found errors for invalid file paths
- Parse errors with helpful context
- Pattern matching errors with suggestions
- Transformation errors with rollback capability

## License

MIT

TDQS

A4.1/5.0

Scored across 12 tools

Disambiguation4/5

Most tools have distinct purposes, such as parse_code for loading code, get_functions for retrieving functions, and rename_identifier for refactoring. However, find_pattern and find_all_pattern overlap significantly in functionality, differing only in returning the first match versus all matches, which could cause confusion in selection. The other tools are well-differentiated, with clear boundaries like analyze_scopes for scope analysis and insert_code for code insertion.

Naming Consistency5/5

All tool names follow a consistent snake_case pattern with clear verb_noun structures, such as parse_code, get_functions, rename_identifier, and remove_unused_imports. There are no deviations in naming conventions, making the set predictable and easy to understand. The naming style is uniform throughout, enhancing readability and usability.

Tool Count5/5

With 12 tools, the count is well-scoped for a JavaScript/TypeScript AST analysis server, covering essential operations like parsing, querying, transforming, and refactoring code. Each tool serves a specific purpose, such as get_imports for dependency analysis and transform_code for complex workflows, without redundancy. The number aligns perfectly with the domain's complexity, providing comprehensive coverage without being overwhelming.

Completeness5/5

The toolset offers complete coverage for AST-based code analysis and manipulation, including parsing (parse_code), querying (e.g., get_functions, get_classes), transformation (e.g., insert_code, rename_identifier), and cleanup (remove_unused_imports). It supports full lifecycle operations from loading code to advanced refactoring with transform_code, leaving no obvious gaps. The domain of code analysis and refactoring is thoroughly addressed with tools for both analysis and modification.

Maintenance

ActivityInactive
ResponsivenessNo issues