unpaywall-mcp
by dam2452
README.md
# unpaywall-mcp
[Polski](README.pl.md)
Unpaywall Open Access scholarly API MCP server. Looks up free-to-read versions
of papers by DOI and searches article titles for OA matches.
## Table of contents
- [Tools](#tools)
- [Environment variables](#environment-variables)
- [Wiring it up](#wiring-it-up)
- [Local run](#local-run)
## Tools
| Tool | Parameters | Description |
|------|------------|-------------|
| `get_doi` | `doi: str` | OA status + bibliographic metadata for a single DOI |
| `search_articles` | `query: str, is_oa: Optional[bool] = None, page: int = 1` | Search article titles; returns up to 50 DOI objects per page |
`search_articles` `query` modifiers: `"quoted phrase"` (contiguous), `OR`
(either term), `-term` (exclude). `is_oa` tri-state: `None` no filter, `True`
OA only, `False` non-OA only.
## Environment variables
| Variable | Required | Description |
|----------|----------|-------------|
| `UNPAYWALL_MCP_EMAIL` | yes | Contact email Unpaywall requires on every request |
Unpaywall rate limit: 100,000 calls/day per email.
## Wiring it up
Only requirement: `uv` (https://docs.astral.sh/uv/). Nothing else to install.
### Claude Code
```
claude mcp add unpaywall-mcp -e UNPAYWALL_MCP_EMAIL=<your-email> -- uvx --from git+https://github.com/dam2452/unpaywall-mcp.git unpaywall-mcp
```
### Claude Desktop / other MCP client
```json
{
"mcpServers": {
"unpaywall-mcp": {
"command": "uvx",
"args": ["--from", "git+https://github.com/dam2452/unpaywall-mcp.git", "unpaywall-mcp"],
"env": { "UNPAYWALL_MCP_EMAIL": "<your-email>" }
}
}
}
```
After pushing a new version: `uv cache clean` and restart the client.
## Local run
```
uv run --directory . unpaywall-mcp
```
Tests (manual):
```
uv run --directory . --with pytest pytest test/
```
TDQS
A4.2/5.0
Scored across 2 tools
Disambiguation5/5
The two tools have clearly distinct purposes: get_doi retrieves data for a known DOI, while search_articles finds articles by title query. No overlap or ambiguity.
Naming Consistency5/5
Both tools follow a consistent verb_noun pattern: get_doi and search_articles. The naming is predictable and easy to understand.
Tool Count4/5
Two tools is lean but reasonable for a focused API that covers the primary use cases: fetching by DOI and searching by title. Could be expanded with additional identifiers, but the count is appropriate for a minimal server.
Completeness4/5
The server covers the core functionality of the Unpaywall API: single DOI lookup and title search. Minor gaps exist (e.g., no batch operations or search by other metadata), but the main workflows are supported.
Maintenance
ActivityStale
ResponsivenessNo issues