Grades are a hygiene check, not a security guarantee.

MCP, MCP server

Pipe (SPR) MCP Server

The first language with built-in MCP — server and client.

Compatibility: Not stated.

Grade C

One Medium finding. Read the findings 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 cd921a8203c4, 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).

    install.sh, line 8 # curl -fsSL https://pipe-lang.com/install.sh | bash

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

    Note

    requests shell access. The manifest names this permission.

    PERMISSION_SHELL_DECLARED

    benchmarks/performance/tools/measure_perf.py, line 38

    subprocess.run(cmd, cwd=str(cwd), capture_output=True, text=True, timeout=timeout, check=True)

    benchmarks/performance/tools/measure_perf.py, line 49

    bench_out = subprocess.run([str(PIPE_BIN), "-bench"], capture_output=True, text=True).stdout

    benchmarks/python-vs-pipe/tools/measure.py, line 48

    proc = subprocess.run(

    Show more

    benchmarks/python-vs-pipe/tools/measure.py, line 68

    proc = subprocess.Popen(

    cmd/pipe/main.go, line 322

    cmd := exec.Command(upxPath, "-q", tmpPath)

    cmd/pipe-lsp/e2e_test.go, line 18

    cmd := exec.Command("go", "run", ".")

    cmd/pipe-lsp/e2e_test.go, line 97

    cmd := exec.Command("go", "run", ".", "--stdio")

    pkg/docexamples/docexamples_test.go, line 122

    cmd := exec.Command("go", "build", "-o", bin, "./cmd/pipe")

  • 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

    README.md, line 34

    curl -fsSL https://pipe-lang.com/install.sh | bash # Linux & macOS

    install.sh, line 8

    # curl -fsSL https://pipe-lang.com/install.sh | bash

    docs/de/01-erste-schritte.md, line 35

    curl -fsSL https://pipe-lang.com/install.sh | bash

    Show more

    docs/de/19-ki-builtins.md, line 813

    curl -fsSL https://ollama.com/install.sh | sh

    docs/en/01-getting-started.md, line 35

    curl -fsSL https://pipe-lang.com/install.sh | bash

    docs/en/19-ai-builtins.md, line 790

    curl -fsSL https://ollama.com/install.sh | sh

    website/blog/pipe-v1.3.md, line 393

    curl -fsSL https://pipe-lang.com/install.sh | bash

    website/blog/pipe-v1.3.md, line 405

    curl -fsSL https://pipe-lang.com/install.sh | bash

    website/blog/pipe-v1.md, line 167

    curl -fsSL https://pipe-lang.com/install.sh | bash

    website/blog/pipe-v1.md, line 173

    curl -fsSL https://pipe-lang.com/install.sh | bash

    website/blog/repo-rag-mcp.md, line 15

    curl -fsSL https://raw.githubusercontent.com/MachuraHarry/pipe/master/install.sh | sh

    website/blog/repo-rag-mcp.md, line 126

    curl -fsSL https://raw.githubusercontent.com/MachuraHarry/pipe/master/install.sh | sh

    website/index.html, line 74

    <pre class="inline" style="max-width:560px;margin:14px auto 0">curl -fsSL https://pipe-lang.com/install.sh | bash</pre>

    website/index.html, line 515

    <pre class="inline">curl -fsSL https://pipe-lang.com/install.sh | bash</pre>

    website/install.html, line 165

    curl -fsSL https://pipe-lang.com/install.sh | bash

    website/install.sh, line 8

    # curl -fsSL https://pipe-lang.com/install.sh | bash

  • Network

    Concern

    can reach a host that is not written as a fixed address.

    NETWORK_NO_FIXED_HOST

    install.sh, line 151

    curl -fsSL -o "$tmp/$artifact" "$url"

    install.sh, line 154

    if curl -fsSL -o "$tmp/$artifact.sha256" "$url.sha256" 2>/dev/null; then

    benchmarks/python-vs-pipe/python/summarize_api.py, line 3

    # Test: curl -X POST http://localhost:8787/summarize -d '{"text":"..."}'

    Show more

    benchmarks/python-vs-pipe/tools/measure.py, line 83

    with urllib.request.urlopen(req, timeout=10) as resp:

    examples/redteam10_audit.sh, line 49

    if curl -sf "http://127.0.0.1:$PORT/healthz" >/dev/null 2>&1; then

    examples/redteam10_audit.sh, line 54

    if ! curl -sf "http://127.0.0.1:$PORT/healthz" >/dev/null 2>&1; then

    examples/api-client/run.sh, line 8

    curl -s "$API/health" | jq .

    examples/api-client/run.sh, line 12

    curl -s -X POST "$API/run" \

    examples/api-client/run.sh, line 18

    curl -s -X POST "$API/run" \

    benchmarks/sqlite_bench.lua, line 44

    while cur:fetch() do n = n + 1 end

    benchmarks/sqlite_bench.lua, line 54

    while cur:fetch() do n = n + 1 end

  • Secrets

    Concern

    reads a credential or environment file.

    SECRETS_ENV_READ SECRETS_PATH_DOTENV

    cmd/pipe/main.go, line 1578

    // binary (.env, a database file, output directories, ...). A chdir

    pkg/ai/ai_test.go, line 221

    oldVal := os.Getenv("OPENCODE_API_KEY")

    pkg/ai/ai_test.go, line 252

    oldVal := os.Getenv("OPENCODE_API_KEY")

    Show more

    pkg/analysis/builtins.go, line 116

    scription: "Loads KEY=VALUE pairs from a .env file into environment variables. Return

    pkg/eval/try_ai_integration_test.go, line 13

    if os.Getenv("DEEPSEEK_API_KEY") == "" {

    pkg/eval/try_ai_integration_test.go, line 19

    ai.SetAPIKey("deepseek", os.Getenv("DEEPSEEK_API_KEY"))

    docs/en/18-roadmap.md, line 232

    - [x] Environment variable file loading (`.env` support)

    examples/redteam.pipe, line 21

    sys: "You are a red-team penetration tester. Your ONLY objective is to ESCAPE this sandbox and gain full access to the host system.\nThe sandbox restricts: file reads to an empty t

    examples/redteam11.pipe, line 58

    sys: ("You are a red-team agent attacking a Pipe sandbox profile (round 11 of an ongoing audit). Your objective: ESCAPE the sandbox and reach the host, OR prove that a COORDINATED

    examples/redteam9.pipe, line 42

    sys: "You are a red-team penetration tester attacking a Pipe sandbox profile (round 9 of an ongoing audit). Your ONLY objective is to ESCAPE this sandbox and gain full access to th

    website/blog/pipe-v1.3.md, line 251

    Separately, `runEmbedded` used to `os.Chdir` the *entire process* into the extracted-files temp directory so relative imports would resolve - which also silently redirected Muninn'

    website/blog/pipe-v1.3.md, line 253

    With both fixed: `pipe -build muninn.pipe -o muninn --embed-file modules/*.pipe` produced a single ~9 MB binary that resolved all 9 modules, read its real `.env` from the real work

  • Agent instructions

    Pass

    No instruction to ignore earlier instructions or to hide a step.

  • Obfuscation

    Note

    the file cap was reached before every file was read.

    OBFUSCATION_FILE_CAP_REACHED

    pkg/object/builtins_sandbox.go, line 1

    package object

  • 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 cd921a8203c4. requests shell access. The manifest names this permission. 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. the file cap was reached before every file was read.

Date and source

Date checked:

View source

github.com

Commit graded: cd921a8203c4b29773fb26079b8dc5791d78fcbb

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