crossref-local 0.3.1__tar.gz → 0.5.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 (184) hide show
  1. crossref_local-0.5.0/.env.example +57 -0
  2. {crossref_local-0.3.1 → crossref_local-0.5.0}/.github/workflows/test.yml +10 -3
  3. {crossref_local-0.3.1 → crossref_local-0.5.0}/.gitignore +2 -0
  4. crossref_local-0.5.0/.readthedocs.yaml +31 -0
  5. {crossref_local-0.3.1 → crossref_local-0.5.0}/CHANGELOG.md +39 -0
  6. {crossref_local-0.3.1 → crossref_local-0.5.0}/Makefile +29 -31
  7. {crossref_local-0.3.1 → crossref_local-0.5.0}/PKG-INFO +88 -24
  8. {crossref_local-0.3.1 → crossref_local-0.5.0}/README.md +86 -23
  9. crossref_local-0.5.0/docs/remote-deployment.md +260 -0
  10. crossref_local-0.5.0/docs/sphinx/api/crossref_local.rst +34 -0
  11. crossref_local-0.5.0/docs/sphinx/cli_reference.rst +142 -0
  12. crossref_local-0.5.0/docs/sphinx/conf.py +135 -0
  13. crossref_local-0.5.0/docs/sphinx/http_api.rst +174 -0
  14. crossref_local-0.5.0/docs/sphinx/index.rst +85 -0
  15. crossref_local-0.5.0/docs/sphinx/installation.rst +80 -0
  16. crossref_local-0.5.0/docs/sphinx/quickstart.rst +113 -0
  17. crossref_local-0.5.0/docs/sphinx/requirements.txt +5 -0
  18. crossref_local-0.5.0/examples/00_run_all.sh +28 -0
  19. crossref_local-0.3.1/examples/quickstart.py → crossref_local-0.5.0/examples/01_quickstart.py +0 -0
  20. crossref_local-0.3.1/examples/citation_network/generate_visualization.py → crossref_local-0.5.0/examples/02_citation_network/01_generate_visualization.py +0 -0
  21. {crossref_local-0.3.1/examples/citation_network → crossref_local-0.5.0/examples/02_citation_network}/citation_network.html +0 -0
  22. {crossref_local-0.3.1/examples/citation_network → crossref_local-0.5.0/examples/02_citation_network}/citation_network.yaml +0 -0
  23. crossref_local-0.5.0/examples/02_demo_mcp.org +31 -0
  24. {crossref_local-0.3.1/examples/impact_factor → crossref_local-0.5.0/examples/03_impact_factor}/00_calculate_impact_factor.py +0 -0
  25. {crossref_local-0.3.1/examples/impact_factor → crossref_local-0.5.0/examples/03_impact_factor}/01_compare_jcr.py +0 -0
  26. {crossref_local-0.3.1/examples/impact_factor → crossref_local-0.5.0/examples/03_impact_factor}/01_compare_jcr_out/all_combined.json +0 -0
  27. {crossref_local-0.3.1/examples/impact_factor → crossref_local-0.5.0/examples/03_impact_factor}/01_compare_jcr_out/biomedical_engineering.json +0 -0
  28. {crossref_local-0.3.1/examples/impact_factor → crossref_local-0.5.0/examples/03_impact_factor}/01_compare_jcr_out/high_impact.json +0 -0
  29. {crossref_local-0.3.1/examples/impact_factor → crossref_local-0.5.0/examples/03_impact_factor}/01_compare_jcr_out/neuroscience.json +0 -0
  30. {crossref_local-0.3.1/examples/impact_factor → crossref_local-0.5.0/examples/03_impact_factor}/02_compare_jcr_plot.py +0 -0
  31. {crossref_local-0.3.1/examples/impact_factor → crossref_local-0.5.0/examples/03_impact_factor}/02_compare_jcr_plot_out/scatter_calc_vs_jcr.yaml +0 -0
  32. {crossref_local-0.3.1/examples/impact_factor → crossref_local-0.5.0/examples/03_impact_factor}/run_all_demos.sh +0 -0
  33. crossref_local-0.5.0/examples/04_mcp_demo.org +399 -0
  34. crossref_local-0.5.0/examples/04_mcp_demo_out/demo_mcp.tex +438 -0
  35. crossref_local-0.5.0/examples/04_mcp_demo_out/evolution.mmd +13 -0
  36. crossref_local-0.5.0/examples/04_mcp_demo_out/pipeline.mmd +27 -0
  37. crossref_local-0.5.0/examples/04_mcp_demo_out/states.mmd +11 -0
  38. crossref_local-0.5.0/examples/04_mcp_demo_out/tradeoff.mmd +14 -0
  39. {crossref_local-0.3.1 → crossref_local-0.5.0}/examples/compose_readme.py +0 -0
  40. {crossref_local-0.3.1 → crossref_local-0.5.0}/examples/readme_figure.yaml +0 -0
  41. {crossref_local-0.3.1 → crossref_local-0.5.0}/pyproject.toml +2 -1
  42. {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/README.md +0 -0
  43. {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/create_test_db.py +0 -0
  44. {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/database/00_rebuild_all.sh +0 -0
  45. {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/database/02_create_missing_indexes.sh +0 -0
  46. {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/database/03_rebuild_citations_table.py +1 -1
  47. {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/database/03_rebuild_citations_table_optimized.py +1 -1
  48. {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/database/04a_download_openalex_journals.py +1 -1
  49. {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/database/04b_build_issn_table.py +1 -1
  50. {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/database/04c_build_journals_table.py +1 -1
  51. {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/database/04d_build_from_issn_list.py +2 -2
  52. {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/database/05_build_fts5_index.py +1 -1
  53. {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/database/06_calculate_abstract_ratio.py +1 -1
  54. {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/database/99_check_db_connections.py +1 -1
  55. {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/database/99_db_info.sh +0 -0
  56. {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/database/99_maintain_indexes.sh +0 -0
  57. {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/database/99_switch_to_optimized.sh +4 -4
  58. {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/database/README.md +0 -0
  59. {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/deployment/build_apptainer.sh +0 -0
  60. {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/deployment/install_apptainer.sh +0 -0
  61. crossref_local-0.5.0/scripts/deployment/mcp/Dockerfile.mcp +35 -0
  62. crossref_local-0.5.0/scripts/deployment/mcp/crossref-mcp.service +47 -0
  63. crossref_local-0.5.0/scripts/deployment/mcp/docker-compose.mcp.yml +44 -0
  64. crossref_local-0.5.0/scripts/deployment/mcp/docker.sh +176 -0
  65. crossref_local-0.5.0/scripts/deployment/mcp/install.sh +179 -0
  66. crossref_local-0.5.0/scripts/deployment/mcp/status.sh +39 -0
  67. {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/deployment/run_apptainer.sh +1 -1
  68. {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/deployment/run_docker.sh +2 -2
  69. {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/nfs/check.sh +0 -0
  70. {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/nfs/setup_nfs.sh +0 -0
  71. {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/nfs/status.sh +1 -1
  72. {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/nfs/stop.sh +0 -0
  73. crossref_local-0.5.0/scripts/status.sh +199 -0
  74. {crossref_local-0.3.1 → crossref_local-0.5.0}/src/crossref_local/__init__.py +38 -16
  75. {crossref_local-0.3.1 → crossref_local-0.5.0}/src/crossref_local/__main__.py +0 -0
  76. crossref_local-0.5.0/src/crossref_local/_aio/__init__.py +30 -0
  77. crossref_local-0.3.1/src/crossref_local/aio.py → crossref_local-0.5.0/src/crossref_local/_aio/_impl.py +35 -33
  78. crossref_local-0.5.0/src/crossref_local/_cache/__init__.py +15 -0
  79. crossref_local-0.5.0/src/crossref_local/_cache/export.py +100 -0
  80. crossref_local-0.5.0/src/crossref_local/_cache/utils.py +93 -0
  81. crossref_local-0.5.0/src/crossref_local/_cache/viz.py +296 -0
  82. crossref_local-0.5.0/src/crossref_local/_cli/__init__.py +9 -0
  83. crossref_local-0.5.0/src/crossref_local/_cli/cache.py +179 -0
  84. crossref_local-0.5.0/src/crossref_local/_cli/cli.py +512 -0
  85. crossref_local-0.5.0/src/crossref_local/_cli/completion.py +245 -0
  86. crossref_local-0.5.0/src/crossref_local/_cli/main.py +20 -0
  87. crossref_local-0.5.0/src/crossref_local/_cli/mcp.py +351 -0
  88. crossref_local-0.5.0/src/crossref_local/_cli/mcp_server.py +413 -0
  89. crossref_local-0.5.0/src/crossref_local/_core/__init__.py +58 -0
  90. {crossref_local-0.3.1/src/crossref_local → crossref_local-0.5.0/src/crossref_local/_core}/api.py +130 -36
  91. {crossref_local-0.3.1/src/crossref_local → crossref_local-0.5.0/src/crossref_local/_core}/citations.py +55 -26
  92. {crossref_local-0.3.1/src/crossref_local → crossref_local-0.5.0/src/crossref_local/_core}/config.py +57 -42
  93. {crossref_local-0.3.1/src/crossref_local → crossref_local-0.5.0/src/crossref_local/_core}/db.py +32 -26
  94. {crossref_local-0.3.1/src/crossref_local → crossref_local-0.5.0/src/crossref_local/_core}/fts.py +18 -14
  95. {crossref_local-0.3.1/src/crossref_local → crossref_local-0.5.0/src/crossref_local/_core}/models.py +11 -6
  96. {crossref_local-0.3.1/src/crossref_local/impact_factor → crossref_local-0.5.0/src/crossref_local/_impact_factor}/__init__.py +0 -0
  97. {crossref_local-0.3.1/src/crossref_local/impact_factor → crossref_local-0.5.0/src/crossref_local/_impact_factor}/calculator.py +0 -0
  98. {crossref_local-0.3.1/src/crossref_local/impact_factor → crossref_local-0.5.0/src/crossref_local/_impact_factor}/journal_lookup.py +0 -0
  99. crossref_local-0.5.0/src/crossref_local/_remote/__init__.py +56 -0
  100. crossref_local-0.3.1/src/crossref_local/remote.py → crossref_local-0.5.0/src/crossref_local/_remote/base.py +100 -8
  101. crossref_local-0.5.0/src/crossref_local/_remote/collections.py +175 -0
  102. crossref_local-0.5.0/src/crossref_local/_server/__init__.py +140 -0
  103. crossref_local-0.5.0/src/crossref_local/_server/middleware.py +25 -0
  104. crossref_local-0.5.0/src/crossref_local/_server/models.py +129 -0
  105. crossref_local-0.5.0/src/crossref_local/_server/routes_citations.py +98 -0
  106. crossref_local-0.5.0/src/crossref_local/_server/routes_collections.py +282 -0
  107. crossref_local-0.5.0/src/crossref_local/_server/routes_compat.py +102 -0
  108. crossref_local-0.5.0/src/crossref_local/_server/routes_works.py +128 -0
  109. crossref_local-0.5.0/src/crossref_local/_server/server.py +19 -0
  110. crossref_local-0.5.0/src/crossref_local/aio.py +60 -0
  111. crossref_local-0.5.0/src/crossref_local/cache.py +466 -0
  112. crossref_local-0.5.0/src/crossref_local/cli.py +8 -0
  113. crossref_local-0.5.0/src/crossref_local/jobs.py +169 -0
  114. crossref_local-0.5.0/src/crossref_local/mcp_server.py +8 -0
  115. crossref_local-0.5.0/src/crossref_local/remote.py +8 -0
  116. crossref_local-0.5.0/src/crossref_local/server.py +8 -0
  117. {crossref_local-0.3.1 → crossref_local-0.5.0}/tests/conftest.py +21 -6
  118. {crossref_local-0.3.1 → crossref_local-0.5.0}/tests/crossref_local/impact_factor/test_calculator.py +0 -0
  119. {crossref_local-0.3.1 → crossref_local-0.5.0}/tests/crossref_local/impact_factor/test_journal_lookup.py +0 -0
  120. {crossref_local-0.3.1 → crossref_local-0.5.0}/tests/crossref_local/test_aio.py +1 -1
  121. {crossref_local-0.3.1 → crossref_local-0.5.0}/tests/crossref_local/test_api.py +100 -37
  122. crossref_local-0.5.0/tests/crossref_local/test_cache.py +247 -0
  123. {crossref_local-0.3.1 → crossref_local-0.5.0}/tests/crossref_local/test_citations.py +1 -1
  124. crossref_local-0.5.0/tests/crossref_local/test_cli.py +144 -0
  125. crossref_local-0.5.0/tests/crossref_local/test_cli_completion.py +210 -0
  126. {crossref_local-0.3.1 → crossref_local-0.5.0}/tests/crossref_local/test_config.py +9 -9
  127. {crossref_local-0.3.1 → crossref_local-0.5.0}/tests/crossref_local/test_db.py +1 -1
  128. {crossref_local-0.3.1 → crossref_local-0.5.0}/tests/crossref_local/test_fts.py +3 -3
  129. crossref_local-0.5.0/tests/crossref_local/test_jobs.py +132 -0
  130. crossref_local-0.5.0/tests/crossref_local/test_mcp_server.py +80 -0
  131. {crossref_local-0.3.1 → crossref_local-0.5.0}/tests/crossref_local/test_models.py +1 -1
  132. {crossref_local-0.3.1 → crossref_local-0.5.0}/tests/crossref_local/test_remote.py +29 -29
  133. {crossref_local-0.3.1 → crossref_local-0.5.0}/tests/crossref_local/test_server.py +57 -0
  134. {crossref_local-0.3.1 → crossref_local-0.5.0}/tests/sync_tests_with_source.sh +0 -0
  135. {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/.gitignore +0 -0
  136. {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/LICENSE +0 -0
  137. {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/NOTES.md +0 -0
  138. {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/README.md +0 -0
  139. {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/dois2sqlite/__init__.py +0 -0
  140. {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/dois2sqlite/cli.py +0 -0
  141. {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/dois2sqlite/database.py +0 -0
  142. {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/dois2sqlite/file_handlers.py +0 -0
  143. {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/dois2sqlite/models.py +0 -0
  144. {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/dois2sqlite/representations.py +0 -0
  145. {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/dois2sqlite/utils.py +0 -0
  146. {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/examples/cnserver/NOTES.md +0 -0
  147. {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/examples/cnserver/README.md +0 -0
  148. {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/examples/cnserver/app.py +0 -0
  149. {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/examples/cnserver/cn-quick-test.py +0 -0
  150. {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/examples/cnserver/cnserver/__init__.py +0 -0
  151. {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/examples/cnserver/cnserver/accept_header_utils.py +0 -0
  152. {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/examples/cnserver/cnserver/cslutils.py +0 -0
  153. {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/examples/cnserver/cnserver/settings.py +0 -0
  154. {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/pyproject.toml +0 -0
  155. {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/quick_convert.sh +0 -0
  156. {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/quick_no_convert.sh +0 -0
  157. {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/utils/create-rnd-tar-subset.py +0 -0
  158. {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/utils/select-rnd-dois-from-db.py +0 -0
  159. {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/labs-data-file-api/.gitignore +0 -0
  160. {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/labs-data-file-api/LICENSE.md +0 -0
  161. {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/labs-data-file-api/README.md +0 -0
  162. {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/labs-data-file-api/crossrefDataFile/__init__.py +0 -0
  163. {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/labs-data-file-api/crossrefDataFile/api.py +0 -0
  164. {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/labs-data-file-api/crossrefDataFile/app_urls.py +0 -0
  165. {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/labs-data-file-api/crossrefDataFile/asgi.py +0 -0
  166. {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/labs-data-file-api/crossrefDataFile/migrations/0001_initial.py +0 -0
  167. {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/labs-data-file-api/crossrefDataFile/migrations/0002_dataindexwithlocation.py +0 -0
  168. {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/labs-data-file-api/crossrefDataFile/migrations/__init__.py +0 -0
  169. {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/labs-data-file-api/crossrefDataFile/models.py +0 -0
  170. {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/labs-data-file-api/crossrefDataFile/urls.py +0 -0
  171. {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/labs-data-file-api/crossrefDataFile/views.py +0 -0
  172. {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/labs-data-file-api/crossrefDataFile/wsgi.py +0 -0
  173. {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/labs-data-file-api/main.py +0 -0
  174. {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/labs-data-file-api/manage.py +0 -0
  175. crossref_local-0.3.1/.env.example +0 -5
  176. crossref_local-0.3.1/src/crossref_local/cli.py +0 -450
  177. crossref_local-0.3.1/src/crossref_local/mcp_server.py +0 -202
  178. crossref_local-0.3.1/src/crossref_local/server.py +0 -352
  179. crossref_local-0.3.1/tests/crossref_local/test_cli.py +0 -183
  180. crossref_local-0.3.1/tests/crossref_local/test_mcp_server.py +0 -98
  181. crossref_local-0.3.1/tests/fixtures/.gitkeep +0 -0
  182. crossref_local-0.3.1/vendor/labs-data-file-api/crossrefDataFile/settings.py +0 -43
  183. {crossref_local-0.3.1/.old/impact_factor_standalone_20260110 → crossref_local-0.5.0}/docs/to_claude/examples/example-python-project-scitex/data/.gitkeep +0 -0
  184. {crossref_local-0.3.1/docs/to_claude/examples/example-python-project-scitex/data → crossref_local-0.5.0/tests/fixtures}/.gitkeep +0 -0
@@ -0,0 +1,57 @@
1
+ # CrossRef Local Configuration
2
+ # Copy this file to .env and customize as needed
3
+
4
+ # =============================================================================
5
+ # LOCAL MODE - Direct database access
6
+ # =============================================================================
7
+
8
+ # Path to CrossRef SQLite database (optional - auto-detected if not set)
9
+ # CROSSREF_LOCAL_DB=/path/to/crossref.db
10
+
11
+ # =============================================================================
12
+ # DEVELOPMENT / DEBUGGING
13
+ # =============================================================================
14
+
15
+ # Enable debug mode for verbose logging
16
+ # CROSSREF_LOCAL_DEBUG_MODE=1
17
+
18
+ # Cache directory (default: ~/.cache/crossref-local)
19
+ # CROSSREF_LOCAL_CACHE_DIR=/path/to/cache
20
+
21
+ # =============================================================================
22
+ # REMOTE MODE - HTTP API access (via SSH tunnel or direct connection)
23
+ # =============================================================================
24
+
25
+ # Force remote mode (set to "remote" or "local")
26
+ # CROSSREF_LOCAL_MODE=remote
27
+
28
+ # API URL for remote mode (default: http://localhost:31291)
29
+ # CROSSREF_LOCAL_API_URL=http://localhost:31291
30
+
31
+ # Server host/port (for run-server-http)
32
+ # CROSSREF_LOCAL_HOST=0.0.0.0
33
+ # CROSSREF_LOCAL_PORT=31291
34
+
35
+ # =============================================================================
36
+ # SCITEX INTEGRATION (takes priority over CROSSREF_LOCAL_* variables)
37
+ # =============================================================================
38
+ # Port scheme: 3129X (31290: scitex-cloud, 31291: crossref, 31292: openalex)
39
+ #
40
+ # SCITEX_SCHOLAR_CROSSREF_DB=/path/to/crossref.db
41
+ # SCITEX_SCHOLAR_CROSSREF_MODE=remote
42
+ # SCITEX_SCHOLAR_CROSSREF_HOST=0.0.0.0
43
+ # SCITEX_SCHOLAR_CROSSREF_PORT=31291
44
+
45
+ # =============================================================================
46
+ # TYPICAL SSH TUNNEL SETUP
47
+ # =============================================================================
48
+ # 1. Create SSH tunnel to your database server:
49
+ # ssh -L 31291:127.0.0.1:31291 your-nas-server
50
+ #
51
+ # 2. Set environment variables:
52
+ # export CROSSREF_LOCAL_MODE=remote
53
+ # export CROSSREF_LOCAL_API_URL=http://localhost:31291
54
+ #
55
+ # 3. Or use CLI flags:
56
+ # crossref-local --http search "machine learning"
57
+ # crossref-local --api-url http://localhost:31291 search "query"
@@ -30,11 +30,18 @@ jobs:
30
30
  run: |
31
31
  python scripts/create_test_db.py --rows 500
32
32
 
33
- - name: Run tests
33
+ - name: Run tests with coverage
34
34
  run: |
35
- pytest tests/ -v --tb=short
35
+ pytest tests/ -v --tb=short --cov=crossref_local --cov-report=term-missing --cov-report=xml
36
+
37
+ - name: Upload coverage to Codecov
38
+ if: matrix.python-version == '3.11'
39
+ uses: codecov/codecov-action@v4
40
+ with:
41
+ files: ./coverage.xml
42
+ fail_ci_if_error: false
36
43
 
37
44
  - name: Test CLI
38
45
  run: |
39
46
  crossref-local --help
40
- crossref-local info || true
47
+ crossref-local status || true
@@ -132,6 +132,7 @@ data/*
132
132
  **/*.ppt
133
133
  **/*.pptx
134
134
  **/*.txt
135
+ !docs/sphinx/requirements.txt
135
136
  **/*.log
136
137
  **/*.db
137
138
  **/*.sqlite
@@ -681,3 +682,4 @@ GITIGNORED/
681
682
  tests/fixtures/*.db
682
683
  tests/fixtures/*.json
683
684
  _.venv/
685
+ .coverage
@@ -0,0 +1,31 @@
1
+ # Read the Docs configuration file
2
+ # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
3
+
4
+ version: 2
5
+
6
+ # Set the OS, Python version and other tools you might need
7
+ build:
8
+ os: ubuntu-22.04
9
+ tools:
10
+ python: "3.11"
11
+
12
+ # Build documentation in the "docs/sphinx" directory with Sphinx
13
+ sphinx:
14
+ configuration: docs/sphinx/conf.py
15
+ fail_on_warning: false
16
+
17
+ # Optionally build your docs in additional formats such as PDF and ePub
18
+ formats:
19
+ - pdf
20
+ - epub
21
+
22
+ # Python configuration
23
+ python:
24
+ install:
25
+ # Install package with all optional dependencies
26
+ - method: pip
27
+ path: .
28
+ extra_requirements:
29
+ - all
30
+ # Install sphinx documentation requirements
31
+ - requirements: docs/sphinx/requirements.txt
@@ -5,6 +5,45 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.4.0] - 2026-01-24
9
+
10
+ ### Added
11
+ - **Collections API** - HTTP endpoints for paper collections (`/collections/*`)
12
+ - CRUD operations: list, create, query, delete
13
+ - Download as JSON, CSV, BibTeX, or DOIs
14
+ - Statistics endpoint for collection analytics
15
+ - **Citation HTTP endpoints** - RESTful citation access
16
+ - `GET /citations/{doi}/citing` - Papers citing this DOI
17
+ - `GET /citations/{doi}/cited` - Papers cited by this DOI
18
+ - `GET /citations/{doi}/count` - Citation count
19
+ - `GET /citations/{doi}/network` - Citation network graph
20
+ - **Multi-tenant support** - X-User-ID header for collection scoping
21
+ - **Security hardening**
22
+ - Path traversal protection via name sanitization
23
+ - Input validation with field whitelist (14 allowed fields)
24
+ - Size limits: MAX_LIMIT=10000, MAX_DOIS=1000
25
+ - Shell completion command (`crossref-local completion bash/zsh/fish/install/status`)
26
+ - Paper cache module for efficient collection management
27
+ - MCP subcommand group (`crossref-local mcp {start,doctor,installation,list-tools}`)
28
+ - `--help-recursive` option for complete CLI help
29
+ - Remote deployment docs with systemd and Docker examples
30
+ - Automated MCP server installation via Makefile
31
+ - RemoteClient collection methods mixin
32
+
33
+ ### Changed
34
+ - Default port changed from 8333 to 31291 (SCITEX convention)
35
+ - Server refactored into modular package (`server/`)
36
+ - Reorganized CLI commands for better clarity
37
+ - Improved MCP tools alignment with CLI commands
38
+ - SCITEX environment variables supported with fallback chain
39
+ - Examples renamed to follow numbered convention (04_mcp_demo)
40
+ - Updated .env.example with all environment variables
41
+
42
+ ### Fixed
43
+ - Remote client `get_many` batch response includes citation_count
44
+ - CI workflow now includes pytest-cov for coverage reporting
45
+ - Circular import between cache.py and cache_export.py
46
+
8
47
  ## [0.3.1] - 2026-01-14
9
48
 
10
49
  ### Added
@@ -7,7 +7,8 @@
7
7
  # make status - Show database status
8
8
 
9
9
  .PHONY: help install dev test status db-info db-schema db-indices fts-build fts-status \
10
- citations-status citations-rebuild check clean nfs-setup nfs-status nfs-stop
10
+ citations-status citations-rebuild check clean nfs-setup nfs-status nfs-stop \
11
+ mcp-install mcp-uninstall mcp-status mcp-start mcp-stop mcp-restart mcp-logs
11
12
 
12
13
  # Paths
13
14
  PROJECT_ROOT := $(shell pwd)
@@ -136,36 +137,7 @@ help: ## Show this help
136
137
  ##@ Status & Information
137
138
 
138
139
  status: ## Show overall system status (run this first!)
139
- @echo "╔════════════════════════════════════════════════════════════╗"
140
- @echo "║ CROSSREF LOCAL - STATUS ║"
141
- @echo "╚════════════════════════════════════════════════════════════╝"
142
- @echo ""
143
- @echo "=== Database ==="
144
- @if [ -f "$(DB_PATH)" ]; then \
145
- echo " ✓ Database exists: $(DB_PATH)"; \
146
- echo " Size: $$(du -h "$(DB_PATH)" | cut -f1)"; \
147
- else \
148
- echo " ✗ Database NOT FOUND: $(DB_PATH)"; \
149
- echo " Hint: Check data symlink or run 'make download'"; \
150
- fi
151
- @echo ""
152
- @echo "=== NFS Server ==="
153
- @$(SCRIPTS)/nfs/check.sh
154
- @echo ""
155
- @echo "=== Running Processes ==="
156
- @ps aux | grep -E "(rebuild_citations|build_fts|sqlite3)" | grep -v grep | head -5 || echo " No database processes running"
157
- @echo ""
158
- @echo "=== Screen Sessions ==="
159
- @screen -ls 2>/dev/null | grep -E "(citations|fts|rebuild)" || echo " No relevant screen sessions"
160
- @echo ""
161
- @echo "=== Quick Stats ==="
162
- @if [ -f "$(DB_PATH)" ]; then \
163
- echo " Works: $$(sqlite3 "$(DB_PATH)" "SELECT stat FROM sqlite_stat1 WHERE tbl='works' LIMIT 1;" 2>/dev/null | cut -d' ' -f1 || echo '?')"; \
164
- echo " Citations: $$(sqlite3 "$(DB_PATH)" "SELECT MAX(rowid) FROM citations;" 2>/dev/null || echo '?')"; \
165
- fi
166
- @echo ""
167
- @echo "For detailed database info: make db-info"
168
- @echo "For NFS details: make nfs-status"
140
+ @$(SCRIPTS)/status.sh
169
141
 
170
142
  db-info: ## Show database tables, indices, and row counts
171
143
  @$(SCRIPTS)/database/99_db_info.sh
@@ -257,6 +229,32 @@ create-missing-indices: ## Create any missing indices
257
229
  maintain-indices: ## Analyze and optimize indices
258
230
  @$(SCRIPTS)/database/99_maintain_indexes.sh
259
231
 
232
+ ##@ MCP Server (Remote Access)
233
+
234
+ mcp-install: ## Install MCP server as systemd service
235
+ @$(SCRIPTS)/deployment/mcp/install.sh $(if $(DB),--db $(DB),) $(if $(PORT),--port $(PORT),)
236
+
237
+ mcp-uninstall: ## Remove MCP systemd service
238
+ @$(SCRIPTS)/deployment/mcp/install.sh --uninstall
239
+
240
+ mcp-status: ## Show MCP server status
241
+ @$(SCRIPTS)/deployment/mcp/status.sh
242
+
243
+ mcp-start: ## Start MCP server
244
+ @sudo systemctl start crossref-mcp
245
+ @echo "✓ MCP server started"
246
+
247
+ mcp-stop: ## Stop MCP server
248
+ @sudo systemctl stop crossref-mcp
249
+ @echo "✓ MCP server stopped"
250
+
251
+ mcp-restart: ## Restart MCP server
252
+ @sudo systemctl restart crossref-mcp
253
+ @echo "✓ MCP server restarted"
254
+
255
+ mcp-logs: ## Show MCP server logs (live)
256
+ @journalctl -u crossref-mcp -f
257
+
260
258
  ##@ NFS Server
261
259
 
262
260
  nfs-setup: ## Setup NFS server to share database (requires .env with SUDO_PASSWORD)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: crossref-local
3
- Version: 0.3.1
3
+ Version: 0.5.0
4
4
  Summary: Local CrossRef database with 167M+ works and full-text search
5
5
  Project-URL: Homepage, https://github.com/ywatanabe1989/crossref_local
6
6
  Project-URL: Repository, https://github.com/ywatanabe1989/crossref_local
@@ -18,6 +18,7 @@ Classifier: Topic :: Database
18
18
  Classifier: Topic :: Scientific/Engineering
19
19
  Requires-Python: >=3.10
20
20
  Requires-Dist: click>=8.0
21
+ Requires-Dist: rich>=13.0
21
22
  Provides-Extra: all
22
23
  Requires-Dist: fastapi>=0.100; extra == 'all'
23
24
  Requires-Dist: fastmcp>=0.4; extra == 'all'
@@ -43,11 +44,20 @@ Requires-Dist: networkx>=3.0; extra == 'viz'
43
44
  Requires-Dist: pyvis>=0.3; extra == 'viz'
44
45
  Description-Content-Type: text/markdown
45
46
 
47
+ <!-- ---
48
+ !-- Timestamp: 2026-01-16 19:15:51
49
+ !-- Author: ywatanabe
50
+ !-- File: /home/ywatanabe/proj/crossref-local/README.md
51
+ !-- --- -->
52
+
46
53
  # CrossRef Local
47
54
 
48
55
  Local CrossRef database with 167M+ scholarly works, full-text search, and impact factor calculation.
49
56
 
57
+ [![PyPI version](https://badge.fury.io/py/crossref-local.svg)](https://badge.fury.io/py/crossref-local)
58
+ [![Documentation](https://readthedocs.org/projects/crossref-local/badge/?version=latest)](https://crossref-local.readthedocs.io/en/latest/)
50
59
  [![Tests](https://github.com/ywatanabe1989/crossref-local/actions/workflows/test.yml/badge.svg)](https://github.com/ywatanabe1989/crossref-local/actions/workflows/test.yml)
60
+ [![Coverage](https://codecov.io/gh/ywatanabe1989/crossref-local/branch/main/graph/badge.svg)](https://codecov.io/gh/ywatanabe1989/crossref-local)
51
61
  [![Python](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
52
62
  [![License](https://img.shields.io/badge/license-AGPL--3.0-blue.svg)](LICENSE)
53
63
 
@@ -55,6 +65,22 @@ Local CrossRef database with 167M+ scholarly works, full-text search, and impact
55
65
  <img src="examples/readme_figure.png" alt="CrossRef Local Demo" width="800"/>
56
66
  </p>
57
67
 
68
+ <details>
69
+ <summary><strong>MCP Demo Video</strong></summary>
70
+
71
+ <p align="center">
72
+ <a href="https://scitex.ai/media/videos/crossref-local-v0.3.1-demo.mp4">
73
+ <img src="examples/demo_mcp_out/crossref-local-v0.3.1-demo-thumbnail_6m55s.png" alt="Demo Video Thumbnail" width="600"/>
74
+ </a>
75
+ </p>
76
+
77
+ Live demonstration of MCP server integration with Claude Code for `epilepsy seizure prediction` literature review:
78
+ - Full-text search on title, abstracts, and keywords across 167M papers (22ms response)
79
+
80
+ 📄 [Full demo documentation](examples/demo_mcp.org) | 📊 [Generated diagrams](examples/demo_mcp_out/)
81
+
82
+ </details>
83
+
58
84
  <details>
59
85
  <summary><strong>Why CrossRef Local?</strong></summary>
60
86
 
@@ -135,9 +161,8 @@ async def main():
135
161
 
136
162
  ```bash
137
163
  crossref-local search "CRISPR genome editing" -n 5
138
- crossref-local get 10.1038/nature12373
139
- crossref-local impact-factor Nature -y 2023 # IF: 54.067
140
- crossref-local info # Database stats
164
+ crossref-local search-by-doi 10.1038/nature12373
165
+ crossref-local status # Configuration and database stats
141
166
  ```
142
167
 
143
168
  With abstracts (`-a` flag):
@@ -160,53 +185,68 @@ Found 4 matches in 128.4ms
160
185
 
161
186
  Start the FastAPI server:
162
187
  ```bash
163
- crossref-local api --host 0.0.0.0 --port 3333
188
+ crossref-local relay --host 0.0.0.0 --port 31291
164
189
  ```
165
190
 
166
191
  Endpoints:
167
192
  ```bash
168
193
  # Search works (FTS5)
169
- curl "http://localhost:3333/works?q=CRISPR&limit=10"
194
+ curl "http://localhost:31291/works?q=CRISPR&limit=10"
170
195
 
171
196
  # Get by DOI
172
- curl "http://localhost:3333/works/10.1038/nature12373"
197
+ curl "http://localhost:31291/works/10.1038/nature12373"
173
198
 
174
199
  # Batch DOI lookup
175
- curl -X POST "http://localhost:3333/works/batch" \
200
+ curl -X POST "http://localhost:31291/works/batch" \
176
201
  -H "Content-Type: application/json" \
177
202
  -d '{"dois": ["10.1038/nature12373", "10.1126/science.aax0758"]}'
178
203
 
204
+ # Citation endpoints
205
+ curl "http://localhost:31291/citations/10.1038/nature12373/citing"
206
+ curl "http://localhost:31291/citations/10.1038/nature12373/cited"
207
+ curl "http://localhost:31291/citations/10.1038/nature12373/count"
208
+
209
+ # Collection endpoints
210
+ curl "http://localhost:31291/collections"
211
+ curl -X POST "http://localhost:31291/collections" \
212
+ -H "Content-Type: application/json" \
213
+ -d '{"name": "my_papers", "query": "CRISPR", "limit": 100}'
214
+ curl "http://localhost:31291/collections/my_papers/download?format=bibtex"
215
+
179
216
  # Database info
180
- curl "http://localhost:3333/info"
217
+ curl "http://localhost:31291/info"
181
218
  ```
182
219
 
183
- Remote access via SSH tunnel:
220
+ HTTP mode (connect to running server):
184
221
  ```bash
185
- # On local machine
186
- ssh -L 3333:127.0.0.1:3333 nas
222
+ # On local machine (if server is remote)
223
+ ssh -L 31291:127.0.0.1:31291 your-server
187
224
 
188
225
  # Python client
189
- from crossref_local import configure_remote
190
- configure_remote("http://localhost:3333")
226
+ from crossref_local import configure_http
227
+ configure_http("http://localhost:31291")
228
+
229
+ # Or via CLI
230
+ crossref-local --http search "CRISPR"
191
231
  ```
192
232
 
193
233
  </details>
194
234
 
195
235
  <details>
196
- <summary><strong>MCP Server (Claude Desktop)</strong></summary>
236
+ <summary><strong>MCP Server</strong></summary>
197
237
 
198
- Run as MCP server for Claude Desktop integration:
238
+ Run as MCP (Model Context Protocol) server:
199
239
  ```bash
200
- crossref-local serve
240
+ crossref-local mcp start
201
241
  ```
202
242
 
203
- Add to Claude Desktop config (`~/.config/claude/claude_desktop_config.json`):
243
+ Local MCP client configuration:
204
244
  ```json
205
245
  {
206
246
  "mcpServers": {
207
247
  "crossref-local": {
208
248
  "command": "crossref-local",
209
- "args": ["serve"],
249
+ "args": ["mcp", "start"],
210
250
  "env": {
211
251
  "CROSSREF_LOCAL_DB": "/path/to/crossref.db"
212
252
  }
@@ -215,12 +255,36 @@ Add to Claude Desktop config (`~/.config/claude/claude_desktop_config.json`):
215
255
  }
216
256
  ```
217
257
 
258
+ Remote MCP via HTTP (recommended):
259
+ ```bash
260
+ # On server: start persistent MCP server
261
+ crossref-local mcp start -t http --host 0.0.0.0 --port 8082
262
+ ```
263
+ ```json
264
+ {
265
+ "mcpServers": {
266
+ "crossref-remote": {
267
+ "url": "http://your-server:8082/mcp"
268
+ }
269
+ }
270
+ }
271
+ ```
272
+
273
+ Diagnose setup:
274
+ ```bash
275
+ crossref-local mcp doctor # Check dependencies and database
276
+ crossref-local mcp list-tools # Show available MCP tools
277
+ crossref-local mcp installation # Show client config examples
278
+ ```
279
+
280
+ See [docs/remote-deployment.md](docs/remote-deployment.md) for systemd and Docker setup.
281
+
218
282
  Available tools:
219
- - `search_works` - Full-text search across 167M+ papers
220
- - `get_work` - Get paper by DOI
221
- - `count_works` - Count matching papers
222
- - `database_info` - Database statistics
223
- - `calculate_impact_factor` - Journal impact factor
283
+ - `search` - Full-text search across 167M+ papers
284
+ - `search_by_doi` - Get paper by DOI
285
+ - `enrich_dois` - Add citation counts and references to DOIs
286
+ - `status` - Database statistics
287
+ - `cache_*` - Paper collection management
224
288
 
225
289
  </details>
226
290
 
@@ -1,8 +1,17 @@
1
+ <!-- ---
2
+ !-- Timestamp: 2026-01-16 19:15:51
3
+ !-- Author: ywatanabe
4
+ !-- File: /home/ywatanabe/proj/crossref-local/README.md
5
+ !-- --- -->
6
+
1
7
  # CrossRef Local
2
8
 
3
9
  Local CrossRef database with 167M+ scholarly works, full-text search, and impact factor calculation.
4
10
 
11
+ [![PyPI version](https://badge.fury.io/py/crossref-local.svg)](https://badge.fury.io/py/crossref-local)
12
+ [![Documentation](https://readthedocs.org/projects/crossref-local/badge/?version=latest)](https://crossref-local.readthedocs.io/en/latest/)
5
13
  [![Tests](https://github.com/ywatanabe1989/crossref-local/actions/workflows/test.yml/badge.svg)](https://github.com/ywatanabe1989/crossref-local/actions/workflows/test.yml)
14
+ [![Coverage](https://codecov.io/gh/ywatanabe1989/crossref-local/branch/main/graph/badge.svg)](https://codecov.io/gh/ywatanabe1989/crossref-local)
6
15
  [![Python](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
7
16
  [![License](https://img.shields.io/badge/license-AGPL--3.0-blue.svg)](LICENSE)
8
17
 
@@ -10,6 +19,22 @@ Local CrossRef database with 167M+ scholarly works, full-text search, and impact
10
19
  <img src="examples/readme_figure.png" alt="CrossRef Local Demo" width="800"/>
11
20
  </p>
12
21
 
22
+ <details>
23
+ <summary><strong>MCP Demo Video</strong></summary>
24
+
25
+ <p align="center">
26
+ <a href="https://scitex.ai/media/videos/crossref-local-v0.3.1-demo.mp4">
27
+ <img src="examples/demo_mcp_out/crossref-local-v0.3.1-demo-thumbnail_6m55s.png" alt="Demo Video Thumbnail" width="600"/>
28
+ </a>
29
+ </p>
30
+
31
+ Live demonstration of MCP server integration with Claude Code for `epilepsy seizure prediction` literature review:
32
+ - Full-text search on title, abstracts, and keywords across 167M papers (22ms response)
33
+
34
+ 📄 [Full demo documentation](examples/demo_mcp.org) | 📊 [Generated diagrams](examples/demo_mcp_out/)
35
+
36
+ </details>
37
+
13
38
  <details>
14
39
  <summary><strong>Why CrossRef Local?</strong></summary>
15
40
 
@@ -90,9 +115,8 @@ async def main():
90
115
 
91
116
  ```bash
92
117
  crossref-local search "CRISPR genome editing" -n 5
93
- crossref-local get 10.1038/nature12373
94
- crossref-local impact-factor Nature -y 2023 # IF: 54.067
95
- crossref-local info # Database stats
118
+ crossref-local search-by-doi 10.1038/nature12373
119
+ crossref-local status # Configuration and database stats
96
120
  ```
97
121
 
98
122
  With abstracts (`-a` flag):
@@ -115,53 +139,68 @@ Found 4 matches in 128.4ms
115
139
 
116
140
  Start the FastAPI server:
117
141
  ```bash
118
- crossref-local api --host 0.0.0.0 --port 3333
142
+ crossref-local relay --host 0.0.0.0 --port 31291
119
143
  ```
120
144
 
121
145
  Endpoints:
122
146
  ```bash
123
147
  # Search works (FTS5)
124
- curl "http://localhost:3333/works?q=CRISPR&limit=10"
148
+ curl "http://localhost:31291/works?q=CRISPR&limit=10"
125
149
 
126
150
  # Get by DOI
127
- curl "http://localhost:3333/works/10.1038/nature12373"
151
+ curl "http://localhost:31291/works/10.1038/nature12373"
128
152
 
129
153
  # Batch DOI lookup
130
- curl -X POST "http://localhost:3333/works/batch" \
154
+ curl -X POST "http://localhost:31291/works/batch" \
131
155
  -H "Content-Type: application/json" \
132
156
  -d '{"dois": ["10.1038/nature12373", "10.1126/science.aax0758"]}'
133
157
 
158
+ # Citation endpoints
159
+ curl "http://localhost:31291/citations/10.1038/nature12373/citing"
160
+ curl "http://localhost:31291/citations/10.1038/nature12373/cited"
161
+ curl "http://localhost:31291/citations/10.1038/nature12373/count"
162
+
163
+ # Collection endpoints
164
+ curl "http://localhost:31291/collections"
165
+ curl -X POST "http://localhost:31291/collections" \
166
+ -H "Content-Type: application/json" \
167
+ -d '{"name": "my_papers", "query": "CRISPR", "limit": 100}'
168
+ curl "http://localhost:31291/collections/my_papers/download?format=bibtex"
169
+
134
170
  # Database info
135
- curl "http://localhost:3333/info"
171
+ curl "http://localhost:31291/info"
136
172
  ```
137
173
 
138
- Remote access via SSH tunnel:
174
+ HTTP mode (connect to running server):
139
175
  ```bash
140
- # On local machine
141
- ssh -L 3333:127.0.0.1:3333 nas
176
+ # On local machine (if server is remote)
177
+ ssh -L 31291:127.0.0.1:31291 your-server
142
178
 
143
179
  # Python client
144
- from crossref_local import configure_remote
145
- configure_remote("http://localhost:3333")
180
+ from crossref_local import configure_http
181
+ configure_http("http://localhost:31291")
182
+
183
+ # Or via CLI
184
+ crossref-local --http search "CRISPR"
146
185
  ```
147
186
 
148
187
  </details>
149
188
 
150
189
  <details>
151
- <summary><strong>MCP Server (Claude Desktop)</strong></summary>
190
+ <summary><strong>MCP Server</strong></summary>
152
191
 
153
- Run as MCP server for Claude Desktop integration:
192
+ Run as MCP (Model Context Protocol) server:
154
193
  ```bash
155
- crossref-local serve
194
+ crossref-local mcp start
156
195
  ```
157
196
 
158
- Add to Claude Desktop config (`~/.config/claude/claude_desktop_config.json`):
197
+ Local MCP client configuration:
159
198
  ```json
160
199
  {
161
200
  "mcpServers": {
162
201
  "crossref-local": {
163
202
  "command": "crossref-local",
164
- "args": ["serve"],
203
+ "args": ["mcp", "start"],
165
204
  "env": {
166
205
  "CROSSREF_LOCAL_DB": "/path/to/crossref.db"
167
206
  }
@@ -170,12 +209,36 @@ Add to Claude Desktop config (`~/.config/claude/claude_desktop_config.json`):
170
209
  }
171
210
  ```
172
211
 
212
+ Remote MCP via HTTP (recommended):
213
+ ```bash
214
+ # On server: start persistent MCP server
215
+ crossref-local mcp start -t http --host 0.0.0.0 --port 8082
216
+ ```
217
+ ```json
218
+ {
219
+ "mcpServers": {
220
+ "crossref-remote": {
221
+ "url": "http://your-server:8082/mcp"
222
+ }
223
+ }
224
+ }
225
+ ```
226
+
227
+ Diagnose setup:
228
+ ```bash
229
+ crossref-local mcp doctor # Check dependencies and database
230
+ crossref-local mcp list-tools # Show available MCP tools
231
+ crossref-local mcp installation # Show client config examples
232
+ ```
233
+
234
+ See [docs/remote-deployment.md](docs/remote-deployment.md) for systemd and Docker setup.
235
+
173
236
  Available tools:
174
- - `search_works` - Full-text search across 167M+ papers
175
- - `get_work` - Get paper by DOI
176
- - `count_works` - Count matching papers
177
- - `database_info` - Database statistics
178
- - `calculate_impact_factor` - Journal impact factor
237
+ - `search` - Full-text search across 167M+ papers
238
+ - `search_by_doi` - Get paper by DOI
239
+ - `enrich_dois` - Add citation counts and references to DOIs
240
+ - `status` - Database statistics
241
+ - `cache_*` - Paper collection management
179
242
 
180
243
  </details>
181
244