Research Deposition MCP
This server lets you safely prepare, review, and publish scholarly deposits to Zenodo/Sandbox via MCP, with deterministic validation, file manifests, package identity, and operator-signed approvals.
deposition_status – report backend and safety configuration without exposing secrets.
validate_deposition – deterministically validate repository-independent research metadata.
build_file_manifest – select files with include/exclude rules and compute SHA-256 manifests without uploading.
build_publication_package – canonicalize metadata + manifest and compute the package digest.
create_draft / get_draft / update_draft – manage unpublished Zenodo drafts.
upload_file – upload local files to an existing draft without publishing.
publication_review – recompute the package and return a human-signable approval request.
publish_draft – publish only when process-level publishing is enabled and a valid signed receipt matches the freshly recomputed package and target.
Safety defaults prevent implicit publication: publishing fails closed without explicit configuration and operator approval.
Provides integration with Zenodo for preparing scholarly deposits, including draft creation, metadata updates, file uploads, and operator-approved publication workflows.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Research Deposition MCP Validate the deposition metadata and build a file manifest for the dataset folder."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Research Deposition MCP
A safety-first Model Context Protocol (MCP) server for preparing scholarly deposits from agentic research workflows. Zenodo is the first repository adapter; the core model is intentionally repository-independent.
Project status: v0.2 in progress / early development. Use Zenodo Sandbox for testing. Package identity and signed human approval are implemented; full remote-draft/file attestation remains planned in #10.
Why this exists
Repository APIs make programmatic deposition possible, but a raw API wrapper is not enough for trustworthy agentic publishing. Research Deposition MCP separates three responsibilities:
Agent/LLM — interpret researcher intent and assemble candidate metadata.
Deterministic deposition layer — validate, canonicalize, hash, transform, upload, and report inconsistencies.
Human/operator — authorize publication of a specific immutable package using a signing key kept outside the MCP/agent environment.
The design principle is simple: agents may help prepare a deposit, but they should not silently invent scientific metadata or obtain implicit authority to publish it.
Related MCP server: io.github.xngg1021/academic-research-kernel
Current scope
Implemented:
repository-independent research-deposit model;
deterministic schema validation with warnings;
deterministic file selection with explicit include/exclude rules;
repository-independent file manifest with POSIX/NFC-normalized source/deposit paths, byte size, and SHA-256;
canonical byte-stable file-manifest serialization;
canonical scientific metadata serialization;
versioned publication package combining metadata + manifest;
SHA-256 package digest with domain separation;
strict rejection of symlinks/path traversal for manifest construction;
Zenodo adapter and Zenodo Sandbox default;
draft creation, retrieval, metadata update, and local file upload;
publication review that emits the exact approval request;
Ed25519 operator-signed, short-lived approval receipts;
pre-publication package digest recomputation;
approval binding to package digest, repository adapter, endpoint, draft ID, and policy version;
publication disabled by default at process level.
Still planned include wiring the append-only audit event log (#9) into the MCP tool handlers, full Zenodo remote-package verification and Sandbox E2E coverage (#10), RO-Crate/CITATION.cff/ISA/ORW importers, identifier validation, and additional repository adapters. See ROADMAP.md and BACKLOG.md.
MCP tools
Tool | Purpose | Publishes? |
| Report backend, approval verifier, and safety configuration without exposing secrets | No |
| Validate repository-independent metadata | No |
| Deterministically select and SHA-256 files without uploading them | No |
| Canonicalize metadata + manifest and compute the package digest | No |
| Validate metadata and create an unpublished Zenodo draft | No |
| Retrieve a draft | No |
| Validate and replace draft metadata | No |
| Upload a local file to a draft | No |
| Recompute the package, retrieve the draft, and return the approval request | No |
| Recompute package, verify signed approval, then publish if process policy permits | Yes |
See docs/file-manifest.md, docs/package-identity.md, and docs/approval.md.
Safety defaults
ZENODO_BASE_URL=https://sandbox.zenodo.org
ZENODO_ALLOW_PUBLISH=false
DEPOSITION_PUBLICATION_POLICY_VERSION=1
DEPOSITION_APPROVAL_MAX_AGE_SECONDS=900A valid approval receipt does not enable publication by itself. Final publication requires both:
deliberate process configuration (
ZENODO_ALLOW_PUBLISH=true); anda valid operator-signed receipt matching the freshly recomputed package and exact target.
The private approval key is intentionally not used by the MCP server. See docs/safety-model.md.
Requirements
Node.js 20+
npm
a Zenodo Sandbox personal access token for writable tests
Install
git clone https://github.com/dhuzard/Research-Deposition-MCP.git
cd Research-Deposition-MCP
npm install
npm testCreate a Zenodo Sandbox token and start the MCP server:
export ZENODO_API_KEY="..."
npm startDo not commit tokens or put them into MCP configuration files that will be version-controlled.
Local CLI
research-deposition is a local, read-only operator CLI. It validates a package config and its selected files and computes the deterministic package digest; it never talks to a repository and never writes anything.
research-deposition status [--json]
research-deposition package check <config.json> [--json]
research-deposition package digest <config.json> [--json]A package config is JSON with schemaVersion: "1", repository-independent metadata, and an explicit files list of { "sourcePath": "...", "depositName": "..." } entries. sourcePath is resolved relative to the directory containing the config file (the implicit root) and is treated as a literal file path, not a glob. --json emits exactly one JSON document to stdout, including on validation failure; without it, output is human-readable. Exit codes: 0 for a valid (or warning-only) result, 1 for an invalid config/metadata/file or a runtime safety rejection, 2 for usage errors. Tokens are never accepted as CLI flags and are never logged; status only reports whether one is configured via ZENODO_API_KEY.
MCP client example
{
"mcpServers": {
"research-deposition": {
"command": "node",
"args": ["/absolute/path/Research-Deposition-MCP/build/src/index.js"],
"env": {
"ZENODO_API_KEY": "YOUR_SANDBOX_TOKEN",
"ZENODO_BASE_URL": "https://sandbox.zenodo.org",
"DEPOSITION_APPROVAL_PUBLIC_KEY_FILE": "/safe/path/operator-public.pem"
}
}
}
}Only the public approval key belongs in the MCP process.
Repository-independent metadata
{
"title": "Home-cage behavioral dataset",
"description": "Behavioral and experimental metadata for ...",
"resourceType": "dataset",
"creators": [
{
"name": "Huzard, Damien",
"orcid": "0000-0000-0000-0000",
"affiliation": "..."
}
],
"keywords": ["FAIR", "home-cage monitoring"],
"license": "cc-by-4.0",
"version": "1.0.0",
"relatedIdentifiers": []
}The common model deliberately avoids Zenodo field names. Repository-specific transformations live in adapters.
File manifest
{
"rootDir": "/path/to/project",
"include": ["data/**", "README.md"],
"exclude": ["data/intermediate/**"],
"destinations": {
"README.md": "documentation/README.md"
}
}build_file_manifest returns a canonical manifest containing only repository-independent relative paths and content identity. Absolute local paths are not serialized. Symlinks and .. traversal are rejected.
Publication package and digest
build_publication_package combines canonical metadata with the canonical file manifest. The resulting digest has the form:
sha256:<64 lowercase hex characters>The digest is over a versioned canonical JSON representation with explicit domain separation. Creator order is significant. Keywords and related identifiers are canonicalized as unordered sets. Unknown operational metadata fields and machine-local root paths do not affect the digest.
The full contract and golden test fixture are documented in docs/package-identity.md.
Human approval workflow
Generate an operator key pair outside the agent workspace:
npm run build
research-deposition-approve keygen \
--private-key ~/.config/research-deposition/operator-private.pem \
--public-key ~/.config/research-deposition/operator-public.pemConfigure the MCP process with only the public key:
export DEPOSITION_APPROVAL_PUBLIC_KEY_FILE="$HOME/.config/research-deposition/operator-public.pem"Call publication_review with the draft ID, metadata, root directory, and file-selection rules. It returns an approvalRequest containing the package digest and exact publication target.
Save that request as JSON and sign it interactively:
research-deposition-approve sign \
--request approval-request.json \
--private-key ~/.config/research-deposition/operator-private.pem \
--receipt approval-receipt.jsonThe signing command requires a TTY and an exact human-entered confirmation phrase. There is intentionally no non-interactive bypass flag.
publish_draft then requires the receipt plus the metadata/file-selection inputs. It re-reads the selected files and recomputes the package digest immediately before verifying the receipt and publishing.
Any change to metadata, selected file content, selected filenames, repository endpoint, draft ID, or configured policy version invalidates the authorization.
See docs/approval.md for the complete protocol and its current limitations.
Audit event log
src/audit.ts defines a repository-independent, append-only audit event schema (v1) with a domain-separated SHA-256 hash chain, plus an AuditFileSink NDJSON persistence layer (src/audit-sinks.ts) that validates any existing log and refuses to resume a tampered one. It records operation-level activity — validation, manifest/digest generation, draft and file operations, approval lifecycle, publication — without repository tokens, the approval private key, or arbitrary payloads.
The chain is tamper-evident, not tamper-proof; see docs/audit.md for its guarantees and limits (in particular, detecting tail truncation requires an externally held checkpoint hash). This module is not yet wired into the MCP tool handlers.
Architecture
Agentic client
│ MCP
▼
Research Deposition MCP
├─ deterministic validation / policy
├─ common research-deposit model
├─ deterministic file-manifest layer
├─ canonical publication-package identity
├─ operator public-key receipt verification
└─ repository adapters
├─ Zenodo
├─ InvenioRDM (planned)
└─ Dataverse (planned)
Human/operator side
└─ private Ed25519 key + interactive approval CLIMetadata-source adapters will eventually map structures such as ISA, RO-Crate, CITATION.cff, and Open Research Workspace (ORW) metadata into the common model without coupling those standards to Zenodo.
More detail: docs/architecture.md.
Environment variables
Variable | Default | Description |
| unset | Zenodo/Sandbox bearer token. Required for deposition operations. |
|
| Repository endpoint and part of the approval target. |
|
| Process-level final-publication enablement. |
|
| Per-file local safety ceiling used by this server. |
| unset | Operator public Ed25519 key used to verify receipts. Final publication fails closed when unset. |
|
| Policy identifier included in approval requests/receipts. Changing it invalidates older receipts. |
|
| Server-side maximum accepted receipt age. |
Current integrity boundary
The signed receipt authorizes the declared local publication package and exact repository target. The server recomputes that local package immediately before publication.
Full proof that the current remote Zenodo draft contains exactly the same file set is not yet implemented; that is part of #10. Direct upload_file operations therefore remain a known gap before this should be treated as production-grade remote package attestation.
Development
npm install
npm run build
npm testSource code lives under src/; repository-specific code belongs under src/adapters/. Tests use Node's built-in test runner.
Before adding any new write capability, read AGENTS.md, CONTRIBUTING.md, and docs/safety-model.md.
Contributing
Issues and pull requests are welcome. For substantial features, open an issue first so the data model, safety boundary, and repository semantics can be discussed before implementation. See CONTRIBUTING.md.
For security-sensitive problems, do not open a public issue; follow SECURITY.md.
License
MIT — see LICENSE.
Available Tools
10 toolsbuild_file_manifestA
Build a deterministic repository-independent SHA-256 manifest from explicit include/exclude rules. Never uploads or publishes files.
Inputs: include (required), rootDir (required), exclude, destinations.
build_publication_packageB
Build canonical metadata + file manifest and compute the package SHA-256 identity. Never writes to a repository.
Inputs: include (required), rootDir (required), metadata (required), exclude, +1 more.
create_draftB
Validate metadata and create an unpublished repository draft. Default backend is Zenodo Sandbox.
Inputs: metadata (required).
deposition_statusA
Report deposition backend and safety configuration. Does not expose secrets.
Inputs: no named parameters.
get_draftC
Retrieve an existing unpublished deposition draft.
Inputs: id (required).
publication_reviewA
Rebuild the exact package identity, retrieve the draft, and return the approval request a human operator may sign out-of-band. Does not publish.
Inputs: id (required), include (required), rootDir (required), metadata (required), +2 more.
publish_draftC
Publish only when process-level publication is enabled and a valid short-lived operator-signed receipt matches a freshly recomputed package, repository endpoint, draft, and policy.
Inputs: id (required), include (required), receipt (required), rootDir (required), +3 more.
update_draftB
Validate and replace metadata on an existing unpublished draft.
Inputs: id (required), metadata (required).
upload_fileB
Upload a local file to an existing draft. Never publishes the draft.
Inputs: id (required), filePath (required), remoteName.
validate_depositionA
Deterministically validate repository-independent research deposition metadata. Never publishes anything.
Inputs: metadata (required).
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 10 tools
Each tool has a clearly distinct responsibility in the deposition lifecycle—status, validation, manifest building, package building, draft creation, retrieval, update, file upload, review, and publication. Even the two validation-related tools (validate_deposition and create_draft) are separated by action, and descriptions clarify their boundaries.
Most tools follow a consistent verb_noun pattern (validate_deposition, build_file_manifest, create_draft, upload_file, publish_draft), but a few use noun-first names (deposition_status, publication_review) that break the pattern slightly. This is a minor deviation and does not impede understanding.
With 10 tools covering the complete deposition workflow, the count is well within the ideal 3-15 range. Each tool serves a necessary, non-redundant role in the pipeline, and none feel extraneous.
The tool set covers the full deposition lifecycle: validation, manifest/package building, draft creation/retrieval/update, file upload, review, and publication. There are no obvious gaps for the stated purpose—only minor absent operations like listing or deleting drafts, which are not critical to the core workflow.
Maintenance
Related MCP Connectors
Preflight, approve, and prove consequential agent actions with signed evidence and x402 tools.
Plan and verify evidence-aware research workflows with specialist execution receipts.
Deterministic research automation with live OpenAlex search and reusable workflow programs.
Tamper-evident proof creation and verification for AI agents via MCP, A2A, and REST.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to operate DSpace repositories through a typed interface, including SAF package building, metadata editing, scientometric harvesting, open-access PDF downloads, and repository administration.MIT
- FlicenseNot gradedqualityBmaintenanceEnables deterministic, harness-neutral research workflows by unifying research object identity, evidence receipts, claim-evidence graphs, and append-only decision logs, along with specialized scholarly skills for literature analysis, reproducibility audits, and multi-agent review.206 PyPI1-
- AlicenseNot gradedqualityBmaintenanceEnables searching Zenodo records, resolving DOIs and URLs, tracing version series and funding, listing files, and previewing text file contents (including inside ZIP archives) over MCP.153 npm1Apache 2.0
- AlicenseAqualityCmaintenanceEnables searching HAL and preparing, validating, and submitting publication deposits via SWORD, with dry-run validation and explicit submission control.14MIT