Skip to content

Configuration

Human reads configuration from ~/.human/config.json. Environment variables override config values.

| Platform | Path | | ---------- | ---------------------------------- | | Unix/macOS | ~/.human/config.json | | Windows | %USERPROFILE%\.human\config.json |

| Section | Description | | --------------------- | ---------------------------------------------------------- | | default_provider | Default AI provider (e.g. openai, anthropic, ollama) | | default_model | Default model name | | default_temperature | Sampling temperature (0.0–2.0, default 0.7) | | providers | Array of provider entries with name, api_key, base_url | | channels | Channel enablement (cli, telegram, discord, etc.) | | tools | Tool config (enabled_tools, disabled_tools, timeouts) | | memory | Memory backend (sqlite, markdown, none) | | mcp_servers | External MCP server connections (command, args per server) | | cron | Cron job scheduling (enabled, interval) | | security | Sandbox, autonomy level, resource limits | | autonomy | Action limits, workspace scoping | | gateway | Host, port, pairing, webhook HMAC | | tunnel | Tunnel provider (e.g. ngrok) | | runtime | Execution environment (native, docker, wasm) | | agent | Agent behavior (hula, metacognition, tool limits, …) |

When true (default), Human may run HuLa JSON programs for structured multi-step tool use, with policy checks and optional trace files. Set "hula": false under agent to disable.

Full guide: HuLa Programs.

Control how much the agent can do without approval via autonomy.level or security.autonomy_level (0–4):

| Level | autonomy.level | Behavior | | ----- | ---------------- | -------------------------------------------------------- | | 0 | readonly | No shell or file writes; read-only tools only | | 1 | supervised | Ask before destructive or high-impact commands (default) | | 2+ | full | Autonomous execution; use with caution |

Config example:

{
"autonomy": {
"level": "supervised",
"workspace_only": true,
"max_actions_per_hour": 20
},
"security": {
"autonomy_level": 1
}
}

Use HUMAN_AUTONOMY=0 (readonly) through 4 (full) to override via environment.

These override config values when set:

| Variable | Overrides | | --------------------------- | --------------------------- | | HUMAN_PROVIDER | default_provider | | HUMAN_MODEL | default_model | | HUMAN_API_KEY | Default API key | | HUMAN_TEMPERATURE | default_temperature | | HUMAN_GATEWAY_PORT | gateway.port | | HUMAN_GATEWAY_HOST | gateway.host | | HUMAN_WORKSPACE | Workspace directory | | HUMAN_ALLOW_PUBLIC_BIND | gateway.allow_public_bind | | HUMAN_WEBHOOK_HMAC_SECRET | Webhook HMAC secret | | HUMAN_AUTONOMY | Autonomy level (0–4) |

Provider-specific keys (used when no HUMAN_API_KEY or provider-specific key in config):

  • OPENAI_API_KEY — OpenAI
  • ANTHROPIC_API_KEY — Anthropic
  • GEMINI_API_KEY — Google Gemini
  • OLLAMA_HOST — Ollama base URL (e.g. http://localhost:11434)
{
"workspace": "~/.human/workspace",
"default_provider": "openai",
"default_model": "gpt-4o",
"default_temperature": 0.7,
"providers": [
{
"name": "openai",
"api_key": "sk-your-openai-key",
"base_url": null,
"native_tools": true
},
{
"name": "anthropic",
"api_key": "sk-ant-your-anthropic-key"
},
{
"name": "ollama",
"api_key": null,
"base_url": "http://localhost:11434"
}
],
"channels": {
"cli": true,
"default_channel": "cli",
"email": {
"smtp_host": "smtp.gmail.com",
"smtp_port": 587,
"from_address": "bot@example.com",
"smtp_user": "bot@example.com",
"smtp_pass": "app-password",
"imap_host": "imap.gmail.com",
"imap_port": 993
},
"imessage": {
"default_target": "+15551234567"
}
},
"memory": {
"backend": "sqlite",
"auto_save": true,
"sqlite_path": null,
"max_entries": 0
},
"security": {
"sandbox": "auto",
"autonomy_level": 1
},
"autonomy": {
"level": "supervised",
"workspace_only": true,
"max_actions_per_hour": 20
},
"gateway": {
"enabled": true,
"port": 3000,
"host": "127.0.0.1",
"require_pairing": true,
"allow_public_bind": false,
"pair_rate_limit_per_minute": 10,
"webhook_hmac_secret": null
},
"tunnel": {
"provider": "none",
"domain": null
},
"runtime": {
"kind": "native",
"docker_image": null
},
"tools": {
"shell_timeout_secs": 60,
"shell_max_output_bytes": 1048576,
"web_fetch_max_chars": 100000,
"enabled_tools": [],
"disabled_tools": []
},
"mcp_servers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem"]
}
},
"cron": {
"enabled": true,
"interval_minutes": 1
}
}

Each entry in the providers array can have:

| Field | Type | Description | | -------------- | ------- | ------------------------------------------------------------------------------------------------------------------ | | name | string | Provider identifier: openai, anthropic, ollama, llamacpp, lmstudio, vllm, sglang, openrouter, etc. | | api_key | string | API key (optional for local providers) | | base_url | string | Override base URL (e.g. http://localhost:11434 for Ollama) | | native_tools | boolean | Use provider-native tool format (default: true) |

Local providers (no API key required): ollama, llamacpp, llama.cpp, lmstudio, lm-studio, vllm, sglang, osaurus

  • sqlite — SQLite with FTS5 and vector search (requires HU_ENABLE_SQLITE)
  • markdown — File-based markdown files
  • none — No memory

Use enabled_tools and disabled_tools to control which tools are available:

{
"tools": {
"enabled_tools": ["shell", "file_read", "memory_store"],
"disabled_tools": ["browser_open"]
}
}

Empty enabled_tools means all tools are enabled unless listed in disabled_tools.

Connect to external MCP (Model Context Protocol) servers. Human can act as both client and server:

As client — connect to external tool servers at startup:

{
"mcp_servers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem"]
}
}
}

MCP tools are automatically loaded and available to the agent as mcp_0_<tool_name>.

As server — expose all Human tools over MCP:

Terminal window
human mcp

This runs the JSON-RPC 2.0 server on stdin/stdout, compatible with Claude Code and other MCP clients.

Run Human as an always-on service:

Terminal window
human service # Daemonize (background)
human service-loop # Foreground (for containers)
human status # Check if running

The service loop executes cron jobs and will poll configured channels in future releases.