# Reported issues for doiget Desktop Extension

Pod holds 20 of 39 GitHub reports that passed its relevance review. This can include external user reports, maintainer-confirmed bugs, and concrete feature gaps. Treat them as evidence to inspect, not a count of distinct defects.

Back to [doiget Desktop Extension](/mcp/doiget-desktop-extension).

## Most discussed

### Discovery-oriented features for agent-driven literature search (paper_search, paper_text, survey macro, MCP loop)

## Motivation — agent-driven research-question *discovery*, not just DOI→PDF

Using doiget from an LLM agent to actually *find the question* (not just fetch a known DOI), the
loop I want to self-complete is:

> **search → triage → expand(citations) → fetch → read → map/gap-analysis**

Today doiget is excellent at the back half (`fetch`/`batch`/`graph`/`bib`/`csl`/`serve`/`capabilities`),
but the front half assumes you already know the DOIs. The gaps below are what would let an agent run
the whol

[Read the thread](https://github.com/QAtlasHub/doiget/issues/281) · 2026-06-04 · closed · 3 comments

### mcp: align tool output shapes with the CLI --mode json bodies (#204 / #205 mirror)

## Purpose

#204 added `--mode json` bodies for the six human-table CLI commands and #205 added the ERRORS.md §3 JSONL shape for `batch`. The `doiget-mcp` tools (`doiget_info`, `doiget_search`, `doiget_audit_log`, `doiget_batch_fetch`, etc.) each have their own output schema today; they predate the CLI JSON bodies and may diverge in field names / nesting from the CLI surface.

Consistency matters because a single LLM agent often consults *both* (`doiget serve` for in-session work and `doiget cli

[Read the thread](https://github.com/QAtlasHub/doiget/issues/212) · 2026-05-20 · closed · 3 comments

### bug(cli): the human denial help suggests both trust flags unconditionally, while the machine path computes which one actually covers the host

Observed on `doiget 0.8.9` against the #443/#461 case:

```
$ doiget fetch 10.1109/tsp.2018.2812747
error[CAPABILITY_DENIED]: … redirect target strathprints.strath.ac.uk not in allowlist …
  = help: that host is not on the allowlist yet; widen it in …/config.toml
          [network] trust_academic_repos = true   # 15 curated academic suffixes
          [network] trust_oa_registries  = true   # DOAJ, SciELO, Zenodo, OSF, HAL
          [[network.additional_hosts]] host = "strathprints.strath.ac.uk

[Read the thread](https://github.com/QAtlasHub/doiget/issues/478) · 2026-08-25 · closed · 2 comments

### oa-publisher allowlist omits major physics OA hosts (APS, SciPost, IOP) — 7/30 niche papers fall to metadata-only

## Summary

Dogfooding a real **finite-temperature MPS** literature collection on a
university box (via the now-working citation graph, #187) batch-fetched 30
DOIs that OpenAlex reports as Open Access. **24 succeeded; 7 were denied**
with `error[CAPABILITY_DENIED]` — the OA PDF *was discovered* but its host
is not in `oa_publisher_allowlist()`
(`crates/doiget-core/src/http.rs`) / `docs/REDIRECT_ALLOWLIST.md` §3.4.

Denied hosts (real Unpaywall `best_oa_location` targets):

| host | count | natur

[Read the thread](https://github.com/QAtlasHub/doiget/issues/193) · 2026-05-18 · closed · 2 comments

### cleanup batch (LOW): s2 dead api_key, dry_run .expect() panics, missing serde(deny_unknown_fields), SCOPE.md count mismatch

**Category: F/D — low-severity cleanup batch** (grouped like #123)

1. **core** `crates/doiget-core/src/sources/s2.rs:52-53` — `api_key` is `#[allow(dead_code)]`, never sent. Users with a Semantic Scholar key are silently rate-limited to the anonymous tier. Wire the header like APS, or document + warn.
2. **core** `crates/doiget-core/src/dry_run.rs:143,163` — `.expect()` on allowlist lookups panics `doiget plan` if a source key is ever renamed. Convert to `Result<FetchPlan, FetchError>`.
3. **mc

[Read the thread](https://github.com/QAtlasHub/doiget/issues/156) · 2026-05-17 · closed · 2 comments

### Four shipped MCP tools have no entry in MCP_TOOLS.md

Four tools ship in every release binary and have no entry in `docs/MCP_TOOLS.md`:

- `doiget_annotate`
- `doiget_batch_from_bibliography`
- `doiget_paper_tex_source`
- `doiget_tag`

## How this was measured

`doiget serve` run from an installed npm package, `tools/list` compared against the
tool table in `MCP_TOOLS.md` (the rows matching `^| \`doiget_[a-z_]+\``):

```
live in a shipped oa-only,citation build : 21   (22 after #552)
documented in the tool table             : 18
explicitly refused,

[Read the thread](https://github.com/QAtlasHub/doiget/issues/553) · 2026-08-27 · closed · 1 comment

### Ship doiget as a Claude Code plugin: self-hosted marketplace first, then the community catalog

Mechanics verified 2026-08-26 against the installed `claude-plugins-official` marketplace on disk and the official docs.

## Why this and not just `claude mcp add`

A plugin makes installation two lines with no binary handling, and it can carry skills, agents and commands alongside the MCP server — which is where domain workflows (systematic review / PRISMA, etc.) would eventually be delivered.

```
/plugin marketplace add QAtlasHub/doiget
/plugin install doiget@doiget
```

## Files to add

At t

[Read the thread](https://github.com/QAtlasHub/doiget/issues/513) · 2026-08-25 · open · 1 comment

### feat(registry): the MCP Registry now documents cargo AND mcpb — the source-only entry can carry packages

`server.json` has no `packages` array, so `io.github.QAtlasHub/doiget` is discoverable in the registry but **not installable from it**. Verified live:

```
$ curl 'https://registry.modelcontextprotocol.io/v0/servers?search=doiget'
  name: io.github.QAtlasHub/doiget | version: 0.8.9 | packages: (none)
```

The reason is recorded in `release-plz.yml`:

> the live MCP Registry does not yet accept the `cargo` registry type (400 "unsupported registry type: cargo"), though the 2025-12-11 schema lists 

[Read the thread](https://github.com/QAtlasHub/doiget/issues/483) · 2026-08-25 · closed · 1 comment

## Most recent

### bug(transport): in a `metadata`-without-`citation` build, every Tier-2 optional source fails UnknownSource

Found while wiring OpenAlex into the optional chain for #461. Not fixed there because it is a different defect with its own blast radius.

## The gates disagree

The Tier-2 sources are gated on `metadata`:

```toml
# crates/doiget-core/Cargo.toml
metadata = []
citation = ["metadata"]
```

`resolve_optional_chain` is `#[cfg(feature = "metadata")]`, and so are DataCite, Europe PMC, OpenAIRE, HAL and CORE.

Their **transport** gate is not:

```rust
// crates/doiget-cli/src/commands/fetch.rs:267
#[c

[Read the thread](https://github.com/QAtlasHub/doiget/issues/516) · 2026-08-26 · closed · 0 comments

### docs/INTEGRATION: all six host guides are Phase 3 placeholders that tell users to stop and wait — for a phase that shipped

A user who follows `README.md:51` to the host-integration guides is actively told not to proceed.

## Measured 2026-08-26

Every file in `docs/INTEGRATION/` carries the same banner and two unfilled TODOs:

```
claude-code.md         Status: PLACEHOLDER (Phase 3)   TODOs: 2
claude-desktop.md      Status: PLACEHOLDER (Phase 3)   TODOs: 2
cursor.md              Status: PLACEHOLDER (Phase 3)   TODOs: 2
codex.md               Status: PLACEHOLDER (Phase 3)   TODOs: 2
obsidian.md            Status: PLA

[Read the thread](https://github.com/QAtlasHub/doiget/issues/512) · 2026-08-25 · closed · 0 comments

### Publish doiget to npm so the MCP entry is one line — optionalDependencies, no postinstall, Trusted Publishing

The concrete build-out of #501's priority-1 channel. Registration mechanics verified 2026-08-26.

## Target

```
claude mcp add doiget -- npx -y doiget serve
```

No binary handling, no C toolchain, no PATH edit. This is also the prerequisite for the Claude Code plugin route (sibling issue), whose `.mcp.json` is exactly `{"command":"npx","args":["-y","doiget@latest","serve"]}` — the same shape the official `firebase` plugin ships.

## What exists to package

The workspace produces **one** binary

[Read the thread](https://github.com/QAtlasHub/doiget/issues/511) · 2026-08-25 · closed · 0 comments

### test: the batch --json and MCP diagnostic wiring points would survive being disconnected

Found in the #468 review. Same shape as #413 / #442 / #454 / #458: the component works, the wiring is untested, and disconnecting it leaves the suite green.

## batch `--json`

`crates/doiget-cli/src/commands/batch.rs:535` (inside `classify_joined`) is the only place that threads a real `FetchPaperOutcome`'s `attempts` into `build_jsonl_failure`.

Every test that asserts the JSONL record contains `attempts` / `remediation` calls `build_jsonl_failure` **directly** with hand-built arguments. The o

[Read the thread](https://github.com/QAtlasHub/doiget/issues/471) · 2026-08-25 · closed · 1 comment

### The MCP envelope and batch --json carry no resolution trace and no remediation hint, so an agent is told "blocked" and cannot find the one-line fix

Everything #443, #448 and #449 added to make a blocked fetch *actionable* is CLI text. The two
machine-readable surfaces — the MCP tool envelope and `batch --json` — get none of it.

## Evidence

Real `doiget serve`, `doiget_fetch_paper`, `10.1109/TSP.2018.2812747`:

```
KEYS        : [authors, license, oa_status, ok, path, pdf, ref,
               resolver_profile, schema_version, size_bytes, source, title, year]
has attempts: False
pdf         : { status: "blocked",
                code: "NETW

[Read the thread](https://github.com/QAtlasHub/doiget/issues/459) · 2026-08-24 · closed · 0 comments

### bug(transport): the Tier-3 allowlists are never registered in the production HTTP client, so every TDM fetch fails UnknownSource

`tier_3_aps_allowlist()`, `tier_3_elsevier_allowlist()` and `tier_3_springer_allowlist()` are
implemented, feature-gated and asserted by a registry guard. **Nothing calls them.** Neither
`build_http_client` (CLI) nor its MCP twin extends `allowlists` with them, so the production
client has no entry under the `tdm-*` source keys and `ctx.http.fetch_bytes("tdm-aps", ...)`
returns `UnknownSource`.

This is #442 one layer down. #444 made the orchestrator *reach* the three sources; the transport
gate

[Read the thread](https://github.com/QAtlasHub/doiget/issues/454) · 2026-08-24 · closed · 0 comments

### feat(source): HAL — French national repository OA

Part of #413. Priority 5 — smallest scope, land last.

## Why

HAL is the French national OA repository. It holds deposits (notably in maths, physics and CS) that are absent from Crossref-centric indexes, so Unpaywall misses them.

## API

Public, no auth. Verified 2026-08-22:

```
GET https://api.archives-ouvertes.fr/search/?q=*:*&rows=1&wt=json   → 200
```

Solr-style query interface; DOI lookup via the `doiId_s` field.

Terms: <https://api.archives-ouvertes.fr/docs> (record the exact ToS URL 

[Read the thread](https://github.com/QAtlasHub/doiget/issues/418) · 2026-08-22 · closed · 0 comments

### feat(source): CORE — cross-repository OA aggregation (optional free key)

Part of #413. Priority 4.

## Why

CORE aggregates OA full text across repositories worldwide and is the broadest single OA PDF index outside Unpaywall. Useful as the last OA fallback before giving up.

## API

Verified live 2026-08-22: `https://api.core.ac.uk/v3/search/works` → 200.

Works without a key at a low rate limit; a **free** key raises it. Key handling must follow the existing pattern — read from the user's own config/env, never bundled, never required to build.

Terms: <https://core.

[Read the thread](https://github.com/QAtlasHub/doiget/issues/417) · 2026-08-22 · closed · 0 comments

### MCP: hide doiget_expand_citation_graph from tools/list in feature-off builds (follow-up to #373)

Follow-up to **#373**. Part (a) shipped (#378) — the citation tool now builds into the released binaries / `.mcpb` and works in Claude Desktop. Part **(b)** — *hide* `doiget_expand_citation_graph` from `tools/list` in a feature-off (`cargo install`, no `--features citation`) build, so an agent never sees a tool that returns `NOT_IMPLEMENTED` — is still open.

## Why the obvious fix doesn't work
`#[cfg(feature = "citation")]` on the `#[tool]` **method** fails to compile in the feature-off build (

[Read the thread](https://github.com/QAtlasHub/doiget/issues/379) · 2026-06-29 · closed · 0 comments

### Decide: ship doiget_expand_citation_graph enabled, or hide it when built without --features citation (always NOT_IMPLEMENTED in .mcpb)

Surfaced during `.mcpb` dogfooding.

## Observation
`doiget_expand_citation_graph` is registered (appears in the tool list) but the default release build — and therefore the shipped `.mcpb` — is compiled **without** `--features citation` (ADR-0010), so in Claude Desktop the tool **always returns `NOT_IMPLEMENTED`**. Exposing a tool that can never succeed is confusing for an agent (and the `depth`/`total`/`per_paper` params also hit the stringified-number bug, separately).

## Options
- **(a) Shi

[Read the thread](https://github.com/QAtlasHub/doiget/issues/373) · 2026-06-25 · closed · 0 comments

### Citation resolver drops title-less author-year queries (0.5 score cutoff)

Found via `doiget_batch_resolve_citations` during `.mcpb` dogfooding.

## Symptom
`doiget_batch_resolve_citations(["…", "Bulla Costi Pruschke 2008"])` → the 2nd query returned **no candidates** (filtered below the 0.5 confidence cutoff), even though it uniquely identifies a well-known paper (Rev. Mod. Phys. 80, 395). Author + year strings with no title score low and are dropped entirely.

## Proposal
- Evaluate lowering / making the score threshold configurable, or boosting author+year matches.

[Read the thread](https://github.com/QAtlasHub/doiget/issues/372) · 2026-06-25 · closed · 0 comments

### MCP: numeric tool params reject stringified numbers ("10") — breaks limit / max_chars / depth / total / per_paper

Found while dogfooding the `.mcpb` in Claude Desktop. Several tools error when the client sends a numeric argument as a JSON **string** (`"10"`) instead of a number (`10`) — a common LLM / MCP-client behavior.

## Symptoms (deserialization / type errors)
- `doiget_paper_text` → `max_chars` rejected
- `doiget_expand_citation_graph` → `depth` / `total` / `per_paper` rejected
- `doiget_paper_search` → `limit` rejected on the (stringified) call

## Root cause
Inputs are typed as plain `Option<u32>` 

[Read the thread](https://github.com/QAtlasHub/doiget/issues/370) · 2026-06-25 · closed · 0 comments

The remaining reports are on [the project's issue tracker](https://github.com/sotashimozono/doiget/issues).
