MCP, MCP server
Agentic Experiments
Agentic Experiments, an MCP server listed in the PlugVet directory.
Compatibility: Not stated.
Grade D
Two or more Medium findings, or a High. Only try it in a sandbox.
Not a guarantee. A hygiene check of the source at the commit shown, not a security audit.
Pattern found, check before installing
The checks matched a pattern that needs a closer look. It does not mean the code is harmful. Read the quoted lines below.
- NETWORK_HOST_FROM_INPUT High
host from input plus a credential path in operative code
NETWORK_HOST_FROM_INPUT SECRETS_PATH_CREDENTIAL
Why this grade
- NETWORK_HOST_FROM_INPUT High
A file takes a URL or endpoint as input and has no fixed host list.
src/aexp/jupyter.py, line 410
with urllib.request.urlopen(req, timeout=timeout) as resp: # noqa: S310 - explicit http(s) only - SECRETS_PATH_CREDENTIAL Medium
Mentions a credential store path (~/.ssh, id_rsa, .npmrc, .aws/credentials, credentials.json, .netrc).
src/aexp/airgapped/__init__.py, line 28
See ``docs/airgapped.md`` for the SSH setup recipe (``~/.ssh/config``
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.
If you think this grade is wrong, email [email protected] with the entry link and your evidence. We aim to acknowledge within two working days and decide within seven. If we confirm an error, we aim to correct it within 24 hours of confirming it. These are aims, not guarantees.
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
Note
requests shell access. The manifest names this permission.
PERMISSION_SHELL_DECLARED
src/aexp/cli.py, line 1061
result = subprocess.run(cmd, capture_output=True, text=True)
src/aexp/cli.py, line 1801
the job's resolved sp, and runs it via ``subprocess.run(shell=True)``
src/aexp/jupyter.py, line 180
result = subprocess.run(
Show more
src/aexp/queue.py, line 966
) -> tuple[subprocess.Popen[str], int | None]:
src/aexp/queue.py, line 993
proc = subprocess.Popen(command, **popen_kwargs)
src/aexp/queue.py, line 1000
proc = subprocess.Popen(command, **popen_kwargs)
src/aexp/queue.py, line 1020
``subprocess.Popen(..., shell=True)`` inside :func:`run_lifecycle`
src/aexp/queue.py, line 1305
``subprocess.Popen(shell=True)`` spawns.
Install and update
Note
The docs document an installer that pipes a download into a shell.
INSTALL_DOCUMENTED_INSTALLER
docs/mcp.md, line 29
curl -LsSf https://astral.sh/uv/install.sh | sh
Network
Serious
accepts a host from input, with no fixed list in this file.
NETWORK_HOST_FROM_INPUT
src/aexp/jupyter.py, line 410
with urllib.request.urlopen(req, timeout=timeout) as resp: # noqa: S310 - explicit http(s) only
src/aexp/airgapped/client.py, line 115
def fetch(self, *, timeout: float | None = None) -> RelayResult:
CHANGELOG.md, line 782
`pull()`, `fetch()`, `status()`, `rebase()`, `push(branch="HEAD",
Show more
docs/airgapped.md, line 151
relay.fetch() # git fetch --all --prune
src/aexp/scaffold/docs/setup/jupyter-mcp.md, line 562
| `ws://127.0.0.1:<port>/api/kernels/<id>/channels` | Kernel WebSocket (used by MCP_SERVER mode kernel-client) |
Secrets
Concern
reads a credential or environment file.
SECRETS_PATH_CREDENTIAL
src/aexp/airgapped/__init__.py, line 28
See ``docs/airgapped.md`` for the SSH setup recipe (``~/.ssh/config``
src/aexp/airgapped/_relay.py, line 32
See ``docs/airgapped.md`` for setup (the ``~/.ssh/config`` host alias,
src/aexp/airgapped/_relay.py, line 253
"It should name an ~/.ssh/config Host alias (auth/keys/MFA live "
Show more
src/aexp/airgapped/_relay.py, line 427
SSH host (ideally an ``~/.ssh/config`` alias). Falls back to
src/aexp/airgapped/_relay.py, line 514
"Check: the host alias in ~/.ssh/config, known_hosts seeded "
src/aexp/airgapped/_relay.py, line 726
SSH host to use -- ideally a ``~/.ssh/config`` Host alias so
src/aexp/airgapped/_relay.py, line 784
f"mcpServers.{server_name}.env is not an object in {mcp_config_path}."
src/aexp/airgapped/_relay.py, line 819
help="SSH host alias to use (ideally an entry in ~/.ssh/config).",
Agent instructions
Pass
No instruction to ignore earlier instructions or to hide a step.
Obfuscation
Note
a file was over the read cap and was not fully read.
OBFUSCATION_FILE_OVER_READ_CAP
poetry.lock, line 1
# This file is automatically @generated by Poetry 2.3.2 and should not be changed by hand.
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 11fd23103a04. requests shell access. The manifest names this permission. The docs document an installer that pipes a download into a shell. accepts a host from input, with no fixed list in this file. reads a credential or environment file. a file was over the read cap and was not fully read.
Date and source
Date checked:
github.com
Commit graded: 11fd23103a04ab6c32a5d8727d502b2a04c20261
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.