Skip to main content

Shadow AI agent discovery and inventory for the Agent Governance Toolkit

Project description

Agent Discovery

Shadow AI Agent Discovery & Inventory for the Agent Governance Toolkit

License: MIT Python 3.11+


The Problem

68% of employees use unsanctioned AI tools. Most enterprises cannot answer a simple question: How many AI agents are running in my organization right now?

The Agent Governance Toolkit governs agents that register with it — but you can't govern what you can't see. Agent Discovery closes this gap by finding AI agents across your environment, inventorying them with deduplication, and reconciling against your governance registry to surface shadow agents operating outside governance.


Quick Start

Install

pip install agentmesh-discovery                  # Core (process + config scanners)
pip install agentmesh-discovery[github]          # + GitHub scanner
pip install agentmesh-discovery[all]             # Everything including AgentMesh integration

Scan Your Environment

# Scan local processes and filesystem for AI agents
agent-discovery scan

# Scan specific directories
agent-discovery scan -s config -p /path/to/projects -p /path/to/deployments

# Scan a GitHub organization
agent-discovery scan -s github --github-org my-org

# JSON output for CI/CD
agent-discovery scan -o json

View Inventory

agent-discovery inventory                    # Table view
agent-discovery inventory -o summary         # Summary stats
agent-discovery inventory -o json            # JSON export

Reconcile Against Registry

# Compare discovered agents against a registry of known agents
agent-discovery reconcile --registry-file registered-agents.json

Architecture

┌─────────────────────────────────────────────────────────────┐
│                     AGENT DISCOVERY                          │
│                                                              │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐                  │
│  │ Process   │  │ Config   │  │ GitHub   │   ← Scanners     │
│  │ Scanner   │  │ Scanner  │  │ Scanner  │     (pluggable)   │
│  └────┬──────┘  └────┬─────┘  └────┬─────┘                  │
│       │              │              │                         │
│       ▼              ▼              ▼                         │
│  ┌──────────────────────────────────────┐                    │
│  │         Agent Inventory              │  ← Deduplication   │
│  │   (fingerprint-based merge keys)     │    & correlation   │
│  └──────────────┬───────────────────────┘                    │
│                 │                                             │
│       ┌─────────┴──────────┐                                 │
│       ▼                    ▼                                  │
│  ┌──────────┐     ┌──────────────┐                           │
│  │Reconciler│     │ Risk Scorer  │                           │
│  │          │     │              │                            │
│  │ Registry │     │ Identity?    │                            │
│  │ Provider │     │ Owner?       │                            │
│  │ (adapter)│     │ Audit trail? │                            │
│  └──────────┘     └──────────────┘                           │
│       │                    │                                  │
│       ▼                    ▼                                  │
│  Shadow Agents    Risk Assessments                           │
└─────────────────────────────────────────────────────────────┘

Key Design Decisions

  1. Evidence-based discovery — Every finding carries provenance, confidence scores, and detection basis. No black-box results.

  2. Fingerprint deduplication — The same agent found by multiple scanners is merged into one logical agent with multiple observations. Prevents overcounting.

  3. Scanner plugin architectureBaseScanner ABC makes it easy to add new scanner types. Each scanner is independent, stateless, and read-only.

  4. Registry adapter patternRegistryProvider interface decouples reconciliation from any specific governance system. Ship with StaticRegistryProvider and optional AgentMesh adapter.

  5. Security-first defaults — Read-only scanning, secret redaction in process args, allowlist scoping, passive-only by default.


Scanners

Process Scanner (process)

Inspects running processes for signatures of 11 known AI agent frameworks:

  • LangChain / LangGraph
  • CrewAI
  • AutoGen
  • OpenAI Agents SDK
  • Semantic Kernel
  • AGT (AgentMesh / Agent OS)
  • MCP Servers
  • LlamaIndex
  • Haystack
  • PydanticAI
  • Google ADK

Security: Command-line secrets (API keys, tokens, JWTs) are automatically redacted.

Config Scanner (config)

Walks directories looking for agent configuration artifacts:

  • agentmesh.yaml, crewai.yaml, mcp.json, etc.
  • Docker/Compose files referencing agent frameworks
  • Copilot setup files

GitHub Scanner (github)

Searches repositories for agent indicators:

  • Known config files in repo contents
  • Agent framework dependencies in requirements.txt, pyproject.toml, package.json

Requires httpx: pip install agentmesh-discovery[github]


Python API

import asyncio
from agent_discovery import AgentInventory, RiskScorer
from agent_discovery.scanners import ProcessScanner, ConfigScanner
from agent_discovery.reconciler import Reconciler, StaticRegistryProvider

async def discover():
    inventory = AgentInventory(storage_path="~/.agent-governance-python/agent-discovery/inventory.json")
    
    # Run scanners
    process_result = await ProcessScanner().scan()
    config_result = await ConfigScanner().scan(paths=["/opt/agents", "/home/deploy"])
    
    # Ingest with automatic deduplication
    inventory.ingest(process_result)
    inventory.ingest(config_result)
    
    # Reconcile against known agents
    registry = StaticRegistryProvider([
        {"did": "did:agent:prod-assistant", "name": "Production Assistant"},
        {"did": "did:agent:code-reviewer", "name": "Code Reviewer"},
    ])
    reconciler = Reconciler(inventory, registry)
    shadow_agents = await reconciler.reconcile()
    
    # Score risk
    scorer = RiskScorer()
    for shadow in shadow_agents:
        shadow.risk = scorer.score(shadow.agent)
        print(f"⚠ {shadow.agent.name}: {shadow.risk.level.value} ({shadow.risk.score:.0f}/100)")
        for action in shadow.recommended_actions:
            print(f"  → {action}")

asyncio.run(discover())

Data Models

DiscoveredAgent

Field Type Description
fingerprint str Stable dedup key (SHA-256 of merge keys)
name str Best-guess name
agent_type str Framework type (langchain, crewai, etc.)
did str? DID if registered with AgentMesh
owner str? Human/team owner
status AgentStatus registered / shadow / unregistered / unknown
evidence list[Evidence] All observations supporting this finding
confidence float Max confidence across all evidence (0.0-1.0)
merge_keys dict Stable identifiers for deduplication

Evidence

Field Type Description
scanner str Which scanner found this
basis DetectionBasis How it was detected
source str Where (PID, URL, path)
confidence float 0.0 = guess, 1.0 = certain

RiskAssessment

Field Type Description
level RiskLevel critical / high / medium / low / info
score float 0-100 numeric score
factors list[str] Contributing risk factors

Integration with Agent Governance Toolkit

Agent Discovery is designed to feed into the broader AGT governance stack:

Discovery → Inventory → Reconcile → Govern
    │            │           │          │
    │            │           │          └─ Agent OS (policy enforcement)
    │            │           └─ AgentMesh (register identity)
    │            └─ Persistent agent catalog
    └─ Process / Config / GitHub scanners
  1. Discover agents with agent-discovery scan
  2. Register shadow agents with AgentMesh: agentmesh identity create
  3. Govern with Agent OS policies: capability model, privilege rings
  4. Monitor with Agent SRE: SLOs, circuit breakers

Writing Custom Scanners

from agent_discovery.scanners.base import BaseScanner, registry
from agent_discovery.models import ScanResult, DiscoveredAgent, Evidence, DetectionBasis

@registry.register
class MyCustomScanner(BaseScanner):
    @property
    def name(self) -> str:
        return "my-scanner"
    
    async def scan(self, **kwargs) -> ScanResult:
        result = ScanResult(scanner_name=self.name)
        # Your discovery logic here
        agent = DiscoveredAgent(
            fingerprint=DiscoveredAgent.compute_fingerprint({"my_key": "value"}),
            name="Found Agent",
            agent_type="custom",
        )
        agent.add_evidence(Evidence(
            scanner=self.name,
            basis=DetectionBasis.MANUAL,
            source="my-source",
            detail="Custom detection logic",
            confidence=0.9,
        ))
        result.agents.append(agent)
        return result

Security Considerations

  • Read-only — All scanners are passive and never modify the target environment
  • Secret redaction — Process scanner automatically redacts API keys, tokens, and JWTs from command-line arguments
  • Scoped access — Scanners only examine what's explicitly requested (directories, repos, etc.)
  • No content storage — File contents are never stored in the inventory, only metadata and paths
  • Least-privilege credentials — GitHub scanner needs only read access to repos

Contributing

See the Agent Governance Toolkit contributing guide.

License

MIT — see LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

agentmesh_discovery-3.3.0.tar.gz (27.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

agentmesh_discovery-3.3.0-py3-none-any.whl (27.8 kB view details)

Uploaded Python 3

File details

Details for the file agentmesh_discovery-3.3.0.tar.gz.

File metadata

  • Download URL: agentmesh_discovery-3.3.0.tar.gz
  • Upload date:
  • Size: 27.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: RestSharp/106.13.0.0

File hashes

Hashes for agentmesh_discovery-3.3.0.tar.gz
Algorithm Hash digest
SHA256 5132c46b43fd0dd5721945cdd50adcdc4cc057708433e0edaecb3515c745a173
MD5 dd7465ee32fa16f601b299265a41530d
BLAKE2b-256 5abf08ddd1b200a385728ab7a206a7c0e70814387704046bf9771fe626b1a2ec

See more details on using hashes here.

File details

Details for the file agentmesh_discovery-3.3.0-py3-none-any.whl.

File metadata

File hashes

Hashes for agentmesh_discovery-3.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 8ff184f6816eb1e623d6259b898e34316edaf135a7c04e90225c672b3840f6d7
MD5 577efa0ee2d783e7217163e4d3f4c852
BLAKE2b-256 e3f8e7dc32af7c74cef147a8ed7b08fb673dd09ef9436001c5251530e0b920ff

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page