davinci-resolve-mcp 2.95.3 → 2.96.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,84 @@
2
2
 
3
3
  Release history for the DaVinci Resolve MCP Server. The latest release is summarized in the root README; older entries live here to keep the README focused.
4
4
 
5
+ ## What's New in v2.96.0
6
+
7
+ New tool **`timeline_frame`** — the assistant can look at what Resolve is
8
+ rendering instead of inferring it from metadata. Closes
9
+ [#146](https://github.com/samuelgursky/davinci-resolve-mcp/issues/146).
10
+
11
+ ### `timeline_frame(action="capture")`
12
+
13
+ Returns the timeline frame as MCP image content — grade, Fusion, titles,
14
+ transitions, as composited. (For the raw camera file, `media_analysis(action=
15
+ "extract_frames")` is still the right call.)
16
+
17
+ - `timecode` / `frame` — capture anywhere, not just the playhead. Accepts
18
+ absolute (`01:00:15:12`) or elapsed (`00:00:15:12`) timecode, matching the
19
+ marker-parameter contract.
20
+ - `quality` — `preview` (Resolve's thumbnail; fast, writes nothing) or `full`
21
+ (full resolution via a Gallery still, removed again afterwards).
22
+ - `max_width` — bound the context cost. Preview downscales in-process with an
23
+ area average; `full` rescales with ffmpeg, and **fails rather than silently
24
+ returning a full-size frame** when ffmpeg is missing.
25
+ - `format` — `png` (default), `jpg`, or `tif` on the `full` path.
26
+ - `timeline_name` — capture from another timeline; it is made current for the
27
+ read and the original restored after.
28
+
29
+ A capture is a read: the Color page, playhead, current timeline, and Gallery all
30
+ come back as the caller left them.
31
+
32
+ ### Why a separate tool rather than an action on `timeline`
33
+
34
+ FastMCP derives an output schema from a tool's return annotation and validates
35
+ returns against it, so a `-> Dict[str, Any]` tool cannot return image content.
36
+ `timeline_frame` is annotated `-> Any` for that reason — the same reason
37
+ `timeline_markers` already was. The issue asked for a top-level tool, and the
38
+ schema constraint independently forces one.
39
+
40
+ ### Fixed — thumbnail reads no longer misreport a page problem as a missing frame
41
+
42
+ `GetCurrentClipThumbnailImage` returns `None` on every page except Color, with
43
+ nothing to distinguish that from "no frame here."
44
+ `timeline_markers(action="get_thumbnail")` and `get_thumbnail_image` called it
45
+ bare, so off the Color page they reported a missing thumbnail. Both now hold the
46
+ Color page for the read and restore the previous page — the mitigation
47
+ `thumbnail_contact_sheet` already used. When the switch genuinely cannot happen
48
+ (headless, page locked), the error names the Color-page requirement instead.
49
+
50
+ `get_thumbnail_image` now shares the `timeline_frame` capture path, so it picks
51
+ up the fix; its contract is unchanged.
52
+
53
+ ### Fixed — the installer configures Codex CLI
54
+
55
+ The installer claimed Codex support but never wrote its config, so a successful
56
+ install left no `davinci-resolve` entry in `~/.codex/config.toml` — everything
57
+ else (venv, Resolve paths, bridge, server) was in place and only the
58
+ registration was missing. Codex keys MCP servers under a TOML
59
+ `[mcp_servers.<name>]` table, and the installer only knew how to write JSON.
60
+ Closes [#39](https://github.com/samuelgursky/davinci-resolve-mcp/issues/39).
61
+
62
+ `codex` is now a selectable client (included in `--clients all`), writing
63
+ `$CODEX_HOME/config.toml` (default `~/.codex/config.toml`), and `--manual`
64
+ prints a ready-to-paste TOML block.
65
+
66
+ The merge is a text splice, not a parse-and-rewrite, so comments and hand
67
+ formatting survive; an existing `[mcp_servers.davinci-resolve]` table has its
68
+ `command`/`args`/`env` replaced in place. Sub-tables of that entry are kept:
69
+ hand-written Codex configs put per-tool approval modes in
70
+ `[mcp_servers.davinci-resolve.tools.<tool>]`, and an installer that dropped them
71
+ would quietly widen what the agent may do without asking. An
72
+ `[mcp_servers.davinci-resolve.env]` sub-table is regenerated in that same shape
73
+ rather than replaced with an inline `env` — TOML rejects a file that spells one
74
+ key both ways.
75
+
76
+ Paths are escaped as TOML basic strings (Windows backslashes would otherwise
77
+ corrupt the file). The installer refuses to touch a config that is already
78
+ invalid TOML, one that defines the server as an inline key it cannot safely
79
+ rewrite, or a merge result that would not parse — the same
80
+ never-wipe-a-user-config policy the JSON clients follow. Writes are backed up to
81
+ `config.toml.backup` first.
82
+
5
83
  ## What's New in v2.95.3
6
84
 
7
85
  Closes the retime entry's explicit `UNTESTED` warning: **reverse and
package/README.md CHANGED
@@ -2,10 +2,10 @@
2
2
 
3
3
  English | [简体中文](README.zh-CN.md)
4
4
 
5
- [![Version](https://img.shields.io/badge/version-2.95.3-blue.svg)](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
5
+ [![Version](https://img.shields.io/badge/version-2.96.0-blue.svg)](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
6
6
  [![npm](https://img.shields.io/npm/v/davinci-resolve-mcp.svg?label=npm&color=CB3837)](https://www.npmjs.com/package/davinci-resolve-mcp)
7
7
  [![API Coverage](https://img.shields.io/badge/API%20Coverage-100%25-brightgreen.svg)](docs/reference/api-coverage.md)
8
- [![Tools](https://img.shields.io/badge/MCP%20Tools-34%20(353%20full)-blue.svg)](#server-modes)
8
+ [![Tools](https://img.shields.io/badge/MCP%20Tools-35%20(353%20full)-blue.svg)](#server-modes)
9
9
  [![Advanced](https://img.shields.io/badge/Advanced%20(offline)-18%20tools-blueviolet.svg)](#server-modes)
10
10
  [![Tested](https://img.shields.io/badge/Live%20Tested-93.6%25-green.svg)](docs/reference/api-coverage.md#test-results)
11
11
  [![DaVinci Resolve](https://img.shields.io/badge/DaVinci%20Resolve-18.5+-darkred.svg)](https://www.blackmagicdesign.com/products/davinciresolve)
@@ -24,7 +24,7 @@ A local browser control panel ships with the server for inspecting Resolve state
24
24
  npx davinci-resolve-mcp setup
25
25
  ```
26
26
 
27
- Before connecting, open DaVinci Resolve Studio and set **Preferences > General > External scripting using** to **Local**. (On the **free edition** that preference does not help — see [Free edition](#free-edition-in-app-bridge) below.) The npm launcher installs a managed copy under your user application-data directory, then runs the universal Python installer. The installer creates a virtual environment, detects Resolve paths, and can configure Claude Desktop, Claude Code, Cursor, VS Code, Windsurf, Zed, Continue, Cline, Roo Code, OpenCode, and JetBrains IDEs.
27
+ Before connecting, open DaVinci Resolve Studio and set **Preferences > General > External scripting using** to **Local**. (On the **free edition** that preference does not help — see [Free edition](#free-edition-in-app-bridge) below.) The npm launcher installs a managed copy under your user application-data directory, then runs the universal Python installer. The installer creates a virtual environment, detects Resolve paths, and can configure Claude Desktop, Claude Code, Cursor, VS Code, Windsurf, Zed, Continue, Cline, Roo Code, OpenCode, Codex CLI, and JetBrains IDEs.
28
28
 
29
29
  For source installs:
30
30
 
@@ -109,7 +109,7 @@ The command starts a localhost server and opens the control panel in your browse
109
109
 
110
110
  | Mode | Entry point | Tools | Best for |
111
111
  |------|-------------|-------|----------|
112
- | Compound | `src/server.py` | 34 | Default mode for most assistants. Related Resolve operations are grouped behind action parameters to keep context usage low. |
112
+ | Compound | `src/server.py` | 35 | Default mode for most assistants. Related Resolve operations are grouped behind action parameters to keep context usage low. |
113
113
  | Full / granular | `src/server.py --full` or `src/resolve_mcp_server.py` | 353 | Power users who want one MCP tool per Resolve API method. |
114
114
 
115
115
  The compound server is recommended unless you specifically need the granular one-tool-per-method surface.
@@ -272,7 +272,7 @@ The default server is a local stdio process launched by your MCP client; it does
272
272
 
273
273
  | Metric | Value |
274
274
  |--------|-------|
275
- | MCP Tools | **34** compound / **353** granular (live server) |
275
+ | MCP Tools | **35** compound / **353** granular (live server) |
276
276
  | Advanced (offline) tools | **18** — .drp/.drt/.drx + DB authoring, no Resolve running |
277
277
  | Kernel Actions | **136** guarded workflow actions across 9 compound tools |
278
278
  | API Methods Covered | **361/361** (100%) |
package/README.zh-CN.md CHANGED
@@ -2,17 +2,17 @@
2
2
 
3
3
  [English](README.md) | 简体中文
4
4
 
5
- [![Version](https://img.shields.io/badge/version-2.95.3-blue.svg)](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
5
+ [![Version](https://img.shields.io/badge/version-2.96.0-blue.svg)](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
6
6
  [![npm](https://img.shields.io/npm/v/davinci-resolve-mcp.svg?label=npm&color=CB3837)](https://www.npmjs.com/package/davinci-resolve-mcp)
7
7
  [![API Coverage](https://img.shields.io/badge/API%20Coverage-100%25-brightgreen.svg)](docs/reference/api-coverage.md)
8
- [![Tools](https://img.shields.io/badge/MCP%20Tools-34%20(353%20full)-blue.svg)](#服务器模式)
8
+ [![Tools](https://img.shields.io/badge/MCP%20Tools-35%20(353%20full)-blue.svg)](#服务器模式)
9
9
  [![Advanced](https://img.shields.io/badge/Advanced%20(offline)-18%20tools-blueviolet.svg)](#服务器模式)
10
10
  [![Tested](https://img.shields.io/badge/Live%20Tested-93.6%25-green.svg)](docs/reference/api-coverage.md#test-results)
11
11
  [![DaVinci Resolve](https://img.shields.io/badge/DaVinci%20Resolve-18.5+-darkred.svg)](https://www.blackmagicdesign.com/products/davinciresolve)
12
12
  [![Python](https://img.shields.io/badge/python-3.10+-green.svg)](https://www.python.org/downloads/)
13
13
  [![License](https://img.shields.io/badge/license-MIT-blue.svg)](https://opensource.org/licenses/MIT)
14
14
 
15
- > 本翻译对应 v2.95.3 版 README。如与英文原版有出入,以 [英文原版](README.md) 为准。
15
+ > 本翻译对应 v2.96.0 版 README。如与英文原版有出入,以 [英文原版](README.md) 为准。
16
16
 
17
17
  一个 Model Context Protocol (MCP) 服务器,让 AI 助手通过官方脚本 API 控制 DaVinci Resolve Studio(达芬奇)。它提供完整的 API 覆盖,外加带护栏的工作流助手,涵盖剪辑、媒体池整理、渲染设置、审阅标记、调色、Fusion、Fairlight、项目生命周期任务、扩展开发,以及不碰源媒体的媒体分析。
18
18
 
@@ -26,7 +26,7 @@
26
26
  npx davinci-resolve-mcp setup
27
27
  ```
28
28
 
29
- 连接之前,先打开 DaVinci Resolve Studio,把 **Preferences > General > External scripting using** 设为 **Local**。(**免费版**上这个偏好设置不起作用——见下文 [免费版](#免费版应用内桥接)。)npm 启动器会在你的用户应用数据目录下安装一份托管副本,然后运行通用 Python 安装器。安装器会创建虚拟环境、检测 Resolve 路径,并可自动配置 Claude Desktop、Claude Code、Cursor、VS Code、Windsurf、Zed、Continue、Cline、Roo Code、OpenCode 和 JetBrains 系列 IDE。
29
+ 连接之前,先打开 DaVinci Resolve Studio,把 **Preferences > General > External scripting using** 设为 **Local**。(**免费版**上这个偏好设置不起作用——见下文 [免费版](#免费版应用内桥接)。)npm 启动器会在你的用户应用数据目录下安装一份托管副本,然后运行通用 Python 安装器。安装器会创建虚拟环境、检测 Resolve 路径,并可自动配置 Claude Desktop、Claude Code、Cursor、VS Code、Windsurf、Zed、Continue、Cline、Roo Code、OpenCode、Codex CLI 和 JetBrains 系列 IDE。
30
30
 
31
31
  从源码安装:
32
32
 
@@ -81,7 +81,7 @@ venv/bin/python -m src.control_panel
81
81
 
82
82
  | 模式 | 入口 | 工具数 | 适合谁 |
83
83
  |------|------|--------|--------|
84
- | Compound(复合) | `src/server.py` | 34 | 大多数助手的默认模式。相关的 Resolve 操作按 action 参数分组,压低上下文占用。 |
84
+ | Compound(复合) | `src/server.py` | 35 | 大多数助手的默认模式。相关的 Resolve 操作按 action 参数分组,压低上下文占用。 |
85
85
  | Full / granular(细粒度) | `src/server.py --full` 或 `src/resolve_mcp_server.py` | 353 | 想要"一个 Resolve API 方法 = 一个 MCP 工具"的重度用户。 |
86
86
 
87
87
  除非你明确需要一方法一工具的细粒度界面,否则推荐复合模式。
@@ -196,7 +196,7 @@ DRX 调色写入**针对 Resolve Studio 做过实机校准**:调色参数默
196
196
 
197
197
  | 指标 | 数值 |
198
198
  |------|------|
199
- | MCP 工具 | **34** 复合 / **353** 细粒度(实时服务器) |
199
+ | MCP 工具 | **35** 复合 / **353** 细粒度(实时服务器) |
200
200
  | Advanced(离线)工具 | **18**——.drp/.drt/.drx + 数据库创作,无需 Resolve 运行 |
201
201
  | 内核 action | 9 个复合工具下 **136** 个带护栏的工作流 action |
202
202
  | API 方法覆盖 | **361/361**(100%) |
package/docs/SKILL.md CHANGED
@@ -162,7 +162,7 @@ before mutating Resolve state.
162
162
 
163
163
  | Mode | Entry point | Tool count | Use when |
164
164
  |---|---|---|---|
165
- | Compound (default) | `src/server.py` | 34 tools | Most workflows — keeps context lean |
165
+ | Compound (default) | `src/server.py` | 35 tools | Most workflows — keeps context lean |
166
166
  | Granular (full) | `src/server.py --full` | 353 tools | Power users needing one tool per API method |
167
167
 
168
168
  This skill document covers the **compound server** (the default). Each compound
@@ -393,7 +393,7 @@ the work done:
393
393
 
394
394
  - `timeline(action="detect_gaps_overlaps")`
395
395
  - `timeline(action="source_range_report")`
396
- - `timeline_markers(action="get_thumbnail_image")` at important markers and cuts
396
+ - `timeline_frame(action="capture")` at important markers and cuts
397
397
  - Compare each marker name against the Resolve-rendered frame; revise the marker
398
398
  or edit if the image contradicts the plan.
399
399
 
@@ -1492,7 +1492,39 @@ applied — which is different from reading the source file directly.
1492
1492
 
1493
1493
  Use `get_thumbnail_image` when the MCP client can display image content directly.
1494
1494
  It converts the same Resolve thumbnail payload to PNG bytes without writing a
1495
- file to disk.
1495
+ file to disk. Both actions hold the Color page for the read and restore the
1496
+ previous page. Prefer `timeline_frame(action="capture")` for new work — it is the
1497
+ same capture plus a timecode target, `max_width`, and a full-resolution mode.
1498
+
1499
+ **`timeline_frame`** — Capture a timeline frame as viewable image content.
1500
+
1501
+ Key actions: `capture(timecode?|frame?, quality?, max_width?, format?, timeline_name?)`,
1502
+ `capabilities`
1503
+
1504
+ Returns MCP image content, so a multimodal assistant can look at what Resolve is
1505
+ rendering — grade, Fusion, titles, transitions — rather than inferring it from
1506
+ metadata. (For the raw camera file instead, use
1507
+ `media_analysis(action="extract_frames")`.)
1508
+
1509
+ - `quality="preview"` (default) is Resolve's thumbnail: fast, small, writes
1510
+ nothing.
1511
+ - `quality="full"` grabs a Gallery still for a full-resolution frame, then
1512
+ removes it again. `format` is `png` (default), `jpg`, or `tif`.
1513
+ - `max_width` caps the width to conserve context. On `full` this needs ffmpeg;
1514
+ without it the call fails rather than quietly returning a full-size frame.
1515
+ - `timecode` accepts absolute (`01:00:15:12`) or elapsed (`00:00:15:12`) time;
1516
+ `frame` is the absolute timeline frame. Omit both to capture the playhead.
1517
+
1518
+ A capture is a read: the Color page, the playhead, the current timeline, and the
1519
+ Gallery are all restored afterwards.
1520
+
1521
+ ```
1522
+ timeline_frame(action="capture", params={"timecode": "01:00:15:12", "max_width": 1280})
1523
+ ```
1524
+
1525
+ This tool is separate from `timeline` because a tool that returns image content
1526
+ cannot declare a `Dict[str, Any]` output schema — FastMCP validates returns
1527
+ against it, and image content fails that validation.
1496
1528
 
1497
1529
  **`timeline_ai`** — AI/ML analysis on the current timeline.
1498
1530
 
@@ -2046,15 +2078,33 @@ clip's comp, always pass `clip_id`, `timeline_item_id`, or `timeline_item`.
2046
2078
 
2047
2079
  ## Seeing What Resolve Sees (Visual Context)
2048
2080
 
2049
- The server provides two mechanisms to inspect a frame as Resolve has processed it,
2050
- including color grading, effects, and compositing — not just the raw source file.
2081
+ The server provides several mechanisms to inspect a frame as Resolve has processed
2082
+ it, including color grading, effects, and compositing — not just the raw source
2083
+ file.
2084
+
2085
+ **Start here: `timeline_frame(action="capture")`** — Returns the frame at the
2086
+ playhead (or at any `timecode`/`frame` you name) as MCP image content, so a
2087
+ multimodal assistant can simply look at it. `quality="preview"` is fast and
2088
+ writes nothing; `quality="full"` is full resolution; `max_width` bounds the
2089
+ context cost. The Color page, playhead, current timeline, and Gallery are all
2090
+ restored afterwards.
2091
+
2092
+ ```
2093
+ timeline_frame(action="capture", params={"timecode": "01:00:15:12", "max_width": 1280})
2094
+ ```
2051
2095
 
2052
2096
  **`timeline_markers(action="get_thumbnail")`** — Returns raw thumbnail data at
2053
2097
  the current playhead position. The response is a dictionary with keys `data`,
2054
- `format`, `width`, `height`, `noOfComponents`, and `depth`.
2098
+ `format`, `width`, `height`, `noOfComponents`, and `depth`. Use it when you need
2099
+ pixel data for tooling rather than an image to look at.
2100
+
2101
+ **`timeline_markers(action="get_thumbnail_image")`** — The original image-content
2102
+ action, equivalent to `timeline_frame(action="capture")` at default quality with
2103
+ no positional arguments. Kept for existing callers.
2055
2104
 
2056
- **`timeline_markers(action="get_thumbnail_image")`** — Converts the same current
2057
- frame thumbnail to PNG bytes and returns MCP image content without writing a file.
2105
+ **`timeline(action="thumbnail_contact_sheet")`** — Many frames at once as a single
2106
+ labeled PNG written to the analysis root. Use it to review a stretch of cut rather
2107
+ than one moment.
2058
2108
 
2059
2109
  **`gallery_stills(action="grab_and_export", params={...})`** — Grabs a still from
2060
2110
  the current frame on the Color page and returns the image encoded as base64 in the
@@ -63,7 +63,7 @@ This MCP server controls DaVinci Resolve via its Scripting API. Some tools perfo
63
63
  davinci-resolve-mcp/
64
64
  ├── install.py # Universal installer (macOS/Windows/Linux)
65
65
  ├── src/
66
- │ ├── server.py # Compound MCP server — 34 tools (default)
66
+ │ ├── server.py # Compound MCP server — 35 tools (default)
67
67
  │ ├── resolve_mcp_server.py # Thin full-server entrypoint — 353 tools
68
68
  │ ├── granular/ # Modular full-server implementation
69
69
  │ └── utils/ # Platform detection, Resolve connection helpers
package/docs/install.md CHANGED
@@ -88,6 +88,7 @@ The installer can automatically configure any of these clients:
88
88
  | Zed | `~/.config/zed/settings.json` |
89
89
  | Continue | `~/.continue/config.json` |
90
90
  | OpenCode | `~/.config/opencode/opencode.json` (or project-root `opencode.json`) |
91
+ | Codex CLI | `~/.codex/config.toml` (or `$CODEX_HOME/config.toml`) — TOML `[mcp_servers.davinci-resolve]` |
91
92
  | JetBrains IDEs | Manual (Settings > Tools > AI Assistant > MCP) |
92
93
 
93
94
  You can configure multiple clients at once, or use `--clients manual` to get copy-paste config snippets.
@@ -132,7 +133,7 @@ The MCP server comes in two modes:
132
133
 
133
134
  | Mode | File | Tools | Best For |
134
135
  |------|------|-------|----------|
135
- | **Compound** (default) | `src/server.py` | 34 | Most users — fast, clean, low context usage |
136
+ | **Compound** (default) | `src/server.py` | 35 | Most users — fast, clean, low context usage |
136
137
  | **Full** | `src/resolve_mcp_server.py` | 353 | Power users who want one tool per API method |
137
138
 
138
139
  The compound server's `timeline_item` tool includes dedicated actions for common workflows:
@@ -196,6 +197,21 @@ If you prefer to set things up yourself, add to your MCP client config:
196
197
  }
197
198
  ```
198
199
 
200
+ Codex CLI uses TOML instead. Add to `~/.codex/config.toml` (or
201
+ `$CODEX_HOME/config.toml`):
202
+
203
+ ```toml
204
+ [mcp_servers.davinci-resolve]
205
+ command = "/path/to/venv/bin/python"
206
+ args = ["/path/to/davinci-resolve-mcp/src/server.py"]
207
+ env = { RESOLVE_SCRIPT_API = "/path/to/DaVinci Resolve/Developer/Scripting", RESOLVE_SCRIPT_LIB = "/path/to/fusionscript.so-or-dll", PYTHONPATH = "/path/to/DaVinci Resolve/Developer/Scripting/Modules" }
208
+ ```
209
+
210
+ Paths must be absolute — Codex does not expand `~`. Run
211
+ `python install.py --clients codex` to have the installer write this block for
212
+ you (it merges into an existing config and leaves your other servers and
213
+ comments alone).
214
+
199
215
  On Windows, installer-generated configs also include `PYTHONHOME`. That scopes Resolve's Python binding to the selected interpreter and avoids the Resolve 20.3 multi-Python crash reported in [Issue #26](https://github.com/samuelgursky/davinci-resolve-mcp/issues/26).
200
216
 
201
217
  For Resolve's **Network** scripting mode, add
@@ -6,7 +6,7 @@ Complete Resolve scripting API coverage, live-test status, and method-by-method
6
6
 
7
7
  | Metric | Value |
8
8
  |--------|-------|
9
- | MCP Tools | **34** compound (default) / **353** granular |
9
+ | MCP Tools | **35** compound (default) / **353** granular |
10
10
  | Kernel Actions | **136** guarded MCP workflow actions across 9 compound tools |
11
11
  | API Methods Covered | **361/361** (100%) |
12
12
  | Methods Live Tested | **338/361** (93.6%) |
@@ -17,7 +17,7 @@ Complete Resolve scripting API coverage, live-test status, and method-by-method
17
17
 
18
18
  ## API Coverage
19
19
 
20
- Every non-deprecated method in the DaVinci Resolve Scripting API is covered. The default compound server exposes **34 tools** that group related operations by action parameter, keeping LLM context windows lean. The full granular server provides **353 individual tools** for power users. Both modes cover all 13 API object classes. MCP-level kernel actions are tracked separately in [Kernel Action Coverage](../kernels/README.md).
20
+ Every non-deprecated method in the DaVinci Resolve Scripting API is covered. The default compound server exposes **35 tools** that group related operations by action parameter, keeping LLM context windows lean. The full granular server provides **353 individual tools** for power users. Both modes cover all 13 API object classes. MCP-level kernel actions are tracked separately in [Kernel Action Coverage](../kernels/README.md).
21
21
 
22
22
  The 34th compound tool is `timeline_versioning` (C6) — an MCP-level workflow
23
23
  tool, not a wrapper around a Resolve API method. It surfaces the