Metal GPU Trace
PYPI · METAL-GPU-TRACE
Measure Wine and macOS programs' GPU use on Apple silicon with Metal System Trace
Available components
Last scanned (14 hours ago)
Scores higher than 68% of PyPI servers
Category Monitoring and Observability
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security50
- Malware scan not yet available for this package.Unverified
- No known CVEs affecting this package version or its production dependencies.Pass
- Runs hatchling.build at install time, a recognised build step with no custom scripting around it. View diagnostics → Pass
- No production dependencies, so there is no dependency health to assess. View diagnostics → Pass
Provenance & Transparency97
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Cryptographically verified build provenance (signed, bound to partprogramming09/metal-gpu-trace). View diagnostics → Pass
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 1 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability76
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (good).Pass
- Context-footprint check failed: tool/resource definitions use about 5346 tokens (~198/item across 27 items; 22 tools + 5 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management57
- Stability observed for 17 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 22 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 24 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities60
- Spec-recency check failed: implements MCP spec 2025-06-18; the latest is 2026-07-28. See how to fix → Fail
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 3 Nov 26 0
- Schema quality: 135 → 198 ▼ functional
- Schema quality: 135 → 172 ▼ functional
- Package version: 0.10.2 → 0.16.0 functional
- Package version: 0.10.2 → 0.14.0 functional
- 2 Nov 26 −15
- Malware scan: pass → unverified ▼ security
- First check of Tool coverage: 100 functional
- Package version: 0.8.4 → 0.10.2 functional
- Package version: 0.8.4 → 0.10.1 functional
- Package version: 0.8.4 → 0.10.0 functional
- Package version: 0.8.4 → 0.9.1 functional
- 1 Nov 26 +7
- Tool safety: pass → unverified ▼ security
- Malware scan: pass → unverified ▼ security
- Stability: Stability not yet verified: we do not have a sandbox capture of the MCP schema this version of the package serves yet. security
- Capabilities: fail → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- Schema quality: 100 → unverified ▼ functional
- Stability: unverified → 0.47 ▲ functional
- Package version: 0.7.1 → 0.8.4 functional
- Package version: 0.7.1 → 0.8.3 functional
- Package version: 0.7.1 → 0.8.1 functional
- 31 Oct 26 +15
- Malware scan: unverified → pass ▲ security
- 29 Oct 26 −15
- Malware scan: pass → unverified ▼ security
- 27 Oct 26 +15
- Malware scan: unverified → pass ▲ security
- 26 Oct 26 −15
- Malware scan: pass → unverified ▼ security
- 22 Oct 26 +15
- Malware scan: unverified → pass ▲ security
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 4 Nov 2026 · Analysed pypi/metal-gpu-trace@0.16.0
Provenance Verified
A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.
| Result | Verified |
|---|---|
| Ecosystem | pypi |
| Reason | Verified |
| Discovered via | Registry attestation endpoint |
| Source repo | partprogramming09/metal-gpu-trace |
| Certificate issuer | https://token.actions.githubusercontent.com |
| Certificate SAN | https://github.com/partprogramming09/metal-gpu-trace/.github/workflows/publish.yml@refs/tags/v0.16.0 |
| Rekor log index | 3658236755 |
| Predicate type | PyPI publish attestation https://docs.pypi.org/attestations/publish/v1 |
| Subject digest | sha256:c2c6202f341371917b798c8964a211c531b771a10dd92499112a682559bdd657 |
Background: How many MCP packages publish verified provenance →
Install scripts 1 script
| Hook | Tier | Command |
|---|---|---|
| build_backend | allowlisted | hatchling.build |
Background: Why install scripts are a supply-chain risk →
Dependencies 0 packages
| Packages resolved | 0 |
|---|---|
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
capture_records ~93
Returns one page of the records of a .gputrace command stream, with their Metal call names when known.
| Name | Type | Req | Description |
|---|---|---|---|
| capture | string | yes | path of a .gputrace bundle saved from Xcode, inside METAL_TRACE_OUT or METAL_TRACE_READ |
| limit | integer | – | rows per page, default 50, at most 500 |
| offset | integer | – | first row, default 0 |
| Name | Type | Req | Description |
|---|---|---|---|
| next_offset | integer|null | yes | – |
| offset | integer | yes | – |
| rows | array | yes | – |
| total | integer | yes | – |
No examples provided.
capture_summary ~75
Reads a Metal .gputrace capture without Xcode: command buffers, encoders, draws, debug groups, and the 100 most frequent call ids out of calls_total.
| Name | Type | Req | Description |
|---|---|---|---|
| capture | string | yes | path of a .gputrace bundle saved from Xcode, inside METAL_TRACE_OUT or METAL_TRACE_READ |
Structured output declared, but exposes no named fields.
No examples provided.
gpu_family ~92
Apple's published facts for one GPU family, by family ("Apple7") or chip ("M1 Pro"): its chips, what it adds, its limits, plus the limits shared by all families and the footnotes. Source URLs are in the result.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | a family (Apple7 to Apple10) or a chip (M1 Pro, M2, M4 Max, A17 Pro) |
Structured output declared, but exposes no named fields.
No examples provided.
perf_ab ~581
Records the same program with two environments in the order A B B A (repeated `rounds` times, so drift hits both sides equally) and says per metric whether B is better, worse or the same as A, with every value behind it. env_a and env_b are NAME=VALUE pairs separated by spaces; empty means none. Runs are named `name`-a1, `name`-b1, ... Each recording takes its seconds plus about a minute to read back. skip_s leaves out the first seconds of every recording (the start-up) when the verdicts are drawn, as perf_compare does; the recordings are whole.
| Name | Type | Req | Description |
|---|---|---|---|
| api | string | – | with workload: mtl (native Metal), vk (Vulkan through MoltenVK: set METAL_TRACE_MOLTENVK), d3d11 or d3d12 (under wine) |
| args | string | – | program arguments as in a shell, quotes included |
| counters | boolean | – | default false; true also records Metal GPU Counters (gpu_counters in the summary); not under Windows; adds about 40 s of read-back per recorded second |
| dim | integer | – | with workload drawstress: side of the cube grid, dim^3 draws per frame |
| env_a | string | yes | NAME=VALUE pairs for side A, the reference (empty: none) |
| env_b | string | yes | NAME=VALUE pairs for side B, the change under test (empty: none) |
| memory | boolean | – | default true; false skips the Metal memory table, the slowest to read (about 40 % faster summary): no metal_mib_peak |
| name | string | yes | name for the runs: letters, digits, '.', '_', '-' |
| prefix | string | – | Wine prefix, default WINEPREFIX or ~/.wine; ignored with native |
| program | string | – | path of the .exe, or of the macOS binary with wine=native |
| rounds | integer | – | A B B A rounds, default 1 (4 recordings), at most 5 |
| seconds | integer | – | recording length, default 20; use 30 under Wine, whose start-up takes part of it; the export afterwards takes several minutes under Wine |
| skip_s | number | – | seconds to leave out at the start of each recording, where shaders compile and resources load; 0 (default) keeps all. The GPU numbers, hitches and Metal memory are recomputed without them |
| wine | string | – | Wine directory holding bin/wine, or native |
| workdir | string | – | directory the program starts in, default the program's own |
| workload | string | – | a test program from workload_list, fetched with workload_fetch, instead of program |
Structured output declared, but exposes no named fields.
No examples provided.
perf_attach ~140
Records a program that is already running, by pid or by a name in its command line (Game.exe under Wine), for `seconds` and returns the same summary as perf_record; the program keeps running. For games started by Steam, CrossOver, NotProton or any launcher: start the game or its benchmark there first.
| Name | Type | Req | Description |
|---|---|---|---|
| label | string | yes | name for the run: letters, digits, '.', '_', '-' |
| process | string | yes | pid, or a name in the program's command line such as Game.exe |
| seconds | integer | – | recording length, default 20; the export afterwards takes several minutes under Wine |
Structured output declared, but exposes no named fields.
No examples provided.
perf_baseline ~311
Names a reference for perf_check, or lists them. With name and runs (names from perf_runs, several runs of the same program recorded with no change between them), it saves copies of their summaries as the reference `name`, replacing a previous one, and returns the range each number spans across them: that range, not one run, is what perf_check judges against, since repeated runs differ by a few percent, and `spread_pct`, each range's width in % of its midpoint: the noise of this program on this machine, which a change must exceed. With name alone it shows that reference; with nothing it lists them. With skip_s the reference keeps each run without its first skip_s seconds (the start-up, as perf_compare's skip_s) and perf_check applies the same cut to the run it judges, so both are steady-state; the runs need their per-frame files for that.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | – | reference name: letters, digits, '.', '_', '-'; alone, shows that reference |
| runs | array | – | run names from perf_runs to save as this reference, ideally 3 or more equal runs; replaces a previous one |
| skip_s | number | – | seconds to leave out at the start of each recording, where shaders compile and resources load; 0 (default) keeps all. The GPU numbers, hitches and Metal memory are recomputed without them; perf_check… |
Structured output declared, but exposes no named fields.
No examples provided.
perf_baseline_record ~511
Records the same program `count` times in a row with perf_record's arguments and saves the runs as the reference `name` for perf_check, returning the range each number spans across them. Runs are named `name`-1, `name`-2, ... Each recording takes its seconds plus about a minute to read back. skip_s as in perf_baseline: the reference leaves out each run's start-up.
| Name | Type | Req | Description |
|---|---|---|---|
| api | string | – | with workload: mtl (native Metal), vk (Vulkan through MoltenVK: set METAL_TRACE_MOLTENVK), d3d11 or d3d12 (under wine) |
| args | string | – | program arguments as in a shell, quotes included |
| count | integer | – | equal recordings to make, default 3 |
| counters | boolean | – | default false; true also records Metal GPU Counters (gpu_counters in the summary); not under Windows; adds about 40 s of read-back per recorded second |
| dim | integer | – | with workload drawstress: side of the cube grid, dim^3 draws per frame |
| env | string | – | NAME=VALUE pairs separated by spaces, set in the program's environment |
| memory | boolean | – | default true; false skips the Metal memory table, the slowest to read (about 40 % faster summary): no metal_mib_peak |
| name | string | yes | reference name: letters, digits, '.', '_', '-' |
| prefix | string | – | Wine prefix, default WINEPREFIX or ~/.wine; ignored with native |
| program | string | – | path of the .exe, or of the macOS binary with wine=native |
| seconds | integer | – | recording length, default 20; use 30 under Wine, whose start-up takes part of it; the export afterwards takes several minutes under Wine |
| skip_s | number | – | seconds to leave out at the start of each recording, where shaders compile and resources load; 0 (default) keeps all. The GPU numbers, hitches and Metal memory are recomputed without them; perf_check… |
| wine | string | – | Wine directory holding bin/wine, or native |
| workdir | string | – | directory the program starts in, default the program's own |
| workload | string | – | a test program from workload_list, fetched with workload_fetch, instead of program |
Structured output declared, but exposes no named fields.
No examples provided.
perf_check ~230
Judges a recording against a reference saved with perf_baseline: regressed when FPS falls under the reference's lowest FPS by more than margin_pct, GPU ms per frame rises over its highest by more than margin_pct, or encoders or command buffers per frame exceed its highest; improved when a number leaves the range the other way and none regressed; same otherwise. Frame pacing, short encoders and GPU idle time are reported by the comparison but do not decide: they vary too much between equal runs. A run from Windows against a Metal reference (or the reverse) is judged on FPS alone. A reference saved with skip_s judges the run without its first skip_s seconds too (`skipped_s` says so). Returns the reasons and perf_compare's full comparison against the reference's first run.
| Name | Type | Req | Description |
|---|---|---|---|
| baseline | string | yes | a reference name from perf_baseline |
| margin_pct | number | – | how far outside the reference's range FPS or GPU ms per frame may fall before counting, default 3 |
| run | string | yes | a run name from perf_runs |
Structured output declared, but exposes no named fields.
No examples provided.
perf_compare ~406
Compares two saved recordings (names from perf_runs), a the reference and b the run after a change: the headline numbers (FPS, GPU ms, frame pacing, memory), then what changed in the GPU work and where: encoders and command buffers per frame, the share of encoders under short_us, the GPU's idle time, and each encoder label's count and GPU ms per frame, largest change first. layer says whether both ran on the same translation layer: with different layers it compares layers, not one change. A Windows run against a Metal run has `measure`: the GPU ms and Metal memory differ in kind and the encoders exist only in Metal, so use FPS, its lows, stutter and jitter. Recordings with under 100 frames are flagged: too short to compare. With markdown true the result also has `markdown`: the same numbers as tables for a PR comment. skip_s leaves out the first seconds of each recording, where shaders compile and resources load: the GPU numbers, hitches and Metal memory are recomputed from the per-frame files without them, and `skipped_s` says it; thermal state, process memory and encoders stay whole-run.
| Name | Type | Req | Description |
|---|---|---|---|
| a | string | yes | run name from perf_runs: the reference, such as the run before a change |
| b | string | yes | run name from perf_runs: the run to compare against a |
| markdown | boolean | – | also return the numbers as Markdown tables, default false |
| short_us | integer | – | an encoder under this GPU time counts as short: 10, 25 (default), 50, 100, 250, 500 or 1000 |
| skip_s | number | – | seconds to leave out at the start of each recording, where shaders compile and resources load; 0 (default) keeps all. The GPU numbers, hitches and Metal memory are recomputed without them |
Structured output declared, but exposes no named fields.
No examples provided.
perf_diagnose ~251
Says whether a saved recording splits its GPU work into too many short encoders, the pattern of translation layers such as DXMT, Mullion or MoltenVK, with the numbers behind it: encoders and command buffers per frame, the share of short encoders, the labels with the most GPU time and the GPU's idle time. Read the idle time together with the FPS: a program waiting for vsync idles too. Defaults come from bgfx 17-drawstress on an M1 Pro: 7 encoders per frame and 50% under 25 us under Mullion, 2 and 2% in native Metal.
| Name | Type | Req | Description |
|---|---|---|---|
| min_encoders | integer | – | encoders per frame (median) from which the verdict can be yes, default 4 |
| run | string | yes | a run name from perf_runs |
| short_share | number | – | share of short encoders from which the verdict is yes, default 0.25 |
| short_us | integer | – | an encoder under this GPU time counts as short: 10, 25 (default), 50, 100, 250, 500 or 1000 |
Structured output declared, but exposes no named fields.
No examples provided.
perf_export_trace ~120
Writes a recording's GPU frames as a Chrome trace file, `<run>.chrome-trace` in the runs directory, that ui.perfetto.dev and chrome://tracing open: one slice per GPU frame, from its start for its GPU time (the sum of its encoders' time, so a frame with parallel encoders can show shorter than it took), with the compute, fragment and vertex split as arguments. Returns the file name and the number of frames.
| Name | Type | Req | Description |
|---|---|---|---|
| run | string | yes | a run name from perf_runs |
Structured output declared, but exposes no named fields.
No examples provided.
perf_gate ~318
Checks a recording against budgets and says pass or fail: a floor for FPS and the 1% low, a ceiling for the stutter rate, the p95 GPU ms per frame, the hitch count and the peak Metal MiB. Give at least one. A number the recording lacks fails its budget (value null): a gate must not pass on missing data. Returns each budget with its limit, the value and whether it held. Use it as a bar a change must clear, where perf_check judges against equal runs. skip_s leaves out the first seconds of the recording (the start-up), as perf_compare does.
| Name | Type | Req | Description |
|---|---|---|---|
| fps_1pct_low_min | number | – | the 1% low FPS must be at least this |
| fps_min | number | – | the FPS must be at least this |
| gpu_ms_p95_max | number | – | the p95 GPU ms per frame at most this |
| hitches_max | number | – | the number of hitches at most this |
| metal_mib_max | number | – | the peak Metal memory in MiB at most this |
| run | string | yes | a run name from perf_runs |
| skip_s | number | – | seconds to leave out at the start of each recording, where shaders compile and resources load; 0 (default) keeps all. The GPU numbers, hitches and Metal memory are recomputed without them |
| stutter_rate_pct_max | number | – | the share of stutter frames, in %, at most this |
Structured output declared, but exposes no named fields.
No examples provided.
perf_history ~226
Lists the recordings whose name starts with `prefix`, oldest first, with their FPS, 1% low, GPU ms, stutter, hitches and peak Metal MiB, and the change from the first to the last: how a number moved over a series of runs, such as one recording per version of a translation layer. Read a trend as real only when it exceeds the spread_pct that perf_baseline reports for equal runs. Runs from Windows and Metal in one series are flagged: their GPU ms and memory do not compare. skip_s leaves out the first seconds of each recording (the start-up), as perf_compare does.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | newest runs to keep, default 50 |
| prefix | string | yes | the start of the run names to follow: letters, digits, '.', '_', '-' |
| skip_s | number | – | seconds to leave out at the start of each recording, where shaders compile and resources load; 0 (default) keeps all. The GPU numbers, hitches and Metal memory are recomputed without them |
Structured output declared, but exposes no named fields.
No examples provided.
perf_panel ~431
Writes one HTML file, `<name>.panel.html` in the runs directory, that shows one or two recordings in a browser without a server: GPU time per frame with the hitches marked, the numbers (FPS and its lows, frame time, jitter, stutter, memory, thermal state), Metal memory over time and, for two runs, A against B. The file holds the data itself, no path, and loads nothing from the network; the viewer can hide and reorder the widgets and export the layout as JSON. preset `fps` is the timeline, numbers and memory; `compare` (two runs) puts A against B first. skip_s leaves out the first seconds of each recording (the start-up), as perf_compare does. layout (tab ids in the order to show) is saved as panel.json in the runs directory and becomes the default tab order of every panel, the live one too, until the viewer changes it in the browser; ids left out are hidden but can be switched back on; tabs are summary, ab, frames, encoders, counters, memory and data, and a panel.json you wrote yourself, or copied from the panel's Layout JSON, works the same. Returns the file name, the runs, the frames shown and the file's bytes.
| Name | Type | Req | Description |
|---|---|---|---|
| layout | array | – | tabs to show, in order: summary, ab, frames, encoders, counters, memory, data; saved as panel.json in the runs directory as the default for every panel |
| name | string | yes | name for the panel file: letters, digits, '.', '_', '-' |
| preset | string | – | fps (default) or compare (needs two runs) |
| runs | array | yes | one or two run names from perf_runs; with two, the first is A, the reference |
| skip_s | number | – | seconds to leave out at the start of each recording, where shaders compile and resources load; 0 (default) keeps all. The GPU numbers, hitches and Metal memory are recomputed without them |
Structured output declared, but exposes no named fields.
No examples provided.
perf_record ~505
Records `program` (an .exe under Wine, or a macOS binary with wine="native"), or a test program fetched with workload_fetch (workload, api, dim), for `seconds` with Metal System Trace and returns its summary: GPU ms per frame, frame intervals, FPS, Metal and resident memory (memory=false skips the Metal memory table, the slowest to read). When it ends it stops every program of that Wine prefix (wineserver -k), or every process named like the program with native. counters=true also records Metal GPU Counters (`gpu_counters` in the summary: the units the GPU waited on, its utilization, occupancy and memory bandwidth); it adds about 40 s of read-back per recorded second.
| Name | Type | Req | Description |
|---|---|---|---|
| api | string | – | with workload: mtl (native Metal), vk (Vulkan through MoltenVK: set METAL_TRACE_MOLTENVK), d3d11 or d3d12 (under wine) |
| args | string | – | program arguments as in a shell, quotes included |
| counters | boolean | – | default false; true also records Metal GPU Counters (gpu_counters in the summary); not under Windows; adds about 40 s of read-back per recorded second |
| dim | integer | – | with workload drawstress: side of the cube grid, dim^3 draws per frame |
| env | string | – | NAME=VALUE pairs separated by spaces, set in the program's environment |
| label | string | yes | name for the run: letters, digits, '.', '_', '-' |
| memory | boolean | – | default true; false skips the Metal memory table, the slowest to read (about 40 % faster summary): no metal_mib_peak |
| prefix | string | – | Wine prefix, default WINEPREFIX or ~/.wine; ignored with native |
| program | string | – | path of the .exe, or of the macOS binary with wine=native |
| seconds | integer | – | recording length, default 20; use 30 under Wine, whose start-up takes part of it; the export afterwards takes several minutes under Wine |
| wine | string | – | Wine directory holding bin/wine, or native |
| workdir | string | – | directory the program starts in, default the program's own |
| workload | string | – | a test program from workload_list, fetched with workload_fetch, instead of program |
Structured output declared, but exposes no named fields.
No examples provided.
perf_runs ~77
Lists the saved recordings, newest first, with frames, FPS, GPU ms per frame, memory peaks and the translation layer each ran on (fingerprint and Wine, or native).
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | rows per page, default 50, at most 500 |
| offset | integer | – | first row, default 0 |
| Name | Type | Req | Description |
|---|---|---|---|
| next_offset | integer|null | yes | – |
| offset | integer | yes | – |
| rows | array | yes | – |
| total | integer | yes | – |
No examples provided.
presentmon_install ~84
Windows only: downloads Intel's PresentMon console application (MIT) from its GitHub release, checks its SHA-256 against the one this package pins, and keeps it in %LOCALAPPDATA%\metal-gpu-trace, where perf_record and perf_attach find it; later calls reuse it. It needs administrator rights or the Performance Log Users group to run.
Input schema present but exposes no named parameters.
Structured output declared, but exposes no named fields.
No examples provided.
trace_count ~105
Counts the rows of several tables of a kept .trace, in all and per process, so a recording's useful tables show before reading them: a table with 0 rows needs another instrument or Xcode, not a bigger page.
| Name | Type | Req | Description |
|---|---|---|---|
| tables | array | – | table names from trace_tables; default the tables that matter for a translation layer |
| trace | string | yes | a run name from perf_runs whose trace_kept is true, or the path of a .trace |
Structured output declared, but exposes no named fields.
No examples provided.
trace_query ~128
Returns one page of rows of one table of a .trace as {column: value}, optionally only one process's rows.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | rows per page, default 50, at most 500 |
| offset | integer | – | first row, default 0 |
| pid | integer | – | keep only this process's rows |
| schema | string | yes | a table name that trace_tables lists, such as metal-gpu-intervals |
| trace | string | yes | a run name from perf_runs whose trace_kept is true, or the path of a .trace |
| Name | Type | Req | Description |
|---|---|---|---|
| next_offset | integer|null | yes | – |
| offset | integer | yes | – |
| rows | array | yes | – |
| total | integer | yes | – |
No examples provided.
trace_tables ~60
Lists the data tables (schemas) a .trace recording holds; recordings keep their .trace only with KEEP_TRACE=1.
| Name | Type | Req | Description |
|---|---|---|---|
| trace | string | yes | a run name from perf_runs whose trace_kept is true, or the path of a .trace |
Structured output declared, but exposes no named fields.
No examples provided.
workload_fetch ~84
Downloads a test program from this project's GitHub releases once, checks its SHA-256 against the one this package pins, and keeps it in ~/Library/Caches/metal-gpu-trace; later calls reuse it. The programs are built from source by the project's workloads workflow.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | a workload name from workload_list, such as drawstress |
Structured output declared, but exposes no named fields.
No examples provided.
workload_list ~43
Lists the test programs workload_fetch can download, such as bgfx's drawstress: what each measures, its size, license and APIs, and whether it is already downloaded.
Input schema present but exposes no named parameters.
Structured output declared, but exposes no named fields.
No examples provided.
How do I install the Metal GPU Trace MCP server?
Metal GPU Trace runs locally as a PyPI package, launched with uvx metal-gpu-trace. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
pypi · metal-gpu-trace
claude mcp add partprogramming09-metal-gpu-trace -- uvx metal-gpu-trace
What is the Metal GPU Trace MCP server?
Metal GPU Trace is an MCP server listed in the public MCP registry as io.github.partprogramming09/metal-gpu-trace. Measure Wine and macOS programs' GPU use on Apple silicon with Metal System Trace. This page covers its PyPI package (metal-gpu-trace).
Is the Metal GPU Trace MCP server safe to use?
Metal GPU Trace scores 72 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 4 November 2026. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the Metal GPU Trace MCP server expose?
Metal GPU Trace exposes 22 tools: perf_record, perf_baseline_record, perf_ab, perf_attach, perf_runs, and 17 more. Their descriptions and schemas cost roughly 4,871 tokens of context every time the server is loaded.
Is the Metal GPU Trace MCP server still maintained?
Metal GPU Trace is still listed as active in the MCP registry. We last reached this channel on 4 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the Metal GPU Trace MCP server under?
Metal GPU Trace declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.