Skip to content

Commit 9bfdfa7

Browse files
committed
chore: rename package and project to tooltrim
1 parent bf856ed commit 9bfdfa7

50 files changed

Lines changed: 266 additions & 266 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.dockerignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ coverage
1616
*.tsbuildinfo
1717

1818
# Local runtime artifacts
19-
.leanmcp
19+
.tooltrim
2020
bench/sandbox
2121
bench/results/*.json
2222
bench/REPORT.md

.github/workflows/ci.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,5 +44,5 @@ jobs:
4444
- name: Smoke-test the CLI
4545
shell: bash
4646
run: |
47-
node bin/leanmcp --version
48-
node bin/leanmcp measure --config examples/demo.config.json
47+
node bin/tooltrim --version
48+
node bin/tooltrim measure --config examples/demo.config.json

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
node_modules/
22
dist/
33
coverage/
4-
.leanmcp/
4+
.tooltrim/
55
*.log
66
.DS_Store
77
.env

.npmignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,4 @@ vitest.config.ts
99
.eslintrc*
1010
.prettierrc*
1111
coverage/
12-
.leanmcp/
12+
.tooltrim/

CONTRIBUTING.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
# Contributing to LeanMCP
1+
# Contributing to Tooltrim
22

3-
Thanks for your interest! LeanMCP is a small project; a quick PR is usually faster than a long discussion.
3+
Thanks for your interest! Tooltrim is a small project; a quick PR is usually faster than a long discussion.
44

55
## Local setup
66

@@ -16,7 +16,7 @@ pnpm build
1616
## Enterprise benchmark (optional)
1717

1818
The numbers in [`bench/REPORT.md`](bench/REPORT.md) / the README hero come from
19-
**`pnpm bench` run inside the Docker image** (`Dockerfile``leanmcp:dev`) so
19+
**`pnpm bench` run inside the Docker image** (`Dockerfile``tooltrim:dev`) so
2020
the baseline is **linux-x64** with a pinned Node, not whatever laptop ran it
2121
last. See [`docs/DOCKER.md`](docs/DOCKER.md) for `docker build` / `docker run`
2222
and how to mount `bench/` so `REPORT.md` updates on the host.
@@ -48,8 +48,8 @@ Conventional commits are nice but not enforced. A short imperative summary is fi
4848

4949
Please include:
5050

51-
- the version of LeanMCP (`leanmcp --version`),
52-
- the **redacted** config (use `leanmcp validate-config` — it strips token-like fields),
53-
- a few lines of `.leanmcp/trace.ndjson` if relevant.
51+
- the version of Tooltrim (`tooltrim --version`),
52+
- the **redacted** config (use `tooltrim validate-config` — it strips token-like fields),
53+
- a few lines of `.tooltrim/trace.ndjson` if relevant.
5454

5555
By contributing, you agree your work is licensed under the same [MIT license](LICENSE) as the project.

Dockerfile

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
# LeanMCP — Linux container image
1+
# Tooltrim — Linux container image
22
#
3-
# Default behavior: starts the LeanMCP proxy on 0.0.0.0:8799 (MCP Streamable HTTP)
3+
# Default behavior: starts the Tooltrim proxy on 0.0.0.0:8799 (MCP Streamable HTTP)
44
# and 0.0.0.0:9464 (Prometheus). It fans out to five upstream MCP servers via
55
# `npx`, so we warm the npm cache for those packages during build to make the
66
# first call fast and self-contained.
77
#
88
# Override CMD to run the bench harness instead, e.g.:
9-
# docker run --rm leanmcp:dev pnpm bench --skip-agent
9+
# docker run --rm tooltrim:dev pnpm bench --skip-agent
1010
#
1111
# Multi-stage layout:
1212
# 1. deps — install ALL dependencies (incl. dev) for build + bench
@@ -112,12 +112,12 @@ RUN set -eux; \
112112

113113
# Filesystem upstream needs a sandbox dir; the bench config defaults to
114114
# /app/bench/sandbox via BENCH_FS_ROOT.
115-
RUN mkdir -p /app/bench/sandbox /app/bench/results /app/.leanmcp
115+
RUN mkdir -p /app/bench/sandbox /app/bench/results /app/.tooltrim
116116

117117
EXPOSE 8799 9464
118118

119119
# dumb-init reaps zombie children spawned by the upstream stdio servers.
120120
ENTRYPOINT ["/usr/bin/dumb-init", "--"]
121121

122122
# Default: start the proxy. Override with `pnpm bench [...]` etc.
123-
CMD ["node", "bin/leanmcp", "start", "--config", "examples/benchmark.docker.config.yaml"]
123+
CMD ["node", "bin/tooltrim", "start", "--config", "examples/benchmark.docker.config.yaml"]

LICENSE

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
MIT License
22

3-
Copyright (c) 2026 LeanMCP contributors
3+
Copyright (c) 2026 Tooltrim contributors
44

55
Permission is hereby granted, free of charge, to any person obtaining a copy
66
of this software and associated documentation files (the "Software"), to deal

README.md

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
1-
# LeanMCP
1+
# Tooltrim
22

33
> An open-source [Model Context Protocol](https://modelcontextprotocol.io) proxy that puts your tool list on a diet.
44
> Aggregate N MCP servers, filter and shrink the noise, and trace every call.
55
6-
[![npm](https://img.shields.io/npm/v/leanmcp.svg)](https://www.npmjs.com/package/leanmcp)
6+
[![npm](https://img.shields.io/npm/v/tooltrim.svg)](https://www.npmjs.com/package/tooltrim)
77
[![license](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
88

99
## Why
1010

1111
Connect three or four MCP servers in a single session and the **tool metadata alone routinely eats 40-50% of the context window** before the user has even typed a question.
1212
The MCP team's [2026 roadmap](https://blog.modelcontextprotocol.io/posts/2026-mcp-roadmap/) explicitly calls out gateways, proxies, and observability as priority work.
1313

14-
**LeanMCP** (`leanmcp` on npm) is a small, drop-in proxy that sits in front of N upstream MCP servers and:
14+
**Tooltrim** (`tooltrim` on npm) is a small, drop-in proxy that sits in front of N upstream MCP servers and:
1515

1616
- **filters** their tool / resource / prompt lists down to the ones your project actually uses,
1717
- **shrinks** verbose tool descriptions and dedupes JSON-Schema sub-trees, deterministically,
@@ -24,7 +24,7 @@ It speaks both `stdio` and `Streamable HTTP` in both directions, runs stateless
2424

2525
## The hero
2626

27-
Measured against five real, official `@modelcontextprotocol/*` servers (`server-everything` + `server-filesystem` + `server-memory` + `server-sequential-thinking` + `server-github`). The numbers below match the checked-in [`bench/REPORT.md`](bench/REPORT.md): full **`pnpm bench`** inside the **`leanmcp:dev` Docker image** (Debian bookworm, **linux-x64**, Node **20.18**), so CI and contributors get the same Linux-shaped baseline as the README—not a hand-tuned Windows-only run.
27+
Measured against five real, official `@modelcontextprotocol/*` servers (`server-everything` + `server-filesystem` + `server-memory` + `server-sequential-thinking` + `server-github`). The numbers below match the checked-in [`bench/REPORT.md`](bench/REPORT.md): full **`pnpm bench`** inside the **`tooltrim:dev` Docker image** (Debian bookworm, **linux-x64**, Node **20.18**), so CI and contributors get the same Linux-shaped baseline as the README—not a hand-tuned Windows-only run.
2828

2929
```text
3030
Scenario Tools Bytes Tokens vs raw (tokens)
@@ -35,7 +35,7 @@ task (filter+shrink) 3 3,165 656 −93.7%
3535
3636
Proxy round-trip overhead +3.7 ms p50 / +6.7 ms p95 (tools/call, bench harness loopback inside container)
3737
Throughput 50 concurrent calls, 0 errors, ~271 ops/sec
38-
Agent (Claude Sonnet 4.5) ~77% fewer cumulative input tokens (direct vs LeanMCP task filter) — see report §5
38+
Agent (Claude Sonnet 4.5) ~77% fewer cumulative input tokens (direct vs Tooltrim task filter) — see report §5
3939
```
4040

4141
Full reproducible report: [`bench/REPORT.md`](bench/REPORT.md). Run the harness on the host with `pnpm bench`, or in Docker (same numbers on Linux) — see [`docs/DOCKER.md`](docs/DOCKER.md) and [`bench/README.md`](bench/README.md).
@@ -46,34 +46,34 @@ Full reproducible report: [`bench/REPORT.md`](bench/REPORT.md). Run the harness
4646

4747
```bash
4848
# 1. install (no global, no daemon, just npx)
49-
pnpm dlx leanmcp --version # or: npx leanmcp --version
49+
pnpm dlx tooltrim --version # or: npx tooltrim --version
5050

5151
# 2. drop a config in your repo root
52-
cp node_modules/leanmcp/examples/leanmcp.config.yaml .
52+
cp node_modules/tooltrim/examples/tooltrim.config.yaml .
5353

54-
# 3. point your MCP client at LeanMCP instead of the individual servers
54+
# 3. point your MCP client at Tooltrim instead of the individual servers
5555
```
5656

5757
Cursor / Claude Desktop / Codex stdio config:
5858

5959
```json
6060
{
6161
"mcpServers": {
62-
"leanmcp": {
62+
"tooltrim": {
6363
"command": "npx",
64-
"args": ["-y", "leanmcp"]
64+
"args": ["-y", "tooltrim"]
6565
}
6666
}
6767
}
6868
```
6969

70-
That's it. `leanmcp` will read `leanmcp.config.yaml` from the cwd, fan out to every upstream listed there, and present a single merged, filtered, shrunk tool list to your client.
70+
That's it. `tooltrim` will read `tooltrim.config.yaml` from the cwd, fan out to every upstream listed there, and present a single merged, filtered, shrunk tool list to your client.
7171

7272
---
7373

7474
## Configuration
7575

76-
A complete example lives in [`examples/leanmcp.config.yaml`](examples/leanmcp.config.yaml).
76+
A complete example lives in [`examples/tooltrim.config.yaml`](examples/tooltrim.config.yaml).
7777

7878
```yaml
7979
servers:
@@ -97,7 +97,7 @@ shrink:
9797
mode: rules # rules | off | llm (v0.2)
9898
maxDescriptionChars: 160
9999
dedupeSchemas: true
100-
cachePath: .leanmcp/shrink-cache.json
100+
cachePath: .tooltrim/shrink-cache.json
101101

102102
inbound:
103103
stdio: true
@@ -109,22 +109,22 @@ inbound:
109109
sessions: stateless # stateless | redis://... (v0.2)
110110

111111
observability:
112-
trace: { sink: file, path: .leanmcp/trace.ndjson }
112+
trace: { sink: file, path: .tooltrim/trace.ndjson }
113113
metrics: { prometheus: { enabled: true, port: 9464 } }
114-
audit: { enabled: true, path: .leanmcp/audit.ndjson }
114+
audit: { enabled: true, path: .tooltrim/audit.ndjson }
115115
```
116116
117117
`${VAR}` and `${VAR:-default}` are expanded from the environment in any string value.
118118

119119
### Config files
120120

121-
`leanmcp` searches for one of these, walking up from the cwd:
121+
`tooltrim` searches for one of these, walking up from the cwd:
122122

123-
- `leanmcp.config.yaml` / `.yml`
124-
- `leanmcp.config.json`
125-
- `leanmcp.config.js` / `.mjs`
126-
- `.leanmcp.yaml` / `.yml` / `.json`
127-
- a `"leanmcp"` key in `package.json`
123+
- `tooltrim.config.yaml` / `.yml`
124+
- `tooltrim.config.json`
125+
- `tooltrim.config.js` / `.mjs`
126+
- `.tooltrim.yaml` / `.yml` / `.json`
127+
- a `"tooltrim"` key in `package.json`
128128

129129
You can also pass `--config <path>` to any command.
130130

@@ -151,7 +151,7 @@ The default `rules` mode is fully deterministic:
151151
5. Truncate at the first sentence boundary past `maxDescriptionChars`.
152152
6. JSON-Schema dedup: any sub-tree that appears 2+ times is hoisted to `$defs` and replaced with `$ref`.
153153

154-
Output is hashed and cached in `.leanmcp/shrink-cache.json`, so the same description always shrinks to the same bytes — your agent never sees a moving target.
154+
Output is hashed and cached in `.tooltrim/shrink-cache.json`, so the same description always shrinks to the same bytes — your agent never sees a moving target.
155155

156156
The `llm` mode (v0.2) adds an optional offline pass that can be checked into git for reproducibility.
157157

@@ -169,8 +169,8 @@ Every JSON-RPC frame in or out is one NDJSON line:
169169
```
170170

171171
```bash
172-
leanmcp trace tail # follow with pretty-printing
173-
leanmcp trace tail --no-pretty # raw NDJSON, pipe to jq / Loki / Datadog
172+
tooltrim trace tail # follow with pretty-printing
173+
tooltrim trace tail --no-pretty # raw NDJSON, pipe to jq / Loki / Datadog
174174
```
175175

176176
### Metrics
@@ -179,32 +179,32 @@ Prometheus endpoint at `http://<host>:9464/metrics`:
179179

180180
| metric | type | labels |
181181
| --- | --- | --- |
182-
| `lean_mcp_calls_total` | counter | `upstream`, `tool`, `ok` |
183-
| `lean_mcp_call_duration_ms` | histogram | `upstream`, `tool`, `ok` |
184-
| `lean_mcp_tokens_saved` | gauge | `upstream` |
185-
| `lean_mcp_upstream_up` | gauge | `upstream` |
182+
| `tooltrim_calls_total` | counter | `upstream`, `tool`, `ok` |
183+
| `tooltrim_call_duration_ms` | histogram | `upstream`, `tool`, `ok` |
184+
| `tooltrim_tokens_saved` | gauge | `upstream` |
185+
| `tooltrim_upstream_up` | gauge | `upstream` |
186186

187187
A starter Grafana dashboard is in [`examples/grafana-dashboard.json`](examples/grafana-dashboard.json).
188188

189189
### OpenTelemetry
190190

191-
Set `OTEL_EXPORTER_OTLP_ENDPOINT` (or enable it in config) and LeanMCP initializes the Node SDK with an OTLP/HTTP trace exporter.
191+
Set `OTEL_EXPORTER_OTLP_ENDPOINT` (or enable it in config) and Tooltrim initializes the Node SDK with an OTLP/HTTP trace exporter.
192192

193193
### Audit
194194

195-
Every `tools/call` lands in `.leanmcp/audit.ndjson` with the identity claims (`sub`, `iss`, `aud`, `scope`, `client_id`) decoded — but **not** verified — from the inbound `Authorization` Bearer token. Run a real auth gateway in front of LeanMCP if you need cryptographic verification.
195+
Every `tools/call` lands in `.tooltrim/audit.ndjson` with the identity claims (`sub`, `iss`, `aud`, `scope`, `client_id`) decoded — but **not** verified — from the inbound `Authorization` Bearer token. Run a real auth gateway in front of Tooltrim if you need cryptographic verification.
196196

197197
---
198198

199199
## CLI
200200

201201
```text
202-
leanmcp # start the proxy (default)
203-
leanmcp start # explicit
204-
leanmcp measure # before/after token report; the README hero
205-
leanmcp validate-config # parse + validate, no startup
206-
leanmcp validate-file <path> # validate a JSON file against the schema
207-
leanmcp trace tail # tail the NDJSON trace
202+
tooltrim # start the proxy (default)
203+
tooltrim start # explicit
204+
tooltrim measure # before/after token report; the README hero
205+
tooltrim validate-config # parse + validate, no startup
206+
tooltrim validate-file <path> # validate a JSON file against the schema
207+
tooltrim trace tail # tail the NDJSON trace
208208
```
209209

210210
All commands accept `-c, --config <path>`.

bench/README.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
# LeanMCP enterprise benchmark
1+
# Tooltrim enterprise benchmark
22

3-
End-to-end harness that proves LeanMCP against five real MCP servers and
3+
End-to-end harness that proves Tooltrim against five real MCP servers and
44
a real Claude Sonnet 4.5 agent loop. Output is `bench/REPORT.md`.
55

66
## Quick start
@@ -30,18 +30,18 @@ files are present.
3030
## Docker (Linux, reproducible)
3131

3232
The checked-in [`REPORT.md`](REPORT.md) hero numbers are produced with
33-
**`pnpm bench` inside the `leanmcp:dev` image** (linux-x64, Node 20) so the
33+
**`pnpm bench` inside the `tooltrim:dev` image** (linux-x64, Node 20) so the
3434
README and the report stay aligned regardless of your host OS.
3535

3636
```bash
37-
docker build -t leanmcp:dev .
37+
docker build -t tooltrim:dev .
3838

3939
docker run --rm \
4040
-e GITHUB_TOKEN="$GITHUB_TOKEN" \
4141
-e ANTHROPIC_API_KEY="$ANTHROPIC_API_KEY" \
4242
-v "$(pwd)/bench/results:/app/bench/results" \
4343
-v "$(pwd)/bench:/app/bench" \
44-
leanmcp:dev \
44+
tooltrim:dev \
4545
pnpm bench
4646
```
4747

@@ -56,7 +56,7 @@ PowerShell: use `${PWD}\bench\...` for the volume paths. Full build/run notes:
5656
| `measure` | For 4 filter scenarios (raw / shrunk / common / task) records bytes + tokens of the merged tool list. | `bench/results/measure.json` |
5757
| `latency` | 100 samples each of `tools/list` and `tools/call (everything.echo)` direct vs through the proxy. | `bench/results/latency.json` |
5858
| `throughput` | 50 concurrent `tools/call` against the proxy, ops/sec + error count. | `bench/results/throughput.json` |
59-
| `agent` | Locked task run twice (direct fan-out vs LeanMCP), Claude Sonnet 4.5, capped at 8 turns × 1024 tokens. | `bench/results/agent{,-direct,-proxy}.json` |
59+
| `agent` | Locked task run twice (direct fan-out vs Tooltrim), Claude Sonnet 4.5, capped at 8 turns × 1024 tokens. | `bench/results/agent{,-direct,-proxy}.json` |
6060
| `report` | Stitches everything into `bench/REPORT.md`. | `bench/REPORT.md` |
6161

6262
## Flags

bench/REPORT.md

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,24 @@
1-
# LeanMCP enterprise benchmark
1+
# Tooltrim enterprise benchmark
22

33
> Five real MCP servers, one ~63-tool fan-out, a Claude Sonnet 4.5 agent loop,
4-
> and the same task run twice — once direct, once through `LeanMCP`.
4+
> and the same task run twice — once direct, once through `Tooltrim`.
55
> Numbers below come from `pnpm bench`; raw JSON is in `bench/results/`.
66
77
- Run timestamp: `2026-05-03T17:36:40.633Z`
88
- Platform: `win32-x64`
99
- Node: `v24.12.0`
10-
- LeanMCP: `v0.1`
10+
- Tooltrim: `v0.1`
1111

1212
## TL;DR
1313

1414
- **Token diet**: 63 tools · 10,401 tokens of metadata at baseline → 3 tools · 656 tokens with the `task` filter. **93.7% reduction.**
1515
- **Proxy overhead**: `tools/call` p50 2.1 ms vs 0.3 ms direct (Δ +1.9 ms p50, +2.8 ms p95).
1616
- **Concurrency**: 50 parallel `tools/call` finished in 101 ms — **495 ops/sec, 0 errors**.
17-
- **Real LLM money**: same Claude Sonnet 4.5 task = 54,714 input tokens direct vs 12,690 through LeanMCP (**−42,024, 76.8% cheaper**).
17+
- **Real LLM money**: same Claude Sonnet 4.5 task = 54,714 input tokens direct vs 12,690 through Tooltrim (**−42,024, 76.8% cheaper**).
1818

1919
## 1. Setup under test
2020

21-
Five MCP servers, all spawned over stdio, all reached through one `LeanMCP` Streamable HTTP inbound:
21+
Five MCP servers, all spawned over stdio, all reached through one `Tooltrim` Streamable HTTP inbound:
2222

2323
| Upstream | Package | Server name | Version | Tools | Initialize ms |
2424
| --- | --- | --- | --- | --- | --- |
@@ -147,7 +147,7 @@ These three servers are listed first in the "Reference Servers" section of the R
147147

148148
## 6. Trace + metrics evidence
149149

150-
Last 10 lines of `.leanmcp/trace.ndjson`:
150+
Last 10 lines of `.tooltrim/trace.ndjson`:
151151

152152
```ndjson
153153
{"level":"info","time":"2026-05-03T17:37:01.058Z","trace":true,"dir":"in","upstream":"everything","method":"tools/call","name":"everything.echo","ok":true,"durMs":22,"msg":"tools/call"}
@@ -165,17 +165,17 @@ Last 10 lines of `.leanmcp/trace.ndjson`:
165165
Live `/metrics` excerpt scraped during the throughput phase:
166166

167167
```text
168-
lean_mcp_calls_total{upstream="everything",tool="everything.echo",ok="true",service="leanmcp"} 51
169-
lean_mcp_call_duration_ms_bucket{le="25",service="leanmcp",upstream="everything",tool="everything.echo",ok="true"} 16
170-
lean_mcp_call_duration_ms_bucket{le="100",service="leanmcp",upstream="everything",tool="everything.echo",ok="true"} 51
171-
lean_mcp_call_duration_ms_bucket{le="250",service="leanmcp",upstream="everything",tool="everything.echo",ok="true"} 51
172-
lean_mcp_call_duration_ms_sum{service="leanmcp",upstream="everything",tool="everything.echo",ok="true"} 1629
173-
lean_mcp_call_duration_ms_count{service="leanmcp",upstream="everything",tool="everything.echo",ok="true"} 51
174-
lean_mcp_upstream_up{upstream="github",service="leanmcp"} 1
175-
lean_mcp_upstream_up{upstream="memory",service="leanmcp"} 1
176-
lean_mcp_upstream_up{upstream="sequentialthinking",service="leanmcp"} 1
177-
lean_mcp_upstream_up{upstream="everything",service="leanmcp"} 1
178-
lean_mcp_upstream_up{upstream="filesystem",service="leanmcp"} 1
168+
tooltrim_calls_total{upstream="everything",tool="everything.echo",ok="true",service="tooltrim"} 51
169+
tooltrim_call_duration_ms_bucket{le="25",service="tooltrim",upstream="everything",tool="everything.echo",ok="true"} 16
170+
tooltrim_call_duration_ms_bucket{le="100",service="tooltrim",upstream="everything",tool="everything.echo",ok="true"} 51
171+
tooltrim_call_duration_ms_bucket{le="250",service="tooltrim",upstream="everything",tool="everything.echo",ok="true"} 51
172+
tooltrim_call_duration_ms_sum{service="tooltrim",upstream="everything",tool="everything.echo",ok="true"} 1629
173+
tooltrim_call_duration_ms_count{service="tooltrim",upstream="everything",tool="everything.echo",ok="true"} 51
174+
tooltrim_upstream_up{upstream="github",service="tooltrim"} 1
175+
tooltrim_upstream_up{upstream="memory",service="tooltrim"} 1
176+
tooltrim_upstream_up{upstream="sequentialthinking",service="tooltrim"} 1
177+
tooltrim_upstream_up{upstream="everything",service="tooltrim"} 1
178+
tooltrim_upstream_up{upstream="filesystem",service="tooltrim"} 1
179179
```
180180

181181
> The trace.ndjson and `/metrics` endpoint are hot during the bench because `examples/benchmark.config.yaml` enables `observability.trace`, `observability.metrics.prometheus`, and `observability.audit`. They're real, not theoretical.

0 commit comments

Comments
 (0)