内容
# umlib-mcp
让您的 AI 助手使用您自己的密歇根大学图书馆访问权限来阅读论文。向它请求一篇论文:它首先查找免费副本,如果找不到,则通过您登录的会话使用 U-M 代理拉取 PDF。
您的密码永远不会触及助手或此服务器。所有保留的内容只是浏览器会话 cookie,在您自己的机器上。
与 Claude Code、Codex、Cursor、VS Code、Zed、Windsurf、Gemini CLI 和 Claude Desktop 兼容。
## 安装
一条命令。安装所有内容并将其注册到您已经拥有的任意助手:
```sh
curl -LsSf https://raw.githubusercontent.com/puppyum/umlib-mcp/main/install.sh | bash
```
重启您的助手,然后说 **"log me into the library proxy"** 并在打开的窗口中使用您的 U-M 帐户登录。整个设置就是如此。
macOS 和 Linux。 在 Windows 上,使用 WSL。
<details>
<summary>其他安装方式</summary>
Claude Code 和 Codex 共享一个插件市场,该市场将使用指南作为一项技能捆绑:
```sh
/plugin marketplace add puppyum/umlib-mcp
/plugin install umlib@umlib-lab
```
使用其中一个,而不是两个,否则您最终会注册两次服务器。
手动安装,运行 `uv tool install git+https://github.com/puppyum/umlib-mcp` 并将您的客户端指向 `uv tool dir --bin` 中的二进制文件。它不带任何参数。只有周围的键会更改:`mcpServers` 用于 Cursor、Windsurf、Gemini CLI 和 Claude Desktop,`servers` 用于 VS Code(还需要 `"type": "stdio"`),`context_servers` 用于 Zed。Claude Desktop 需要绝对路径,因为它不会扩展 `~`:
```json
{
"mcpServers": {
"umlib": { "command": "/Users/YOU/.local/bin/umlib-mcp" }
}
}
```
查看安装程序在不进行任何操作的情况下会执行的操作:`curl -LsSf https://raw.githubusercontent.com/puppyum/umlib-mcp/main/install.sh | bash -s -- --dry-run`
更新:`uv tool upgrade umlib-mcp --reinstall`。 `--reinstall` 参数很重要,因为普通的升级可以重用缓存的构建。插件安装跟踪 `@main` 并在服务器下次启动时刷新。
</details>
## 使用它
只需请求一篇论文。无需等待您完成登录,因为获取论文的操作会等待您。
- "获取 DOI 为 10.1145/3411764.3445642 的 PDF 并总结方法。"
- "查找 Jhaver 等人的 'Does Transparency in Moderation Really Matter' 并拉取全文。"
PDF 保存在 `~/Downloads` 中。当会话过期时,您将被要求重新登录。当发布商阻止自动获取时,您会收到一个链接以供自己打开。
## 工具
| 工具 | 功能 |
|---|---|
| `login` | 打开一个浏览器窗口,让您可以登录。立即返回;会话保存以供稍后使用。 |
| `auth_status` | 表示会话是否激活。 |
| `resolve` | 将 DOI 或标题转换为元数据、免费复制链接和代理发布商 URL。 |
| `fetch_pdf` | 获取一个 PDF(首先是免费复制,然后是代理),并将其保存到 `~/Downloads`。 |
| `proxy_url` | 为校外访问添加 URL 前缀。 |
| `logout` | 删除保存的会话。 |
## 让它自动使用工具
开箱即用,您的助手在您请求时会使用这些工具。要让它自动使用,请将以下内容粘贴到您的项目说明中(`CLAUDE.md`、`AGENTS.md`、`.cursorrules`):
> 在搜索或下载学术文章、论文、书籍或其他出版物时,请使用 umlib 工具。如果内容看起来无法访问(付费墙、登录墙、403 或仅摘要),请在得出结论之前尝试使用 umlib 的 `fetch_pdf`,因为它可能可以通过身份验证的图书馆会话访问。一次获取一篇论文。
如果您通过插件安装而不是脚本安装了该工具,则该文本作为技能随插件提供,您可以跳过此步骤。
## 一条规则
按需获取论文,而不是批量获取。图书馆的 [适当使用政策](https://lib.umich.edu/about-us/policies/statement-appropriate-use-electronic-resources) 禁止系统化下载,发布商通过切断整个校园而不是一个账户来回应。该政策没有设定具体数字,因此这里的 60 小时限制是我们自己的礼貌限制:远高于普通阅读速度,远低于任何类似爬虫的行为。对于大规模的文本或数据挖掘,请联系 library-ds@umich.edu。
## 配置
一切都有一个默认设置,因此您可以跳过此部分。要更改某些内容,请编写 `~/.umlib/config.toml`:
```toml
max_fetches_per_hour = 60 # 授权获取的礼貌上限
download_dir = "~/Papers" # PDF 保存位置
email = "you@umich.edu" # 添加 Unpaywall 和 OpenAlex
```
| 设置 | 默认值 | 用途 |
|---|---|---|
| `max_fetches_per_hour` | `60` | 授权获取的礼貌上限。 `0` 完全关闭授权获取。 |
| `min_fetch_interval_s` | `5` | 授权获取之间的秒数。 |
| `email` | 未设置 | 可选。免费复制检查使用 OpenAlex,不需要电子邮件;设置一个添加 Unpaywall 作为第二个来源。 |
| `download_dir` | `~/Downloads` | PDF 保存位置。 |
| `profile_dir` | `~/.umlib/profile` | 会话存储位置。 |
| `proxy_base` | `https://proxy.lib.umich.edu/login?url=` | EZproxy 前缀。必须是 `https`,否则会话 cookie 将明文传输。 |
| `canary_url` | `https://www.jstor.org/` | 用于判断“已登录”还是“已注销”的网站。指向您的图书馆肯定有许可证的网站。 |
| `resolver_base` | 密歇根大学的 MGet It | “如何获取”链接的链接解析器;设置为 `""` 以省略。 |
| `rewrite_host` | 从 `proxy_base` 派生 | 仅当您的代理登录到一个域并重写到另一个域时需要。 |
| `max_pdf_bytes` | `104857600` | 在保存之前拒绝任何更大的文件。 |
| `login_timeout_s` | `300` | 登录窗口等待的时间。 |
| `login_wait_s` | `150` | 获取等待正在进行的登录的时间。 |
| `lock_timeout_s` | `login_timeout_s + 60` | 等待另一个助手的浏览器完成的时间。 |
另外两个输入仅来自环境:`UMLIB_CONFIG` 移动配置文件本身,`XDG_DOWNLOAD_DIR` 在设置的环境的 Linux 桌面上提供默认下载目录。每个设置也从环境变量中读取(`UMLIB_MAX_FETCHES_PER_HOUR` 等),这些变量优先于文件;文件存在是因为环境变量在不同助手之间应用起来很麻烦。
如果 umlib 无法使用某个设置,它会在 `auth_status` 下的 `config_error` 中说明,而不是悄悄地回退。相对路径相对于您的主目录,而不是助手的启动位置。
它适用于其他 EZproxy 学校,但请在信任它之前检查三个设置:`proxy_base`、`canary_url`(默认为 JSTOR,某些学校不许可 JSTOR,因此永远无法登录)和 `resolver_base`(默认为密歇根大学的解析器)。OCLC 托管的代理会自动检测。
## 开发
```sh
uv sync
uv run pytest
uv run python scripts/smoke.py # 通过 stdio 运行服务器并测试它
```
stdio 服务器在运行时不会重新加载,因此在编辑源代码后重启它(Claude Code 中的 `/mcp`)。插件跟踪 `@main`,因此每个服务器在下次启动时都会收到更改。
## 许可证
MIT