Grades are a hygiene check, not a security guarantee.

MCP, MCP server

attestix

AI agent identity, signed credentials, delegated authority and portable governance evidence.

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 a89903c6ec15, unchanged since the check below.

SECRETS_PATH_CREDENTIAL

Why this grade

  • SECRETS_PATH_CREDENTIAL Medium

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

    attestix/config.py, line 35 CREDENTIALS_FILE = DATA_DIR / "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

    simulate_users.py, line 1207

    shutil.rmtree(TEMP_DIR, ignore_errors=True)

  • Install and update

    Concern

    dependencies are not pinned.

    INSTALL_UNPINNED

    requirements.txt, line 5

    mcp[cli]>=1.28.1,<2.0.0

  • Network

    Concern

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

    NETWORK_NO_FIXED_HOST

    .github/workflows/publish-mcp.yml, line 53

    with urllib.request.urlopen(f'https://pypi.org/pypi/attestix/{version}/json', timeout=30) as response:

    Dockerfile, line 40

    CMD python -c "import urllib.request,sys; sys.exit(0) if urllib.request.urlopen('http://localhost:8080/health').status == 200 else sys.exit(1)" || exit 1

    website/content/docs/quickstart/enterprise-architect.mdx, line 37

    resp = requests.post(

    Show more

    website/content/docs/quickstart/enterprise-architect.mdx, line 57

    trail = requests.get(

    website/src/app/(marketing)/verify/verify-client.tsx, line 17

    // Everything below runs ENTIRELY in the visitor's browser. There is no fetch(),

  • Secrets

    Concern

    reads a credential or environment file.

    SECRETS_ENV_READ SECRETS_PATH_CREDENTIAL SECRETS_PATH_DOTENV

    attestix/config.py, line 30

    ENV_FILE = PROJECT_DIR / ".env"

    attestix/config.py, line 35

    CREDENTIALS_FILE = DATA_DIR / "credentials.json"

    attestix/api/main.py, line 248

    api_key = os.environ.get("ATTESTIX_API_KEY")

    Show more

    attestix/api/main.py, line 340

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

    attestix/auth/crypto.py, line 138

    password = os.environ.get("ATTESTIX_KEY_PASSWORD")

    attestix/services/blockchain_service.py, line 6

    Optional: works only when EVM_PRIVATE_KEY is set in .env.

    attestix/services/blockchain_service.py, line 76

    "Set EVM_PRIVATE_KEY in .env to enable on-chain anchoring. "

    integrations/examples/crewai_real_integration.py, line 144

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

    integrations/examples/openai_agents_real_integration.py, line 213

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

    integrations/examples/openai_agents_real_integration.py, line 272

    if args.live and not os.environ.get("OPENAI_API_KEY"):

    .gitignore, line 1

    # Environment & secrets

    .gitignore, line 2

    .env

    .gitignore, line 3

    .env.local

    .gitignore, line 22

    credentials.json

  • 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

    requirements-ci.txt, line 1

    # This file was autogenerated by uv via the following command:

    requirements-runtime.txt, line 1

    # This file was autogenerated by uv via the following command:

    website/package-lock.json, line 1

    {

    Show more

    website/src/app/globals.css, line 1

    @import "tailwindcss";

    spec/verify/v1/vectors.json, line 12

    "canonical_bytes_hex": "7b22615f6669727374223a6e756c6c2c22617272223a5b312c2274776f222c66616c73652c6e756c6c2c7b226b223a2276227d5d2c226269675f696e74223a393030373139393235343734303939

    spec/verify/v1/vectors.json, line 72

    "canonical_bytes_hex": "7b2240636f6e74657874223a5b2268747470733a2f2f7777772e77332e6f72672f323031382f63726564656e7469616c732f7631222c2268747470733a2f2f773369642e6f72672f736563757269

    spec/verify/v1/vectors.json, line 145

    "canonical_bytes_hex": "7b2240636f6e74657874223a5b2268747470733a2f2f7777772e77332e6f72672f323031382f63726564656e7469616c732f7631222c2268747470733a2f2f773369642e6f72672f736563757269

    spec/verify/v1/vectors.json, line 196

    "canonical_bytes_hex": "7b2240636f6e74657874223a5b2268747470733a2f2f7777772e77332e6f72672f323031382f63726564656e7469616c732f7631222c2268747470733a2f2f773369642e6f72672f736563757269

    spec/verify/v1/vectors.json, line 266

    "parent_token": "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCIsInVjdiI6IjAuOS4wIn0.eyJpc3MiOiJkaWQ6a2V5Ono2TWtvNVRCUEdLSGtDeFNnbWYzYUM2cDZTR2oyYXV3Q2ZSbUJ5ZFhKRkV3TDRldiIsImF1ZCI6ImRpZDprZXk

    spec/verify/v1/vectors.json, line 267

    "token": "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCIsInVjdiI6IjAuOS4wIn0.eyJpc3MiOiJkaWQ6a2V5Ono2TWtvNVRCUEdLSGtDeFNnbWYzYUM2cDZTR2oyYXV3Q2ZSbUJ5ZFhKRkV3TDRldiIsImF1ZCI6ImRpZDprZXk6ekdyYW

    spec/verify/v1/vectors.json, line 293

    "parent_token": "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCIsInVjdiI6IjAuOS4wIn0.eyJpc3MiOiJkaWQ6a2V5Ono2TWtvNVRCUEdLSGtDeFNnbWYzYUM2cDZTR2oyYXV3Q2ZSbUJ5ZFhKRkV3TDRldiIsImF1ZCI6ImRpZDprZXk

    spec/verify/v1/vectors.json, line 294

    "token": "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCIsInVjdiI6IjAuOS4wIn0.eyJpc3MiOiJkaWQ6a2V5Ono2TWtvNVRCUEdLSGtDeFNnbWYzYUM2cDZTR2oyYXV3Q2ZSbUJ5ZFhKRkV3TDRldiIsImF1ZCI6ImRpZDprZXk6ekdyYW

  • 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 a89903c6ec15. can delete files. dependencies are not pinned. can reach a host that is not written as a fixed address. 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: a89903c6ec15b7723c32a016f05427903b703249

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