Grades are a hygiene check, not a security guarantee.

MCP, MCP server

io.github.chopmob-cloud/algovoi-mcp-server

AlgoVoi is available for acquisition — docs.algovoi.co.uk/acquisition

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.

NETWORK_NO_FIXED_HOST NETWORK_UNNAMED_HOST SECRETS_PATH_DOTENV OBFUSCATION_ENCODED_BLOB PERMISSION_SHELL_DECLARED SECRETS_ENV_READ

Why this grade

  • NETWORK_NO_FIXED_HOST Low

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

    test_agent_flow.py, line 209 with urllib.request.urlopen(req) as r:

  • NETWORK_UNNAMED_HOST Low

    Calls a fixed host that the description does not name.

    test_agent_flow.py, line 209 with urllib.request.urlopen(req) as r:

  • SECRETS_PATH_DOTENV Low

    Mentions a .env file.

    ai-adapters/claude/smoke_test_claude_ap2.py, line 7 Uses your existing Algorand wallet (WALLET_MNEMONIC from C:/algo/.env).

  • OBFUSCATION_ENCODED_BLOB Low

    Contains a long base64 shaped string in a file that should be readable.

    no-code/x/test_x_algovoi.py, line 1 """

  • PERMISSION_SHELL_DECLARED Note

    Runs shell commands, and the manifest or description says so.

    mcp-server/smoke_mcp_full.py, line 102 def __init__(self, proc: subprocess.Popen) -> None:

  • SECRETS_ENV_READ Note

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

    webhook_tester.py, line 47 ADMIN_KEY = os.environ.get("ALGOVOI_ADMIN_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

    Note

    requests shell access. The manifest names this permission.

    PERMISSION_SHELL_DECLARED

    mcp-server/smoke_mcp_full.py, line 102

    def __init__(self, proc: subprocess.Popen) -> None:

    mcp-server/smoke_mcp_full.py, line 172

    def _launch_ts(extra_env: dict | None = None) -> subprocess.Popen:

    mcp-server/smoke_mcp_full.py, line 191

    return subprocess.Popen(

    Show more

    mcp-server/smoke_mcp_full.py, line 198

    def _launch_py(extra_env: dict | None = None) -> subprocess.Popen:

    mcp-server/smoke_mcp_full.py, line 212

    return subprocess.Popen(

    mcp-server/smoke_mcp_full.py, line 219

    def _kill(proc: subprocess.Popen) -> None:

    mcp-server/smoke_stdio.py, line 40

    def speak_mcp(proc: subprocess.Popen) -> dict:

    mcp-server/smoke_stdio.py, line 88

    proc = subprocess.Popen(

  • 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 your-domain.example. The description does not name that host.

    NETWORK_NO_FIXED_HOST NETWORK_UNNAMED_HOST

    test_agent_flow.py, line 209

    with urllib.request.urlopen(req) as r:

    test_agent_flow.py, line 220

    with urllib.request.urlopen(req) as r:

    webhook_tester.py, line 749

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

    Show more

    webhook_tester.py, line 1257

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

    ai-adapters/bedrock/example.py, line 10

    Test with curl (see bottom of this file).

    ai-adapters/bedrock/example.py, line 142

    # ── curl test commands ────────────────────────────────────────────────────────

    ai-adapters/bedrock/example.py, line 146

    # curl http://localhost:5000/health

    ai-adapters/bedrock/example.py, line 151

    # curl -s -i -X POST http://localhost:5000/ai/chat \

    ai-adapters/bedrock/example.py, line 176

    # curl -s -X POST http://localhost:5000/ai/chat \

    ai-adapters/claude/example.py, line 10

    Test with curl (see bottom of this file).

    ai-adapters/claude/example.py, line 134

    # ── curl test commands ────────────────────────────────────────────────────────

    ai-adapters/claude/example.py, line 138

    # curl http://localhost:5000/health

    ai-adapters/claude/example.py, line 143

    # curl -s -i -X POST http://localhost:5000/ai/chat \

    ai-adapters/claude/example.py, line 168

    # curl -s -X POST http://localhost:5000/ai/chat \

    ai-adapters/claude/example.py, line 182

    # curl -s -X POST http://localhost:5000/ai/chat \

    ai-adapters/demo/make_demo_gif.py, line 311

    _prompt(d, y, "curl http://localhost:5000/health")

  • Secrets

    Concern

    reads a credential or environment file.

    SECRETS_ENV_READ SECRETS_PATH_DOTENV

    webhook_tester.py, line 47

    ADMIN_KEY = os.environ.get("ALGOVOI_ADMIN_KEY", "")

    ai-adapters/bedrock/example.py, line 41

    aws_access_key_id = os.environ.get("AWS_ACCESS_KEY_ID"),

    ai-adapters/claude/smoke_test_claude_ap2.py, line 7

    Uses your existing Algorand wallet (WALLET_MNEMONIC from C:/algo/.env).

    Show more

    ai-adapters/bedrock/example.py, line 42

    aws_secret_access_key = os.environ.get("AWS_SECRET_ACCESS_KEY"),

    ai-adapters/bedrock/example.py, line 44

    algovoi_key = os.environ.get("ALGOVOI_KEY", "algv_..."),

    ai-adapters/claude/example.py, line 35

    anthropic_key = os.environ.get("ANTHROPIC_KEY", "sk-ant-..."),

    ai-adapters/claude/example.py, line 36

    algovoi_key = os.environ.get("ALGOVOI_KEY", "algv_..."),

    ai-adapters/claude/smoke_test_claude_ap2.py, line 48

    ENV_FILE = os.path.join("C:", os.sep, "algo", ".env")

    ai-adapters/claude/smoke_test_claude_ap2.py, line 60

    Load the Algorand wallet from WALLET_MNEMONIC in C:\\algo\\.env.

    ai-adapters/claude/smoke_test_claude_ap2.py, line 67

    raise FileNotFoundError(f".env file not found: {ENV_FILE}")

    ai-adapters/claude/smoke_test_claude_ap2.py, line 78

    raise RuntimeError("WALLET_MNEMONIC not found in .env")

    ai-adapters/cohere/smoke_test_cohere.py, line 47

    k = os.environ.get("COHERE_KEY") or os.environ.get("CO_API_KEY")

    ai-adapters/cohere/smoke_test_cohere.py, line 68

    k = os.environ.get("ALGOVOI_KEY")

    ai-adapters/demo/make_demo_gif.py, line 533

    ("2", "Download from GitHub:", "openai_algovoi.py + app.py + .env.example"),

    ai-adapters/demo/make_demo_gif.py, line 535

    ("4", "cp .env.example .env - fill in keys", "OPENAI_KEY ALGOVOI_KEY TENANT_ID PAYOUT_ADDRESS"),

    ai-adapters/demo/make_demo_gif.py, line 584

    ("load_dotenv() # reads your .env file", MUTED),

  • Agent instructions

    Pass

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

  • Obfuscation

    Concern

    contains an encoded blob in a file that should be readable.

    OBFUSCATION_ENCODED_BLOB

    no-code/x/test_x_algovoi.py, line 1

    """

    ai-adapters/demo/demo_data.json, line 3

    "challenge_header": "Payment realm=\"API Access\", id=\"5768885f7d65ca513db76a0591fa8827\", method=\"algorand\", intent=\"charge\", request=\"eyJhbW91bnQiOiIxMDAwMCIsImN1cnJlbmN5Ij

    ai-adapters/demo/demo_data.json, line 11

    "challenge_header": "eyJ4NDAyVmVyc2lvbiI6IDEsICJhY2NlcHRzIjogW3sibmV0d29yayI6ICJhbGdvcmFuZDptYWlubmV0IiwgImFzc2V0IjogIjMxNTY2NzA0IiwgImFtb3VudCI6ICIxMDAwMCIsICJwYXlUbyI6ICJaVkxSVll

  • 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 31ac9838fc61. requests shell access. The manifest names this permission. can reach a host that is not written as a fixed address. can reach your-domain.example. The description does not name that host. reads a credential or environment file. contains an encoded blob in a file that should be readable.

Date and source

Date checked:

View source

github.com

Commit graded: 31ac9838fc61f05c267c79869554807ecb83683d

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