MCP, MCP server
scio.md
Search Scio for facts, explanations and sources.
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 SECRETS_ENV_READ
Why this grade
- PERMISSION_DELETE_FILES Low
Contains a call that can delete files.
scripts/gen-manifest.py, line 50
inside = subprocess.run(["git", "-C", root, "rev-parse", "--is-inside-work-tree"], capture_output=True, text=True, timeout=30) - NETWORK_NO_FIXED_HOST Low
Makes a network call whose host is not written as a fixed address.
scripts/gen-stats-line.py, line 71
with urllib.request.urlopen(request, timeout=15) as r: - SECRETS_PATH_DOTENV Low
Mentions a .env file.
skills/scio/scripts/setup.py, line 236
"""Set SCIO_API_KEY in a harness's .env and keep every other line - the model provider's key, other secrets. The whole - SECRETS_ENV_READ Note
Reads an environment variable whose name contains KEY, SECRET, TOKEN, PASSWORD or CREDENTIAL.
skills/scio/scripts/scio_common.py, line 22
v = os.environ.get("SCIO_API_KEY", "").strip()
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/gen-manifest.py, line 50
inside = subprocess.run(["git", "-C", root, "rev-parse", "--is-inside-work-tree"], capture_output=True, text=True, timeout=30)
scripts/gen-manifest.py, line 53
listed = subprocess.run(["git", "-C", root, "ls-files", "-z", "--cached", "--others", "--exclude-standard", "--", "."],
skills/scio/scripts/agy-hook.py, line 45
r = subprocess.run([sys.executable, os.path.join(HERE, script)], input=claude_payload, capture_output=True,
Show more
skills/scio/scripts/build-proposal.py, line 134
sys.exit(subprocess.call([sys.executable, checker, out] + (["--domain", a.domain] if a.domain else [])))
skills/scio/scripts/cursor-hook.py, line 81
r = subprocess.run([sys.executable, os.path.join(HERE, script)], input=claude_payload, capture_output=True,
skills/scio/scripts/refresh-rules.py, line 87
r = subprocess.run([sys.executable, os.path.join(HERE, "verify-rules.py"), src, "--out", out], capture_output=True, text=True,
skills/scio/scripts/register-models.py, line 46
subprocess.run(["qrencode", "-t", "ANSIUTF8", "-m", "1", url], check=False)
skills/scio/scripts/scio_common.py, line 96
tracked = subprocess.run(["git", "-C", _START_DIR, "ls-files", "-z", "--", "scio/key"],
skills/scio/scripts/scio_common.py, line 321
os.remove(path)
skills/scio/scripts/scio_common.py, line 470
os.remove(probe)
skills/scio/scripts/setup.py, line 230
os.remove(tmp)
skills/scio/scripts/setup.py, line 249
os.remove(tmp)
skills/scio/scripts/trust.py, line 45
os.remove(p)
skills/scio/scripts/whoami.py, line 185
os.remove(tmp)
skills/scio/scripts/workdir.py, line 111
shutil.rmtree(directory)
skills/scio/server/scio_bridge.py, line 461
os.remove(verified) # what is there after this call is this call's verdict, never an earlier one
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/gen-stats-line.py, line 71
with urllib.request.urlopen(request, timeout=15) as r:
scripts/sync-contract.py, line 39
with urllib.request.urlopen(request, timeout=30) as r:
skills/scio/scripts/fetch.py, line 60
sock = socket.create_connection((self._ip, self.port), self.timeout, self.source_address)
Show more
skills/scio/scripts/fetch.py, line 70
self.sock = socket.create_connection((self._ip, self.port), self.timeout, self.source_address)
skills/scio/scripts/fetch.py, line 89
# the pinned path never takes the environment's proxy: that decision was made once, in fetch(), and urllib's own
skills/scio/scripts/fetch.py, line 107
def fetch(url, cap=RAW_DOWNLOAD_CAP):
skills/scio/scripts/fetch.py, line 443
result, err, final = fetch(url)
skills/scio/scripts/guard-secrets.py, line 728
# a command that reads the key by name - `curl -d "$SCIO_API_KEY"`, `printenv SCIO_API_KEY`, `declare -p SCIO_API_KEY`,
Secrets
Concern
reads a credential or environment file.
SECRETS_ENV_READ SECRETS_PATH_DOTENV
skills/scio/scripts/guard-secrets.py, line 621
ENV_CODE_DUMP = re.compile(r"\bos\.environb?\b(?!\s*(?:\[|\.get\b|\.setdefault\b|\.pop\b|\.update\b))|\bprocess\.env\b(?!\s*[.\[])")
skills/scio/scripts/scio_common.py, line 22
v = os.environ.get("SCIO_API_KEY", "").strip()
skills/scio/scripts/setup.py, line 236
"""Set SCIO_API_KEY in a harness's .env and keep every other line - the model provider's key, other secrets. The whole
Show more
skills/scio/scripts/scio_common.py, line 27
value = os.environ.get("SCIO_KEYS_FILE", "").strip()
skills/scio/scripts/setup.py, line 238
when anything failed before the write (an unknown alias did). A symlinked .env is written through to its target."""
skills/scio/scripts/setup.py, line 242
fd, tmp = tempfile.mkstemp(prefix=".env.", suffix=".tmp", dir=os.path.dirname(envp)) # created 600
skills/scio/scripts/setup.py, line 463
# Hermes Agent: ~/.hermes/config.yaml → mcp_servers; ${VAR} resolves from ~/.hermes/.env or the process env;
skills/scio/scripts/setup.py, line 468
confirm([cpath] + ([os.path.join(home, ".env")] if a.alias else []))
skills/scio/scripts/setup.py, line 494
envp = os.path.join(home, ".env")
skills/scio/scripts/setup.py, line 502
print("launch: hermes (the key comes from ~/.hermes/.env when --alias was given, else from the keys file)")
skills/scio/scripts/setup.py, line 598
if os.environ.get("SCIO_KEYS_FILE"): # a GUI app does not see the terminal's environment: pin the custom location
skills/scio/server/scio_bridge.py, line 856
if os.environ.get("SCIO_API_KEY") and resolve_key(prefer=alias)[2] == "env":
Agent instructions
Pass
No instruction to ignore earlier instructions or to hide a step.
Obfuscation
Pass
No encoded or minified payload found.
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 4d2d91361b77. can delete files. can reach a host that is not written as a fixed address. reads a credential or environment file.
Date and source
Date checked:
github.com
Commit graded: 4d2d91361b77d168483965eec92a53bb515f1023
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.