Grades are a hygiene check, not a security guarantee.

MCP, MCP server

io.github.NovadaLabs/novada-mcp

One MCP server for the entire live web. Search, extract, scrape, crawl, proxy, browser automation, and AI-powered research — behind a single hosted connection, or one local install if you'd rather run it yourself.

Compatibility: Not stated.

Grade B

Minor issues only, no Medium or High. Worth a quick look at the findings below before installing.

Graded by PlugVetRubric v2

Not a guarantee. A hygiene check of the source at the commit shown, not a security audit.

Rescanned at commit 45ad028d18e8.

PERMISSION_DELETE_FILES NETWORK_NO_FIXED_HOST NETWORK_UNNAMED_HOST SECRETS_PATH_DOTENV SECRETS_ENV_READ OBFUSCATION_FILE_OVER_READ_CAP OBFUSCATION_FILE_CAP_REACHED

Why this grade

  • PERMISSION_DELETE_FILES Low

    Contains a call that can delete files.

    hosted-server/scripts/contract/contract-test.py, line 1055 self.proc = subprocess.Popen(

  • NETWORK_NO_FIXED_HOST Low

    Makes a network call whose host is not written as a fixed address.

    distribution/check.mjs, line 1539 const res = await fetch(url, { signal: controller.signal });

  • NETWORK_UNNAMED_HOST Low

    Calls a fixed host that the description does not name.

    distribution/check.mjs, line 1539 const res = await fetch(url, { signal: controller.signal });

  • SECRETS_PATH_DOTENV Low

    Mentions a .env file.

    npm-package/prompts/lazy-start/setup-agent.md, line 97 **Option C — Environment file (.env in current directory):**

  • SECRETS_ENV_READ Note

    Reads an environment variable whose name contains KEY, SECRET, TOKEN, PASSWORD or CREDENTIAL.

    hosted-server/scripts/telemetry-delivery-canary.mjs, line 124 const key = process.env.TELEMETRY_SUPABASE_SERVICE_KEY;

  • OBFUSCATION_FILE_OVER_READ_CAP Note

    A file was over the read cap and was not fully read.

    hosted-server/vercel/package-lock.json, line 1 {

  • OBFUSCATION_FILE_CAP_REACHED Note

    The 400 file cap was reached before every file was read.

    hosted-server/vercel/package-lock.json, line 1 {

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

    hosted-server/scripts/contract/contract-test.py, line 1055

    self.proc = subprocess.Popen(

    hosted-server/scripts/golden/test_diff_golden.py, line 42

    return subprocess.run(

    monitoring/report/append-daily-sheet.selftest.py, line 122

    result = subprocess.run(

    Show more

    monitoring/report/append-daily-sheet.selftest.py, line 183

    shutil.rmtree(tmp_dir, ignore_errors=True)

  • 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. can reach api.anthropic.com. The description does not name that host.

    NETWORK_NO_FIXED_HOST NETWORK_UNNAMED_HOST

    distribution/check.mjs, line 1539

    const res = await fetch(url, { signal: controller.signal });

    distribution/dify/utils/mcp_client.py, line 78

    resp = requests.post(

    hosted-server/scripts/deploy-hosted.sh, line 9

    # 5. VERIFY — curl live serverInfo.version, capture golden snapshot, TWO-TIER diff vs baseline:

    Show more

    hosted-server/scripts/deploy-hosted.sh, line 212

    INIT_RESP=$(curl -sf \

    hosted-server/scripts/contract/contract-test.py, line 310

    raw = urllib.request.urlopen(req, timeout=timeout).read().decode()

    hosted-server/scripts/contract/contract-test.py, line 339

    return urllib.request.urlopen(req, timeout=timeout).read().decode()

    hosted-server/scripts/contract/contract-test.py, line 369

    return urllib.request.urlopen(req, timeout=timeout).read().decode()

    hosted-server/scripts/contract/contract-test.py, line 516

    return urllib.request.urlopen(req, timeout=20).read().decode()

  • Secrets

    Concern

    reads a credential or environment file.

    SECRETS_ENV_READ SECRETS_PATH_DOTENV

    hosted-server/scripts/telemetry-delivery-canary.mjs, line 124

    const key = process.env.TELEMETRY_SUPABASE_SERVICE_KEY;

    hosted-server/scripts/telemetry-health.mjs, line 192

    const key = process.env.TELEMETRY_SUPABASE_SERVICE_KEY;

    npm-package/prompts/lazy-start/setup-agent.md, line 97

    **Option C — Environment file (.env in current directory):**

    Show more

    hosted-server/scripts/contract/contract-test.py, line 173

    KEY = os.environ.get("NOVADA_MCP_KEY") or os.environ.get("NOVADA_API_KEY")

    hosted-server/scripts/golden/capture-golden.py, line 13

    KEY = os.environ.get("NOVADA_API_KEY") or os.environ.get("NOVADA_MCP_KEY")

    hosted-server/vercel/api/_telemetry.ts, line 279

    return !!(process.env.TELEMETRY_SUPABASE_URL && process.env.TELEMETRY_SUPABASE_KEY);

    hosted-server/vercel/api/_telemetry.ts, line 444

    const rawKeyB64 = process.env.NOVADA_LOG_IDENTITY_AES_KEY;

    hosted-server/vercel/api/_telemetry.ts, line 630

    const key = process.env.TELEMETRY_SUPABASE_KEY!;

    hosted-server/vercel/api/mcp.ts, line 337

    OAUTH_ENC_KEY: process.env.OAUTH_ENC_KEY,

    npm-package/prompts/lazy-start/setup-agent.md, line 98

    If neither config exists, create a .env file:

    npm-package/prompts/lazy-start/setup-agent.md, line 144

    and .env in the current working directory.

    npm-package/prompts/lazy-start/setup-agent.md, line 194

    C. 两者都没有 → 创建 .env 文件,并输出 claude mcp add 命令

    .gitignore, line 51

    .env

  • 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. the file cap was reached before every file was read.

    OBFUSCATION_FILE_OVER_READ_CAP OBFUSCATION_FILE_CAP_REACHED

    hosted-server/vercel/package-lock.json, line 1

    {

    npm-package/src/tools/proxy_datacenter.ts, line 1

    import { z } from "zod";

  • Licence

    Note

    no licence file found.

    LICENCE_MISSING

  • Maintainer activity

    Pass

    The latest commit is within the last 365 days.

Note

Hygiene check of commit 45ad028d18e8. can delete files. can reach a host that is not written as a fixed address. can reach api.anthropic.com. The description does not name that host. reads a credential or environment file. a file was over the read cap and was not fully read. the file cap was reached before every file was read. no licence file found.

Date and source

Date checked:

View source

github.com

Commit graded: 45ad028d18e84a86b9701735475eb0935fc426e3

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.

Read how this letter is chosen