Skip to main content
Glama
bradford-tech

@bradford-tech/npm-package-readme-mcp-server

README.md
# @bradford-tech/npm-package-readme-mcp-server

An MCP server that exposes npm registry data — package READMEs, metadata, and search — to MCP-compatible AI clients.

> This is a maintained fork of [`naoto24kawa/npm-package-readme-mcp-server`](https://github.com/naoto24kawa/npm-package-readme-mcp-server), republished under the `@bradford-tech` scope after the original was removed from GitHub and npm. No functional changes from the upstream `0.1.4` release.

## Install

```bash
npm install -g @bradford-tech/npm-package-readme-mcp-server
```

Also works with `pnpm add -g`, `yarn global add`, or via `npx` (no install needed).

## Configure your MCP client

Add the server to your client's MCP configuration:

```json
{
  "mcpServers": {
    "npm-package-readme": {
      "command": "npm-package-readme-mcp-server"
    }
  }
}
```

Or run on demand with `npx`:

```json
{
  "mcpServers": {
    "npm-package-readme": {
      "command": "npx",
      "args": ["-y", "@bradford-tech/npm-package-readme-mcp-server"]
    }
  }
}
```

## Tools

The server exposes three tools to the connected client.

### `get_readme_from_npm`

Fetches a package's README and extracts usage examples. Reads from the npm registry first, falls back to the linked GitHub repository.

| Parameter          | Type    | Default    | Description                                                |
| ------------------ | ------- | ---------- | ---------------------------------------------------------- |
| `package_name`     | string  | —          | The npm package name (required).                           |
| `version`          | string  | `"latest"` | Specific version or dist-tag.                              |
| `include_examples` | boolean | `true`     | Parse and return usage examples extracted from the README. |

Example call:

```json
{ "package_name": "react", "version": "18.2.0" }
```

### `get_package_info_from_npm`

Returns package metadata and download statistics for the latest version.

| Parameter                  | Type    | Default | Description                      |
| -------------------------- | ------- | ------- | -------------------------------- |
| `package_name`             | string  | —       | The npm package name (required). |
| `include_dependencies`     | boolean | `true`  | Include runtime dependencies.    |
| `include_dev_dependencies` | boolean | `false` | Include dev dependencies.        |

Example call:

```json
{ "package_name": "express", "include_dependencies": true }
```

### `search_packages_from_npm`

Searches the npm registry.

| Parameter    | Type   | Default | Description                    |
| ------------ | ------ | ------- | ------------------------------ |
| `query`      | string | —       | Search text (required).        |
| `limit`      | number | `20`    | Max results, 1–250.            |
| `quality`    | number | —       | Minimum quality score, 0–1.    |
| `popularity` | number | —       | Minimum popularity score, 0–1. |

Example call:

```json
{ "query": "testing framework", "limit": 10 }
```

## How package data is fetched

- Package metadata and READMEs come from `registry.npmjs.org`.
- If the registry response has no README, the server resolves the `repository` field and fetches the README from the GitHub API.
- Download statistics come from `api.npmjs.org/downloads`.
- Responses are cached in memory (default TTL: 1 hour; search results: 10 minutes).

GitHub anonymous API requests are rate-limited to 60/hour. The server logs a warning when no token is available but still works for low-volume use.

## Configuration

All settings are optional environment variables, passed via your MCP client's `env` field (or your shell, when launching directly).

| Variable          | Default | Description                                                                                                                            |
| ----------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------- |
| `CACHE_TTL`       | `3600`  | Default cache TTL in **seconds** for `get_readme_from_npm` and `get_package_info_from_npm`. Search results have a fixed 10-minute TTL. |
| `REQUEST_TIMEOUT` | `30000` | Per-request timeout in **milliseconds**, applied to npm registry and GitHub API calls.                                                 |
| `GITHUB_TOKEN`    | —       | GitHub personal access token. Raises the GitHub API rate limit from 60/hour to 5000/hour.                                              |
| `LOG_LEVEL`       | `INFO`  | One of `ERROR`, `WARN`, `INFO`, `DEBUG` (case-insensitive). Invalid values silently fall back to `INFO`. Logs are written to `stderr`. |

Example, with a GitHub token:

```json
{
  "mcpServers": {
    "npm-package-readme": {
      "command": "npm-package-readme-mcp-server",
      "env": {
        "GITHUB_TOKEN": "ghp_..."
      }
    }
  }
}
```

## Requirements

- Node.js >= 20

## Contributing

Issues and pull requests welcome at [bradford-tech/npm-package-readme-mcp-server](https://github.com/bradford-tech/npm-package-readme-mcp-server). See [`CONTRIBUTING.md`](./CONTRIBUTING.md) for the developer setup.

## License

MIT. See [`LICENSE`](./LICENSE).

TDQS

A3.6/5.0

Scored across 3 tools

Disambiguation5/5

Each tool targets a clearly distinct operation: searching for packages, retrieving package metadata, and fetching README content. There is no ambiguity between searching and retrieving specific package resources.

Naming Consistency5/5

All three tool names follow a consistent verb_noun_from_npm pattern (get_readme, get_package_info, search_packages). The verb choice appropriately reflects each action, and the structure is uniform throughout.

Tool Count4/5

Three tools is on the lean side, but the server has a narrow, focused purpose (npm package readme retrieval), so each tool earns its place. The count feels slightly thin rather than excessive or insufficient.

Completeness4/5

The core workflow is covered: search for a package, inspect its metadata, then fetch its README. Minor gaps exist, such as fetching version-specific readmes or resolving readmes from alternate sources, but there are no dead ends for the stated purpose.

Maintenance

ActivitySlowing
ResponsivenessNo issues