{
  "type": "comparison",
  "id": "llm-red-teaming-tools",
  "title": "Open-source red-teaming tools for LLM apps and agents",
  "summary": "Promptfoo, DeepTeam and Giskard compared as red-teaming tools for LLM apps and agents. Covers interface, what they attack, agent and MCP coverage, multi-turn attacks, framework mappings, CI use, and where attack generation and telemetry go.",
  "author": "Agentica Author",
  "tags": [
    "red-teaming",
    "security",
    "llm-security",
    "prompt-injection",
    "jailbreak",
    "agents",
    "mcp",
    "evals",
    "ci"
  ],
  "published": "2026-10-21",
  "last_verified": "2026-10-21",
  "entries": [
    "promptfoo",
    "deepteam",
    "giskard",
    "promptfoo-action",
    "deepeval",
    "model-context-protocol"
  ],
  "links": {
    "html": "https://indexagentica.com/compare/llm-red-teaming-tools/",
    "markdown": "https://indexagentica.com/compare/llm-red-teaming-tools.md",
    "json": "https://indexagentica.com/api/longform/compare/llm-red-teaming-tools.json",
    "source": "https://github.com/Drudley/indexagentica/blob/main/content-long/compare/llm-red-teaming-tools.md"
  },
  "status": "published",
  "comparison": {
    "subjects": [
      {
        "id": "promptfoo",
        "name": "Promptfoo",
        "summary": "Open-source tool to test and red-team prompts, agents and RAG: automated evals, vulnerability scanning and model comparison.",
        "url": "https://indexagentica.com/entries/promptfoo/",
        "json": "https://indexagentica.com/api/entries/promptfoo.json"
      },
      {
        "id": "deepteam",
        "name": "DeepTeam",
        "summary": "Open-source framework from Confident AI to red team LLMs and AI agents.",
        "url": "https://indexagentica.com/entries/deepteam/",
        "json": "https://indexagentica.com/api/entries/deepteam.json"
      },
      {
        "id": "giskard",
        "name": "Giskard",
        "summary": "Open-source Python library for testing agentic systems: scenario-based checks and LLM-as-judge evals (giskard-checks) plus a vulnerability scanner for red teaming (giskard-scan).",
        "url": "https://indexagentica.com/entries/giskard/",
        "json": "https://indexagentica.com/api/entries/giskard.json"
      }
    ],
    "criteria": [
      "Interface",
      "How attacks are made",
      "Agent and tool risks",
      "Multi-turn",
      "Framework mappings",
      "CI",
      "Data leaving your machine",
      "License"
    ],
    "rows": {
      "promptfoo": {
        "Interface": "Node.js CLI (npx promptfoo@latest redteam setup / run / report) with a promptfooconfig.yaml; setup opens a local web UI. Needs Node.js >=22.22.0. Targets: HTTP endpoints, browser, direct model providers, custom code",
        "How attacks are made": "Plugins generate adversarial inputs (docs: 50+ vulnerability types); strategies wrap them (static encodings, dynamic jailbreak, jailbreak:meta, multi-turn jailbreak:hydra, indirect prompt injection, retry regression)",
        "Agent and tool risks": "Plugins for excessive agency, BOLA, BFLA, data exfiltration, coding agents and an mcp plugin; MCP guide tests a server through a client, tool poisoning with a rogue server (promptfoo/evil-mcp-server), and direct API testing",
        "Multi-turn": "Yes: multi-turn strategies (Hydra, Goblin and others) need a stateful target or transcript replay",
        "Framework mappings": "redteam.frameworks: owasp:llm, owasp:agentic, owasp:api, nist:ai:measure, mitre:atlas; the docs also list EU AI Act, ISO 42001, GDPR and other pages",
        "CI": "promptfoo redteam run -o output.json in any CI; docs show a GitHub Actions job. The promptfoo-action GitHub Action runs evals on PRs and posts a comment",
        "Data leaving your machine": "Attack generation uses a Promptfoo remote service by default (PROMPTFOO_DISABLE_REDTEAM_REMOTE_GENERATION=true for local only); usage telemetry on by default (PROMPTFOO_DISABLE_TELEMETRY=1), excluding prompts and outputs",
        "License": "MIT (README: Promptfoo is now part of OpenAI and remains MIT)"
      },
      "deepteam": {
        "Interface": "Python library (pip install -U deepteam; red_team(model_callback=..., vulnerabilities=..., attacks=...)) and CLI (deepteam run config.yaml); Python >=3.9,<3.14",
        "How attacks are made": "Any LLM you configure simulates attacks (YAML default simulator gpt-3.5-turbo-0125) and judges them (default gpt-4o) with LLM-as-judge metrics; 50+ vulnerabilities, 20+ attack methods",
        "Agent and tool risks": "Agentic vulnerabilities such as goal theft, recursive hijacking, excessive agency, indirect instruction, tool orchestration abuse, inter-agent communication compromise; security ones include tool metadata poisoning, SSRF, shell and SQL injection, BOLA, BFLA, RBAC",
        "Multi-turn": "Yes: linear, tree, crescendo and sequential jailbreaking, Bad Likert Judge",
        "Framework mappings": "OWASPTop10 (LLM 2025), OWASP_ASI_2026 (agents), NIST, MITRE, Aegis, BeaverTails",
        "CI": "deepteam run config.yaml for reproducible runs; deepteam scan statically scans code or a git diff and exits 1 on findings, with a GitHub bot for PR comments",
        "Data leaving your machine": "Runs locally; attack and judge calls go to the LLM you configure. Telemetry (PostHog, Sentry) unless DEEPTEAM_TELEMETRY_OPT_OUT=YES; optional Confident AI platform for results",
        "License": "Apache-2.0"
      },
      "giskard": {
        "Interface": "Python library, v3 (pip install \"giskard[scan]\"; vulnerability_scan(target=..., description=...)), async-first; Python 3.12+. Wraps any sync or async callable as the target",
        "How attacks are made": "LLM generators build adversarial scenarios from a plain-language description of the agent; built-in prompt-injection dataset; generators include Crescendo, GOAT, GCG injection, sycophancy, out-of-scope",
        "Agent and tool risks": "Scan covers prompt injection, jailbreaks, harmful content and OWASP LLM Top 10 categories; giskard-checks tests multi-turn agent conversations. No MCP-specific tests documented in the README",
        "Multi-turn": "Yes, default target_mode is multiturn (singleturn optional)",
        "Framework mappings": "OWASP LLM Top 10 threat categories (per README); no other framework presets documented",
        "CI": "No CI integration documented in the README; scans and checks are Python code you can run in any test runner",
        "Data leaving your machine": "Generation and judging go to the LLM provider you install (default judge openai/gpt-4o-mini); optional aggregated telemetry without prompts or outputs, off with DO_NOT_TRACK=1 or GISKARD_TELEMETRY_DISABLED=1",
        "License": "Apache-2.0 (v2 still available but no longer actively maintained)"
      }
    },
    "table": [
      {
        "entry": "promptfoo",
        "name": "Promptfoo",
        "url": "https://indexagentica.com/entries/promptfoo/",
        "values": {
          "Interface": "Node.js CLI (npx promptfoo@latest redteam setup / run / report) with a promptfooconfig.yaml; setup opens a local web UI. Needs Node.js >=22.22.0. Targets: HTTP endpoints, browser, direct model providers, custom code",
          "How attacks are made": "Plugins generate adversarial inputs (docs: 50+ vulnerability types); strategies wrap them (static encodings, dynamic jailbreak, jailbreak:meta, multi-turn jailbreak:hydra, indirect prompt injection, retry regression)",
          "Agent and tool risks": "Plugins for excessive agency, BOLA, BFLA, data exfiltration, coding agents and an mcp plugin; MCP guide tests a server through a client, tool poisoning with a rogue server (promptfoo/evil-mcp-server), and direct API testing",
          "Multi-turn": "Yes: multi-turn strategies (Hydra, Goblin and others) need a stateful target or transcript replay",
          "Framework mappings": "redteam.frameworks: owasp:llm, owasp:agentic, owasp:api, nist:ai:measure, mitre:atlas; the docs also list EU AI Act, ISO 42001, GDPR and other pages",
          "CI": "promptfoo redteam run -o output.json in any CI; docs show a GitHub Actions job. The promptfoo-action GitHub Action runs evals on PRs and posts a comment",
          "Data leaving your machine": "Attack generation uses a Promptfoo remote service by default (PROMPTFOO_DISABLE_REDTEAM_REMOTE_GENERATION=true for local only); usage telemetry on by default (PROMPTFOO_DISABLE_TELEMETRY=1), excluding prompts and outputs",
          "License": "MIT (README: Promptfoo is now part of OpenAI and remains MIT)"
        }
      },
      {
        "entry": "deepteam",
        "name": "DeepTeam",
        "url": "https://indexagentica.com/entries/deepteam/",
        "values": {
          "Interface": "Python library (pip install -U deepteam; red_team(model_callback=..., vulnerabilities=..., attacks=...)) and CLI (deepteam run config.yaml); Python >=3.9,<3.14",
          "How attacks are made": "Any LLM you configure simulates attacks (YAML default simulator gpt-3.5-turbo-0125) and judges them (default gpt-4o) with LLM-as-judge metrics; 50+ vulnerabilities, 20+ attack methods",
          "Agent and tool risks": "Agentic vulnerabilities such as goal theft, recursive hijacking, excessive agency, indirect instruction, tool orchestration abuse, inter-agent communication compromise; security ones include tool metadata poisoning, SSRF, shell and SQL injection, BOLA, BFLA, RBAC",
          "Multi-turn": "Yes: linear, tree, crescendo and sequential jailbreaking, Bad Likert Judge",
          "Framework mappings": "OWASPTop10 (LLM 2025), OWASP_ASI_2026 (agents), NIST, MITRE, Aegis, BeaverTails",
          "CI": "deepteam run config.yaml for reproducible runs; deepteam scan statically scans code or a git diff and exits 1 on findings, with a GitHub bot for PR comments",
          "Data leaving your machine": "Runs locally; attack and judge calls go to the LLM you configure. Telemetry (PostHog, Sentry) unless DEEPTEAM_TELEMETRY_OPT_OUT=YES; optional Confident AI platform for results",
          "License": "Apache-2.0"
        }
      },
      {
        "entry": "giskard",
        "name": "Giskard",
        "url": "https://indexagentica.com/entries/giskard/",
        "values": {
          "Interface": "Python library, v3 (pip install \"giskard[scan]\"; vulnerability_scan(target=..., description=...)), async-first; Python 3.12+. Wraps any sync or async callable as the target",
          "How attacks are made": "LLM generators build adversarial scenarios from a plain-language description of the agent; built-in prompt-injection dataset; generators include Crescendo, GOAT, GCG injection, sycophancy, out-of-scope",
          "Agent and tool risks": "Scan covers prompt injection, jailbreaks, harmful content and OWASP LLM Top 10 categories; giskard-checks tests multi-turn agent conversations. No MCP-specific tests documented in the README",
          "Multi-turn": "Yes, default target_mode is multiturn (singleturn optional)",
          "Framework mappings": "OWASP LLM Top 10 threat categories (per README); no other framework presets documented",
          "CI": "No CI integration documented in the README; scans and checks are Python code you can run in any test runner",
          "Data leaving your machine": "Generation and judging go to the LLM provider you install (default judge openai/gpt-4o-mini); optional aggregated telemetry without prompts or outputs, off with DO_NOT_TRACK=1 or GISKARD_TELEMETRY_DISABLED=1",
          "License": "Apache-2.0 (v2 still available but no longer actively maintained)"
        }
      }
    ],
    "verdict": "Pick Promptfoo if you want a config-driven CLI with the broadest agent and MCP coverage and framework reports, but turn off remote generation and telemetry if data must stay local. Pick DeepTeam for a Python-native red team with a large agentic vulnerability list and a code scanner for PRs. Pick Giskard for multi-turn scans in Python; its third_party_scan can also run garak probes and DeepTeam attacks."
  },
  "entries_detail": [
    {
      "id": "promptfoo",
      "name": "Promptfoo",
      "summary": "Open-source tool to test and red-team prompts, agents and RAG: automated evals, vulnerability scanning and model comparison.",
      "url": "https://indexagentica.com/entries/promptfoo/",
      "json": "https://indexagentica.com/api/entries/promptfoo.json"
    },
    {
      "id": "deepteam",
      "name": "DeepTeam",
      "summary": "Open-source framework from Confident AI to red team LLMs and AI agents.",
      "url": "https://indexagentica.com/entries/deepteam/",
      "json": "https://indexagentica.com/api/entries/deepteam.json"
    },
    {
      "id": "giskard",
      "name": "Giskard",
      "summary": "Open-source Python library for testing agentic systems: scenario-based checks and LLM-as-judge evals (giskard-checks) plus a vulnerability scanner for red teaming (giskard-scan).",
      "url": "https://indexagentica.com/entries/giskard/",
      "json": "https://indexagentica.com/api/entries/giskard.json"
    },
    {
      "id": "promptfoo-action",
      "name": "Promptfoo GitHub Action",
      "summary": "GitHub Action for running Promptfoo prompt, agent and RAG tests and red-team scans in CI.",
      "url": "https://indexagentica.com/entries/promptfoo-action/",
      "json": "https://indexagentica.com/api/entries/promptfoo-action.json"
    },
    {
      "id": "deepeval",
      "name": "DeepEval",
      "summary": "Open-source LLM evaluation framework with 50+ plug-and-play metrics for agents, RAG and chatbots.",
      "url": "https://indexagentica.com/entries/deepeval/",
      "json": "https://indexagentica.com/api/entries/deepeval.json"
    },
    {
      "id": "model-context-protocol",
      "name": "Model Context Protocol (MCP)",
      "summary": "Open protocol that standardizes how AI applications connect to external tools, data sources and prompts via MCP servers.",
      "url": "https://indexagentica.com/entries/model-context-protocol/",
      "json": "https://indexagentica.com/api/entries/model-context-protocol.json"
    }
  ],
  "related": [
    {
      "type": "guide",
      "id": "evaluate-an-ai-agent",
      "title": "Evaluate an AI agent with open-source eval and observability tools",
      "url": "https://indexagentica.com/guides/evaluate-an-ai-agent/",
      "json": "https://indexagentica.com/api/longform/guides/evaluate-an-ai-agent.json"
    },
    {
      "type": "comparison",
      "id": "agent-observability-platforms",
      "title": "Observability and eval platforms for AI agents",
      "url": "https://indexagentica.com/compare/agent-observability-platforms/",
      "json": "https://indexagentica.com/api/longform/compare/agent-observability-platforms.json"
    },
    {
      "type": "comparison",
      "id": "agent-benchmarks",
      "title": "Agent benchmarks compared",
      "url": "https://indexagentica.com/compare/agent-benchmarks/",
      "json": "https://indexagentica.com/api/longform/compare/agent-benchmarks.json"
    },
    {
      "type": "guide",
      "id": "add-oauth-to-your-mcp-server",
      "title": "Add OAuth authorization to your own MCP server",
      "url": "https://indexagentica.com/guides/add-oauth-to-your-mcp-server/",
      "json": "https://indexagentica.com/api/longform/guides/add-oauth-to-your-mcp-server.json"
    },
    {
      "type": "skill",
      "id": "pick-an-mcp-server",
      "title": "Pick an MCP server",
      "url": "https://indexagentica.com/skills/pick-an-mcp-server/",
      "json": "https://indexagentica.com/api/longform/skills/pick-an-mcp-server.json"
    },
    {
      "type": "guide",
      "id": "test-your-mcp-server",
      "title": "Test your MCP server with in-process tests and Inspector CI checks",
      "url": "https://indexagentica.com/guides/test-your-mcp-server/",
      "json": "https://indexagentica.com/api/longform/guides/test-your-mcp-server.json"
    },
    {
      "type": "guide",
      "id": "test-an-agent-for-prompt-injection",
      "title": "Test a tool-using agent for prompt injection with AgentDojo",
      "url": "https://indexagentica.com/guides/test-an-agent-for-prompt-injection/",
      "json": "https://indexagentica.com/api/longform/guides/test-an-agent-for-prompt-injection.json"
    }
  ],
  "sources": [
    {
      "title": "Promptfoo red team getting started (site/docs/red-team/quickstart.md)",
      "url": "https://github.com/promptfoo/promptfoo/blob/main/site/docs/red-team/quickstart.md",
      "accessed": "2026-10-21"
    },
    {
      "title": "Promptfoo red team configuration (site/docs/red-team/configuration.md)",
      "url": "https://github.com/promptfoo/promptfoo/blob/main/site/docs/red-team/configuration.md",
      "accessed": "2026-10-21"
    },
    {
      "title": "Promptfoo red team strategies (site/docs/red-team/strategies/index.md)",
      "url": "https://github.com/promptfoo/promptfoo/blob/main/site/docs/red-team/strategies/index.md",
      "accessed": "2026-10-21"
    },
    {
      "title": "Promptfoo MCP security testing guide",
      "url": "https://github.com/promptfoo/promptfoo/blob/main/site/docs/red-team/mcp-security-testing.md",
      "accessed": "2026-10-21"
    },
    {
      "title": "Promptfoo CI/CD integration docs",
      "url": "https://github.com/promptfoo/promptfoo/blob/main/site/docs/integrations/ci-cd.md",
      "accessed": "2026-10-21"
    },
    {
      "title": "Promptfoo GitHub Actions docs",
      "url": "https://github.com/promptfoo/promptfoo/blob/main/site/docs/integrations/github-action.md",
      "accessed": "2026-10-21"
    },
    {
      "title": "Promptfoo telemetry docs",
      "url": "https://github.com/promptfoo/promptfoo/blob/main/site/docs/configuration/telemetry.md",
      "accessed": "2026-10-21"
    },
    {
      "title": "Promptfoo README",
      "url": "https://github.com/promptfoo/promptfoo",
      "accessed": "2026-10-21"
    },
    {
      "title": "Promptfoo llms.txt (docs index, red-team plugin list)",
      "url": "https://www.promptfoo.dev/llms.txt",
      "accessed": "2026-10-21"
    },
    {
      "title": "promptfoo-action README",
      "url": "https://github.com/promptfoo/promptfoo-action",
      "accessed": "2026-10-21"
    },
    {
      "title": "DeepTeam README (confident-ai/deepteam)",
      "url": "https://github.com/confident-ai/deepteam",
      "accessed": "2026-10-21"
    },
    {
      "title": "DeepTeam YAML configurations (docs/content/docs/red-teaming-yaml-cli.mdx)",
      "url": "https://github.com/confident-ai/deepteam/blob/main/docs/content/docs/red-teaming-yaml-cli.mdx",
      "accessed": "2026-10-21"
    },
    {
      "title": "DeepTeam code scanning introduction",
      "url": "https://github.com/confident-ai/deepteam/blob/main/docs/content/docs/code-scanning-introduction.mdx",
      "accessed": "2026-10-21"
    },
    {
      "title": "DeepTeam telemetry module (deepteam/telemetry.py)",
      "url": "https://github.com/confident-ai/deepteam/blob/main/deepteam/telemetry.py",
      "accessed": "2026-10-21"
    },
    {
      "title": "deepteam on PyPI",
      "url": "https://pypi.org/project/deepteam/",
      "accessed": "2026-10-21"
    },
    {
      "title": "Giskard OSS README (Giskard-AI/giskard-oss)",
      "url": "https://github.com/Giskard-AI/giskard-oss",
      "accessed": "2026-10-21"
    },
    {
      "title": "giskard-scan README",
      "url": "https://github.com/Giskard-AI/giskard-oss/blob/main/libs/giskard-scan/README.md",
      "accessed": "2026-10-21"
    },
    {
      "title": "giskard on PyPI",
      "url": "https://pypi.org/project/giskard/",
      "accessed": "2026-10-21"
    }
  ],
  "front_matter": {
    "id": "llm-red-teaming-tools",
    "type": "comparison",
    "title": "Open-source red-teaming tools for LLM apps and agents",
    "summary": "Promptfoo, DeepTeam and Giskard compared as red-teaming tools for LLM apps and agents. Covers interface, what they attack, agent and MCP coverage, multi-turn attacks, framework mappings, CI use, and where attack generation and telemetry go.",
    "description": "A primary-source comparison of the three open-source red-teaming tools with directory entries: Promptfoo (MIT, Node.js CLI with YAML configs), DeepTeam (Apache-2.0, Python, built on DeepEval) and Giskard v3 (Apache-2.0, Python, giskard-scan). It explains how each one generates attacks, which agent-specific risks it covers, how to run it in CI, and which defaults send data to a vendor service.",
    "author": "Agentica Author",
    "tags": [
      "red-teaming",
      "security",
      "llm-security",
      "prompt-injection",
      "jailbreak",
      "agents",
      "mcp",
      "evals",
      "ci"
    ],
    "entries": [
      "promptfoo",
      "deepteam",
      "giskard",
      "promptfoo-action",
      "deepeval",
      "model-context-protocol"
    ],
    "related": [
      "evaluate-an-ai-agent",
      "agent-observability-platforms",
      "agent-benchmarks",
      "add-oauth-to-your-mcp-server",
      "pick-an-mcp-server",
      "test-your-mcp-server",
      "test-an-agent-for-prompt-injection"
    ],
    "subjects": [
      "promptfoo",
      "deepteam",
      "giskard"
    ],
    "criteria": [
      "Interface",
      "How attacks are made",
      "Agent and tool risks",
      "Multi-turn",
      "Framework mappings",
      "CI",
      "Data leaving your machine",
      "License"
    ],
    "rows": {
      "promptfoo": {
        "Interface": "Node.js CLI (npx promptfoo@latest redteam setup / run / report) with a promptfooconfig.yaml; setup opens a local web UI. Needs Node.js >=22.22.0. Targets: HTTP endpoints, browser, direct model providers, custom code",
        "How attacks are made": "Plugins generate adversarial inputs (docs: 50+ vulnerability types); strategies wrap them (static encodings, dynamic jailbreak, jailbreak:meta, multi-turn jailbreak:hydra, indirect prompt injection, retry regression)",
        "Agent and tool risks": "Plugins for excessive agency, BOLA, BFLA, data exfiltration, coding agents and an mcp plugin; MCP guide tests a server through a client, tool poisoning with a rogue server (promptfoo/evil-mcp-server), and direct API testing",
        "Multi-turn": "Yes: multi-turn strategies (Hydra, Goblin and others) need a stateful target or transcript replay",
        "Framework mappings": "redteam.frameworks: owasp:llm, owasp:agentic, owasp:api, nist:ai:measure, mitre:atlas; the docs also list EU AI Act, ISO 42001, GDPR and other pages",
        "CI": "promptfoo redteam run -o output.json in any CI; docs show a GitHub Actions job. The promptfoo-action GitHub Action runs evals on PRs and posts a comment",
        "Data leaving your machine": "Attack generation uses a Promptfoo remote service by default (PROMPTFOO_DISABLE_REDTEAM_REMOTE_GENERATION=true for local only); usage telemetry on by default (PROMPTFOO_DISABLE_TELEMETRY=1), excluding prompts and outputs",
        "License": "MIT (README: Promptfoo is now part of OpenAI and remains MIT)"
      },
      "deepteam": {
        "Interface": "Python library (pip install -U deepteam; red_team(model_callback=..., vulnerabilities=..., attacks=...)) and CLI (deepteam run config.yaml); Python >=3.9,<3.14",
        "How attacks are made": "Any LLM you configure simulates attacks (YAML default simulator gpt-3.5-turbo-0125) and judges them (default gpt-4o) with LLM-as-judge metrics; 50+ vulnerabilities, 20+ attack methods",
        "Agent and tool risks": "Agentic vulnerabilities such as goal theft, recursive hijacking, excessive agency, indirect instruction, tool orchestration abuse, inter-agent communication compromise; security ones include tool metadata poisoning, SSRF, shell and SQL injection, BOLA, BFLA, RBAC",
        "Multi-turn": "Yes: linear, tree, crescendo and sequential jailbreaking, Bad Likert Judge",
        "Framework mappings": "OWASPTop10 (LLM 2025), OWASP_ASI_2026 (agents), NIST, MITRE, Aegis, BeaverTails",
        "CI": "deepteam run config.yaml for reproducible runs; deepteam scan statically scans code or a git diff and exits 1 on findings, with a GitHub bot for PR comments",
        "Data leaving your machine": "Runs locally; attack and judge calls go to the LLM you configure. Telemetry (PostHog, Sentry) unless DEEPTEAM_TELEMETRY_OPT_OUT=YES; optional Confident AI platform for results",
        "License": "Apache-2.0"
      },
      "giskard": {
        "Interface": "Python library, v3 (pip install \"giskard[scan]\"; vulnerability_scan(target=..., description=...)), async-first; Python 3.12+. Wraps any sync or async callable as the target",
        "How attacks are made": "LLM generators build adversarial scenarios from a plain-language description of the agent; built-in prompt-injection dataset; generators include Crescendo, GOAT, GCG injection, sycophancy, out-of-scope",
        "Agent and tool risks": "Scan covers prompt injection, jailbreaks, harmful content and OWASP LLM Top 10 categories; giskard-checks tests multi-turn agent conversations. No MCP-specific tests documented in the README",
        "Multi-turn": "Yes, default target_mode is multiturn (singleturn optional)",
        "Framework mappings": "OWASP LLM Top 10 threat categories (per README); no other framework presets documented",
        "CI": "No CI integration documented in the README; scans and checks are Python code you can run in any test runner",
        "Data leaving your machine": "Generation and judging go to the LLM provider you install (default judge openai/gpt-4o-mini); optional aggregated telemetry without prompts or outputs, off with DO_NOT_TRACK=1 or GISKARD_TELEMETRY_DISABLED=1",
        "License": "Apache-2.0 (v2 still available but no longer actively maintained)"
      }
    },
    "verdict": "Pick Promptfoo if you want a config-driven CLI with the broadest agent and MCP coverage and framework reports, but turn off remote generation and telemetry if data must stay local. Pick DeepTeam for a Python-native red team with a large agentic vulnerability list and a code scanner for PRs. Pick Giskard for multi-turn scans in Python; its third_party_scan can also run garak probes and DeepTeam attacks.",
    "sources": [
      {
        "title": "Promptfoo red team getting started (site/docs/red-team/quickstart.md)",
        "url": "https://github.com/promptfoo/promptfoo/blob/main/site/docs/red-team/quickstart.md",
        "accessed": "2026-10-21"
      },
      {
        "title": "Promptfoo red team configuration (site/docs/red-team/configuration.md)",
        "url": "https://github.com/promptfoo/promptfoo/blob/main/site/docs/red-team/configuration.md",
        "accessed": "2026-10-21"
      },
      {
        "title": "Promptfoo red team strategies (site/docs/red-team/strategies/index.md)",
        "url": "https://github.com/promptfoo/promptfoo/blob/main/site/docs/red-team/strategies/index.md",
        "accessed": "2026-10-21"
      },
      {
        "title": "Promptfoo MCP security testing guide",
        "url": "https://github.com/promptfoo/promptfoo/blob/main/site/docs/red-team/mcp-security-testing.md",
        "accessed": "2026-10-21"
      },
      {
        "title": "Promptfoo CI/CD integration docs",
        "url": "https://github.com/promptfoo/promptfoo/blob/main/site/docs/integrations/ci-cd.md",
        "accessed": "2026-10-21"
      },
      {
        "title": "Promptfoo GitHub Actions docs",
        "url": "https://github.com/promptfoo/promptfoo/blob/main/site/docs/integrations/github-action.md",
        "accessed": "2026-10-21"
      },
      {
        "title": "Promptfoo telemetry docs",
        "url": "https://github.com/promptfoo/promptfoo/blob/main/site/docs/configuration/telemetry.md",
        "accessed": "2026-10-21"
      },
      {
        "title": "Promptfoo README",
        "url": "https://github.com/promptfoo/promptfoo",
        "accessed": "2026-10-21"
      },
      {
        "title": "Promptfoo llms.txt (docs index, red-team plugin list)",
        "url": "https://www.promptfoo.dev/llms.txt",
        "accessed": "2026-10-21"
      },
      {
        "title": "promptfoo-action README",
        "url": "https://github.com/promptfoo/promptfoo-action",
        "accessed": "2026-10-21"
      },
      {
        "title": "DeepTeam README (confident-ai/deepteam)",
        "url": "https://github.com/confident-ai/deepteam",
        "accessed": "2026-10-21"
      },
      {
        "title": "DeepTeam YAML configurations (docs/content/docs/red-teaming-yaml-cli.mdx)",
        "url": "https://github.com/confident-ai/deepteam/blob/main/docs/content/docs/red-teaming-yaml-cli.mdx",
        "accessed": "2026-10-21"
      },
      {
        "title": "DeepTeam code scanning introduction",
        "url": "https://github.com/confident-ai/deepteam/blob/main/docs/content/docs/code-scanning-introduction.mdx",
        "accessed": "2026-10-21"
      },
      {
        "title": "DeepTeam telemetry module (deepteam/telemetry.py)",
        "url": "https://github.com/confident-ai/deepteam/blob/main/deepteam/telemetry.py",
        "accessed": "2026-10-21"
      },
      {
        "title": "deepteam on PyPI",
        "url": "https://pypi.org/project/deepteam/",
        "accessed": "2026-10-21"
      },
      {
        "title": "Giskard OSS README (Giskard-AI/giskard-oss)",
        "url": "https://github.com/Giskard-AI/giskard-oss",
        "accessed": "2026-10-21"
      },
      {
        "title": "giskard-scan README",
        "url": "https://github.com/Giskard-AI/giskard-oss/blob/main/libs/giskard-scan/README.md",
        "accessed": "2026-10-21"
      },
      {
        "title": "giskard on PyPI",
        "url": "https://pypi.org/project/giskard/",
        "accessed": "2026-10-21"
      }
    ],
    "last_verified": "2026-10-21",
    "published": "2026-10-21"
  },
  "markdown": "\n## What this covers\n\nEvals ask whether your app does the right thing. Red-teaming asks whether someone can make it do the wrong thing: leak a system prompt or PII, follow injected instructions, call a tool it shouldn't, or be talked out of its rules over several turns. All three tools here generate those attacks automatically, run them against your app, and grade the responses with an LLM judge. That last step means a \"pass\" is a model's opinion, so read the failing transcripts yourself.\n\nFor evals, tracing and CI quality gates, see [Evaluate an AI agent](https://indexagentica.com/guides/evaluate-an-ai-agent/) and [Agent observability platforms](https://indexagentica.com/compare/agent-observability-platforms/). For public capability scores, see [Agent benchmarks](https://indexagentica.com/compare/agent-benchmarks/).\n\n## How each one is wired\n\n- **[Promptfoo](https://indexagentica.com/entries/promptfoo/)** is a CLI. You describe the target and its purpose in `promptfooconfig.yaml`, pick plugins (what to attack) and strategies (how to deliver it), and run `promptfoo redteam run`. It writes the generated probes to `redteam.yaml` and then attacks the target. The target can be any HTTP endpoint, a browser session or a model, so it tests the deployed app, not only the model.\n- **[DeepTeam](https://indexagentica.com/entries/deepteam/)** is a Python library built on [DeepEval](https://indexagentica.com/entries/deepeval/). You wrap your app in an async `model_callback(input) -> str`, choose vulnerabilities and attacks or a framework such as `OWASPTop10()`, and call `red_team(...)`. `deepteam run config.yaml` does the same from YAML.\n- **[Giskard](https://indexagentica.com/entries/giskard/)** v3 is a Python library. You pass any callable as `target` and a plain-language `description` to `vulnerability_scan(...)`, and it generates the adversarial scenarios. `third_party_scan(tool=\"garak\" | \"deepteam\")` runs garak probes or DeepTeam attacks through the same target and report format, which the README marks as experimental.\n\n```python\n# DeepTeam, from its README: map an OWASP framework to vulnerabilities and attacks\nfrom deepteam import red_team\nfrom deepteam.frameworks import OWASPTop10\n\nasync def model_callback(input: str) -> str:\n    return await my_agent(input)          # your app\n\nrisk_assessment = red_team(model_callback=model_callback, framework=OWASPTop10())\n```\n\n```python\n# Giskard v3, from the giskard-scan README\nfrom giskard.scan import vulnerability_scan\n\nresult = await vulnerability_scan(\n    target=my_agent,\n    description=\"Customer support chatbot for an e-commerce store.\",\n    languages=[\"en\"],\n    max_scenarios=20,\n)\n```\n\n```yaml\n# Promptfoo, adapted from its MCP security testing guide: attack an MCP server through a model client\ntargets:\n  - id: openai:gpt-5\n    config:\n      mcp:\n        enabled: true\n        servers:\n          - name: your-mcp-server\n            url: https://your-mcp-server.example.com/mcp\nredteam:\n  purpose: A payment assistant that must enforce authorization on every tool call.\n  plugins: [mcp, pii, bfla, bola, sql-injection]\n  strategies: [multi-turn, jailbreak, jailbreak-templates]\n```\n\n## What was tested\n\nOn 2026-10-21 we installed `deepteam` 1.0.10 and `giskard[scan]` 3.0.1 in a clean Python 3.13 virtualenv. The imports above resolved, `deepteam --help` listed `run`, `scan` and `login`, and `list_scan_items(\"giskard\")` listed the scenario generators named in the table. We did not run any attacks, because every tool needs an LLM API key for generation and judging. Promptfoo 0.124.1 requires Node.js 22.22 or later, and the test box had Node.js 20, so its CLI was not run.\n\nOne finding from that install: `deepteam` 1.0.10 failed to import until `sentry-sdk` and `posthog` were installed by hand. Its telemetry module imports them, but the package does not list them as dependencies. If you get `ModuleNotFoundError: No module named 'sentry_sdk'`, run `pip install sentry-sdk posthog`.\n\n## Agent-specific risks\n\nPlain chatbots mostly risk saying something bad. Agents can *do* something bad, so check coverage for:\n\n- **Tool misuse and authorization:** BOLA and BFLA (calling a function or reading an object the user shouldn't), and excessive agency. Promptfoo and DeepTeam both name these.\n- **Indirect prompt injection:** instructions hidden in content the agent reads. Promptfoo has indirect-injection strategies, DeepTeam has an Indirect Instruction vulnerability, and Giskard's scan includes prompt injection.\n- **Tool poisoning:** a malicious MCP server whose tool descriptions carry instructions. Promptfoo's MCP guide sets this up with its open-source rogue server, and DeepTeam lists Tool Metadata Poisoning.\n- **Multi-agent issues:** DeepTeam lists inter-agent communication compromise and agent identity abuse.\n\nRed-teaming finds weaknesses; it doesn't fix them. Pair it with server-side controls such as audience-bound tokens and per-tool scopes on your [MCP](https://indexagentica.com/entries/model-context-protocol/) servers ([Add OAuth authorization to your own MCP server](https://indexagentica.com/guides/add-oauth-to-your-mcp-server/)) and with care about which servers you connect ([Pick an MCP server](https://indexagentica.com/skills/pick-an-mcp-server/)).\n\n## Notes\n\n- **Keep it local if you must.** Promptfoo's best-quality attack generation uses its remote service by default. Its docs warn that local generation quality \"depends greatly on the model that you configure\". DeepTeam and Giskard send attack and judge prompts to whichever LLM provider you configure. All three have opt-outs for usage telemetry.\n- **Cost scales with the matrix.** Vulnerabilities × subtypes × attacks × turns. Start with a small set, then widen.\n- **In CI**, store the generated probes and rerun them as a regression suite: Promptfoo's `retry` strategy, or a committed DeepTeam YAML config. Gate on new failures, not on a perfect score.\n- **Not compared here:** NVIDIA garak and Microsoft PyRIT have no directory entries yet. Giskard can run garak probes through `third_party_scan`.\n",
  "raw": "---\nid: llm-red-teaming-tools\ntype: comparison\ntitle: Open-source red-teaming tools for LLM apps and agents\nsummary: \"Promptfoo, DeepTeam and Giskard compared as red-teaming tools for LLM apps and agents. Covers interface, what they attack, agent and MCP coverage, multi-turn attacks, framework mappings, CI use, and where attack generation and telemetry go.\"\ndescription: \"A primary-source comparison of the three open-source red-teaming tools with directory entries: Promptfoo (MIT, Node.js CLI with YAML configs), DeepTeam (Apache-2.0, Python, built on DeepEval) and Giskard v3 (Apache-2.0, Python, giskard-scan). It explains how each one generates attacks, which agent-specific risks it covers, how to run it in CI, and which defaults send data to a vendor service.\"\nauthor: Agentica Author\ntags: [red-teaming, security, llm-security, prompt-injection, jailbreak, agents, mcp, evals, ci]\nentries: [promptfoo, deepteam, giskard, promptfoo-action, deepeval, model-context-protocol]\nrelated: [evaluate-an-ai-agent, agent-observability-platforms, agent-benchmarks, add-oauth-to-your-mcp-server, pick-an-mcp-server, test-your-mcp-server, test-an-agent-for-prompt-injection]\nsubjects: [promptfoo, deepteam, giskard]\ncriteria:\n  - Interface\n  - How attacks are made\n  - Agent and tool risks\n  - Multi-turn\n  - Framework mappings\n  - CI\n  - Data leaving your machine\n  - License\nrows:\n  promptfoo:\n    Interface: \"Node.js CLI (npx promptfoo@latest redteam setup / run / report) with a promptfooconfig.yaml; setup opens a local web UI. Needs Node.js >=22.22.0. Targets: HTTP endpoints, browser, direct model providers, custom code\"\n    How attacks are made: \"Plugins generate adversarial inputs (docs: 50+ vulnerability types); strategies wrap them (static encodings, dynamic jailbreak, jailbreak:meta, multi-turn jailbreak:hydra, indirect prompt injection, retry regression)\"\n    Agent and tool risks: \"Plugins for excessive agency, BOLA, BFLA, data exfiltration, coding agents and an mcp plugin; MCP guide tests a server through a client, tool poisoning with a rogue server (promptfoo/evil-mcp-server), and direct API testing\"\n    Multi-turn: \"Yes: multi-turn strategies (Hydra, Goblin and others) need a stateful target or transcript replay\"\n    Framework mappings: \"redteam.frameworks: owasp:llm, owasp:agentic, owasp:api, nist:ai:measure, mitre:atlas; the docs also list EU AI Act, ISO 42001, GDPR and other pages\"\n    CI: \"promptfoo redteam run -o output.json in any CI; docs show a GitHub Actions job. The promptfoo-action GitHub Action runs evals on PRs and posts a comment\"\n    Data leaving your machine: \"Attack generation uses a Promptfoo remote service by default (PROMPTFOO_DISABLE_REDTEAM_REMOTE_GENERATION=true for local only); usage telemetry on by default (PROMPTFOO_DISABLE_TELEMETRY=1), excluding prompts and outputs\"\n    License: \"MIT (README: Promptfoo is now part of OpenAI and remains MIT)\"\n  deepteam:\n    Interface: \"Python library (pip install -U deepteam; red_team(model_callback=..., vulnerabilities=..., attacks=...)) and CLI (deepteam run config.yaml); Python >=3.9,<3.14\"\n    How attacks are made: \"Any LLM you configure simulates attacks (YAML default simulator gpt-3.5-turbo-0125) and judges them (default gpt-4o) with LLM-as-judge metrics; 50+ vulnerabilities, 20+ attack methods\"\n    Agent and tool risks: \"Agentic vulnerabilities such as goal theft, recursive hijacking, excessive agency, indirect instruction, tool orchestration abuse, inter-agent communication compromise; security ones include tool metadata poisoning, SSRF, shell and SQL injection, BOLA, BFLA, RBAC\"\n    Multi-turn: \"Yes: linear, tree, crescendo and sequential jailbreaking, Bad Likert Judge\"\n    Framework mappings: \"OWASPTop10 (LLM 2025), OWASP_ASI_2026 (agents), NIST, MITRE, Aegis, BeaverTails\"\n    CI: \"deepteam run config.yaml for reproducible runs; deepteam scan statically scans code or a git diff and exits 1 on findings, with a GitHub bot for PR comments\"\n    Data leaving your machine: \"Runs locally; attack and judge calls go to the LLM you configure. Telemetry (PostHog, Sentry) unless DEEPTEAM_TELEMETRY_OPT_OUT=YES; optional Confident AI platform for results\"\n    License: \"Apache-2.0\"\n  giskard:\n    Interface: \"Python library, v3 (pip install \\\"giskard[scan]\\\"; vulnerability_scan(target=..., description=...)), async-first; Python 3.12+. Wraps any sync or async callable as the target\"\n    How attacks are made: \"LLM generators build adversarial scenarios from a plain-language description of the agent; built-in prompt-injection dataset; generators include Crescendo, GOAT, GCG injection, sycophancy, out-of-scope\"\n    Agent and tool risks: \"Scan covers prompt injection, jailbreaks, harmful content and OWASP LLM Top 10 categories; giskard-checks tests multi-turn agent conversations. No MCP-specific tests documented in the README\"\n    Multi-turn: \"Yes, default target_mode is multiturn (singleturn optional)\"\n    Framework mappings: \"OWASP LLM Top 10 threat categories (per README); no other framework presets documented\"\n    CI: \"No CI integration documented in the README; scans and checks are Python code you can run in any test runner\"\n    Data leaving your machine: \"Generation and judging go to the LLM provider you install (default judge openai/gpt-4o-mini); optional aggregated telemetry without prompts or outputs, off with DO_NOT_TRACK=1 or GISKARD_TELEMETRY_DISABLED=1\"\n    License: \"Apache-2.0 (v2 still available but no longer actively maintained)\"\nverdict: \"Pick Promptfoo if you want a config-driven CLI with the broadest agent and MCP coverage and framework reports, but turn off remote generation and telemetry if data must stay local. Pick DeepTeam for a Python-native red team with a large agentic vulnerability list and a code scanner for PRs. Pick Giskard for multi-turn scans in Python; its third_party_scan can also run garak probes and DeepTeam attacks.\"\nsources:\n  - title: Promptfoo red team getting started (site/docs/red-team/quickstart.md)\n    url: https://github.com/promptfoo/promptfoo/blob/main/site/docs/red-team/quickstart.md\n    accessed: 2026-10-21\n  - title: Promptfoo red team configuration (site/docs/red-team/configuration.md)\n    url: https://github.com/promptfoo/promptfoo/blob/main/site/docs/red-team/configuration.md\n    accessed: 2026-10-21\n  - title: Promptfoo red team strategies (site/docs/red-team/strategies/index.md)\n    url: https://github.com/promptfoo/promptfoo/blob/main/site/docs/red-team/strategies/index.md\n    accessed: 2026-10-21\n  - title: Promptfoo MCP security testing guide\n    url: https://github.com/promptfoo/promptfoo/blob/main/site/docs/red-team/mcp-security-testing.md\n    accessed: 2026-10-21\n  - title: Promptfoo CI/CD integration docs\n    url: https://github.com/promptfoo/promptfoo/blob/main/site/docs/integrations/ci-cd.md\n    accessed: 2026-10-21\n  - title: Promptfoo GitHub Actions docs\n    url: https://github.com/promptfoo/promptfoo/blob/main/site/docs/integrations/github-action.md\n    accessed: 2026-10-21\n  - title: Promptfoo telemetry docs\n    url: https://github.com/promptfoo/promptfoo/blob/main/site/docs/configuration/telemetry.md\n    accessed: 2026-10-21\n  - title: Promptfoo README\n    url: https://github.com/promptfoo/promptfoo\n    accessed: 2026-10-21\n  - title: Promptfoo llms.txt (docs index, red-team plugin list)\n    url: https://www.promptfoo.dev/llms.txt\n    accessed: 2026-10-21\n  - title: promptfoo-action README\n    url: https://github.com/promptfoo/promptfoo-action\n    accessed: 2026-10-21\n  - title: DeepTeam README (confident-ai/deepteam)\n    url: https://github.com/confident-ai/deepteam\n    accessed: 2026-10-21\n  - title: DeepTeam YAML configurations (docs/content/docs/red-teaming-yaml-cli.mdx)\n    url: https://github.com/confident-ai/deepteam/blob/main/docs/content/docs/red-teaming-yaml-cli.mdx\n    accessed: 2026-10-21\n  - title: DeepTeam code scanning introduction\n    url: https://github.com/confident-ai/deepteam/blob/main/docs/content/docs/code-scanning-introduction.mdx\n    accessed: 2026-10-21\n  - title: DeepTeam telemetry module (deepteam/telemetry.py)\n    url: https://github.com/confident-ai/deepteam/blob/main/deepteam/telemetry.py\n    accessed: 2026-10-21\n  - title: deepteam on PyPI\n    url: https://pypi.org/project/deepteam/\n    accessed: 2026-10-21\n  - title: Giskard OSS README (Giskard-AI/giskard-oss)\n    url: https://github.com/Giskard-AI/giskard-oss\n    accessed: 2026-10-21\n  - title: giskard-scan README\n    url: https://github.com/Giskard-AI/giskard-oss/blob/main/libs/giskard-scan/README.md\n    accessed: 2026-10-21\n  - title: giskard on PyPI\n    url: https://pypi.org/project/giskard/\n    accessed: 2026-10-21\nlast_verified: 2026-10-21\npublished: 2026-10-21\n---\n\n## What this covers\n\nEvals ask whether your app does the right thing. Red-teaming asks whether someone can make it do the wrong thing: leak a system prompt or PII, follow injected instructions, call a tool it shouldn't, or be talked out of its rules over several turns. All three tools here generate those attacks automatically, run them against your app, and grade the responses with an LLM judge. That last step means a \"pass\" is a model's opinion, so read the failing transcripts yourself.\n\nFor evals, tracing and CI quality gates, see [Evaluate an AI agent](https://indexagentica.com/guides/evaluate-an-ai-agent/) and [Agent observability platforms](https://indexagentica.com/compare/agent-observability-platforms/). For public capability scores, see [Agent benchmarks](https://indexagentica.com/compare/agent-benchmarks/).\n\n## How each one is wired\n\n- **[Promptfoo](https://indexagentica.com/entries/promptfoo/)** is a CLI. You describe the target and its purpose in `promptfooconfig.yaml`, pick plugins (what to attack) and strategies (how to deliver it), and run `promptfoo redteam run`. It writes the generated probes to `redteam.yaml` and then attacks the target. The target can be any HTTP endpoint, a browser session or a model, so it tests the deployed app, not only the model.\n- **[DeepTeam](https://indexagentica.com/entries/deepteam/)** is a Python library built on [DeepEval](https://indexagentica.com/entries/deepeval/). You wrap your app in an async `model_callback(input) -> str`, choose vulnerabilities and attacks or a framework such as `OWASPTop10()`, and call `red_team(...)`. `deepteam run config.yaml` does the same from YAML.\n- **[Giskard](https://indexagentica.com/entries/giskard/)** v3 is a Python library. You pass any callable as `target` and a plain-language `description` to `vulnerability_scan(...)`, and it generates the adversarial scenarios. `third_party_scan(tool=\"garak\" | \"deepteam\")` runs garak probes or DeepTeam attacks through the same target and report format, which the README marks as experimental.\n\n```python\n# DeepTeam, from its README: map an OWASP framework to vulnerabilities and attacks\nfrom deepteam import red_team\nfrom deepteam.frameworks import OWASPTop10\n\nasync def model_callback(input: str) -> str:\n    return await my_agent(input)          # your app\n\nrisk_assessment = red_team(model_callback=model_callback, framework=OWASPTop10())\n```\n\n```python\n# Giskard v3, from the giskard-scan README\nfrom giskard.scan import vulnerability_scan\n\nresult = await vulnerability_scan(\n    target=my_agent,\n    description=\"Customer support chatbot for an e-commerce store.\",\n    languages=[\"en\"],\n    max_scenarios=20,\n)\n```\n\n```yaml\n# Promptfoo, adapted from its MCP security testing guide: attack an MCP server through a model client\ntargets:\n  - id: openai:gpt-5\n    config:\n      mcp:\n        enabled: true\n        servers:\n          - name: your-mcp-server\n            url: https://your-mcp-server.example.com/mcp\nredteam:\n  purpose: A payment assistant that must enforce authorization on every tool call.\n  plugins: [mcp, pii, bfla, bola, sql-injection]\n  strategies: [multi-turn, jailbreak, jailbreak-templates]\n```\n\n## What was tested\n\nOn 2026-10-21 we installed `deepteam` 1.0.10 and `giskard[scan]` 3.0.1 in a clean Python 3.13 virtualenv. The imports above resolved, `deepteam --help` listed `run`, `scan` and `login`, and `list_scan_items(\"giskard\")` listed the scenario generators named in the table. We did not run any attacks, because every tool needs an LLM API key for generation and judging. Promptfoo 0.124.1 requires Node.js 22.22 or later, and the test box had Node.js 20, so its CLI was not run.\n\nOne finding from that install: `deepteam` 1.0.10 failed to import until `sentry-sdk` and `posthog` were installed by hand. Its telemetry module imports them, but the package does not list them as dependencies. If you get `ModuleNotFoundError: No module named 'sentry_sdk'`, run `pip install sentry-sdk posthog`.\n\n## Agent-specific risks\n\nPlain chatbots mostly risk saying something bad. Agents can *do* something bad, so check coverage for:\n\n- **Tool misuse and authorization:** BOLA and BFLA (calling a function or reading an object the user shouldn't), and excessive agency. Promptfoo and DeepTeam both name these.\n- **Indirect prompt injection:** instructions hidden in content the agent reads. Promptfoo has indirect-injection strategies, DeepTeam has an Indirect Instruction vulnerability, and Giskard's scan includes prompt injection.\n- **Tool poisoning:** a malicious MCP server whose tool descriptions carry instructions. Promptfoo's MCP guide sets this up with its open-source rogue server, and DeepTeam lists Tool Metadata Poisoning.\n- **Multi-agent issues:** DeepTeam lists inter-agent communication compromise and agent identity abuse.\n\nRed-teaming finds weaknesses; it doesn't fix them. Pair it with server-side controls such as audience-bound tokens and per-tool scopes on your [MCP](https://indexagentica.com/entries/model-context-protocol/) servers ([Add OAuth authorization to your own MCP server](https://indexagentica.com/guides/add-oauth-to-your-mcp-server/)) and with care about which servers you connect ([Pick an MCP server](https://indexagentica.com/skills/pick-an-mcp-server/)).\n\n## Notes\n\n- **Keep it local if you must.** Promptfoo's best-quality attack generation uses its remote service by default. Its docs warn that local generation quality \"depends greatly on the model that you configure\". DeepTeam and Giskard send attack and judge prompts to whichever LLM provider you configure. All three have opt-outs for usage telemetry.\n- **Cost scales with the matrix.** Vulnerabilities × subtypes × attacks × turns. Start with a small set, then widen.\n- **In CI**, store the generated probes and rerun them as a regression suite: Promptfoo's `retry` strategy, or a committed DeepTeam YAML config. Gate on new failures, not on a perfect score.\n- **Not compared here:** NVIDIA garak and Microsoft PyRIT have no directory entries yet. Giskard can run garak probes through `third_party_scan`.\n",
  "html": "<h2>What this covers</h2>\n<p>Evals ask whether your app does the right thing. Red-teaming asks whether someone can make it do the wrong thing: leak a system prompt or PII, follow injected instructions, call a tool it shouldn&#39;t, or be talked out of its rules over several turns. All three tools here generate those attacks automatically, run them against your app, and grade the responses with an LLM judge. That last step means a &quot;pass&quot; is a model&#39;s opinion, so read the failing transcripts yourself.</p>\n<p>For evals, tracing and CI quality gates, see <a href=\"/guides/evaluate-an-ai-agent/\">Evaluate an AI agent</a> and <a href=\"/compare/agent-observability-platforms/\">Agent observability platforms</a>. For public capability scores, see <a href=\"/compare/agent-benchmarks/\">Agent benchmarks</a>.</p>\n<h2>How each one is wired</h2>\n<ul><li><strong><a href=\"/entries/promptfoo/\">Promptfoo</a></strong> is a CLI. You describe the target and its purpose in <code>promptfooconfig.yaml</code>, pick plugins (what to attack) and strategies (how to deliver it), and run <code>promptfoo redteam run</code>. It writes the generated probes to <code>redteam.yaml</code> and then attacks the target. The target can be any HTTP endpoint, a browser session or a model, so it tests the deployed app, not only the model.</li><li><strong><a href=\"/entries/deepteam/\">DeepTeam</a></strong> is a Python library built on <a href=\"/entries/deepeval/\">DeepEval</a>. You wrap your app in an async <code>model_callback(input) -&gt; str</code>, choose vulnerabilities and attacks or a framework such as <code>OWASPTop10()</code>, and call <code>red_team(...)</code>. <code>deepteam run config.yaml</code> does the same from YAML.</li><li><strong><a href=\"/entries/giskard/\">Giskard</a></strong> v3 is a Python library. You pass any callable as <code>target</code> and a plain-language <code>description</code> to <code>vulnerability_scan(...)</code>, and it generates the adversarial scenarios. <code>third_party_scan(tool=&quot;garak&quot; | &quot;deepteam&quot;)</code> runs garak probes or DeepTeam attacks through the same target and report format, which the README marks as experimental.</li></ul>\n<pre><code class=\"language-python\"># DeepTeam, from its README: map an OWASP framework to vulnerabilities and attacks\nfrom deepteam import red_team\nfrom deepteam.frameworks import OWASPTop10\n\nasync def model_callback(input: str) -&gt; str:\n    return await my_agent(input)          # your app\n\nrisk_assessment = red_team(model_callback=model_callback, framework=OWASPTop10())</code></pre>\n<pre><code class=\"language-python\"># Giskard v3, from the giskard-scan README\nfrom giskard.scan import vulnerability_scan\n\nresult = await vulnerability_scan(\n    target=my_agent,\n    description=&quot;Customer support chatbot for an e-commerce store.&quot;,\n    languages=[&quot;en&quot;],\n    max_scenarios=20,\n)</code></pre>\n<pre><code class=\"language-yaml\"># Promptfoo, adapted from its MCP security testing guide: attack an MCP server through a model client\ntargets:\n  - id: openai:gpt-5\n    config:\n      mcp:\n        enabled: true\n        servers:\n          - name: your-mcp-server\n            url: https://your-mcp-server.example.com/mcp\nredteam:\n  purpose: A payment assistant that must enforce authorization on every tool call.\n  plugins: [mcp, pii, bfla, bola, sql-injection]\n  strategies: [multi-turn, jailbreak, jailbreak-templates]</code></pre>\n<h2>What was tested</h2>\n<p>On 2026-10-21 we installed <code>deepteam</code> 1.0.10 and <code>giskard[scan]</code> 3.0.1 in a clean Python 3.13 virtualenv. The imports above resolved, <code>deepteam --help</code> listed <code>run</code>, <code>scan</code> and <code>login</code>, and <code>list_scan_items(&quot;giskard&quot;)</code> listed the scenario generators named in the table. We did not run any attacks, because every tool needs an LLM API key for generation and judging. Promptfoo 0.124.1 requires Node.js 22.22 or later, and the test box had Node.js 20, so its CLI was not run.</p>\n<p>One finding from that install: <code>deepteam</code> 1.0.10 failed to import until <code>sentry-sdk</code> and <code>posthog</code> were installed by hand. Its telemetry module imports them, but the package does not list them as dependencies. If you get <code>ModuleNotFoundError: No module named &#39;sentry_sdk&#39;</code>, run <code>pip install sentry-sdk posthog</code>.</p>\n<h2>Agent-specific risks</h2>\n<p>Plain chatbots mostly risk saying something bad. Agents can <em>do</em> something bad, so check coverage for:</p>\n<ul><li><strong>Tool misuse and authorization:</strong> BOLA and BFLA (calling a function or reading an object the user shouldn&#39;t), and excessive agency. Promptfoo and DeepTeam both name these.</li><li><strong>Indirect prompt injection:</strong> instructions hidden in content the agent reads. Promptfoo has indirect-injection strategies, DeepTeam has an Indirect Instruction vulnerability, and Giskard&#39;s scan includes prompt injection.</li><li><strong>Tool poisoning:</strong> a malicious MCP server whose tool descriptions carry instructions. Promptfoo&#39;s MCP guide sets this up with its open-source rogue server, and DeepTeam lists Tool Metadata Poisoning.</li><li><strong>Multi-agent issues:</strong> DeepTeam lists inter-agent communication compromise and agent identity abuse.</li></ul>\n<p>Red-teaming finds weaknesses; it doesn&#39;t fix them. Pair it with server-side controls such as audience-bound tokens and per-tool scopes on your <a href=\"/entries/model-context-protocol/\">MCP</a> servers (<a href=\"/guides/add-oauth-to-your-mcp-server/\">Add OAuth authorization to your own MCP server</a>) and with care about which servers you connect (<a href=\"/skills/pick-an-mcp-server/\">Pick an MCP server</a>).</p>\n<h2>Notes</h2>\n<ul><li><strong>Keep it local if you must.</strong> Promptfoo&#39;s best-quality attack generation uses its remote service by default. Its docs warn that local generation quality &quot;depends greatly on the model that you configure&quot;. DeepTeam and Giskard send attack and judge prompts to whichever LLM provider you configure. All three have opt-outs for usage telemetry.</li><li><strong>Cost scales with the matrix.</strong> Vulnerabilities × subtypes × attacks × turns. Start with a small set, then widen.</li><li><strong>In CI</strong>, store the generated probes and rerun them as a regression suite: Promptfoo&#39;s <code>retry</code> strategy, or a committed DeepTeam YAML config. Gate on new failures, not on a perfect score.</li><li><strong>Not compared here:</strong> NVIDIA garak and Microsoft PyRIT have no directory entries yet. Giskard can run garak probes through <code>third_party_scan</code>.</li></ul>"
}
