Skip to main content
Glama
dam2452

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