Grades are a hygiene check, not a security guarantee.

MCP, MCP server

io.github.AgentTanuki/agent-guild

Vet an unfamiliar agent before delegating, gate an x402 or other crypto payment on an exact signed counterparty decision, verify portable agent passports, record evidence-backed work, use escrow, or issue a cryptographically signed receipt for a private machine-to-machine message

Compatibility: Not stated.

Grade D

Two or more Medium findings, or a High finding. Only try it in a sandbox.

Graded by PlugVetRubric v2

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

Rescanned at commit e288e4b56a55.

NETWORK_HOST_FROM_INPUT SECRETS_PATH_CREDENTIAL

Why this grade

  • NETWORK_HOST_FROM_INPUT High

    A file takes a URL or endpoint as input and has no fixed host list.

    artifacts/evaluation-2026-10-14/direct_check.py, line 35 with urllib.request.urlopen(req, timeout=5) as r:

  • SECRETS_PATH_CREDENTIAL Medium

    Mentions a credential store path (~/.ssh, id_rsa, .npmrc, .aws/credentials, credentials.json, .netrc).

    live/guild/app/swarm/mapper.py, line 78 "registration_method": "Nostr identity (registered; live/secrets/agentry_credentials.json)",

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

    docs/discovery-swarm/harness/concurrency_test.py, line 12

    if os.path.exists(f): os.remove(f)

    docs/discovery-swarm/harness/concurrency_test.py, line 36

    if os.path.exists(f): os.remove(f)

    docs/discovery-swarm/harness/concurrency_test.py, line 49

    p1 = subprocess.Popen([sys.executable, "-c", child], stdout=subprocess.PIPE, text=True)

    Show more

    docs/discovery-swarm/harness/concurrency_test.py, line 50

    p2 = subprocess.Popen([sys.executable, "-c", child], stdout=subprocess.PIPE, text=True)

    live/experiments/llm_adoption.py, line 217

    os.system(f"{sys.executable} -m pip install -q openai")

    live/market_clients/run_live_demo.py, line 82

    proc = subprocess.run(

    live/scripts/deploy_canary.py, line 93

    subprocess.run(["git", "-C", str(REPO), "revert", "--no-edit", commit],

    live/scripts/deploy_canary.py, line 95

    subprocess.run(["git", "-C", str(REPO), "push", "origin", "main"], check=True)

    live/scripts/publish_checkpoint_external.py, line 71

    subprocess.run(["git", "-C", str(REPO), "add", str(OUTDIR)], check=True)

    live/scripts/publish_checkpoint_external.py, line 72

    diff = subprocess.run(["git", "-C", str(REPO), "diff", "--cached",

  • Install and update

    Pass

    No install-time script found, and dependencies are pinned or absent.

  • Network

    Serious

    accepts a host from input, with no fixed list in this file.

    NETWORK_HOST_FROM_INPUT

    artifacts/evaluation-2026-10-14/direct_check.py, line 35

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

    artifacts/evaluation-2026-10-14/direct_check.py, line 42

    with urllib.request.urlopen(f"{p.scheme}://{p.netloc}/.well-known/agent-card.json",

  • Secrets

    Concern

    reads a credential or environment file.

    SECRETS_ENV_READ SECRETS_PATH_CREDENTIAL SECRETS_PATH_DOTENV

    live/agentkit/agentguild/llm.py, line 28

    if os.environ.get("OPENAI_API_KEY"):

    live/agentkit/agentguild/llm.py, line 34

    if os.environ.get("ANTHROPIC_API_KEY"):

    live/guild/app/swarm/mapper.py, line 78

    "registration_method": "Nostr identity (registered; live/secrets/agentry_credentials.json)",

    Show more

    live/experiments/llm_adoption.py, line 209

    if not os.environ.get("OPENAI_API_KEY"):

    live/guild/app/billing.py, line 100

    return bool(os.environ.get("STRIPE_SECRET_KEY"))

    live/guild/app/billing.py, line 106

    return os.environ.get("GUILD_BILLING_DEV_TOKEN", "")

    live/guild/app/billing.py, line 140

    secret = os.environ.get("STRIPE_WEBHOOK_SECRET", "")

    live/guild/app/credentials.py, line 92

    return os.environ.get("GUILD_HASH_KEYS", "") == "1"

    live/guild/app/firstparty.py, line 61

    return [t for t in (os.environ.get("GUILD_FIRST_PARTY_TOKEN", ""),

    live/experiments/llm_adoption.py, line 25

    Runs on your machine. Set OPENAI_API_KEY (e.g. in live/.env). No key is ever

    live/experiments/llm_adoption.py, line 211

    "Add a line OPENAI_API_KEY=sk-... to live/.env (it is gitignored), then re-run.")

    .gitignore, line 28

    .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

    live/guild/app/main.py, line 1

    """Agent Guild — live public API (FastAPI), v0.2 "costly attestations".

    live/guild/app/store.py, line 1

    """In-memory store with JSON-file persistence — v0.2.

    live/guild/tests/test_contract_conformance.py, line 1

    """One canonical contract, zero drift: the committed contract/contract.json and

  • 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 e288e4b56a55. can delete files. accepts a host from input, with no fixed list in this file. 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.

Date and source

Date checked:

View source

github.com

Commit graded: e288e4b56a557abc1c4b067192c6c92189c37d17

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