Claude Code, Plugin
InvestorClaw
Portfolio analysis & market intelligence for Claude Code & OpenClaw.
Compatibility: Not stated.
Grade C
One Medium finding. Read the findings before installing.
Not a guarantee. A hygiene check of the source at the commit shown, not a security audit.
Rescanned at commit ee3f269c62bb, unchanged since the check below.
INSTALL_REMOTE_SCRIPT
Why this grade
- INSTALL_REMOTE_SCRIPT Medium
Fetches a script from the network and runs it (a pipe to a shell, or an install hook with a URL).
CHANGELOG.md, line 237
`curl https://astral.sh/uv/install.sh | sh` installer to clear the
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
Concern
can delete files.
PERMISSION_DELETE_FILES
harness/eod_pdf_gen.py, line 109
r = subprocess.run(["docker","exec","ic-engine","cat",path], capture_output=True, text=True, timeout=5)
harness/eod_pdf_gen.py, line 199
r = subprocess.run(["docker","exec","ic-engine","find","/data/portfolios","-name","*.csv"],
harness/eod_pdf_gen.py, line 203
r2 = subprocess.run(["docker","exec","ic-engine","cat",csv_path.strip()],
Show more
harness/eod_pdf_gen.py, line 337
r = subprocess.run(
harness/eod_pdf_gen.py, line 1362
subprocess.run(
harness/cobol/cobol_barrage_cross_runtime.py, line 209
subprocess.run(
harness/cobol/cobol_barrage_cross_runtime.py, line 293
res = subprocess.run(cmd, capture_output=True, text=True, timeout=320)
harness/cobol/provider_battery.py, line 250
p = subprocess.run(cmd, capture_output=True, text=True, timeout=timeout)
skill/bridge/investorclaw_bridge/mcp/_runtime.py, line 76
shutil.rmtree(YF_CACHE_DIR, ignore_errors=True)
Install and update
Serious
install fetches a script from the network. The docs document an installer that pipes a download into a shell.
INSTALL_REMOTE_SCRIPT INSTALL_DOCUMENTED_INSTALLER
CHANGELOG.md, line 237
`curl https://astral.sh/uv/install.sh | sh` installer to clear the
docs/PHILOSOPHY.md, line 76
curl -sSL https://gitlab.com/argonautsystems/InvestorClaw/-/raw/main/openclaw/install.sh | bash
Network
Concern
can reach a host that is not written as a fixed address.
NETWORK_NO_FIXED_HOST
harness/eod_pdf_gen.py, line 117
with urllib.request.urlopen(url, timeout=timeout) as r:
skill/SKILL.md, line 110
curl -sS http://127.0.0.1:18090/api/portfolio/initialize/status
skill/SKILL.md, line 114
curl -N http://127.0.0.1:18090/api/portfolio/initialize/stream
Show more
skill/SKILL.md, line 117
curl -sS http://127.0.0.1:18090/healthz
skill/SKILL.md, line 230
until curl -sf http://localhost:18090/healthz > /dev/null 2>&1; do sleep 1; done
skill/SKILL.md, line 258
curl -sS http://127.0.0.1:18090/api/portfolio/initialize/status | jq
skill/SKILL.md, line 260
curl -N http://127.0.0.1:18090/api/portfolio/initialize/stream
skill/SKILL.md, line 283
curl -sS -X POST http://127.0.0.1:18090/api/portfolio/keys_set \
skill/SKILL.md, line 387
curl -sS -X POST http://127.0.0.1:18090/api/portfolio/ask \
skill/SKILL.md, line 497
# Then ask the agent or curl the setup endpoint
skill/bridge/investorclaw_bridge/mcp/transport.py, line 169
refresh,setup,tools}; agents that have shell+curl can hit these
skill/bridge/investorclaw_bridge/mcp/transport.py, line 200
"""Live init state. GET for browser/curl convenience; POST for tool-name parity."""
skill/bridge/investorclaw_bridge/mcp/transport.py, line 289
"""Self-describing tool catalog - agents can curl this to discover endpoints."""
CAPABILITIES.md, line 396
# Uses cached prices from last fetch (faster, cheaper on API quota)
CAPABILITIES.md, line 575
2. Price fetch (data layer)
docs/PROVIDERS.md, line 112
| Access: WebSocket (live) | ✓ | ✗ **planned** |
Secrets
Concern
reads a credential or environment file.
SECRETS_ENV_READ SECRETS_PATH_DOTENV
harness/eod_pdf_gen.py, line 11
MKEY = os.environ.get("MASSIVE_API_KEY") or ""
harness/cobol/cobol_barrage_cross_runtime.py, line 345
ap.add_argument("--xai-key", default=os.environ.get("XAI_API_KEY"))
skill/bridge/investorclaw_bridge/mnemos_client.py, line 60
auth_token=os.environ.get("MNEMOS_AUTH_TOKEN"),
Show more
skill/bridge/investorclaw_bridge/serve.py, line 99
keys_path = Path(os.environ.get("IC_KEYS_FILE", "/data/keys.env"))
skill/bridge/investorclaw_bridge/setup_api.py, line 41
KEYS_FILE = Path(os.environ.get("IC_KEYS_FILE", "/data/keys.env"))
skill/bridge/investorclaw_bridge/mcp/_runtime.py, line 35
KEYS_FILE = Path(os.environ.get("IC_KEYS_FILE", "/data/keys.env"))
skill/bridge/investorclaw_bridge/mcp/tools/keys.py, line 68
keys_file = Path(os.environ.get("IC_KEYS_FILE", "/data/keys.env"))
skill/bridge/investorclaw_bridge/mcp/tools/keys.py, line 112
"keys_file": os.environ.get("IC_KEYS_FILE", "/data/keys.env"),
.env.example, line 2
# Copy this file to .env and set the values you need. Every field is optional.
.gitignore, line 15
# Environment and local config
.gitignore, line 16
.env
.gitignore, line 17
.env.local
.gitignore, line 18
.env.*.local
.gitignore, line 19
.env.backup*
.gitignore, line 21
!.env.example
.gitignore, line 22
!skill/.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 ee3f269c62bb. can delete files. install fetches a script from the network. The docs document an installer that pipes a download into a shell. 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: ee3f269c62bb368dbb0aba82de73e9bb35503613
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.