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.
- crossref_local-0.5.0/.env.example +57 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/.github/workflows/test.yml +10 -3
- {crossref_local-0.3.1 → crossref_local-0.5.0}/.gitignore +2 -0
- crossref_local-0.5.0/.readthedocs.yaml +31 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/CHANGELOG.md +39 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/Makefile +29 -31
- {crossref_local-0.3.1 → crossref_local-0.5.0}/PKG-INFO +88 -24
- {crossref_local-0.3.1 → crossref_local-0.5.0}/README.md +86 -23
- crossref_local-0.5.0/docs/remote-deployment.md +260 -0
- crossref_local-0.5.0/docs/sphinx/api/crossref_local.rst +34 -0
- crossref_local-0.5.0/docs/sphinx/cli_reference.rst +142 -0
- crossref_local-0.5.0/docs/sphinx/conf.py +135 -0
- crossref_local-0.5.0/docs/sphinx/http_api.rst +174 -0
- crossref_local-0.5.0/docs/sphinx/index.rst +85 -0
- crossref_local-0.5.0/docs/sphinx/installation.rst +80 -0
- crossref_local-0.5.0/docs/sphinx/quickstart.rst +113 -0
- crossref_local-0.5.0/docs/sphinx/requirements.txt +5 -0
- crossref_local-0.5.0/examples/00_run_all.sh +28 -0
- crossref_local-0.3.1/examples/quickstart.py → crossref_local-0.5.0/examples/01_quickstart.py +0 -0
- 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
- {crossref_local-0.3.1/examples/citation_network → crossref_local-0.5.0/examples/02_citation_network}/citation_network.html +0 -0
- {crossref_local-0.3.1/examples/citation_network → crossref_local-0.5.0/examples/02_citation_network}/citation_network.yaml +0 -0
- crossref_local-0.5.0/examples/02_demo_mcp.org +31 -0
- {crossref_local-0.3.1/examples/impact_factor → crossref_local-0.5.0/examples/03_impact_factor}/00_calculate_impact_factor.py +0 -0
- {crossref_local-0.3.1/examples/impact_factor → crossref_local-0.5.0/examples/03_impact_factor}/01_compare_jcr.py +0 -0
- {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
- {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
- {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
- {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
- {crossref_local-0.3.1/examples/impact_factor → crossref_local-0.5.0/examples/03_impact_factor}/02_compare_jcr_plot.py +0 -0
- {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
- {crossref_local-0.3.1/examples/impact_factor → crossref_local-0.5.0/examples/03_impact_factor}/run_all_demos.sh +0 -0
- crossref_local-0.5.0/examples/04_mcp_demo.org +399 -0
- crossref_local-0.5.0/examples/04_mcp_demo_out/demo_mcp.tex +438 -0
- crossref_local-0.5.0/examples/04_mcp_demo_out/evolution.mmd +13 -0
- crossref_local-0.5.0/examples/04_mcp_demo_out/pipeline.mmd +27 -0
- crossref_local-0.5.0/examples/04_mcp_demo_out/states.mmd +11 -0
- crossref_local-0.5.0/examples/04_mcp_demo_out/tradeoff.mmd +14 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/examples/compose_readme.py +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/examples/readme_figure.yaml +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/pyproject.toml +2 -1
- {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/README.md +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/create_test_db.py +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/database/00_rebuild_all.sh +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/database/02_create_missing_indexes.sh +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/database/03_rebuild_citations_table.py +1 -1
- {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/database/03_rebuild_citations_table_optimized.py +1 -1
- {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/database/04a_download_openalex_journals.py +1 -1
- {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/database/04b_build_issn_table.py +1 -1
- {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/database/04c_build_journals_table.py +1 -1
- {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/database/04d_build_from_issn_list.py +2 -2
- {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/database/05_build_fts5_index.py +1 -1
- {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/database/06_calculate_abstract_ratio.py +1 -1
- {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/database/99_check_db_connections.py +1 -1
- {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/database/99_db_info.sh +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/database/99_maintain_indexes.sh +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/database/99_switch_to_optimized.sh +4 -4
- {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/database/README.md +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/deployment/build_apptainer.sh +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/deployment/install_apptainer.sh +0 -0
- crossref_local-0.5.0/scripts/deployment/mcp/Dockerfile.mcp +35 -0
- crossref_local-0.5.0/scripts/deployment/mcp/crossref-mcp.service +47 -0
- crossref_local-0.5.0/scripts/deployment/mcp/docker-compose.mcp.yml +44 -0
- crossref_local-0.5.0/scripts/deployment/mcp/docker.sh +176 -0
- crossref_local-0.5.0/scripts/deployment/mcp/install.sh +179 -0
- crossref_local-0.5.0/scripts/deployment/mcp/status.sh +39 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/deployment/run_apptainer.sh +1 -1
- {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/deployment/run_docker.sh +2 -2
- {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/nfs/check.sh +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/nfs/setup_nfs.sh +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/nfs/status.sh +1 -1
- {crossref_local-0.3.1 → crossref_local-0.5.0}/scripts/nfs/stop.sh +0 -0
- crossref_local-0.5.0/scripts/status.sh +199 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/src/crossref_local/__init__.py +38 -16
- {crossref_local-0.3.1 → crossref_local-0.5.0}/src/crossref_local/__main__.py +0 -0
- crossref_local-0.5.0/src/crossref_local/_aio/__init__.py +30 -0
- crossref_local-0.3.1/src/crossref_local/aio.py → crossref_local-0.5.0/src/crossref_local/_aio/_impl.py +35 -33
- crossref_local-0.5.0/src/crossref_local/_cache/__init__.py +15 -0
- crossref_local-0.5.0/src/crossref_local/_cache/export.py +100 -0
- crossref_local-0.5.0/src/crossref_local/_cache/utils.py +93 -0
- crossref_local-0.5.0/src/crossref_local/_cache/viz.py +296 -0
- crossref_local-0.5.0/src/crossref_local/_cli/__init__.py +9 -0
- crossref_local-0.5.0/src/crossref_local/_cli/cache.py +179 -0
- crossref_local-0.5.0/src/crossref_local/_cli/cli.py +512 -0
- crossref_local-0.5.0/src/crossref_local/_cli/completion.py +245 -0
- crossref_local-0.5.0/src/crossref_local/_cli/main.py +20 -0
- crossref_local-0.5.0/src/crossref_local/_cli/mcp.py +351 -0
- crossref_local-0.5.0/src/crossref_local/_cli/mcp_server.py +413 -0
- crossref_local-0.5.0/src/crossref_local/_core/__init__.py +58 -0
- {crossref_local-0.3.1/src/crossref_local → crossref_local-0.5.0/src/crossref_local/_core}/api.py +130 -36
- {crossref_local-0.3.1/src/crossref_local → crossref_local-0.5.0/src/crossref_local/_core}/citations.py +55 -26
- {crossref_local-0.3.1/src/crossref_local → crossref_local-0.5.0/src/crossref_local/_core}/config.py +57 -42
- {crossref_local-0.3.1/src/crossref_local → crossref_local-0.5.0/src/crossref_local/_core}/db.py +32 -26
- {crossref_local-0.3.1/src/crossref_local → crossref_local-0.5.0/src/crossref_local/_core}/fts.py +18 -14
- {crossref_local-0.3.1/src/crossref_local → crossref_local-0.5.0/src/crossref_local/_core}/models.py +11 -6
- {crossref_local-0.3.1/src/crossref_local/impact_factor → crossref_local-0.5.0/src/crossref_local/_impact_factor}/__init__.py +0 -0
- {crossref_local-0.3.1/src/crossref_local/impact_factor → crossref_local-0.5.0/src/crossref_local/_impact_factor}/calculator.py +0 -0
- {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
- crossref_local-0.5.0/src/crossref_local/_remote/__init__.py +56 -0
- crossref_local-0.3.1/src/crossref_local/remote.py → crossref_local-0.5.0/src/crossref_local/_remote/base.py +100 -8
- crossref_local-0.5.0/src/crossref_local/_remote/collections.py +175 -0
- crossref_local-0.5.0/src/crossref_local/_server/__init__.py +140 -0
- crossref_local-0.5.0/src/crossref_local/_server/middleware.py +25 -0
- crossref_local-0.5.0/src/crossref_local/_server/models.py +129 -0
- crossref_local-0.5.0/src/crossref_local/_server/routes_citations.py +98 -0
- crossref_local-0.5.0/src/crossref_local/_server/routes_collections.py +282 -0
- crossref_local-0.5.0/src/crossref_local/_server/routes_compat.py +102 -0
- crossref_local-0.5.0/src/crossref_local/_server/routes_works.py +128 -0
- crossref_local-0.5.0/src/crossref_local/_server/server.py +19 -0
- crossref_local-0.5.0/src/crossref_local/aio.py +60 -0
- crossref_local-0.5.0/src/crossref_local/cache.py +466 -0
- crossref_local-0.5.0/src/crossref_local/cli.py +8 -0
- crossref_local-0.5.0/src/crossref_local/jobs.py +169 -0
- crossref_local-0.5.0/src/crossref_local/mcp_server.py +8 -0
- crossref_local-0.5.0/src/crossref_local/remote.py +8 -0
- crossref_local-0.5.0/src/crossref_local/server.py +8 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/tests/conftest.py +21 -6
- {crossref_local-0.3.1 → crossref_local-0.5.0}/tests/crossref_local/impact_factor/test_calculator.py +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/tests/crossref_local/impact_factor/test_journal_lookup.py +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/tests/crossref_local/test_aio.py +1 -1
- {crossref_local-0.3.1 → crossref_local-0.5.0}/tests/crossref_local/test_api.py +100 -37
- crossref_local-0.5.0/tests/crossref_local/test_cache.py +247 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/tests/crossref_local/test_citations.py +1 -1
- crossref_local-0.5.0/tests/crossref_local/test_cli.py +144 -0
- crossref_local-0.5.0/tests/crossref_local/test_cli_completion.py +210 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/tests/crossref_local/test_config.py +9 -9
- {crossref_local-0.3.1 → crossref_local-0.5.0}/tests/crossref_local/test_db.py +1 -1
- {crossref_local-0.3.1 → crossref_local-0.5.0}/tests/crossref_local/test_fts.py +3 -3
- crossref_local-0.5.0/tests/crossref_local/test_jobs.py +132 -0
- crossref_local-0.5.0/tests/crossref_local/test_mcp_server.py +80 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/tests/crossref_local/test_models.py +1 -1
- {crossref_local-0.3.1 → crossref_local-0.5.0}/tests/crossref_local/test_remote.py +29 -29
- {crossref_local-0.3.1 → crossref_local-0.5.0}/tests/crossref_local/test_server.py +57 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/tests/sync_tests_with_source.sh +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/.gitignore +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/LICENSE +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/NOTES.md +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/README.md +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/dois2sqlite/__init__.py +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/dois2sqlite/cli.py +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/dois2sqlite/database.py +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/dois2sqlite/file_handlers.py +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/dois2sqlite/models.py +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/dois2sqlite/representations.py +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/dois2sqlite/utils.py +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/examples/cnserver/NOTES.md +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/examples/cnserver/README.md +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/examples/cnserver/app.py +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/examples/cnserver/cn-quick-test.py +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/examples/cnserver/cnserver/__init__.py +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/examples/cnserver/cnserver/accept_header_utils.py +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/examples/cnserver/cnserver/cslutils.py +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/examples/cnserver/cnserver/settings.py +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/pyproject.toml +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/quick_convert.sh +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/quick_no_convert.sh +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/utils/create-rnd-tar-subset.py +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/dois2sqlite/utils/select-rnd-dois-from-db.py +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/labs-data-file-api/.gitignore +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/labs-data-file-api/LICENSE.md +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/labs-data-file-api/README.md +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/labs-data-file-api/crossrefDataFile/__init__.py +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/labs-data-file-api/crossrefDataFile/api.py +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/labs-data-file-api/crossrefDataFile/app_urls.py +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/labs-data-file-api/crossrefDataFile/asgi.py +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/labs-data-file-api/crossrefDataFile/migrations/0001_initial.py +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/labs-data-file-api/crossrefDataFile/migrations/0002_dataindexwithlocation.py +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/labs-data-file-api/crossrefDataFile/migrations/__init__.py +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/labs-data-file-api/crossrefDataFile/models.py +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/labs-data-file-api/crossrefDataFile/urls.py +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/labs-data-file-api/crossrefDataFile/views.py +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/labs-data-file-api/crossrefDataFile/wsgi.py +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/labs-data-file-api/main.py +0 -0
- {crossref_local-0.3.1 → crossref_local-0.5.0}/vendor/labs-data-file-api/manage.py +0 -0
- crossref_local-0.3.1/.env.example +0 -5
- crossref_local-0.3.1/src/crossref_local/cli.py +0 -450
- crossref_local-0.3.1/src/crossref_local/mcp_server.py +0 -202
- crossref_local-0.3.1/src/crossref_local/server.py +0 -352
- crossref_local-0.3.1/tests/crossref_local/test_cli.py +0 -183
- crossref_local-0.3.1/tests/crossref_local/test_mcp_server.py +0 -98
- crossref_local-0.3.1/tests/fixtures/.gitkeep +0 -0
- crossref_local-0.3.1/vendor/labs-data-file-api/crossrefDataFile/settings.py +0 -43
- {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
- {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
|
|
47
|
+
crossref-local status || true
|
|
@@ -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
|
-
|
|
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
|
+
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
|
+
[](https://badge.fury.io/py/crossref-local)
|
|
58
|
+
[](https://crossref-local.readthedocs.io/en/latest/)
|
|
50
59
|
[](https://github.com/ywatanabe1989/crossref-local/actions/workflows/test.yml)
|
|
60
|
+
[](https://codecov.io/gh/ywatanabe1989/crossref-local)
|
|
51
61
|
[](https://www.python.org/downloads/)
|
|
52
62
|
[](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
|
|
139
|
-
crossref-local
|
|
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
|
|
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:
|
|
194
|
+
curl "http://localhost:31291/works?q=CRISPR&limit=10"
|
|
170
195
|
|
|
171
196
|
# Get by DOI
|
|
172
|
-
curl "http://localhost:
|
|
197
|
+
curl "http://localhost:31291/works/10.1038/nature12373"
|
|
173
198
|
|
|
174
199
|
# Batch DOI lookup
|
|
175
|
-
curl -X POST "http://localhost:
|
|
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:
|
|
217
|
+
curl "http://localhost:31291/info"
|
|
181
218
|
```
|
|
182
219
|
|
|
183
|
-
|
|
220
|
+
HTTP mode (connect to running server):
|
|
184
221
|
```bash
|
|
185
|
-
# On local machine
|
|
186
|
-
ssh -L
|
|
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
|
|
190
|
-
|
|
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
|
|
236
|
+
<summary><strong>MCP Server</strong></summary>
|
|
197
237
|
|
|
198
|
-
Run as MCP
|
|
238
|
+
Run as MCP (Model Context Protocol) server:
|
|
199
239
|
```bash
|
|
200
|
-
crossref-local
|
|
240
|
+
crossref-local mcp start
|
|
201
241
|
```
|
|
202
242
|
|
|
203
|
-
|
|
243
|
+
Local MCP client configuration:
|
|
204
244
|
```json
|
|
205
245
|
{
|
|
206
246
|
"mcpServers": {
|
|
207
247
|
"crossref-local": {
|
|
208
248
|
"command": "crossref-local",
|
|
209
|
-
"args": ["
|
|
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
|
-
- `
|
|
220
|
-
- `
|
|
221
|
-
- `
|
|
222
|
-
- `
|
|
223
|
-
- `
|
|
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
|
+
[](https://badge.fury.io/py/crossref-local)
|
|
12
|
+
[](https://crossref-local.readthedocs.io/en/latest/)
|
|
5
13
|
[](https://github.com/ywatanabe1989/crossref-local/actions/workflows/test.yml)
|
|
14
|
+
[](https://codecov.io/gh/ywatanabe1989/crossref-local)
|
|
6
15
|
[](https://www.python.org/downloads/)
|
|
7
16
|
[](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
|
|
94
|
-
crossref-local
|
|
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
|
|
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:
|
|
148
|
+
curl "http://localhost:31291/works?q=CRISPR&limit=10"
|
|
125
149
|
|
|
126
150
|
# Get by DOI
|
|
127
|
-
curl "http://localhost:
|
|
151
|
+
curl "http://localhost:31291/works/10.1038/nature12373"
|
|
128
152
|
|
|
129
153
|
# Batch DOI lookup
|
|
130
|
-
curl -X POST "http://localhost:
|
|
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:
|
|
171
|
+
curl "http://localhost:31291/info"
|
|
136
172
|
```
|
|
137
173
|
|
|
138
|
-
|
|
174
|
+
HTTP mode (connect to running server):
|
|
139
175
|
```bash
|
|
140
|
-
# On local machine
|
|
141
|
-
ssh -L
|
|
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
|
|
145
|
-
|
|
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
|
|
190
|
+
<summary><strong>MCP Server</strong></summary>
|
|
152
191
|
|
|
153
|
-
Run as MCP
|
|
192
|
+
Run as MCP (Model Context Protocol) server:
|
|
154
193
|
```bash
|
|
155
|
-
crossref-local
|
|
194
|
+
crossref-local mcp start
|
|
156
195
|
```
|
|
157
196
|
|
|
158
|
-
|
|
197
|
+
Local MCP client configuration:
|
|
159
198
|
```json
|
|
160
199
|
{
|
|
161
200
|
"mcpServers": {
|
|
162
201
|
"crossref-local": {
|
|
163
202
|
"command": "crossref-local",
|
|
164
|
-
"args": ["
|
|
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
|
-
- `
|
|
175
|
-
- `
|
|
176
|
-
- `
|
|
177
|
-
- `
|
|
178
|
-
- `
|
|
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
|
|