One agent.
Every system.

Agent Smith connects an AI agent to every part of your production stack (hosts, databases, object storage, logs, caches, clouds and clusters) so you can run it through conversation. Credentials stay sealed in a vault. Every tool call is classified before it runs. Anything risky waits for a human.

Open source · MIT · Self-hosted · Bring your own model

20connector types
100+operational tools
6ways to connect
3effect classes
0secrets in prompts
INTERCEPTED TRANSCRIPT profile: ops · tenant: default
  1. ANDERSONCheckout is slow. What's going on?
  2. SMITHlogs_search checkout-logs READ ok 212ms
  3. SMITHsql_activity prod-db READ ok 96ms
  4. SMITHssh_system_info web-01 READ ok 341ms
  5. SMITHMr. Anderson, the database is fine. nginx on web-01 is holding 2,400 connections in CLOSE_WAIT and checkout requests are queuing behind them. A restart should clear it. It was, if you'll forgive me, inevitable.
  6. SYSTEMDESTRUCTIVE ssh_service_control restart nginx on web-01 · awaiting approval rejectapprove
FILE 01The problem

Your production stack lives in a dozen tabs.

An outage rarely stays in one system. You read logs in one console, query the database in another, SSH into a host, check the cluster, and piece the story together yourself at two in the morning. Agents are good at exactly this kind of cross-system detective work. The hard part has always been letting them in safely.

Why, Mr. Anderson? Why do you persist in opening twelve consoles?
01.1

Agents can't see your systems

A chat assistant can explain what CLOSE_WAIT means. It can't tell you that web-01 is full of them right now. Without real connections, the agent is guessing and you're still the one doing the work.

01.2

Credentials end up in the wrong places

Wiring tools together by hand usually means pasting connection strings into config files, environment variables and, eventually, prompts. Once a password is in a transcript, you no longer control where it goes.

01.3

Access is all or nothing

Give an agent a shell and it can read a log file or drop a table with equal ease. Telling it "please be careful" in the system prompt is a hope, not a control.

I'd like to share a revelation, Mr. Anderson.

Agent Smith is the missing layer between your agent and your infrastructure. You connect each system once, store its credentials encrypted, and decide per agent what it may read, what it may change, and what needs a human to say yes. The model never sees a secret, and policy is enforced by the server rather than by the model's good manners.

FILE 02Method

Connect once. Compose agents. Talk from anywhere.

Everything in Agent Smith is built from three pieces: resources, secrets and agent profiles. Configure them in the dashboard's setup wizard, through the REST API, or with an SDK.

  1. STEP 1

    Add your resources

    Pick a connector, point it at a target (an SSH host, a PostgreSQL server, an S3 bucket, a Kubernetes cluster) and run Test Connection. One resource can serve many agents.

  2. STEP 2

    Seal the credentials

    Passwords, keys and tokens go into an encrypted vault, bound to the resource's secret slots. They resolve at execution time and are never part of a tool argument or a prompt.

  3. STEP 3

    Build an agent profile

    Choose a model, then bind resources with an alias and an access mode: prod-db as ReadOnly, web-01 as ReadWriteWithApproval. Add instructions and runbooks.

  4. STEP 4

    Put it to work

    Chat in the dashboard, publish a standalone chat page, or connect Claude Code, your own app or another agent over MCP, A2A, REST, the SDKs or the OpenAI-compatible API.

// clients
  • Dashboard chat
  • Standalone chat
  • MCP Claude Code, Cursor, Codex
  • A2A agents
  • REST & SDKs C#, Python, JS
  • OpenAI-compatible
// agent smith server
classifyauthorizeapproveexecutelimitrecord
Profiles
persona, model, instructions, bindings
Vault
credentials resolve only at execution
Memory
resource context, documents, conversations
Audit
every call and decision, scrubbed
// your stack
  • Hosts SSH, SFTP, services
  • Databases Postgres, MySQL, SQL Server
  • Storage S3, Azure Blob, GCS
  • Telemetry Loki, Prometheus, Elastic
  • Clusters & cloud K8s, Docker, AWS
  • Other agents MCP, A2A
FILE 03Connectors

Twenty connectors across the systems you actually run.

Each connector ships purpose-built tools, so the agent asks for k8s_logs or sql_activity instead of improvising shell one-liners. Connector schemas drive the resource forms, secret slots, connection tests and tool definitions.

FamilySystemsToolsExamples
HostsSSH: commands, SFTP, services8ssh_exec ssh_service_control
DatabasesPostgreSQL, MySQL, SQL Server, SQLite16sql_query sql_activity sql_ask
StorageAmazon S3, Azure Blob, Google Cloud Storage8storage_list storage_presign_url
OrchestrationKubernetes, Docker22k8s_logs k8s_rollout_restart docker_ps
CloudAWS17aws_ec2_describe_instances aws_logs_insights_query
ObservabilityPrometheus, Loki, Elasticsearch / OpenSearch16prom_query_range loki_query es_search
LogsSolarWinds Observability5logs_search logs_tail
CacheRedis13redis_info redis_slowlog
APIsHTTP APIs with request limits2http_health_check http_request
CryptographyVault-held AES keys, SHA digests4crypto_encrypt crypto_hash
AgentsExternal MCP servers, remote A2A agents7mcp_call_tool a2a_delegate

Missing a system? The connector contract is a small, documented interface. Read the connector authoring guide.

FILE 04Safety model

The server decides. Not the model.

Every tool call is classified as Read, Write or Destructive before it runs. A SELECT is Read, an UPDATE is Write, a DROP or a service restart is Destructive, and anything Agent Smith can't parse is treated conservatively. The binding's access mode then decides what happens.

You hear that, Mr. Anderson? That is the sound of an approval request. Nothing destructive happens until you answer it.
Effect \ ModeReadOnlyReadWriteWithApprovalReadWrite
READallowallowallow
WRITEdenyapproveallow
DESTRUCTIVEdenyapproveapprove*

* unless disabled for the binding. Resource ceilings, deny patterns, tool rules, tenant lockdown and credential scopes narrow access further. Pair them with least-privilege accounts on the target systems.

  • Approvals with a paper trail. A paused call shows the exact arguments, the resource and the reason. Approve or reject it with a note; the agent is told either way and the decision lands in the audit log.
  • Secrets stay sealed. Credentials are encrypted at rest and resolved at execution. A scrubber runs over prompts, logs, request history, audit descriptions and tool output. Hover this: hunter2-prod
  • Multi-tenant by design. Every query filters by tenant. Roles and scoped access decide who can use which agent, and a lockdown switch freezes a tenant when you need it.
  • No side doors. Dashboard, MCP, A2A, REST and the OpenAI-compatible API all pass through the same invocation pipeline.
FILE 04.BBenefits

Built for the people who carry the pager.

I hate this place, this zoo, this prison. Mostly the part where you SSH into four hosts to find one log line.
A

Faster answers during incidents

The agent checks logs, the database and the host, then comes back with a diagnosis instead of a list of places for you to go look.

B

It learns your environment

Agents record what they discover about each resource (paths, services, tables, relationships) and reload it next time. Attach runbooks and log formats as versioned documents.

C

Me. Me. Me too.

Run as many agents as you need. An on-call agent with approval-gated writes, a read-only analytics agent for the data team, a public support bot with one HTTP API. Same resources, different bindings.

D

Works with the agent you already use

Point Claude Code, Cursor or Codex at the MCP endpoint and they get your resources as tools, with approvals still in force. Your model, your loop, our guardrails.

E

Observable from day one

The Compose stack ships Prometheus, Loki, Tempo and Grafana. Every invocation, request and approval is recorded, and chat answers can be rated and reviewed.

F

Yours to run

MIT licensed and self-hosted on Docker Compose, Kubernetes (Kustomize or Helm) or minikube. SQLite out of the box, PostgreSQL when you want it, amd64 and arm64 images.

FILE 05Case files

What people hand to Agent Smith.

Tell me, Mr. Anderson, what good is a pager if you are unable to see the problem?
CASE 001Incident response

"Why is checkout slow?"

Searches the checkout logs, looks at live database activity and checks host load, then tells you which of the three is the actual problem. If the fix is a restart, it asks first.

CASE 002Databases

"Which customers churned last quarter?"

SQL connectors infer schemas and relationships and keep what they learn, so a read-only agent can answer analytics questions without anyone writing the joins.

CASE 003Kubernetes

"The payments pods keep restarting."

Pulls pod logs and events, finds the OOM kill, and proposes a rollout restart that waits in the approvals queue until someone signs off.

CASE 004Cloud

"What's running in us-east-1?"

Describes EC2 instances, runs CloudWatch Logs Insights queries and summarizes what you're paying for, using an IAM role scoped to read.

CASE 005Developer tooling

Production context for your coding agent

Connect Claude Code over MCP to a profile built for development. It can read staging logs and query the dev database while you debug, and nothing more.

CASE 006Agent networks

Delegate to specialists

Expose a profile over A2A so other agents can call it, or attach remote A2A agents and MCP servers so Agent Smith can hand work to them.

CASE 007Self-service

A status page that answers questions

Publish a standalone chat link with your logo, authenticated or public, backed by scoped access and a read-only health check binding.

CASE 008Data protection

Encrypt without exposing keys

The cryptography connector encrypts, decrypts and hashes with vault-held AES keys. The agent does the transformation and never learns the key.

FILE 05.BConnect

Every surface, one server port.

MCP clients bring their own model and loop. Dashboard chat, standalone chat, A2A and the OpenAI-compatible endpoint run Agent Smith's hosted loop with the profile's configured model. Every example authenticates with a bearer token from POST /v1.0/token.

# get a session token, then add Agent Smith to Claude Code
$ HUGO_TOKEN=$(curl -s -X POST http://127.0.0.1:8800/v1.0/token \
    -H "x-email: anderson@hugo.local" -H "x-password: $PASSWORD" | jq -r .token)

$ claude mcp add --transport http hugo http://127.0.0.1:8800/mcp/Hugo \
    --header "Authorization: Bearer $HUGO_TOKEN"

The profile goes in the URL. The client receives that profile's compiled instructions, resource-scoped tools and document catalog. Session tokens expire after an hour; hugo login and hugo mcp stdio handle that for stdio clients.

# the model name is the agent profile
$ curl -s -X POST http://127.0.0.1:8800/v1.0/openai/v1/chat/completions \
    -H "Authorization: Bearer $HUGO_TOKEN" \
    -H "Content-Type: application/json" \
    -d '{"model": "Hugo", "messages": [{"role": "user", "content": "What tables are in demo-db?"}]}'

Any OpenAI-compatible client works. Agent Smith runs its own tools, streams in OpenAI's chunk format, and tells you in the response when a call is waiting for approval.

from hugo_sdk import HugoClient

with HugoClient("http://127.0.0.1:8800") as client:
    client.login("anderson@hugo.local", "password")   # stores a bearer token
    secret = client.secrets.create({"name": "web-01-key", "kind": "Password", "values": {"password": "..."}})
    resource = client.resources.create({
        "name": "web-01", "connectorType": "ssh",
        "settings": {"host": "web-01.example.com", "port": 22, "username": "deploy",
                     "authMethod": "Password"},
        "secretBindings": [{"slotName": "password", "secretId": secret.id}],
    })
    profile = client.agent_profiles.create({"name": "ops", "displayName": "Ops"})
    client.agent_profiles.create_binding(profile.id, {
        "resourceId": resource.id, "alias": "web-01",
        "accessMode": "ReadWriteWithApproval",
    })

SDKs for C# (Hugo.Sdk), Python (hugo-sdk) and JavaScript/TypeScript (@jchristn/hugo-sdk), each with examples and a test harness.

# each profile is an A2A agent with its own card
$ curl -s http://127.0.0.1:8800/v1.0/a2a/default/Hugo/.well-known/agent-card.json

Profiles live at /v1.0/a2a/{tenantId}/{profileName}. Other agents send tasks with a bearer token; the same access modes and approvals apply.

FILE 06Get started

Up and running in 5 minutes, in your stack.

All you need is Docker with Docker Compose. The start script creates your .env, generates keys, and brings up the server, dashboard and observability stack.

  1. Clone and start

    $ git clone https://github.com/jchristn/AgentSmith.git
    $ cd AgentSmith/docker
    $ ./start.sh

    On Windows, run start.bat. Back up docker/.env with your database: it holds the master key that unseals the vault.

  2. Welcome back, Mr. Anderson

    Open http://127.0.0.1:8801 and sign in to tenant default as anderson@hugo.local with password password. Yes, the seeded administrator really is Mr. Anderson. Change the password before anyone else can reach the stack.

  3. Follow the setup wizard

    Add a model endpoint (Ollama or a hosted provider with tool calling), create a secret, add a resource and test it, then bind it to an agent.

  4. Say hello to Agent Smith

    Open Chat and ask about your systems. Tool calls appear inline with their effect, and risky ones wait for you. Expect to be told it was inevitable.

MEMO // just looking?

The factory stack in docker/factory/ is a separate, seeded demo with its own databases, SSH host, MinIO, Redis, Prometheus and Loki. Try every connector without touching anything real.

> factory guide
PORTS // bound to 127.0.0.1
Dashboard
8801
API, MCP, A2A
8800
Grafana
3000
Prometheus
9090

We've been expecting you, Mr. Anderson.

Never send a human to do a machine's job.

Agent Smith is in active development at 0.1.0-alpha. Tell us what your stack looks like, what you'd hand to an agent, and what's missing.