Grades are a hygiene check, not a security guarantee.

MCP, MCP server

AgentLine

AgentLine — Phone API for AI Voice Agents Open-source AI phone agent platform — real phone numbers, outbound & inbound voice calls, SMS, MCP, and IVR G

Compatibility: Not stated.

Grade C

One Medium finding. Read the report before installing.

Graded by PlugVetRubric v2

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

NETWORK_HOST_FROM_INPUT

Why this grade

  • NETWORK_HOST_FROM_INPUT Medium

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

    agentline/auth_middleware.py, line 33 rows = await db.fetch(

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

    agentline/static/agentline_relay.py, line 115

    subprocess.run(_runtime_command(config, "gateway", "install", "--force"), check=True)

    agentline/static/agentline_relay.py, line 117

    subprocess.run(_runtime_command(config, "gateway", "stop"), check=False)

    agentline/static/agentline_relay.py, line 118

    subprocess.run(_runtime_command(config, "gateway", "start"), check=True)

    Show more

    agentline/static/agentline_relay.py, line 138

    subprocess.run(_runtime_command(config, "gateway", "install"), check=False)

    agentline/static/agentline_relay.py, line 139

    subprocess.run(_runtime_command(config, "gateway", "start"), check=True)

    agentline/static/agentline_relay.py, line 140

    subprocess.run(

    agentline/static/agentline_relay.py, line 316

    result = subprocess.run(

    agentline/static/agentline_relay.py, line 473

    result = subprocess.run(

    agentline/static/agentline_relay.py, line 637

    shutil.rmtree(environment)

  • Install and update

    Concern

    dependencies are not pinned.

    INSTALL_UNPINNED

    requirements.txt, line 2

    fastapi>=0.111.0

  • Network

    Concern

    can reach a host that is not written as a fixed address. accepts a host from input, with no fixed list in this file.

    NETWORK_HOST_FROM_INPUT NETWORK_NO_FIXED_HOST

    agentline/auth_middleware.py, line 33

    rows = await db.fetch(

    agentline/providers/plivo.py, line 187

    rows = await db.fetch(

    agentline/providers/signalwire.py, line 116

    rows = await db.fetch(

    Show more

    agentline/providers/telnyx.py, line 191

    rows = await db.fetch(

    agentline/providers/twilio.py, line 178

    rows = await db.fetch(

    agentline/routers/agents.py, line 107

    rows = await db.fetch(

    agentline/routers/calls.py, line 143

    rows = await db.fetch(

    agentline/routers/events.py, line 71

    rows = await db.fetch(

  • Secrets

    Concern

    reads a credential or environment file.

    SECRETS_ENV_READ SECRETS_PATH_DOTENV

    agentline/config.py, line 120

    "env_file": ".env",

    agentline/database.py, line 139

    logger.warning("Server starting WITHOUT database - fix DATABASE_URL in .env")

    agentline/database.py, line 157

    raise RuntimeError("Database not available. Check DATABASE_URL in .env")

    Show more

    agentline/database.py, line 169

    raise RuntimeError("Database not available. Check DATABASE_URL in .env")

    agentline/static/agentline_relay.py, line 94

    env_path = hermes_home / ".env"

    agentline/static/agentline_relay.py, line 719

    api_key = args.api_key or os.environ.get("AGENTLINE_API_KEY")

    agentline/static/agentline_relay.py, line 753

    elif runtime == "codex" and not os.environ.get("CODEX_API_KEY"):

    .env.example, line 2

    # Copy this file to .env and fill in the providers you actually use.

    .gitignore, line 17

    # Virtual environments

    CONTRIBUTING.md, line 46

    cp .env.example .env

  • Agent instructions

    Pass

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

  • Obfuscation

    Pass

    No encoded or minified payload found.

  • 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 9ed61a710d80. can delete files. dependencies are not pinned. can reach a host that is not written as a fixed address. accepts a host from input, with no fixed list in this file. reads a credential or environment file.

Date and source

Date checked:

View source

github.com

Commit graded: 9ed61a710d80d11f4d5076d026a8baad4b42ac98

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