Skip to main content
Glama
lmn451

jsx-analyzer

by lmn451
README.md
# JSX Component Prop Analyzer

A powerful tool for analyzing JSX component prop usage in React/JSX codebases. Now available as both a CLI tool and an MCP (Model Context Protocol) server!

## Features

- **Recursive file scanning** - Analyzes `.js`, `.jsx`, `.ts`, and `.tsx` files
- **Component detection** - Finds JSX components by name
- **Prop analysis** - Searches for specific props and their values
- **Missing prop detection** - Identifies components missing required props
- **Substring matching** - Search for prop values containing specific strings
- **Detailed output** - Shows file paths, line numbers, and prop values

## Installation

```bash
npm install
```

## Usage

### CLI Mode

Use the traditional command-line interface:

```bash
# Basic usage - find components with specific prop
./cli.js <rootDir> <componentName> <propName> [propValue]

# Find Button components with className prop
./cli.js ./src Button className

# Find Button components with specific className value
./cli.js ./src Button className "btn-primary"

# Find components missing a required prop
./cli.js ./src Button onClick --find-missing

# Verbose output showing all props
./cli.js ./src Button className --verbose

# Substring matching
./cli.js ./src Button className "primary" --includes
```

**CLI Options:**

- `--find-missing, -m`: Find components missing the specified prop
- `--verbose, -v`: Include all props of matching components in output
- `--includes, -i`: Substring match for prop values

### MCP Server Mode

The project now also works as an MCP server, exposing three tools:

#### Installation for VS Code / Cursor

You have two options for installing this MCP server:

##### Option 1: Local Installation

**For VS Code with Roo/Cline:**

1. Open the MCP settings file: `~/Library/Application Support/Code/User/globalStorage/rooveterinaryinc.roo-cline/settings/mcp_settings.json`
2. Add the jsx-analyzer server to the `mcpServers` object:

```json
{
  "mcpServers": {
    "jsx-analyzer": {
      "command": "node",
      "args": ["/absolute/path/to/your/project/mcp-server.js"],
      "disabled": false,
      "alwaysAllow": []
    }
  }
}
```

**For Cursor with Claude/Cline:**

1. Open the MCP settings file: `~/Library/Application Support/Cursor/User/globalStorage/rooveterinaryinc.roo-cline/settings/mcp_settings.json`
2. Add the same configuration as above

**Local Installation Notes:**

- Replace `/absolute/path/to/your/project/mcp-server.js` with the actual absolute path to your mcp-server.js file
- Make sure you've run `npm install` in the project directory first
- Restart VS Code/Cursor after modifying the settings file

##### Option 2: NPX Installation (if published to npm)

If this package is published to npm, you can use npx for easier installation:

**For VS Code with Roo/Cline:**

```json
 "jsx-analyzer": {
      "command": "npx",
      "args": ["-y", "my-component-prop-analyzer"],
      "disabled": false
    }
```

**For Cursor with Claude/Cline:**
Use the same configuration as above.

**NPX Installation Benefits:**

- No need to clone the repository locally
- Always uses the latest published version
- Simpler configuration (no absolute paths required)
- Automatic dependency management

**Publishing to NPM (for package maintainers):**
To enable npx installation, publish the package:

```bash
# Update package name in package.json if needed
npm login
npm publish
```

Then users can reference it via npx using the published package name.

**General Notes:**

- Restart VS Code/Cursor after modifying the settings file
- The server will automatically start when you begin a new conversation

#### Verification

After installation, you should see "jsx-analyzer" listed in the Connected MCP Servers section when you start a new conversation.

#### Tools Available:

1. **`analyze_jsx_props`** - General JSX prop analysis

   - `rootDir`: Directory or file to analyze
   - `componentName`: JSX component name to search for
   - `propName`: Prop name to search for
   - `propValue` (optional): Expected prop value
   - `findMissing` (optional): Find missing props
   - `verbose` (optional): Include all props in output
   - `includes` (optional): Substring matching

2. **`find_missing_props`** - Find components missing required props

   - `rootDir`: Directory or file to analyze
   - `componentName`: JSX component name
   - `propName`: Required prop name
   - `verbose` (optional): Include all props in output

3. **`search_prop_values`** - Search prop values with substring matching
   - `rootDir`: Directory or file to analyze
   - `componentName`: JSX component name
   - `propName`: Prop name to search
   - `searchValue`: String to search for within prop values
   - `verbose` (optional): Include all props in output

The MCP server has been automatically configured and is ready to use!

## Project Structure

```
├── analyzer.js     # Core analysis logic
├── cli.js          # CLI interface
├── mcp-server.js   # MCP server interface
├── package.json    # Dependencies and scripts
└── README.md       # This file
```

## Examples

### CLI Examples

```bash
# Find all Button components with onClick prop
./cli.js ./src Button onClick

# Find Button components missing onClick prop
./cli.js ./src Button onClick --find-missing

# Find Input components with type="password"
./cli.js ./src Input type "password"

# Find components with className containing "primary"
./cli.js ./src Button className "primary" --includes --verbose
```

### MCP Examples

When using through an MCP client, you can invoke tools like:

- Analyze Button components for className prop in ./src directory
- Find Input components missing the required 'name' prop
- Search for components with className values containing 'btn-'

## Output Format

### CLI Output

```
--- JSX Prop Analysis Results ---

[1] src/components/Button.jsx:15
  Props: {
    "className": "btn btn-primary"
  }

[2] src/pages/Home.jsx:42
  Props: {
    "className": "btn btn-secondary"
  }
```

### MCP Output

```json
{
  "summary": {
    "totalMatches": 2,
    "searchCriteria": {
      "component": "Button",
      "prop": "className",
      "value": null,
      "mode": "existing props"
    }
  },
  "matches": [
    {
      "filePath": "src/components/Button.jsx",
      "lineNumber": 15,
      "props": {
        "className": "btn btn-primary"
      }
    }
  ]
}
```

## Supported File Types

- `.js` - JavaScript files
- `.jsx` - React JSX files
- `.ts` - TypeScript files
- `.tsx` - TypeScript JSX files

## Excluded Directories

The analyzer automatically skips:

- `node_modules`
- `.git`
- `dist`
- `build`
- `.next`

---

Your JSX prop analyzer is now ready to use in both CLI and MCP modes! 🚀