Local-first autonomous AI agent for programming and system automation. Runs against local models (Ollama, vLLM, LM Studio) or any OpenAI-compatible API (OpenRouter, OpenAI, Anthropic-compatible) with native tool calling, MCP support, plan mode, and skills.
Project description
exara-agent
Local-first autonomous AI agent for programming and system automation. Runs against local models (Ollama, vLLM, LM Studio, llama.cpp) or any OpenAI-compatible API (OpenRouter, OpenAI, DeepSeek, Anthropic, Groq) using native tool calling. Ships with a Rich CLI, a Next.js web UI, and MCP (Model Context Protocol) support so you can plug in GitHub, filesystem, Slack, Linear, Postgres, and the rest of the community catalog.
pip install exara-agent
exara init # one-time interactive setup
exara chat # talk to it from any folder
What it does
- ReAct loop with native tool calling — no fragile JSON parsing, the model emits real function calls.
- 30+ built-in tools — file ops, multi-edit, search, shell, background processes, Python execution, git, package install, web fetch, vision, audio, todos, plan mode, subagent delegation.
- MCP client —
~/.ai-agent/mcp.jsonworks the same as Claude Desktop / Cursor: drop in any server from the catalog and the tools appear in the agent. Multi-source merge: bundled defaults → user-global → per-workspace. - Skills system — markdown knowledge packs with auto-activation by stack
(Python, Next.js, FastAPI, …). 10 ship out of the box; add your own at
~/.ai-agent/skills/(global) or./skills/(per-project). - Multi-provider profiles —
exara profile use openrouterto swap. Keys live in~/.ai-agent/profiles.json, never in the repo. - Three-tier permission model —
safe/normal/full, with a hard denylist for destructive commands (rm -rf /,mkfs.*,format c:, …) enforced at every level. - Streaming responses + per-tool diff previews — Claude Code-style UX.
- Auto-context compaction — keeps long sessions inside the model's window without you noticing.
- Hooks — shell commands fired on
session_start,pre_tool_use,post_tool_use, etc. Same model as Claude Code. - Docker sandbox (optional) — route
run_pythonandexecute_terminalthrough a disposable container instead of your host shell. - Secret redaction —
OPENAI_API_KEY=…, GitHub PATs, AWS keys, Bearer tokens, and DB URLs are scrubbed from every tool output before they reach the model.
Install
pip install exara-agent
Or with pipx for global isolation (recommended):
pipx install exara-agent
One-liner installers (detect Python, install pipx if missing, run wizard):
# macOS / Linux
curl -sSL https://raw.githubusercontent.com/santirivera-oss/exara-agent/main/scripts/install.sh | bash
# Windows (PowerShell)
iwr https://raw.githubusercontent.com/santirivera-oss/exara-agent/main/scripts/install.ps1 | iex
First run
exara init
Interactive wizard. Picks a provider, asks for an API key, optionally enables
MCP servers (filesystem / github / memory / sequential-thinking) and writes
a starter skill at ~/.ai-agent/skills/my-preferences.md.
Sanity check
exara doctor # provider reachable? tools loaded? memory writable?
exara skills list # which skills are active in this cwd
exara mcp list # which MCP servers + tools are wired up
Use it
# One-shot task
exara run "summarise the structure of this project"
# Interactive REPL
exara chat
# Web UI (after `npm install` in frontend/)
exara serve # http://127.0.0.1:8765
cd frontend && npm run dev # http://localhost:3100
Slash commands
/help /tools /sessions /resume <id>
/model /plan /init /compact
/stats /todos /ps /clear
Providers
Anything OpenAI-compatible works out of the box. Built-in presets:
| Preset | Endpoint | Default model |
|---|---|---|
ollama-local |
http://localhost:11434 | qwen2.5:7b-instruct |
openrouter |
https://openrouter.ai/api/v1 | deepseek/deepseek-chat |
openai |
https://api.openai.com/v1 | gpt-4o-mini |
anthropic |
https://api.anthropic.com/v1 | claude-haiku-4-5 |
deepseek |
https://api.deepseek.com/v1 | deepseek-chat |
groq |
https://api.groq.com/openai/v1 | llama-3.3-70b-versatile |
lm-studio |
http://localhost:1234/v1 | (whatever you loaded) |
exara profile presets # show the catalog
exara profile add --from openrouter --use
exara profile use ollama-local
Permission levels
| Level | Reads | Writes / shell / python | Confirmation |
|---|---|---|---|
safe |
yes | denied | n/a |
normal |
yes | allowed | required on high-risk |
full |
yes | allowed | skipped |
Destructive command patterns (rm -rf /, mkfs.*, format c:, etc.) are
blocked at every level via the bundled default_config.yaml.
Config layout
~/.ai-agent/
├── profiles.json # provider keys (gitignored by design)
├── mcp.json # global MCP servers
├── config.yaml # optional global overrides
├── skills/ # global skills (always loaded)
│ └── my-preferences.md
├── data/agent.db # conversation memory (SQLite)
└── logs/ # JSON logs
./ # per-workspace overrides
├── .env # env vars (highest precedence)
├── config.yaml # workspace-only overrides
├── mcp.json # workspace MCP servers (merged on top of global)
└── skills/ # workspace skills (override globals by name)
Precedence (low → high): bundled defaults → ~/.ai-agent/config.yaml →
workspace config.yaml → active profile → AI_AGENT_* env vars.
Architecture & docs
docs/ARCHITECTURE.md— internals, ReAct loop, tool registrydocs/MCP.md— how MCP integration worksdocs/ROADMAP.md— what's nextCHANGELOG.md— release notes
Develop
git clone https://github.com/santirivera-oss/exara-agent
cd exara-agent
python -m venv .venv
. .venv/Scripts/Activate.ps1 # PowerShell on Windows
# source .venv/bin/activate # macOS / Linux
pip install -e ".[dev]"
pytest # backend tests
# Web UI
cd frontend
npm install
npm run dev # http://localhost:3100
License
MIT — see LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file exara_agent-0.1.0.tar.gz.
File metadata
- Download URL: exara_agent-0.1.0.tar.gz
- Upload date:
- Size: 129.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8fada2b9c766596dfd63af278b3312dc0fa70a9d6dbefc58969ada6dd121d1fa
|
|
| MD5 |
45c17488b5373ea4be6906b61a0bdac3
|
|
| BLAKE2b-256 |
f448e509010a3418c60413bc043daad8c55d3107f450bfb7b11172101be8118a
|
Provenance
The following attestation bundles were made for exara_agent-0.1.0.tar.gz:
Publisher:
publish.yml on santirivera-oss/exara-agent
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
exara_agent-0.1.0.tar.gz -
Subject digest:
8fada2b9c766596dfd63af278b3312dc0fa70a9d6dbefc58969ada6dd121d1fa - Sigstore transparency entry: 1565997448
- Sigstore integration time:
-
Permalink:
santirivera-oss/exara-agent@b9b0b5ab64a8c6898e45da9838c68e21be8ff6de -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/santirivera-oss
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@b9b0b5ab64a8c6898e45da9838c68e21be8ff6de -
Trigger Event:
push
-
Statement type:
File details
Details for the file exara_agent-0.1.0-py3-none-any.whl.
File metadata
- Download URL: exara_agent-0.1.0-py3-none-any.whl
- Upload date:
- Size: 132.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5f172bd3f8624d78c83cc23eb2f2a423955f0982d5ac535be59ec0976a6d5117
|
|
| MD5 |
78be1a947e3a8442e9319777ab917aa1
|
|
| BLAKE2b-256 |
90d1931e5e432881d59468ff5c29c83a887d34ac7724284013aa9773d3e51beb
|
Provenance
The following attestation bundles were made for exara_agent-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on santirivera-oss/exara-agent
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
exara_agent-0.1.0-py3-none-any.whl -
Subject digest:
5f172bd3f8624d78c83cc23eb2f2a423955f0982d5ac535be59ec0976a6d5117 - Sigstore transparency entry: 1565997452
- Sigstore integration time:
-
Permalink:
santirivera-oss/exara-agent@b9b0b5ab64a8c6898e45da9838c68e21be8ff6de -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/santirivera-oss
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@b9b0b5ab64a8c6898e45da9838c68e21be8ff6de -
Trigger Event:
push
-
Statement type: