MCP, MCP server
Nplg Dspace Mcp
Upstream-read-only Streamable HTTP MCP server for the National Parliamentary Library of Georgia's Iverieli repository (dspace.nplg.gov.ge).
Compatibility: Not stated.
Grade B
Minor issues only, no Medium or High. Worth a quick look at the findings below before installing.
Not a guarantee. A hygiene check of the source at the commit shown, not a security audit.
PERMISSION_DELETE_FILES NETWORK_NO_FIXED_HOST SECRETS_PATH_DOTENV OBFUSCATION_ENCODED_BLOB
Why this grade
- PERMISSION_DELETE_FILES Low
Contains a call that can delete files.
scripts/baseline_capture_io.py, line 1224
process: subprocess.Popen[bytes], - NETWORK_NO_FIXED_HOST Low
Makes a network call whose host is not written as a fixed address.
scripts/run_mcp_conformance.py, line 219
with socket.create_connection((host, port), timeout=0.1): - SECRETS_PATH_DOTENV Low
Mentions a .env file.
scripts/run_test_gate.py, line 375
".env.example", - OBFUSCATION_ENCODED_BLOB Low
Contains a long base64 shaped string in a file that should be readable.
docs/2026-08-14-official-mcp-sdk-alpic-tdd-implementation-plan.md, line 1
# NPLG DSpace MCP Official Python SDK and Alpic Audit-ready Staging/Release-decision Implementation Plan
Any High, or two or more Medium findings, give D. One Medium gives C. Low findings or a security Note give B. Each code names a finding behind the letter.
Grades are a hygiene check of the source at the commit shown, on the date checked, not a security audit or a guarantee. The free directory grades are automated. Before release, a PlugVet engineer reviews every paid report and any grade we hold back, including all F grades, against the source code and the evidence we quote.
What was checked
Plain notes from the hygiene checks.
Permissions
Concern
can delete files.
PERMISSION_DELETE_FILES
scripts/baseline_capture_io.py, line 1224
process: subprocess.Popen[bytes],
scripts/baseline_capture_io.py, line 1243
process: subprocess.Popen[bytes],
scripts/baseline_capture_io.py, line 1262
process: subprocess.Popen[bytes],
Show more
scripts/baseline_capture_io.py, line 1349
process: subprocess.Popen[bytes] = subprocess.Popen( # noqa: S603
scripts/bootstrap_toolchain.py, line 985
completed = subprocess.run( # noqa: S603
scripts/bootstrap_toolchain.py, line 1135
completed = subprocess.run( # noqa: S603
scripts/bootstrap_toolchain.py, line 1334
shutil.rmtree(stage, ignore_errors=True)
scripts/build_asvs_matrix.py, line 3388
def _terminate_git_process(process: subprocess.Popen[bytes]) -> int:
scripts/build_asvs_matrix.py, line 3472
) -> tuple[subprocess.Popen[bytes], int, int]:
scripts/run_mutation_gate.py, line 2067
shutil.rmtree(output, ignore_errors=True)
scripts/run_test_gate.py, line 3069
shutil.rmtree(output, ignore_errors=True)
scripts/run_test_gate.py, line 3078
shutil.rmtree(output, ignore_errors=True)
scripts/run_test_gate.py, line 4486
shutil.rmtree(output, ignore_errors=True)
src/nplg_mcp/pdf_worker_client.py, line 363
shutil.rmtree(job_path)
src/nplg_mcp/pdf_worker_client.py, line 369
shutil.rmtree(job_path)
src/nplg_mcp/storage.py, line 741
shutil.rmtree(path)
Install and update
Pass
No install-time script found, and dependencies are pinned or absent.
Network
Concern
can reach a host that is not written as a fixed address.
NETWORK_NO_FIXED_HOST
scripts/run_mcp_conformance.py, line 219
with socket.create_connection((host, port), timeout=0.1):
Dockerfile, line 29
CMD ["python", "-c", "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8000/healthz', timeout=3).read()"]
Secrets
Concern
reads a credential or environment file.
SECRETS_PATH_DOTENV
scripts/run_test_gate.py, line 375
".env.example",
.dockerignore, line 14
**/*.egg-info/
.dockerignore, line 15
.env
Show more
.gitignore, line 3
coverage/
.gitignore, line 4
.env
.gitignore, line 6
!.env.example
README.md, line 187
docker compose --env-file .env config --quiet
compose.yaml, line 9
- .env
Agent instructions
Pass
No instruction to ignore earlier instructions or to hide a step.
Obfuscation
Concern
contains an encoded blob in a file that should be readable.
OBFUSCATION_ENCODED_BLOB
docs/2026-08-14-official-mcp-sdk-alpic-tdd-implementation-plan.md, line 1
# NPLG DSpace MCP Official Python SDK and Alpic Audit-ready Staging/Release-decision Implementation Plan
docs/security/asvs-5.0.0-l2-matrix.jsonl, line 1
{"applicability":"applicable","applicability_rationale":"The requirement remains conservatively applicable until a profile-specific review proves otherwise.","asvs_version":"5.0.0"
tests/contracts/test_frozen_baseline.py, line 1
# Copyright (c) 2026 David Osipov
Show more
tests/unit/test_test_gate.py, line 1
# Copyright (c) 2026 David Osipov
contracts/baseline/error-cases.json, line 1
{"error.app-canary.legacy":{"expected":{"payload":{"id":"error.app-canary.legacy","jsonrpc":"2.0","result":{"content":[{"text":"{\"code\": \"UPSTREAM_FAILURE\", \"message\": \"The
contracts/baseline/resources.json, line 1
{"resource.list.legacy":{"expected":{"payload":{"id":"resource.list.legacy","jsonrpc":"2.0","result":{"resources":[{"description":"Read-only server scope, visual-analysis rules, an
contracts/baseline/result-cases.json, line 1
{"protocol.initialize.legacy.success":{"expected":{"payload":{"id":"protocol.initialize.legacy.success","jsonrpc":"2.0","result":{"capabilities":{"resources":{},"tools":{}},"instru
contracts/sdk-authorization-capability.json, line 1
{"asgi_case_digest":"dbb4e2b1d45e3b854502cba32de3e29e748176e09b87b9d287321cacfc88b9cc","asgi_observation_digest":"38cd6a0aa618c4f62e938c2829005890637e9808f1f7f6906ec7aca8e6e06f69",
Licence
Pass
A licence file is present (LICENSE).
Maintainer activity
Pass
The latest commit is within the last 365 days.
Note
Hygiene check of commit c92e0666b31d. can delete files. can reach a host that is not written as a fixed address. reads a credential or environment file. contains an encoded blob in a file that should be readable.
Date and source
Date checked:
github.com
Commit graded: c92e0666b31db3f369b730c1b26dea648337b687
This link goes to the original host. PlugVet does not host or check what you download from there, and installing it is your own decision and risk.