Tares
Tares is an open-source, self-hosted data plane for AI agents. It ingests events like logs, metrics, deploys, Postgres, Vercel, GitHub, OpenTelemetry from your systems and stores them losslessly in embedded DuckDB, and serves them through an MCP server: one correlated, time-ordered read of any entity. It also watches changes in those events and has triggers that fire on a condition. It can push the correlated timeline to a subscribed agent or the agents can read the correlated view of the data via MCP.
It runs as two processes: taresd (the daemon) and tares-mcp (the MCP proxy) both writing to a
single DuckDB file. No external database or broker are needed to get tares up and running.
Documentation: Tares Documentation where you can find quickstart, core concepts, connectors, MCP setup, and deployment guides.
Install and run
uv tool install tares # or: pipx install tares
tares up # daemon + console on http://127.0.0.1:8787
Docker images and server deployment (TLS, auth) are coveredin the server deployment guide (Docker, TLS, auth).
See it work
The fastest way to have something in the timeline is the bundled demo/. It has a small stack
(api-server, Prometheus, traffic) for Tares to ingest from, with fault injection:
cd demo && docker compose up -d && cd - # start the stack to ingest from
Stop the daemon from the previous step (Ctrl-C), then restart it seeded with the demo catalog with three sources, a correlated view, and two triggers:
TARES_CATALOG=demo/catalog.demo.yaml tares up
(The catalog imports only while your catalog is still empty. Already added a source? Restart on a
fresh data directory instead: TARES_CATALOG=demo/catalog.demo.yaml tares up --data-dir ~/tares-demo.)
Open Explore and pick api-server: request logs, latency and error-rate metrics, and alerts —
three sources merged into one time-ordered timeline. That timeline is exactly what an agent gets,
so connect one next and break the demo on purpose.
Skip the demo? Add one of your own sources instead: Sources → Add source in the console. You can see the list of supported connectors.
Connect an agent over MCP
Tares serves its read/watch surface as an MCP server for AI agents. Run the MCP endpoint and point a client (Claude Code, Cursor, Claude Desktop, …) at it:
# 1) the MCP endpoint - a second process (or use the stdio transport and skip this)
tares mcp --transport streamable-http --port 8788 --taresd http://localhost:8787
# 2) connect Claude Code
claude mcp add --transport http tares http://localhost:8788/mcp
Running the demo? Now cause the incident, a 5xx storm, and give it ~30 seconds to be ingested:
./demo/inject.sh error_spike
Then ask your agent:
Use tares: what happened to api-server in the last 15 minutes?
The agent calls read and gets the incident correlated: the HighErrorRate alert Prometheus fired,
the 5xx request logs, and the error-rate spike in one time-ordered response. It has nothing to stitch
together across systems. (The incident trigger fires too, and the catalog ships a Tares agent
that wakes on it and writes its diagnosis back as a finding on the timeline. Please set
ANTHROPIC_API_KEY first, or see demo/. ./demo/inject.sh clear rolls the fault back.)
Other clients, stdio transport, and auth are covered in
connecting AI agents over MCP.
What you get: connectors, reads, triggers, MCP tools
- Connectors: Prometheus (metrics and alerts), Alertmanager, Docker logs, GitHub, Postgres, Vercel, OpenTelemetry (OTLP), a generic webhook, reference documents, agent memory, and Claude Code sessions. Add and configure sources at runtime; a Discover step proposes config for connectors that can introspect. → Connector setup docs
- Reads:
read(selector, window)returns any entity's correlated timeline across all sources with no view required;query(view, …)reads through a saved, narrowed view; agentssubscribeto be pushed the timeline when a trigger fires. → reads, views, and triggers explained - Tares agents: attach a prompt to a trigger and Tares runs it in-process when the trigger fires: it reads the correlated timeline and writes a finding back onto the entity's timeline (so the next agent to read that entity starts ahead). Read-only — it concludes, it doesn't act. → Tares agents
- Slack: subscribe a channel to any trigger with
slack://channel/C0123456789and every firing is posted there as Block Kit — retried, logged in the delivery ledger, and visible in the console like any other subscriber. One bot token per instance (TARES_SLACK_BOT_TOKEN, or set it under Security); the token is never returned by the API. This is the way forward for Slack: an agent's older per-agentslack_webhookstill works, but it is not retried or logged. Ask back from the same channel with the/tares ask <question>slash command — point the Slack app's command athttps://<your-tares>/api/slack/eventsand set the app's signing secret (TARES_SLACK_SIGNING_SECRET, or under Security). Every inbound request is verified by HMAC-SHA256 over the raw body within a 5-minute replay window; with no signing secret configured the endpoint answers 503 rather than trusting anything. - Console: Sources (health + setup), Explore (pick an entity, read its timeline, human or agent view), Views & Triggers, Agents (create Tares agents + connect external ones), and Ask (an in-console assistant over your data, summonable with ⌘K).
- MCP tools:
read,query,subscribe,catalog_list/catalog_describe,derive(an agent authors its own view),remember(write observations back), and source-setup tools. → MCP tools reference
Architecture
Two processes share one DuckDB file. taresd owns the store and runs ingest + trigger evaluation
continuously; tares-mcp is a thin stdio proxy the agent spawns, reaching the daemon over HTTP.
upstream ──poll/push──▶ taresd ──▶ DuckDB ──▶ trigger eval ──fire──▶ webhook ──▶ subscribed agent
▲
read / query / subscribe (HTTP)
│
tares-mcp (MCP proxy) ◀── the agent
DuckDB is single-writer, which is why the daemon owns the DB and everything else goes through its HTTP API. More in Concepts.
Feedback
Bug reports and ideas are very welcome via
GitHub issues or ashish@glassflow.dev.
No telemetry — Tares collects and sends no usage data.
License
MIT.
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 tares-1.0.0.tar.gz.
File metadata
- Download URL: tares-1.0.0.tar.gz
- Upload date:
- Size: 33.1 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
83cc4e6f4abfd9bb84678d87da83aefdeccc17feb7ae351fd5d4983cb4e3d822
|
|
| MD5 |
2859c5cfcaf0eaff5713b5313148efc3
|
|
| BLAKE2b-256 |
ce87a7c659c653ac7f27ada63074eaa8977e107bc6fd9fb12ad8f706093f0a7c
|
Provenance
The following attestation bundles were made for tares-1.0.0.tar.gz:
Publisher:
release.yml on glassflow/navflow
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
tares-1.0.0.tar.gz -
Subject digest:
83cc4e6f4abfd9bb84678d87da83aefdeccc17feb7ae351fd5d4983cb4e3d822 - Sigstore transparency entry: 2348994094
- Sigstore integration time:
-
Permalink:
glassflow/navflow@fb7987775757ced0c9692c1f8ba4dc7d677aa4ad -
Branch / Tag:
refs/tags/v1.0.0 - Owner: https://github.com/glassflow
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@fb7987775757ced0c9692c1f8ba4dc7d677aa4ad -
Trigger Event:
push
-
Statement type:
File details
Details for the file tares-1.0.0-py3-none-any.whl.
File metadata
- Download URL: tares-1.0.0-py3-none-any.whl
- Upload date:
- Size: 909.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
416677506ce16a5924f91947f6b4884a1f2721227745f3529e7f53f998fb8d87
|
|
| MD5 |
e8acf3e5e0af6a6cfc12ec6908217527
|
|
| BLAKE2b-256 |
579bd77ea7005625d0d472ebdba5da112a3273f7c43e173536f93b7e78b0f078
|
Provenance
The following attestation bundles were made for tares-1.0.0-py3-none-any.whl:
Publisher:
release.yml on glassflow/navflow
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
tares-1.0.0-py3-none-any.whl -
Subject digest:
416677506ce16a5924f91947f6b4884a1f2721227745f3529e7f53f998fb8d87 - Sigstore transparency entry: 2348994406
- Sigstore integration time:
-
Permalink:
glassflow/navflow@fb7987775757ced0c9692c1f8ba4dc7d677aa4ad -
Branch / Tag:
refs/tags/v1.0.0 - Owner: https://github.com/glassflow
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@fb7987775757ced0c9692c1f8ba4dc7d677aa4ad -
Trigger Event:
push
-
Statement type: