
Quellgeist Metrics
io.github.Rajeev-ShyamPublished by GitHub account Rajeev-Shyamv0.1.0Updated Oct 24, 2026
Read-only MCP server: query_metrics over local metric time-series (Quellgeist triage).
Overview
A read-only local MCP server exposing a query_metrics tool so an assistant can read local metric time-series for incident triage.
- What you can do
- Query metric time-series: run query_metrics over a local metric series file to retrieve named series and their values for triage reasoning.
- When to use it
- Useful when an assistant needs to inspect local metric time-series during first-line incident triage, alongside log and deploy evidence, without giving it write access to production.
- Requirements
- Runs as a local stdio process launched with uvx from the quellgeist PyPI package, so uv and Python 3.12+ are needed. The QG_METRICS_PATH environment variable points at the metric series file (default demo/metrics.json, resolved against the working directory). Desktop only; no authentication declared.
Installation
In SourceWeft
- Open Quellgeist Metrics in the dashboard and add it to a workspace.
- Enable the server for the chats that should use its tools.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Other MCP clients
Follow the launch instructions in the repository.
README
Quellgeist
[ci] [security] [tuned 4B] [License: MIT] [Python 3.12+]
First-line incident triage you can trust: ranked root-cause hypotheses where every claim cites a real evidence handle — and the agent abstains rather than guess.
Quellgeist is a model-agnostic AI agent for first-line production-incident triage.
It runs a legible JSON-action ReAct loop over read-only tools (structured logs +
recent deploys + metric time-series), then emits a structured Diagnosis:
confidence-ranked root-cause hypotheses, each backed by a structured evidence
handle (LogRef.id / CommitRef.sha / MetricRef.id) the agent actually saw —
never free text. Two ideas set it apart:
- Cite-by-structured-handle. Evidence is a checkable handle, not a sentence, so a fabricated citation is measurable and deterministically rejected by a keyless fabrication check — not a matter of fuzzy string-matching.
- Abstain-over-hallucinate. A confidently-stated wrong cause is the worst possible answer, so "insufficient evidence" is a first-class outcome.
Status: Wave 4 complete — the fine-tune works. The DR-0020 QLoRA fine-tune of the local reasoner (Qwen3-4B, served via Ollama) took it from the base's 0/16 holdout to 12/16 — zero fabrication, zero speculative-filtering, and cheaper than the base — while beating a 31B frontier (Gemma-4-31B, 10/16) on the same holdout at $0, fully offline. Non-memorisation is triangulated three ways (fixtures ≈ holdout; core-fresh ≥ core-overlap; structure probe 7/10). Two honest limits: the
resource_exhaustionclass didn't transfer (0/N; the frontier passes it), and adversarial-abstention recall is 6/12 at the system level — a ceiling the 31B frontier shares (also 6/12), not a fine-tune regression. When this agent misses it's incomplete or too cautious, never confidently fabricating. See Status & roadmap · fine-tune case study.
Why it's different
What it is / what it's NOT
- It is: a first-line triage agent — ranked, evidence-cited root-cause hypotheses (or an honest abstention) from read-only logs/deploys/metrics, over a model-agnostic loop that runs on a hosted frontier model or a local 4B.
- It is NOT: an autonomous remediator (it never mutates prod — resolution verification is a deferred, cut-first wave); a production-hardened service (the demo is a deliberate toy); or a general-purpose agent. The holdout it's measured on is out-of-vocabulary but in-structure — not a claim about unseen incident shapes or real production data.
Quickstart (~30 seconds to a broken service + structured logs)
Requires uv and Python 3.12+.
See a real-shaped diagnosis in one keyless command (no model, no API key):
Then run the full loop against the live toy service:
The live step needs a reasoner — see Running the model.
Without a key, quellgeist diagnose exits 1 with a one-line error + hint (never a
traceback); --demo always works keyless and renders the same output shape
deterministically from gold.
Architecture
A custom, legible loop is the orchestration layer; the three read-only tools are
the evidence interface; the Diagnosis schema is the contract that the
postmortem renderer and the eval judge both read.
All three tools are also exposed as MCP servers over stdio
(python -m quellgeist.servers.logs_mcp, …commits_mcp, …metrics_mcp). The
agent currently reuses the same tool functions in-process behind a ToolSpec
registry; a stdio MCP-client path (the agent driving the servers over the
wire) is on the roadmap (DR-0010).
Deep dive:
docs/architecture.mdwalks the full pipeline (loop → tools → verifier → postmortem), a sequence diagram, the module map, and the cross-cutting design decisions.
The servers publish to the Official MCP Registry on each tagged release (see
docs/publishing.md); once published each is runnable with
uvx --from quellgeist quellgeist-logs-mcp (or …-commits-mcp / …-metrics-mcp).
Example session
Inject the bad deploy — it drops a marker that flips verify_token into a
NoneType regression and writes a deploy_log.json whose offending commit landed
just before the errors (illustrative stdout — the timestamp reflects when you
run it; paths shown relative to the repo root):
With a reasoner configured, quellgeist diagnose reads the logs + deploys and
emits a postmortem. The CI environment has no validated model key (DR-0012), so
the diagnosis below is rendered from gold — built deterministically from the
fixture's labelled cause and evidence handles via render_postmortem, not
live model output:
Reproduce that render yourself (no model needed):
The point isn't the prose — it's that log #2 and commit a1b2c3d are
exact handles into the real signals, not paraphrases. A live run additionally
fills in a one-line summary and suggested actions, and abstains outright when the
evidence is too weak to name a confident cause.
Write the postmortem to a file with --out postmortem.md, or as a self-contained
HTML page with --out postmortem.html (or --format html) — same deterministic
render, no external assets.
Running the model
The reasoner is any LiteLLM model string, selected by
--model or the QG_MODEL env var (default gemini/gemini-3.5-flash). Provider
keys are read from the environment by LiteLLM; nothing is stored in the repo.
Or fully local and offline via Ollama — the intended home default (DR-0008; exact artifact pinned in DR-0019), no API key involved:
Base vs tuned — important. The
ollama pullabove is the base Qwen3-4B: the honest safe floor — it scores 0/16 on the holdout and abstains on everything, never fabricating (DR-0019). The 12/16 headline is the DR-0020 fine-tune (quellgeist-qwen3-dr0020), which you build + serve viafinetune/README.md(a free-Colab QLoRA run →ollama create). Until that tuned GGUF is published for a one-line pull, the base model is what a plainollama pullgives you — safe, not yet useful. Use a hosted model (above) or the fine-tune to see live diagnoses.
Heads-up (DR-0012): a Gemini key on an unvalidated, no-billing project returns
429 limit: 0 on current models, so the shipped CI gate is deliberately
keyless and model-driven evals are key-gated and run out-of-band
(DR-0015). At home the intended default reasoner is a local Qwen3-4B via
Ollama (DR-0008).
Running the eval (reasoner + verifier + LLM-judge)
The fixture eval scores the reasoner with a deterministic keyword judge + a zero-fabrication check (the keyless gate), and can additionally run two model layers (DR-0016): a verifier that confirms cited evidence supports each hypothesis (forcing abstention otherwise) and an advisory LLM-judge rubric.
QG_VERIFIER_MODEL / QG_JUDGE_MODEL override the model per layer (default
QG_MODEL). An unreachable backend (quota/503/timeout) or a rejected
credential (missing/invalid/stale key) is reported as a skip, not a failure
(DR-0015/DR-0017), so the out-of-band eval never reddens on a free-tier hiccup.
The LLM-judge's scores are advisory (they never gate). On a human-labelled
gold subset it agreed with human verdicts at Cohen's kappa 0.81 using an
independent judge (groq/llama-3.1-8b-instant ≠ the reasoner) — validated on that
subset (DR-0018); still self-grading whenever QG_JUDGE_MODEL equals the reasoner.
CI's out-of-band eval runs on Groq (
groq/llama-3.3-70b-versatile, gated onGROQ_API_KEY): Gemini's free tier proved unusable from cloud CI (429 → 503 → timeout → invalid-key), so the reasoner was swapped with one env var — the model-agnostic thesis in action (DR-0017). The intended home default remains a local Qwen3-4B (DR-0008).
Using it on your real data
The demo eats three canonical files; your production signals don't look like that.
quellgeist ingest is the adapter — point it at real sources and it writes the
canonical files the tools read:
It tolerates messy real data (foreign field names are aliased onto the schema,
timestamps normalised to UTC, a malformed line coerced rather than crashing the
run), and query_logs caps how many rows one observation returns (QG_MAX_ROWS,
default 200) so a large log can't blow the context window. The deterministic
cite-or-abstain guarantee runs at real-use time: diagnose verifies every
cited handle against your real signals and warns on a fabrication (--strict-citations
exits non-zero for CI). Full guide: docs/ingestion.md.
Run the live service (v2)
v2 wraps the same frozen core in a live, concurrent, observable incident-response service: a signed webhook triggers an investigation, a worker pool runs the unchanged loop over an isolated per-incident snapshot, every run is persisted to SQLite with its trace and cost, an operator approves / steers / rejects before it posts to Slack + a self-contained HTML page, and after a sandbox fix the agent re-reads signals to confirm recovery. Everything additive; the frozen measurement surface is untouched. The whole stack runs from one file:
Secrets stay env-only (public repo); the service is fail-closed — no webhook secret rejects every request, no operator token closes the operator surface, and it never posts a fabricated or unverified diagnosis. Design: DR-0023 + spec.
Status & roadmap
Built in rolling waves — only the current wave is implemented in detail
(see docs/quellgeist-plan-rolling-wave.md).
The full decision history lives in the
ADR log.
The wave boundary is deliberate, not unfinished: only the current wave is built in
detail, and later waves are scoped but intentionally unimplemented. v2 is additive
over the proven v1 core — the frozen fine-tune measurement surface is never touched
(DR-0023; guarded by tests/frozen/).
Reliability gate
The deterministic CI gate is the reliability contract: 339 tests (ruff +
black via pre-commit, then pytest — covering the loop's never-crash /
graceful-abstention behaviour, the deterministic fabrication check and
cite-based judge gate, the verifier and advisory LLM-judge, parameterised
scenario generation, the judge-validation harness, the server filters, the
postmortem renderer, the fixture-backed eval harness, the real-data ingestion +
robustness layer, an end-to-end real-incident harness, and the v2 live service —
signed webhook, concurrent per-incident isolation, HITL review gate, and the
deterministic sandbox resolution check) on Python 3.12 and 3.13.
Out of band, the model-driven eval runs the reasoner over the 65-scenario suite. The latest full run scored 61/65 passed, 0 fabricated evidence (Cerebras Gemma-4-31B) — per-class breakdown + the failure analysis in the reliability case study.
Development & contributing
See CONTRIBUTING.md for the dev setup, conventions, and the wave model; SECURITY.md for reporting and the no-secrets / toy-demo policy; and CODE_OF_CONDUCT.md for community expectations. Bug reports and feature requests use the issue templates; PRs follow the PR template.
License
MIT © Rajeev Shyam Kumar.
Source: README.md at commit 63c0260
Tools
0Version history
1- v0.1.0LatestSep 16, 2026
Score
50% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
- Reached in the last 30 days25 pts
Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.
- Auth declared10 pts
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
- Tools listed15 pts
Answer tools/list without a credential, or ship a package that starts in a sandbox without one.
- DescriptionRequired15 pts
- Logo10 pts
- Documentation15 pts
- License10 pts