Skip to main content
Glama
RyanCadby

License Scanner MCP Server

by RyanCadby
README.md
# License Scanner MCP Server

A Model Context Protocol (MCP) server built with FastMCP that scans project dependencies and generates license reports in markdown format.

## Features

- **Multi-package manager support**: npm, pip, cargo, and more
- **Automatic license detection**: Fetches license information from package registries
- **Markdown report generation**: Creates comprehensive license reports
- **Caching**: Avoids repeated API calls for better performance
- **Error handling**: Robust error handling and informative error messages

## Supported Package Managers

- **npm/yarn/pnpm**: `package.json`, `yarn.lock`, `pnpm-lock.yaml`
- **Python**: `requirements.txt`, `pyproject.toml`, `Pipfile`
- **Rust**: `Cargo.toml`, `Cargo.lock`
- **PHP**: `composer.json`, `composer.lock`
- **Ruby**: `Gemfile`, `Gemfile.lock`
- **Go**: `go.mod`, `go.sum`
- **Java**: `pom.xml`, `build.gradle`

## Installation

1. Install dependencies:
```bash
pip install -r requirements.txt
```

2. Run the MCP server:
```bash
python license_scanner.py
```

## Available Tools

### 1. `scan_dependencies(project_path: str)`
Scans a project for dependencies and returns detailed license information.

**Parameters:**
- `project_path`: Path to the project directory to scan

**Returns:** JSON string containing dependency and license information

### 2. `generate_license_report(project_path: str, output_file: str = None)`
Generates a markdown license report for a project.

**Parameters:**
- `project_path`: Path to the project directory to scan
- `output_file`: Optional path to save the markdown report

**Returns:** Markdown content of the license report

### 3. `list_package_managers(project_path: str)`
Lists all package manager files found in a project.

**Parameters:**
- `project_path`: Path to the project directory to scan

**Returns:** JSON string containing list of package manager files

## Example Usage

### Using the MCP server with Claude Desktop

1. Add the server to your Claude Desktop configuration:

```json
{
  "mcpServers": {
    "license-scanner": {
      "command": "python",
      "args": ["/path/to/license_scanner.py"],
      "cwd": "/path/to/project"
    }
  }
}
```

2. Use the tools in Claude Desktop:
   - "Scan the dependencies in my project"
   - "Generate a license report for this project"
   - "List the package managers used in this project"

### Example Project

The `example_project/` directory contains sample files for different package managers:
- `package.json` - npm dependencies
- `requirements.txt` - Python dependencies  
- `Cargo.toml` - Rust dependencies

## License Information Sources

- **npm packages**: npm registry API
- **Python packages**: PyPI JSON API
- **Rust crates**: crates.io API

## Output Format

The license report includes:

1. **Project information**: Path, total dependencies, package files found
2. **Dependencies by manager**: Organized by package manager with license details
3. **License summary**: Count of dependencies by license type

### Sample Markdown Output

```markdown
# License Report

**Project:** /path/to/project
**Total Dependencies:** 8
**Package Files Found:** package.json, requirements.txt

## NPM Dependencies

Found 5 dependencies

| Package | Version | License | Author | Homepage |
|---------|---------|---------|--------|----------|
| express | ^4.18.2 | MIT | TJ Holowaychuk | https://expressjs.com/ |
| lodash | ^4.17.21 | MIT | John-David Dalton | https://lodash.com/ |

## License Summary

| License | Count |
|---------|-------|
| MIT | 6 |
| Apache-2.0 | 2 |
```

## Error Handling

The server includes comprehensive error handling:
- Invalid project paths
- Missing package files
- Network errors when fetching license information
- Malformed package files

## Performance

- **Caching**: License information is cached to avoid repeated API calls
- **Parallel processing**: Multiple package files are processed efficiently
- **Timeout handling**: API requests have timeout protection

## Contributing

1. Fork the repository
2. Create a feature branch
3. Add tests for new functionality
4. Submit a pull request

## License

This project is licensed under the MIT License.