rad-mcp@0.1.0
CAUTION· not startedPublisher claims: "Enables AI assistants to run local Radiance lighting and daylighting simulations on user-owned models, including annual daylight, compliance metrics, renders, glare analysis and electric lighting studies, with reproducible exported scripts." Observed in sandbox: no network, touches nothing outside the project, writes no memory.
Coverage
Not started: dependency install failed; the server itself was not observed.- Tested
- the dependency install step · every file read, file written and host contacted by what ran
- Not tested
- server startup · the tool list · tool behavior
What this means for the label: Caution here covers what ran. The server's tools were not exercised with a real credential, so nothing about their behavior is asserted; the credential summary below says what to do with that.
Before you give it your token
- It will ask for
- no credential variables read in the code
- Where it talks to
- no vendor host named in the codeAlso lbl.gov — not the publisher's domain; check what for before connecting.
- What the honeypot saw
- no credential files read · no network
- What we could not test
- server startup · the tool list · tool behavior
Connect it under the guard. Not started: dependency install failed; the server itself was not observed. The code names no credential variable; the guard pins the network to what the honeypot saw and logs every call.
Never paste a credential into a chat, a ticket or a report, including ours. How the guard holds it.
Is [email protected] safe to install?
KillerSkills ran it in the KillerSkills honeypot sandbox (2 scenarios; not started: dependency install failed; the server itself was not observed) on 2026-11-13 and scored it 75/100 (Caution). It is not known to be malicious, but it has behaviour or code a security policy should decide on before install. Notable findings: Access to sensitive file paths; Access to sensitive file paths; Access to sensitive file paths. Summary: no network, touches nothing outside the project, writes no memory.
Behavior trace
Honeypot run · 0 s · 2 scenarios · 0 deviationsStatic findings
from .env import RadianceEnvFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.from .env import RadianceEnv, RadianceNotFound, discoverFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.from .env import RadianceEnvFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.from .env import RadianceEnvFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.from .env import RadianceEnv, raypath_dirs_ofFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.from .env import RadianceEnvFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.return text[1:] if text and text[0] == "" else textFix: Keep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent.and `cancel` whenever they hold the step's process, `_execute`'s post-spawn kill and itsFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.from .env import RadianceEnvFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.**And stdin is declared on every spawn, including the ones that take none.** `subprocess.run(...,Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.the `anyio` worker parked there and the process needed `kill -9`. The `anyio` limiter is 40, soFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.proc = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out."""Jobs whose step's process group was sent a kill (R775), so an end reason can say whetherFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.`"manifest"` writes `manifest.json` (the project record and its registered inputs, or onlyFix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.probe = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.# would fall in its kill window after a normal exit (design P10). "" and not None: NoneFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.# Text in and out, as `subprocess.run(text=True)` did, but decoded *after* the helperFix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.# prefix absorbs the leading segment of a traversal, so `../../etc/passwd` becomesFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.from .env import RadianceEnvFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.makes a group kill possible and also means a hard-killed server leaves a live `rcontrib` holdingFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.on 2026-08-09: hand-editing `manifest.json` so a registered geometry input points at a FIFO --Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.# have passed any of those straight to the first `subprocess.run(..., timeout=...)` spawn --Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.from .env import RadianceEnvFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.from .env import RadianceEnvFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.a `chmod +x`'d `export.sh` keeps its execute bits. Owner and group are not carried: the stageFix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.and `report.md`, an artifact's copy, `manifest.json` and each input's copy. `export` registersFix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.# `dsmx_../../etc/passwd` -- one directory shallower than intended and, on this repo's layout,Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# `manifest.json`, a restored backup) -- computed from project state, not an argumentFix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.# `chmod 000` is unreadable, so this function cannot prove its bytes are the bound ones,Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.`CTRL_BREAK_EVENT` reaches console children only, so the tree kill goes through `taskkill /T /F`Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.#: tight multiple would kill correct work on a slow host, which is the failure `Step.timeout_s`Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.from .env import RadianceEnvFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.from .env import RadianceEnvFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.`kill -9`. The worker pool's limiter is 40, so forty such paths stall every tool the server offers.Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.# to `rad_engine.process_group.run_in_own_session` (R750; `subprocess.run(input=...,Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.# manifest-registered geometry path pointed at one, the process needed `kill -9`.Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.from .env import RadianceEnvFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.A file this function **cannot read at all** -- gone, replaced by a directory, `chmod 000`, aFix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.leader has exited (R757), so a step whose process is held is sent a kill either way. A jobFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell."""`manifest.json` plus a copy of every registered input file it references -- the "ingredients"Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why."""The encoding `subprocess.Popen(text=True)` chooses for its pipes in this process: aFix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.from .env import RadianceEnvFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# R750: inline Radiance children run in their own session, so the client's group kill noFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.`subprocess.run(input=..., capture_output=True)` before it), whose `Popen.communicate` buffersFix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.return subprocess.Popen(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.from .env import RadianceEnvFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.manifest.json listed BOTH inputs; advisories: NoneFix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.`subprocess.run(..., timeout=1e9)` spawn *during* `dry_run=True` and raises an uncaughtFix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.`subprocess.run(..., timeout=...)` spawn, but as different exception types (the boundary tableFix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.by driving `subprocess.run([sys.executable, "-c", "import time; time.sleep(0.2)"], timeout=t,Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.`subprocess.run(..., timeout=t)` with **no** piped stream does *not* reproduce this on thisFix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.Cost to the agent
Tokens estimated at four characters each. The tool list is re-read by the agent on every turn, so it is the number to compare between servers that do the same job: ranked across the index.
Known vulnerabilities
Vulnerability advisories (OSV) cover npm and PyPI packages; this registry has no advisory database.
What would make this Verified
5 points to 80 · weights: behavior 45%, static 25%, prompt 15%, publisher 15%- Unclaimed publisher≈ +8 on the totalClaim akontadakis: a verified publisher gets +50 on publisher trust. It is free and usually instant with GitHub sign-in.
- Access to sensitive file paths≈ +4 on the totalStop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.
- Hidden zero-width characters detected≈ +4 on the totalKeep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent.
- Process kill command≈ +2 on the totalBuild commands from fixed arguments; do not interpolate untrusted strings into a shell.
- Python subprocess execution detected≈ +2 on the totalBuild commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.
- File type combined with upload action≈ +2 on the totalRemove the call, or declare the host in frontmatter and explain in the README what is sent and why.