"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.
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.
logs_search checkout-logs READ ok 212mssql_activity prod-db READ ok 96msssh_system_info web-01 READ ok 341msssh_service_control restart nginx on web-01 · awaiting approval rejectapproveAn 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?
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
| Family | Systems | Tools | Examples |
|---|---|---|---|
| Hosts | SSH: commands, SFTP, services | 8 | ssh_exec ssh_service_control |
| Databases | PostgreSQL, MySQL, SQL Server, SQLite | 16 | sql_query sql_activity sql_ask |
| Storage | Amazon S3, Azure Blob, Google Cloud Storage | 8 | storage_list storage_presign_url |
| Orchestration | Kubernetes, Docker | 22 | k8s_logs k8s_rollout_restart docker_ps |
| Cloud | AWS | 17 | aws_ec2_describe_instances aws_logs_insights_query |
| Observability | Prometheus, Loki, Elasticsearch / OpenSearch | 16 | prom_query_range loki_query es_search |
| Logs | SolarWinds Observability | 5 | logs_search logs_tail |
| Cache | Redis | 13 | redis_info redis_slowlog |
| APIs | HTTP APIs with request limits | 2 | http_health_check http_request |
| Cryptography | Vault-held AES keys, SHA digests | 4 | crypto_encrypt crypto_hash |
| Agents | External MCP servers, remote A2A agents | 7 | mcp_call_tool a2a_delegate |
Missing a system? The connector contract is a small, documented interface. Read the connector authoring guide.
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 \ Mode | ReadOnly | ReadWrite | ReadWrite |
|---|---|---|---|
| READ | allow | allow | allow |
| WRITE | deny | approve | allow |
| DESTRUCTIVE | deny | approve | approve* |
* 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.
I hate this place, this zoo, this prison. Mostly the part where you SSH into four hosts to find one log line.
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.
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.
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.
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.
The Compose stack ships Prometheus, Loki, Tempo and Grafana. Every invocation, request and approval is recorded, and chat answers can be rated and reviewed.
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.
Tell me, Mr. Anderson, what good is a pager if you are unable to see the problem?
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.
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.
Pulls pod logs and events, finds the OOM kill, and proposes a rollout restart that waits in the approvals queue until someone signs off.
Describes EC2 instances, runs CloudWatch Logs Insights queries and summarizes what you're paying for, using an IAM role scoped to read.
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.
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.
Publish a standalone chat link with your logo, authenticated or public, backed by scoped access and a read-only health check binding.
The cryptography connector encrypts, decrypts and hashes with vault-held AES keys. The agent does the transformation and never learns the key.
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.
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.
$ 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.
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.
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.
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.
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.
We've been expecting you, Mr. Anderson.
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.