cite-nexus-mcp 0.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. cite_nexus_mcp-0.2.0/.env.example +25 -0
  2. cite_nexus_mcp-0.2.0/.gitignore +59 -0
  3. cite_nexus_mcp-0.2.0/CHANGELOG.md +28 -0
  4. cite_nexus_mcp-0.2.0/CONTRIBUTING.md +44 -0
  5. cite_nexus_mcp-0.2.0/LICENSE +21 -0
  6. cite_nexus_mcp-0.2.0/PKG-INFO +291 -0
  7. cite_nexus_mcp-0.2.0/README.md +266 -0
  8. cite_nexus_mcp-0.2.0/assets/cite-nexus-400.png +0 -0
  9. cite_nexus_mcp-0.2.0/assets/cite-nexus.svg +8 -0
  10. cite_nexus_mcp-0.2.0/assets/social-card.png +0 -0
  11. cite_nexus_mcp-0.2.0/assets/social-card.svg +14 -0
  12. cite_nexus_mcp-0.2.0/docs/data-handling.md +30 -0
  13. cite_nexus_mcp-0.2.0/docs/migration.md +78 -0
  14. cite_nexus_mcp-0.2.0/docs/product-direction.md +87 -0
  15. cite_nexus_mcp-0.2.0/docs/providers.md +94 -0
  16. cite_nexus_mcp-0.2.0/docs/release/README.md +127 -0
  17. cite_nexus_mcp-0.2.0/docs/release/delivery-validation.md +55 -0
  18. cite_nexus_mcp-0.2.0/docs/release/launch-kit.md +157 -0
  19. cite_nexus_mcp-0.2.0/docs/release/marketplaces.md +81 -0
  20. cite_nexus_mcp-0.2.0/docs/release/pr-body.md +23 -0
  21. cite_nexus_mcp-0.2.0/docs/release/release-0.2.0.md +231 -0
  22. cite_nexus_mcp-0.2.0/docs/release/release-notes-0.2.0.md +55 -0
  23. cite_nexus_mcp-0.2.0/docs/release/validation.md +51 -0
  24. cite_nexus_mcp-0.2.0/docs/release/wtfp-team-prompt.md +124 -0
  25. cite_nexus_mcp-0.2.0/docs/troubleshooting.md +66 -0
  26. cite_nexus_mcp-0.2.0/docs/wtf-p.md +94 -0
  27. cite_nexus_mcp-0.2.0/llms-install.md +21 -0
  28. cite_nexus_mcp-0.2.0/packaging/cite-nexus/.claude-plugin/plugin.json +22 -0
  29. cite_nexus_mcp-0.2.0/packaging/cite-nexus/.codex-plugin/plugin.json +37 -0
  30. cite_nexus_mcp-0.2.0/packaging/cite-nexus/.mcp.json +11 -0
  31. cite_nexus_mcp-0.2.0/packaging/cite-nexus/LICENSE +21 -0
  32. cite_nexus_mcp-0.2.0/packaging/cite-nexus/README.md +25 -0
  33. cite_nexus_mcp-0.2.0/packaging/cite-nexus/assets/logo.svg +8 -0
  34. cite_nexus_mcp-0.2.0/packaging/cite-nexus/mcp.json +12 -0
  35. cite_nexus_mcp-0.2.0/packaging/cite-nexus/plugin.json +41 -0
  36. cite_nexus_mcp-0.2.0/pyproject.toml +75 -0
  37. cite_nexus_mcp-0.2.0/release/marketplace-checks.json +246 -0
  38. cite_nexus_mcp-0.2.0/release/marketplaces.csv +42 -0
  39. cite_nexus_mcp-0.2.0/release/marketplaces.json +1109 -0
  40. cite_nexus_mcp-0.2.0/release/product.json +26 -0
  41. cite_nexus_mcp-0.2.0/release/schemas/AGENT-PLUGINS-LICENSE.txt +202 -0
  42. cite_nexus_mcp-0.2.0/release/schemas/MCP-REGISTRY-LICENSE.txt +216 -0
  43. cite_nexus_mcp-0.2.0/release/schemas/README.md +17 -0
  44. cite_nexus_mcp-0.2.0/release/schemas/mcp-1.0.0.json +120 -0
  45. cite_nexus_mcp-0.2.0/release/schemas/plugin-1.0.0.json +65 -0
  46. cite_nexus_mcp-0.2.0/release/schemas/server-2025-12-11.json +574 -0
  47. cite_nexus_mcp-0.2.0/scripts/check_distribution.py +139 -0
  48. cite_nexus_mcp-0.2.0/scripts/check_wtfp.py +124 -0
  49. cite_nexus_mcp-0.2.0/scripts/marketplaces.py +130 -0
  50. cite_nexus_mcp-0.2.0/scripts/prepare_release.py +131 -0
  51. cite_nexus_mcp-0.2.0/scripts/release_gate.py +79 -0
  52. cite_nexus_mcp-0.2.0/scripts/smoke_public.py +37 -0
  53. cite_nexus_mcp-0.2.0/server.json +87 -0
  54. cite_nexus_mcp-0.2.0/src/cite_nexus_mcp/__init__.py +13 -0
  55. cite_nexus_mcp-0.2.0/src/cite_nexus_mcp/__main__.py +3 -0
  56. cite_nexus_mcp-0.2.0/src/cite_nexus_mcp/citations.py +246 -0
  57. cite_nexus_mcp-0.2.0/src/cite_nexus_mcp/config.py +56 -0
  58. cite_nexus_mcp-0.2.0/src/cite_nexus_mcp/elicitation.py +40 -0
  59. cite_nexus_mcp-0.2.0/src/cite_nexus_mcp/http.py +166 -0
  60. cite_nexus_mcp-0.2.0/src/cite_nexus_mcp/identifiers.py +86 -0
  61. cite_nexus_mcp-0.2.0/src/cite_nexus_mcp/llm_factory.py +222 -0
  62. cite_nexus_mcp-0.2.0/src/cite_nexus_mcp/models.py +168 -0
  63. cite_nexus_mcp-0.2.0/src/cite_nexus_mcp/providers/__init__.py +24 -0
  64. cite_nexus_mcp-0.2.0/src/cite_nexus_mcp/providers/academic.py +231 -0
  65. cite_nexus_mcp-0.2.0/src/cite_nexus_mcp/providers/base.py +140 -0
  66. cite_nexus_mcp-0.2.0/src/cite_nexus_mcp/providers/commercial.py +263 -0
  67. cite_nexus_mcp-0.2.0/src/cite_nexus_mcp/providers/graphs.py +228 -0
  68. cite_nexus_mcp-0.2.0/src/cite_nexus_mcp/providers/open_metadata.py +152 -0
  69. cite_nexus_mcp-0.2.0/src/cite_nexus_mcp/server.py +350 -0
  70. cite_nexus_mcp-0.2.0/src/cite_nexus_mcp/service.py +595 -0
  71. cite_nexus_mcp-0.2.0/src/cite_nexus_mcp/tools.py +48 -0
  72. cite_nexus_mcp-0.2.0/src/cite_nexus_mcp/wtfp.py +240 -0
  73. cite_nexus_mcp-0.2.0/tests/conftest.py +29 -0
  74. cite_nexus_mcp-0.2.0/tests/fixtures/arxiv.xml +9 -0
  75. cite_nexus_mcp-0.2.0/tests/fixtures/records.json +71 -0
  76. cite_nexus_mcp-0.2.0/tests/test_citations.py +91 -0
  77. cite_nexus_mcp-0.2.0/tests/test_http.py +143 -0
  78. cite_nexus_mcp-0.2.0/tests/test_identifiers.py +52 -0
  79. cite_nexus_mcp-0.2.0/tests/test_mcp.py +143 -0
  80. cite_nexus_mcp-0.2.0/tests/test_providers.py +185 -0
  81. cite_nexus_mcp-0.2.0/tests/test_release.py +69 -0
  82. cite_nexus_mcp-0.2.0/tests/test_release_delivery.py +130 -0
  83. cite_nexus_mcp-0.2.0/tests/test_service.py +298 -0
  84. cite_nexus_mcp-0.2.0/tests/test_wtfp.py +181 -0
  85. cite_nexus_mcp-0.2.0/uv.lock +2734 -0
@@ -0,0 +1,25 @@
1
+ # No credentials are needed for the default Crossref, DataCite and Europe PMC search.
2
+ # CITE_NEXUS_CONTACT_EMAIL=researcher@university.edu
3
+ # CITE_NEXUS_DEFAULT_PROVIDERS=crossref,datacite,europe_pmc
4
+
5
+ # Optional graph APIs. A configured key does not add a provider to default searches.
6
+ # SEMANTIC_SCHOLAR_API_KEY=
7
+ # OPENALEX_API_KEY=
8
+
9
+ # Optional commercial/institutional search.
10
+ # SERPAPI_API_KEY=
11
+ # SCOPUS_API_KEY=
12
+ # SCOPUS_INSTTOKEN=
13
+ # WOS_API_KEY=
14
+ # Legacy SERP_API_KEY and SERPAPI_KEY are also accepted.
15
+
16
+ # Optional open-access enrichment; Unpaywall requires an actual contact email.
17
+ # UNPAYWALL_EMAIL=researcher@university.edu
18
+
19
+ # Operational limits.
20
+ # CITE_NEXUS_TIMEOUT=12
21
+ # CITE_NEXUS_OPERATION_TIMEOUT=40
22
+ # CITE_NEXUS_RETRIES=1
23
+ # CITE_NEXUS_CONCURRENCY=6
24
+ # CITE_NEXUS_CACHE_TTL=300
25
+ # CITE_NEXUS_CACHE_SIZE=256
@@ -0,0 +1,59 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ wheels/
23
+ share/python-wheels/
24
+ *.egg-info/
25
+ .installed.cfg
26
+ *.egg
27
+ MANIFEST
28
+
29
+ # Environment
30
+ .env
31
+ .venv
32
+ env/
33
+ venv/
34
+ ENV/
35
+ env.bak/
36
+ venv.bak/
37
+
38
+ # Virtualenv
39
+ .uv/
40
+
41
+ # IDEs
42
+ .idea/
43
+ .vscode/
44
+ *.swp
45
+ *.swo
46
+
47
+ # Project specific
48
+ OPT_PLAN.md
49
+ plan.md
50
+ CLAUDE.md
51
+
52
+ # Test, lint and local configuration artifacts
53
+ .pytest_cache/
54
+ .mypy_cache/
55
+ .ruff_cache/
56
+ .coverage
57
+ htmlcov/
58
+ .env.*
59
+ !.env.example
@@ -0,0 +1,28 @@
1
+ # Changelog
2
+
3
+ ## 0.2.0 — 2026-09-17
4
+
5
+ CiteNexus becomes a provider-independent scholarly metadata service with public API defaults.
6
+
7
+ - Migrate to MCP Python SDK 2.2 and protocol 2026-07-28, preserving the legacy protocol path.
8
+ - Add typed tools, output schemas, read-only annotations, resources, prompts and progress.
9
+ - Add local Streamable HTTP alongside stdio, plus configuration discovery and explicit `.env` loading.
10
+ - Add Crossref, DataCite, Europe PMC, arXiv, Semantic Scholar, OpenAlex, Scopus and Web of Science
11
+ Starter alongside the revised SerpAPI integration; add optional Unpaywall enrichment.
12
+ - Introduce namespaced identifiers, exact lookup checks, provenance, retained source disagreements,
13
+ version-aware deduplication, native Europe PMC cursor paging and bounded provider requests.
14
+ - Add deterministic BibTeX/RIS/CSL-JSON export, citation verification, bounded batch export,
15
+ open-access discovery and citation/reference traversal.
16
+ - Correct the citation-count bug: provider totals replace citation-page lengths.
17
+ - Remove automatic AI formatting, inferred bibliographic facts and the paid-provider startup requirement.
18
+ - Move standalone legacy AI helpers to an optional extra; retain old MCP tool names and SerpAPI aliases.
19
+ - Add offline provider fixtures, protocol integration tests, a separate public-API smoke script,
20
+ Python version CI, build configuration and a non-root stdio container definition.
21
+ - Rewrite product positioning, configuration, migration and source-access documentation.
22
+ - Integrate WTF-P's citation-search workflow through a bounded companion using real MCP stdio;
23
+ preserve candidates and source records, select vendors explicitly, and test timeout cleanup.
24
+ - Add `cite-nexus-wtfp --check` and `--no-env-file` for reproducible client-managed configuration.
25
+ - Prepare versioned registry and portable/Codex/Claude plugin metadata, a 41-channel marketplace
26
+ inventory, launch copy, icon/social assets, troubleshooting and agent installation guidance.
27
+
28
+ No release publication or registry registration is performed by this change.
@@ -0,0 +1,44 @@
1
+ # Contributing
2
+
3
+ Install development dependencies with `uv sync --locked`. Before submitting changes, run the lint,
4
+ type, test and build commands in the README. Tests must not require network access or account keys.
5
+ Use `scripts/smoke_public.py` separately for explicit public API checks.
6
+
7
+ ## Architecture
8
+
9
+ - `config.py` reads explicit settings; only the CLI loads `.env`.
10
+ - `http.py` owns request limits, retries, pacing, response-size bounds, caching and sanitized failures.
11
+ - `providers/` contains source-specific endpoints and normalization.
12
+ - `models.py` defines public records and structured tool outputs.
13
+ - `identifiers.py` parses namespaced identifiers without fetching arbitrary URLs.
14
+ - `service.py` coordinates search, identity checks, source merging and research workflows.
15
+ - `citations.py` formats observed metadata without a language model.
16
+ - `server.py` exposes typed MCP tools, resources and prompts and manages the service lifecycle.
17
+
18
+ Keep source-specific API behavior in its adapter. Changes to the research service should remain
19
+ independent of MCP client implementation or transport. Keep output schemas accurate and preserve
20
+ error distinctions; clients depend on the difference between no result and an unavailable source.
21
+
22
+ ## Adding a source
23
+
24
+ Document the API's access tier, terms, authentication, request limits and paging model first.
25
+ Implement the `Provider` interface, use the shared HTTP layer, and add it to the registry. A provider
26
+ must declare only the operations it implements. Commercial access must be explicitly selected or
27
+ configured as a default; setting credentials alone must not introduce automatic charges.
28
+
29
+ Normalize native IDs, preserve provider URLs and counts, and identify incomplete author lists.
30
+ Never map a snippet to a full abstract or a partial graph page to a citation total. Do not fabricate
31
+ metadata to fill a schema. Search results may be candidates; exact resolution must verify the
32
+ requested identifier against the returned record.
33
+
34
+ Add realistic, non-sensitive fixtures for search, lookup and any supported graph operations.
35
+ Cover pagination, missing values, auth/rate-limit failures and malformed records. Add a live check
36
+ only as an explicit opt-in script, and distinguish fixture coverage from live account validation
37
+ in the documentation. Avoid storing licensed payloads without redistribution permission.
38
+
39
+ ## Releases
40
+
41
+ Keep the version in `pyproject.toml` and `cite_nexus_mcp.__version__` aligned, refresh `uv.lock`, and
42
+ build both artifacts with `uv build`. Verify that the wheel and source archive contain no `.env`,
43
+ credentials, local assistant configuration or manual user experiments. Validate an installed wheel
44
+ outside the repository before publishing. The local HTTP CLI is not a multi-user deployment layer.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 akougkas.io
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,291 @@
1
+ Metadata-Version: 2.5
2
+ Name: cite-nexus-mcp
3
+ Version: 0.2.0
4
+ Summary: Evidence-backed scholarly discovery and citation tools for MCP, from open metadata to institutional databases.
5
+ Project-URL: Homepage, https://github.com/akougkas/cite-nexus-mcp
6
+ Project-URL: Issues, https://github.com/akougkas/cite-nexus-mcp/issues
7
+ Author-email: "akougkas.io (Anthony K)" <a.kougkas@gmail.com>
8
+ License: MIT
9
+ License-File: LICENSE
10
+ Classifier: License :: OSI Approved :: MIT License
11
+ Classifier: Operating System :: OS Independent
12
+ Classifier: Programming Language :: Python :: 3
13
+ Requires-Python: >=3.11
14
+ Requires-Dist: anyio<5,>=4.9
15
+ Requires-Dist: bibtexparser<2,>=1.4.3
16
+ Requires-Dist: defusedxml<1,>=0.7.1
17
+ Requires-Dist: httpx2<3,>=2.5
18
+ Requires-Dist: mcp<3,>=2.2
19
+ Requires-Dist: pydantic<3,>=2.12
20
+ Requires-Dist: python-dotenv<2,>=1.1
21
+ Provides-Extra: legacy-ai
22
+ Requires-Dist: litellm<2,>=1.82.1; extra == 'legacy-ai'
23
+ Requires-Dist: requests<3,>=2.32; extra == 'legacy-ai'
24
+ Description-Content-Type: text/markdown
25
+
26
+ # CiteNexus MCP
27
+
28
+ <img src="https://raw.githubusercontent.com/akougkas/cite-nexus-mcp/v0.2.0/assets/cite-nexus.svg" alt="CiteNexus" width="88" height="88" align="right">
29
+
30
+ **Scholarly discovery and citations with evidence you can trace.**
31
+
32
+ CiteNexus connects research assistants to open scholarly metadata, specialist academic indexes,
33
+ and optional commercial databases through the Model Context Protocol. Search without an API key,
34
+ resolve stable identifiers, check references against their sources, and export citations without
35
+ asking a language model to invent the missing fields.
36
+
37
+ This is a citation and metadata service for the assistant you already use. It works alongside
38
+ reference managers such as Zotero and writing environments that support MCP.
39
+
40
+ **CiteNexus 0.2.0** includes the MCP service and the `cite-nexus-wtfp` companion.
41
+ The WTF-P integration targets its separate 0.7.0 release. Marketplace listings and native
42
+ client plugin qualification are tracked independently.
43
+
44
+ [Quick start](#quick-start) · [WTF-P integration](https://github.com/akougkas/cite-nexus-mcp/blob/v0.2.0/docs/wtf-p.md) ·
45
+ [Provider guide](https://github.com/akougkas/cite-nexus-mcp/blob/v0.2.0/docs/providers.md) · [Troubleshooting](https://github.com/akougkas/cite-nexus-mcp/blob/v0.2.0/docs/troubleshooting.md) ·
46
+ [Release information](https://github.com/akougkas/cite-nexus-mcp/blob/v0.2.0/docs/release/README.md)
47
+
48
+ - **Useful without credentials:** Crossref, DataCite and Europe PMC are the default search sources.
49
+ arXiv and Semantic Scholar are also available without mandatory keys.
50
+ - **Optional specialist and commercial access:** OpenAlex, Google Scholar through SerpAPI,
51
+ Scopus and Web of Science Starter have explicit configuration and provider selection.
52
+ - **Source-backed records:** namespaced identifiers, retrieval timestamps, field attribution,
53
+ incomplete-author warnings and provider-specific citation counts.
54
+ - **Deterministic export:** BibTeX, RIS and CSL-JSON from retrieved metadata. No model is required.
55
+ - **Current MCP:** Python SDK 2.2, the **2026-07-28** specification, structured tool results,
56
+ resources, prompts, progress, stdio and Streamable HTTP. Earlier clients remain supported by
57
+ the SDK's legacy protocol path.
58
+
59
+ ## Quick start
60
+
61
+ Python 3.11+ and [uv](https://docs.astral.sh/uv/) are required.
62
+
63
+ ```bash
64
+ uvx --from cite-nexus-mcp==0.2.0 cite-nexus-mcp --version
65
+ uvx --from cite-nexus-mcp==0.2.0 cite-nexus-mcp --no-env-file --list-providers
66
+ ```
67
+
68
+ For an MCP client with a `mcpServers` configuration:
69
+
70
+ ```json
71
+ {
72
+ "mcpServers": {
73
+ "cite-nexus": {
74
+ "command": "uvx",
75
+ "args": ["--from", "cite-nexus-mcp==0.2.0", "cite-nexus-mcp", "--no-env-file"]
76
+ }
77
+ }
78
+ }
79
+ ```
80
+
81
+ The client starts MCP over stdio. No API key or `.env` file is required. Running the server
82
+ command directly waits for a client; it is not an interactive search shell. If your client
83
+ cannot find `uvx`, use its absolute executable path. The first run downloads the package and
84
+ its dependencies.
85
+
86
+ For a persistent installation, including the WTF-P companion:
87
+
88
+ ```bash
89
+ uv tool install cite-nexus-mcp==0.2.0
90
+ cite-nexus-wtfp --check
91
+ ```
92
+
93
+ The diagnostic starts the actual MCP service and lists providers without querying vendor APIs.
94
+ See the [WTF-P setup](https://github.com/akougkas/cite-nexus-mcp/blob/v0.2.0/docs/wtf-p.md) for the separate integration and executable-path setting.
95
+
96
+ For local HTTP clients:
97
+
98
+ ```bash
99
+ uvx --from cite-nexus-mcp==0.2.0 cite-nexus-mcp --no-env-file --transport streamable-http --port 8000
100
+ ```
101
+
102
+ Connect to `http://127.0.0.1:8000/mcp`. The CLI binds only to loopback and serves a single trust
103
+ boundary. A public, multi-user deployment needs authentication, credential isolation and its
104
+ own deployment integration; the CLI does not supply those features.
105
+
106
+ ## Sources and access
107
+
108
+ | Provider ID | Coverage | Access | Setup |
109
+ |---|---|---|---|
110
+ | `crossref` | Publisher-deposited DOI metadata and citation counts | Free; default | Optional `CITE_NEXUS_CONTACT_EMAIL` for the polite pool |
111
+ | `datacite` | Datasets, software and other DOI-registered research outputs | Free; default | None |
112
+ | `europe_pmc` | Biomedical literature, PubMed/PMC records, references and citations | Free; default | None |
113
+ | `arxiv` | Preprints in physics, mathematics, computing and related fields | Free | Select explicitly; paced to one request per three seconds |
114
+ | `semantic_scholar` | Academic Graph discovery and citation traversal | Free/shared anonymous limits; optional key | Optional `SEMANTIC_SCHOLAR_API_KEY` |
115
+ | `openalex` | Multidisciplinary research graph | Free credits / metered account access | `OPENALEX_API_KEY` |
116
+ | `serpapi` | Google Scholar through a vendor API | Commercial; account allowances vary | `SERPAPI_API_KEY` |
117
+ | `scopus` | Elsevier's curated literature index | Institutional/commercial entitlement | `SCOPUS_API_KEY`; optional `SCOPUS_INSTTOKEN` |
118
+ | `wos` | Clarivate Web of Science Starter | Institutional/commercial entitlement | `WOS_API_KEY` |
119
+
120
+ `find-open-access` can additionally enrich DOI records with **Unpaywall** when
121
+ `UNPAYWALL_EMAIL` is configured. It returns reported legal OA locations and licensing information;
122
+ it does not download PDFs or bypass access restrictions.
123
+
124
+ Free access is subject to provider rate limits and terms. Anonymous Semantic Scholar can be
125
+ heavily throttled. OpenAlex access policies have changed over time; CiteNexus requires a key for
126
+ that adapter even when an anonymous request happens to succeed. Institution keys do not by
127
+ themselves guarantee subscription access or access outside an institution's network.
128
+
129
+ Commercial and metered adapters are called only when selected explicitly, when resolving their
130
+ own namespaced IDs, or when deliberately configured as search defaults. Setting a key alone does
131
+ not add a vendor to default searches. `list-providers` reports configuration, capabilities and
132
+ documentation links without testing access or revealing key values.
133
+
134
+ ## Research workflows
135
+
136
+ Use CiteNexus to build a literature shortlist, repair an uncertain reference, check the source
137
+ behind a citation count, or prepare a bibliography for your writing tool. For a full writing
138
+ workflow, the [WTF-P companion](https://github.com/akougkas/cite-nexus-mcp/blob/v0.2.0/docs/wtf-p.md) connects discovery to evidence tables, outlines
139
+ and manuscript work while keeping candidate references visible for review.
140
+
141
+ Ask your assistant to use the tools directly, or start with the `literature-review` and
142
+ `bibliography-audit` MCP prompts. Example tool arguments:
143
+
144
+ ```json
145
+ {"query": "reproducible machine learning benchmarks", "providers": ["crossref", "arxiv"], "limit": 5}
146
+ ```
147
+
148
+ ```json
149
+ {"identifier": "10.1038/nature14539", "format": "bibtex"}
150
+ ```
151
+
152
+ ```json
153
+ {"citation": "10.1038/nature14539", "expected_title": "Deep learning", "expected_year": 2015}
154
+ ```
155
+
156
+ ```json
157
+ {"identifier": "PMID:26017442", "direction": "references", "provider": "europe_pmc", "limit": 10}
158
+ ```
159
+
160
+ ```json
161
+ {"identifiers": ["10.1038/nature14539", "arxiv:1706.03762"], "format": "csl-json"}
162
+ ```
163
+
164
+ | Tool | Purpose |
165
+ |---|---|
166
+ | `list-providers` | Inspect source capabilities, access tiers and credential configuration |
167
+ | `search-papers` | Concurrent federated search, conservative deduplication and per-source pagination |
168
+ | `resolve-paper` | Retrieve and validate a DOI or namespaced identifier; optionally merge selected sources |
169
+ | `get-citation` | Export one resolved record as `bibtex`, `ris` or `csl-json` |
170
+ | `verify-citation` | Check an identifier or single BibTeX entry, including supplied title and year |
171
+ | `batch-citations` | Resolve and export 1–20 identifiers with ordered results, partial failures and progress |
172
+ | `related-papers` | Page through a source's citations or references |
173
+ | `paper-metrics` | Return observed citation counts, separated by provider and index |
174
+ | `find-open-access` | Find source-reported OA locations, with optional Unpaywall enrichment |
175
+ | `enhance-citation` | Normalize BibTeX formatting while preserving supplied bibliographic facts |
176
+ | `find-scholar-id` | Legacy Scholar discovery through SerpAPI; returns candidates for review |
177
+
178
+ `search-papers` defaults to 10 results **per provider**, not 10 overall. Results interleave each
179
+ provider's ranking, then merge compatible records. `limit` is 1–50, or at most 20 when using
180
+ SerpAPI. Use each provider's `next_offsets` with the **same limit**, selecting that provider for
181
+ the next call. Europe PMC search uses `next_cursors` instead: pass its token as `cursor`,
182
+ select only `europe_pmc`, keep the same query and limit, and leave `offset` at zero.
183
+ Offsets must be multiples of the limit, up to 10,000. `year_from`, `year_to` and
184
+ `open_access_only` filter the fetched page; unknown values are excluded. Abstracts are omitted
185
+ from search results by default; set `include_abstract: true` or resolve a record to retrieve them.
186
+ Provider search languages differ: explicit advanced queries use that provider's syntax.
187
+
188
+ Supported identifiers include `10.1038/nature14539`, `arxiv:1706.03762`, `PMID:26017442`,
189
+ `PMC12345`, `openalex:W2919115771`, `s2:<paperId>`, `s2:CorpusId:<number>`,
190
+ `scholar:<numericClusterId>`, `scopus:<numericId>`, and `WOS:<recordId>`. DOI, arXiv and PubMed
191
+ URLs are recognized. Arbitrary URLs are not fetched, and unprefixed numeric strings are not
192
+ assumed to be PubMed or Scholar IDs.
193
+
194
+ DOI resolution tries Crossref, DataCite and Europe PMC in order until a matching record is
195
+ retrieved. An explicit `providers` list instead checks each compatible selected source and
196
+ retains evidence and disagreements. Native identifiers route to their corresponding source.
197
+ A title search always returns candidates; it never silently declares the first result a match.
198
+
199
+ Read the MCP resources `cite-nexus://methodology`, `cite-nexus://providers` and
200
+ `cite-nexus://workflows` for machine-accessible guidance.
201
+
202
+ ## What “verified” means
203
+
204
+ Verification establishes that an identifier exists in retrieved metadata and checks any supplied
205
+ title and year. It does **not** establish that a paper's findings are correct, that every author
206
+ is present, that the paper supports a specific claim, or that no retraction exists. A provider
207
+ outage produces `unavailable`, rather than a claim that the citation is fabricated.
208
+
209
+ Exports omit unavailable metadata. Partial author lists generate warnings; BibTeX uses `others`
210
+ where appropriate. Citation counts retain their source, index and observation timestamp and are
211
+ never summed across databases. Counts from different providers are not directly interchangeable.
212
+ Metadata can contain errors or conflicting publication years, and an absent retraction flag is
213
+ not proof that a paper is unretracted.
214
+
215
+ CSL-JSON is structured bibliographic data. Use a CSL processor or your reference manager to render
216
+ APA, IEEE or a journal's house style. `enhance-citation` supports `default` and `compact` formatting;
217
+ it does not infer keywords, awards, impact factors or missing authors.
218
+
219
+ ## Configuration
220
+
221
+ Copy `.env.example` to `.env` only if you need optional settings. Existing process environment
222
+ variables take precedence. The CLI loads `./.env`, or an explicit `--env-file`; it never searches
223
+ parent directories. Importing the Python package does not read `.env` or call external services.
224
+ Pass `--no-env-file` for clients that manage credentials themselves. The WTF-P companion and
225
+ plugin manifests always use this mode.
226
+
227
+ | Variable | Default | Meaning |
228
+ |---|---|---|
229
+ | `CITE_NEXUS_DEFAULT_PROVIDERS` | `crossref,datacite,europe_pmc` | Explicit search source IDs, comma separated |
230
+ | `CITE_NEXUS_TIMEOUT` | `12` | Timeout in seconds for each HTTP request |
231
+ | `CITE_NEXUS_OPERATION_TIMEOUT` | `40` | Time budget for a provider operation or identifier resolution |
232
+ | `CITE_NEXUS_RETRIES` | `1` | Retries for transport failures, HTTP 429 and 5xx responses |
233
+ | `CITE_NEXUS_CONCURRENCY` | `6` | Maximum simultaneous outbound requests |
234
+ | `CITE_NEXUS_CACHE_TTL` | `300` | In-process response-cache lifetime in seconds; `0` disables it |
235
+ | `CITE_NEXUS_CACHE_SIZE` | `256` | Maximum cached responses; `0` disables caching |
236
+
237
+ Cached records retain their original retrieval and citation-observation timestamps. The cache is
238
+ bounded and partitions responses by credentials. Responses larger than 8 MB are rejected. Long
239
+ `Retry-After` cooldowns return a provider issue instead of holding the call open. Keys and upstream
240
+ error bodies are excluded from tool errors. Local stderr logging keeps stdout clean for MCP.
241
+
242
+ See [provider details](https://github.com/akougkas/cite-nexus-mcp/blob/v0.2.0/docs/providers.md), [migration notes](https://github.com/akougkas/cite-nexus-mcp/blob/v0.2.0/docs/migration.md), and
243
+ [product direction](https://github.com/akougkas/cite-nexus-mcp/blob/v0.2.0/docs/product-direction.md) for access nuances and boundaries.
244
+
245
+ ## Development and verification
246
+
247
+ To work from source:
248
+
249
+ ```bash
250
+ git clone https://github.com/akougkas/cite-nexus-mcp.git
251
+ cd cite-nexus-mcp
252
+ uv sync --locked
253
+ uv run ruff check src tests scripts
254
+ uv run ruff format --check src tests scripts
255
+ uv run mypy src/cite_nexus_mcp
256
+ uv run python scripts/prepare_release.py --check
257
+ uv run python scripts/marketplaces.py --check
258
+ uv run pytest -q
259
+ uv build
260
+ ```
261
+
262
+ The automated suite uses synthetic provider fixtures and mock HTTP, plus real local stdio and
263
+ Streamable HTTP processes. It requires no vendor credentials and blocks external network access
264
+ from the test process. Paid and institutional adapters have fixture-based contract coverage;
265
+ live entitlement testing requires an account with access.
266
+
267
+ An explicit public-API smoke test is available separately:
268
+
269
+ ```bash
270
+ uv run python scripts/smoke_public.py
271
+ ```
272
+
273
+ It ignores account credentials and only contacts Crossref, DataCite, Europe PMC, arXiv and
274
+ anonymous Semantic Scholar. Rate limits and network failures are reported as outcomes.
275
+
276
+ The official MCP Tasks extension is not advertised. SDK 2.2 does not implement it yet.
277
+ `batch-citations` is a bounded synchronous workflow with progress and cancellation, not a durable
278
+ job queue. [The roadmap](https://github.com/akougkas/cite-nexus-mcp/blob/v0.2.0/docs/product-direction.md) describes the criteria for adding persistent
279
+ tasks, local libraries and further licensed providers.
280
+
281
+ The [launch kit](https://github.com/akougkas/cite-nexus-mcp/blob/v0.2.0/docs/release/launch-kit.md) includes positioning, listing copy, a demo script,
282
+ and promotional drafts. The [marketplace inventory](https://github.com/akougkas/cite-nexus-mcp/blob/v0.2.0/docs/release/marketplaces.md) tracks 41
283
+ channels and leads, including verified routes, duplicate channels and inactive or unresolved
284
+ sites. Source metadata, portable plugin manifests and image assets are prepared for review.
285
+ See [data handling](https://github.com/akougkas/cite-nexus-mcp/blob/v0.2.0/docs/data-handling.md) before configuring optional providers or hosting.
286
+
287
+ ## License
288
+
289
+ [MIT](https://github.com/akougkas/cite-nexus-mcp/blob/v0.2.0/LICENSE). Provider content, API access and redistribution remain subject to each source's terms.
290
+
291
+ <!-- mcp-name: io.github.akougkas/cite-nexus-mcp -->