内容
# hexpm-mcp
[](https://github.com/joshrotenberg/hexpm-mcp/actions/workflows/ci.yml)
[](https://hex.pm/packages/hexpm_mcp)
[](https://hexdocs.pm/hexpm_mcp)


[](https://opensource.org/licenses/MIT)
用于查询 [hex.pm](https://hex.pm) 和 [hexdocs.pm](https://hexdocs.pm) 的 MCP 服务器 - Elixir/Erlang 软件包注册表和文档托管。
使用 [Anubis MCP](https://hex.pm/packages/anubis_mcp) + [Bandit](https://hex.pm/packages/bandit) 在 Elixir 中构建。
## 快速入门
一个公共实例正在 `https://hexpm-mcp.fly.dev/mcp` 运行。将其添加到您的 MCP 客户端配置(Claude Desktop、Claude Code 或任何 MCP 客户端):
```json
{
"mcpServers": {
"hexpm": {
"type": "http",
"url": "https://hexpm-mcp.fly.dev/mcp"
}
}
}
```
## 功能
- 24 种工具用于搜索、检查、比较、审计和发现 hex.pm 软件包
- 5 种资源用于结构化软件包和发现数据访问
- 5 种引导式分析提示
- HexDocs 浏览(模块列表、文档搜索、完整模块文档)
- 通过 Elixir Toolbox(组、趋势、丰富搜索)进行精选软件包发现
- OSV.dev 漏洞检查
- Mix.exs 依赖审计和升级检查
- 基于 ETS 的响应缓存,带有可配置的 TTL
- 双重传输:stdio(Claude Code/Desktop)和 StreamableHTTP(远程)
- 可直接从 iex 使用的公共 Elixir API
## 工具
### 软件包信息
| 工具 | 描述 |
|------|-------------|
| `search` | 按名称/关键词搜索软件包,支持排序和分页 |
| `info` | 软件包元数据、描述、链接、下载统计 |
| `versions` | 版本历史,包含退休状态 |
| `release` | 发布详情、发布者、依赖、构建工具 |
| `features` | 可选依赖和额外元数据 |
| `dependencies` | 版本的依赖列表 |
| `downloads` | 下载统计(总计、近期、每周、每日) |
| `owners` | 软件包维护者 |
| `readme` | README 内容为 Markdown |
### 文档浏览
| 工具 | 描述 |
|------|-------------|
| `docs` | 来自 hexdocs.pm 的模块列表(目录) |
| `doc_item` | 特定模块的完整文档 |
| `search_docs` | 软件包文档内的搜索 |
### 分析
| 工具 | 描述 |
|------|-------------|
| `compare` | 2-5 个软件包的并排比较 |
| `health` | 维护、受欢迎程度、质量和风险评估 |
| `audit` | 依赖风险审计(已退休版本、陈旧、_bus_factor、CVE) |
| `alternatives` | 查找和比较类似软件包 |
| `dep_tree` | 递归依赖树(BFS,最大深度 5) |
### Mix.exs 分析
| 工具 | 描述 |
|------|-------------|
| `audit_mix_deps` | 审计依赖列表是否存在陈旧、退休、CVE 和_bus_factor |
| `upgrade_check` | 检查哪些依赖有新版本,标记破坏性更改 |
### 发现(Elixir Toolbox)
通过 [Elixir Toolbox](https://elixir-toolbox.dev) API 进行精选发现。项目结果包含 GitHub/GitLab 统计数据、受欢迎程度评分和原始 hex.pm API 未公开的健康信号。
| 工具 | 描述 |
|------|-------------|
| `toolbox_groups` | 浏览精选的组和类别分类法 |
| `toolbox_group` | 列出单个组中的类别 |
| `toolbox_category` | 分类中的精选项目(按名称或下载量排序) |
| `toolbox_trending` | 流行的 Elixir 软件包 |
| `toolbox_search` | 搜索软件包,包含受欢迎程度和健康信号 |
## 示例输出
### 健康检查
```
# 健康检查:req
## 维护
- 年龄:4 年前
- 总版本:52
- 状态:**活跃**
- 自上次发布以来天数:57
## 受欢迎程度
- 总下载量:11.5M
- 近期(90 天):1.6M
- 每周:141.5K
## 质量
- 文档:可用
- 许可证:Apache-2.0
- 依赖:3 个必需,4 个可选
- Elixir 要求:~> 1.14
## 风险
- 维护者:1(单个维护者!)
- 已退休版本:0
```
### 软件包比较
```
# 软件包比较
| 指标 | req | httpoison | finch |
| --------------- | ---------- | ---------- | ---------- |
| 下载量(全部) | 11.5M | 129.2M | 54.1M |
| 下载量(90 天) | 1.6M | 1.6M | 2.4M |
| 最新版本 | 0.5.17 | 2.3.0 | 0.21.0 |
| 上次更新 | 2026-02-07 | 2025-11-14 | 2026-01-22 |
| 许可证 | Apache-2.0 | MIT | MIT |
| 依赖 | 7 | 1 | 5 |
```
### 依赖审计
```
# 依赖审计:phoenix v1.8.5
检查了 10 个依赖。7 个软件包中有 8 个警告。
- **bandit**:1 个已退休版本
- **jason**:单个维护者
- **plug**:2 个已退休版本;3 个已知漏洞
- **telemetry**:无问题
```
## 用法
### 本地(stdio)
从源代码运行,使用 stdio 传输(例如用于开发):
```json
{
"mcpServers": {
"hexpm": {
"command": "mix",
"args": ["run", "--no-halt", "--", "--transport", "stdio"],
"cwd": "/path/to/hexpm-mcp"
}
}
}
```
### iex
公共 API 可直接从 iex 使用,无需 MCP 服务器。将软件包添加到您的 `mix.exs`:
```elixir
def deps do
[{:hexpm_mcp, "~> 0.3"}]
end
```
或直接从checkout运行:
```elixir
$ MIX_ENV=test iex -S mix
iex> HexpmMcp.get_info("phoenix")
{:ok, %{
name: "phoenix",
description: "从原型到生产的安心",
downloads: %{all: 148_100_000, recent: 2_600_000, week: 223_000, day: 13_000},
licenses: ["MIT"],
latest_stable_version: "1.8.5",
...
}}
iex> HexpmMcp.health_check("req")
{:ok, %{
name: "req",
maintenance: %{status: "Active", age: "4 years ago", days_since_release: 57},
popularity: %{all: 11_500_000, recent: 1_600_000, week: 141_000},
quality: %{has_docs: true, licenses: ["Apache-2.0"], required_deps: 3, optional_deps: 4},
risk: %{owner_count: 1, retired_count: 0},
...
}}
iex> HexpmMcp.compare_packages(["plug", "bandit"])
{:ok, [
%{name: "plug", downloads_all: 156_000_000, dep_count: 3, ...},
%{name: "bandit", downloads_all: 9_900_000, dep_count: 5, ...}
]}
iex> HexpmMcp.audit_mix_deps(~s({:phoenix, "~> 1.7"}, {:jason, "~> 1.0"}))
{:ok, %{total_checked: 2, total_warnings: 1, results: [...]}}
```
## API 参考
所有 25 个函数返回 `{:ok, structured_map}` 或 `{:error, reason}`。
```elixir
# 搜索和查找
HexpmMcp.search(query, opts \\ [])
HexpmMcp.get_info(name)
HexpmMcp.get_downloads(name)
HexpmMcp.get_owners(name)
HexpmMcp.get_versions(name)
# 版本特定(传递 nil 表示最新)
HexpmMcp.get_release(name, version \\ nil)
HexpmMcp.get_dependencies(name, version \\ nil)
HexpmMcp.get_features(name, version \\ nil)
# 综合分析
HexpmMcp.compare_packages(names)
HexpmMcp.health_check(name)
HexpmMcp.audit_dependencies(name, version \\ nil)
HexpmMcp.find_alternatives(name)
HexpmMcp.dependency_tree(name, version \\ nil, opts \\ [])
# Mix.exs 分析
HexpmMcp.audit_mix_deps(deps_string)
HexpmMcp.upgrade_check(deps_string)
# HexDocs 浏览
HexpmMcp.get_readme(name, version \\ nil)
HexpmMcp.get_docs(name, version \\ nil)
HexpmMcp.get_doc_item(name, module, version \\ nil)
HexpmMcp.search_docs(name, query, version \\ nil)
# Elixir Toolbox(精选发现)
HexpmMcp.toolbox_groups()
HexpmMcp.toolbox_group(group)
HexpmMcp.toolbox_category(group, category, opts \\ [])
HexpmMcp.toolbox_trending(opts \\ [])
HexpmMcp.toolbox_search(query)
```
## 架构
```
iex / Elixir 代码 MCP 客户端
| |
HexpmMcp(公共 API) MCP 工具(薄包装)
返回 {:ok, map} |
| 调用 HexpmMcp API
客户端 / HexDocs / OSV / 然后格式化器 -> Markdown
Toolbox(内部客户端) 然后 Response.text()
```
- **`HexpmMcp`** -- 25 个公共函数,返回结构化映射,可从 iex 使用
- **`HexpmMcp.Formatter`** -- MCP 工具输出的 Markdown 格式化
- **`HexpmMcp.Client`** -- 基于 Req 的 hex.pm API 客户端,带有速率限制
- **`HexpmMcp.HexDocs`** -- hexdocs.pm 浏览(侧边栏数据解析,HTML 转 Markdown)
- **`HexpmMcp.OSV`** -- OSV.dev 漏洞数据库客户端
- **`HexpmMcp.Toolbox`** -- Elixir Toolbox 客户端,用于精选软件包发现
- **`HexpmMcp.Cache`** -- 基于 ETS 的响应缓存,带有 TTL 和定期扫描
- **MCP 工具** -- 调用公共 API 的薄包装,通过 Anubis 服务器组件注册
## 开发
```bash
# 安装依赖
mix deps.get
# 运行测试
mix test
# 完整的 CI 检查
mix format --check-formatted
mix compile --warnings-as-errors
mix credo --strict
mix dialyzer
# 本地运行(HTTP,端口 8765)
mix run --no-halt
# 本地运行(用于 MCP 客户端的 stdio)
mix run --no-halt -- --transport stdio
```
## 许可证
MIT