Package Intel MCP Server
by BUZDOLAPCI
README.md
# Package Intel MCP Server
A Model Context Protocol (MCP) server for querying package registries (npm, PyPI, crates.io) to retrieve metadata about packages including versions, release cadence, and maintenance signals.
## Features
- **Multi-Registry Support**: Query npm, PyPI, and crates.io from a single interface
- **Package Summaries**: Get comprehensive package metadata including version, license, and repository info
- **Release Timelines**: Retrieve version history with release dates
- **Maintenance Signals**: Analyze package health with automated scoring
## Installation
```bash
npm install
npm run build
```
## Usage
### As MCP Server (stdio)
```bash
npm start
```
### As HTTP Server
```bash
npm run start:http
# Or with custom port
PORT=8080 npm run start:http
```
### Claude Desktop Configuration
Add to your Claude Desktop config (`~/Library/Application Support/Claude/claude_desktop_config.json` on macOS):
```json
{
"mcpServers": {
"package-intel": {
"command": "node",
"args": ["/path/to/package-intel/dist/cli.js"]
}
}
}
```
## Tools
### package_summary
Get summary information about a package.
**Parameters:**
- `ecosystem` (required): `"npm"` | `"pypi"` | `"crates"`
- `name` (required): Package name
**Example:**
```json
{
"ecosystem": "npm",
"name": "lodash"
}
```
**Response:**
```json
{
"ok": true,
"data": {
"name": "lodash",
"version": "4.17.21",
"description": "Lodash modular utilities.",
"homepage": "https://lodash.com/",
"repository": "https://github.com/lodash/lodash",
"license": "MIT",
"keywords": ["modules", "stdlib", "util"]
},
"meta": {
"source": "https://registry.npmjs.org/lodash",
"retrieved_at": "2024-01-15T10:30:00.000Z",
"pagination": { "next_cursor": null },
"warnings": []
}
}
```
### release_timeline
Get the release history of a package.
**Parameters:**
- `ecosystem` (required): `"npm"` | `"pypi"` | `"crates"`
- `name` (required): Package name
- `limit` (optional): Maximum releases to return (default: 20, max: 100)
**Example:**
```json
{
"ecosystem": "pypi",
"name": "requests",
"limit": 5
}
```
**Response:**
```json
{
"ok": true,
"data": {
"package_name": "requests",
"ecosystem": "pypi",
"releases": [
{
"version": "2.31.0",
"date": "2023-05-22T10:00:00.000Z",
"is_prerelease": false
},
{
"version": "2.30.0",
"date": "2023-05-01T10:00:00.000Z",
"is_prerelease": false
}
],
"total_versions": 87
},
"meta": {
"source": "https://pypi.org/pypi/requests/json",
"retrieved_at": "2024-01-15T10:30:00.000Z",
"pagination": { "next_cursor": "5" },
"warnings": []
}
}
```
### maintenance_signals
Analyze maintenance health signals for a package.
**Parameters:**
- `ecosystem` (required): `"npm"` | `"pypi"` | `"crates"`
- `name` (required): Package name
**Example:**
```json
{
"ecosystem": "crates",
"name": "serde"
}
```
**Response:**
```json
{
"ok": true,
"data": {
"package_name": "serde",
"ecosystem": "crates",
"days_since_last_release": 45,
"last_release_date": "2023-12-01T10:00:00.000Z",
"releases_per_year": 12.5,
"total_versions": 156,
"is_deprecated": false,
"maintenance_score": "good",
"score_factors": {
"recency": "good",
"frequency": "good",
"maturity": "good"
}
},
"meta": {
"source": "https://crates.io/api/v1/crates/serde",
"retrieved_at": "2024-01-15T10:30:00.000Z",
"pagination": { "next_cursor": null },
"warnings": []
}
}
```
## Maintenance Score Calculation
The maintenance score is calculated based on three factors:
### Recency (50% weight)
- **Good**: Last release < 90 days ago
- **Fair**: Last release < 365 days ago
- **Poor**: Last release >= 365 days ago
### Frequency (30% weight)
- **Good**: >= 4 releases per year
- **Fair**: >= 1 release per year
- **Poor**: < 1 release per year
### Maturity (20% weight)
- **Good**: >= 10 total versions
- **Fair**: >= 3 total versions
- **Poor**: < 3 total versions
If a package is deprecated, the score is automatically set to "poor".
## Error Handling
All tools return errors in a consistent envelope format:
```json
{
"ok": false,
"error": {
"code": "INVALID_INPUT",
"message": "Package 'nonexistent' not found on npm",
"details": {
"package": "nonexistent",
"ecosystem": "npm"
}
},
"meta": {
"retrieved_at": "2024-01-15T10:30:00.000Z"
}
}
```
### Error Codes
- `INVALID_INPUT`: Invalid parameters or package not found
- `UPSTREAM_ERROR`: Registry API returned an unexpected error
- `RATE_LIMITED`: Registry rate limit exceeded
- `TIMEOUT`: Request timed out
- `PARSE_ERROR`: Failed to parse registry response
- `INTERNAL_ERROR`: Unexpected server error
## Configuration
Environment variables (see `.env.example`):
| Variable | Default | Description |
|----------|---------|-------------|
| `PORT` | `3000` | HTTP server port |
| `REQUEST_TIMEOUT` | `30000` | Request timeout in ms |
| `USER_AGENT` | `package-intel/0.1.0` | User agent for registry requests |
| `CACHE_TTL` | `300` | Cache TTL in seconds |
| `LOG_LEVEL` | `info` | Log level: debug, info, warn, error |
## Development
```bash
# Install dependencies
npm install
# Build
npm run build
# Run tests
npm test
# Run tests in watch mode
npm run test:watch
# Type check
npm run typecheck
# Development mode (watch)
npm run dev
```
## License
MIT
This server cannot be deployed
Maintenance
ActivityInactive
ResponsivenessNo issues