MCP, MCP server
Openrouter Mcp Multimodal
Openrouter Mcp Multimodal, an MCP server listed in the PlugVet directory.
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.
Rescanned at commit 636035f2ab16, unchanged since the check below.
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.
python/mcp_server_openrouter_multimodal/launcher.py, line 51
out = subprocess.check_output([node, "-p", "process.versions.node"], text=True).strip() - NETWORK_NO_FIXED_HOST Low
Makes a network call whose host is not written as a fixed address.
scripts/harvest-metrics.mjs, line 34
const r = await fetch(url, { headers }); - SECRETS_PATH_DOTENV Low
Mentions a .env file.
AGENTS.md, line 15
src/index.ts ← MCP server entry, stdio transport, .env loading - SECRETS_ENV_READ Note
Reads an environment variable whose name contains KEY, SECRET, TOKEN, PASSWORD or CREDENTIAL.
scripts/generate-logo.mjs, line 19
apiKey: process.env.OPENROUTER_API_KEY,
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
python/mcp_server_openrouter_multimodal/launcher.py, line 51
out = subprocess.check_output([node, "-p", "process.versions.node"], text=True).strip()
python/mcp_server_openrouter_multimodal/launcher.py, line 82
rc = subprocess.call(
scripts/mock-e2e-video.mjs, line 85
await fs.rm(sandbox, { recursive: true, force: true });
Show more
src/tool-handlers/path-utils.ts, line 59
await fs.rm(tmp, { force: true }).catch(() => undefined);
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/harvest-metrics.mjs, line 34
const r = await fetch(url, { headers });
scripts/list-video-gen-models.mjs, line 4
const res = await fetch('https://openrouter.ai/api/v1/videos/models', {
src/openrouter-api.ts, line 95
const res = await fetch(url, { ...init, signal: AbortSignal.timeout(timeoutMs) });
Show more
src/tool-handlers/fetch-utils.ts, line 466
const req = http.request(options, (res) => resolve(res));
src/tool-handlers/fetch-utils.ts, line 486
const req = https.request({ ...options, ca }, (res) => resolve(res));
CHANGELOG.md, line 410
- **[#13] `fetchHttpResource` now sends a `User-Agent` and `Accept` header.** Node's default `fetch()` ships no UA, and UA-screening CDNs (notably Wikimedia / Varnish) return HTTP
Secrets
Concern
reads a credential or environment file.
SECRETS_ENV_READ SECRETS_PATH_DOTENV
AGENTS.md, line 15
src/index.ts ← MCP server entry, stdio transport, .env loading
scripts/check-version-sync.mjs, line 22
['.env.example', read('../.env.example')],
scripts/generate-logo.mjs, line 19
apiKey: process.env.OPENROUTER_API_KEY,
Show more
scripts/harvest-metrics.mjs, line 22
const GH_TOKEN = process.env.GH_TOKEN;
scripts/list-video-gen-models.mjs, line 5
headers: { Authorization: `Bearer ${process.env.OPENROUTER_API_KEY}` },
scripts/live-e2e.mjs, line 5
* Reads OPENROUTER_API_KEY from .env (loaded via dotenv), spawns the built
scripts/live-e2e.mjs, line 22
const KEY = process.env.OPENROUTER_API_KEY;
scripts/live-e2e.mjs, line 24
console.error('OPENROUTER_API_KEY not found in environment (.env).');
scripts/smoke-docker-mcp.mjs, line 14
const smokeApiKey = process.env.OPENROUTER_API_KEY || 'sk-or-v1-smoke-placeholder';
scripts/smoke-docker-mcp.mjs, line 81
if (process.env.OPENROUTER_API_KEY) {
scripts/smoke-list-tools.mjs, line 11
env: { ...process.env, OPENROUTER_API_KEY: process.env.OPENROUTER_API_KEY ?? 'sk-or-v1-smoke' },
scripts/smoke-npm-mcp.mjs, line 43
OPENROUTER_API_KEY: process.env.OPENROUTER_API_KEY || 'sk-or-v1-smoke-placeholder',
src/index.ts, line 5
config({ quiet: true }); // Load .env file if present (quiet - stdio transport owns stdout)
src/tool-definitions.ts, line 67
'(global fallback OPENROUTER_INLINE_MAX_BYTES). See .env.example.',
.dockerignore, line 4
.github
.dockerignore, line 5
.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 636035f2ab16. 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: 636035f2ab1621ccb3187919eb530880c2f23d41
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.