Mcp Test — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Mcp Test (MCP Server) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
mcp-test)-testLocal [Model Context Protocol](https://modelcontextprotocol.io) server for the DataCite community: repository QA, funder compliance, CSV index analytics, search/facets, and exports over DataCite monthly and public datafiles you host on disk.
Built with FastMCP · uv · Python 3.12+ · MIT
This repository does not ship production datafiles. You must download them yourself and keep them outside git (see below). CI runs only against a small mock corpus.
part_*.jsonl.gz, YYYY-MM.csv.gz, TAR archives, or monthly/public extracts. They are gitignored under data/local/ and at the repo root.DATACITE_DATA_DIR is unset / DATACITE_USE_MOCK=1). It is not a substitute for real monthly/public files.DATACITE_MAX_RECORDS, default 10000). Always inspect truncated, scan_limit, and (for indexes) coverage_pct so you do not treat a sample as the full corpus.YYYY-MM.csv.gz index can list hundreds of thousands of DOIs; you need the matching part_*.jsonl.gz files for full QA/search. Use coverage_report to measure the gap.Follow only DataCite’s documentation and portals. Do not rely on third-party mirrors unless you trust them and accept their terms.
| Resource | URL |
|---|---|
| Data files portal | https://datafiles.datacite.org |
| Public data file (annual, public DOIs; documented for open use) | DataCite Support — Public Data File |
| Monthly data file (members/consortium; S3 + credentials) | DataCite Support — Monthly Data File |
| XML ↔ JSON mapping (record shape) | DataCite Support — XML to JSON |
| Metadata schema | https://schema.datacite.org |
Public annual file
public-2025).data/local/, which is gitignored).dois/updated_YYYY-MM/part_*.jsonl.gz and/or monthly YYYY-MM.csv.gz indexes inside the extract.Monthly file (members)
data/local/ (or another path outside git).DATACITE_DATA_DIR at that root.After download — required layout for this MCP
Preferred (matches DataCite releases):
data/local/ # or any path you pass as DATACITE_DATA_DIR
STATUS.json # optional
MANIFEST.json # optional
dois/
updated_2026-06/
2026-06.csv.gz # index: doi, state, client_id, updated
part_0000.jsonl.gz # full metadata (~10k records/part typical)
part_0001.jsonl.gz
…Also supported (experimental/flat):
data/local/
2026-06.csv.gz
part_0000.jsonl.gzSee data/local/README.md and docs/DATAFILE_SCHEMA.md.
git clone <this-repo-url> mcp-test
cd mcp-test
uv sync --all-groups# Demo/mock only (no real datafiles)
uv run datacite-librarian-mcp
# Production/local datafiles (STRICT: path must exist)
export DATACITE_DATA_DIR="/absolute/path/to/data/local"
export DATACITE_MAX_RECORDS=20000 # optional; raise for fuller scans
uv run datacite-librarian-mcpExample MCP host config (mcp.json pattern):
{
"mcpServers": {
"datacite-librarian": {
"command": "uv",
"args": [
"run",
"--directory",
"/absolute/path/to/mcp-test",
"datacite-librarian-mcp"
],
"env": {
"DATACITE_DATA_DIR": "/absolute/path/to/mcp-test/data/local",
"DATACITE_MAX_RECORDS": "20000"
}
}
}
}export DATACITE_DATA_DIR="/absolute/path/to/data/local"
uv run python -c "from datacite_librarian_mcp.server import mcp; mcp.run(transport='http', host='127.0.0.1', port=8765)"export DATACITE_DATA_DIR="/absolute/path/to/data/local"
uv run datacite-librarian-chat
# or: uv run python scripts/interactive_client.pyExamples: how many DOIs?, how many funders?, repository health for zenodo, funder compliance for European Commission.
| Audience | Start with |
|---|---|
| Librarians / RDM | community_guide, repository_health, export_health_issues |
| Research offices | funder_compliance, export_funder_issues |
| Repository operators | index_summary, index_client, coverage_report |
| Bibliometrics / policy | facets, top_subjects, index_summary (report truncated) |
| Developers | server_info, mock corpus, tests |
| Teachers | datacite-librarian-chat, mock data |
Call `community_guide` from any MCP client for persona-oriented workflows.
Discovery: community_guide, server_info, corpus_status, corpus_inventory, diff_partitions_summary
Metadata QA / compliance (needs part_*.jsonl.gz): repository_health, funder_compliance, search_dois, get_doi, check_doi_qa, list_clients, list_funders
Analytics: facets, top_subjects
CSV index only (no JSONL required): index_summary, index_client, coverage_report
Exports (writes under exports/ or DATACITE_EXPORT_DIR): export_health_issues, export_funder_issues, export_search_results
Ops: regenerate_mock_data
| Variable | Purpose |
|---|---|
DATACITE_DATA_DIR | Corpus root (must exist if set) |
DATACITE_USE_MOCK | 1 / true forces mock corpus |
DATACITE_MOCK_DIR | Override mock write/read location |
DATACITE_MAX_RECORDS | Aggregate scan ceiling (default 10000) |
DATACITE_DOI_LOOKUP_MAX_SCAN | get_doi ceiling; 0 = full local scan |
DATACITE_EXPORT_DIR | Export output directory |
uv sync --all-groups
uv run pytest
uv run ruff check src testsGitHub Actions (.github/workflows/ci.yml) runs ruff + pytest on Python 3.12 and 3.13 with DATACITE_USE_MOCK=1 only—no real datafiles in CI.
Project docs:
fastmcp + pydantic (+ stdlib).truncated, scan_limit, coverage_pct on tool outputs.part_*.jsonl.gz are downloaded.MIT — see LICENSE.
DataCite bulk metadata licensing and access are governed by DataCite (public file documentation typically describes CC0 for metadata; confirm on Support). Member monthly access may be restricted. This software does not redistribute production datafiles.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.