Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add MarcSkovMadsen/holoviz-mcp --skill panel-material-uigit clone --depth 1 https://github.com/MarcSkovMadsen/holoviz-mcpWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/marcskovmadsen/holoviz-mcp/panel-material-ui)<a href="https://agentmods.dev/skills/marcskovmadsen/holoviz-mcp/panel-material-ui"><img src="https://agentmods.dev/badge/skills/marcskovmadsen/holoviz-mcp/panel-material-ui/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/marcskovmadsen/holoviz-mcp/panel-material-ui"><img src="https://agentmods.dev/badge/skills/marcskovmadsen/holoviz-mcp/panel-material-ui.svg" alt="Reviewed on agentmods" width="80" height="20"></a>- NVIDIA SkillSpector pass
What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00027 | $0.02992 |
| Opus 5 | $0.00014 | $0.01496 |
| Sonnet 5 | $0.00005 | $0.00598 |
| Haiku 4.5 | $0.00003 | $0.00299 |
Grade A, and why
panel-material-ui scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 12d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 354 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Panel Material UI Development Skills
This guide provides best practices for using Panel Material UI. Optimized for LLMs.
Please develop code, tests and documentation as an expert Panel analytics app developer would do when working with a short time to market.
If not already loaded please get the 'panel' skill.
This guide focuses on panel-material-ui specific patterns. This guide takes precedence over the panel skills.
Installation
pip install panel-material-ui panel watchfiles hvplot hvsampledata
For development in .py files DO always include watchfiles for hotreload.
Best Practice Hello World App
Let's describe our best practices via a basic Hello World App:
# DO import panel as pn
import panel as pn
# DO import panel_material_ui as pmui
import panel_material_ui as pmui
import param
# DO run pn.extension
# DO remember to add any imports needed by panes, e.g. pn.extension("tabulator", "plotly", ...)
# DON'T add "bokeh" as an extension. It is not needed.
# DON'T add "panel_material_ui" as an extension. It is not needed.
# Do use throttled=True when using slider unless you have a specific reason not to
pn.extension(throttled=True)
# DO organize functions to extract data separately as your app grows
# DO use caching to speed up the app, e.g. for expensive data loading or processing that would return the same result given same input arguments.
# DO add a ttl (time to live argument) for expensive data loading that changes over time
@pn.cache(max_items=3)
def extract(n=5):
return "Hello World" + "⭐" * n
text = extract()
text_len = len(text)
# DO organize functions to transform data separately as your app grows. Eventually in a separate transform.py file
# DO add caching to speed up expensive data transformations
def transform(data: str, count: int=5)->str:
"""
Transforms the input data by truncating it to the specified count of characters.
"""
count = min(count, len(data))
return data[:count]
# DO organize functions to create plots separately as your app grows. Eventually in a separate plots.py file.
# DO organize custom components and views separately as your app grows. Eventually in separate components.py or views.py file(s).
# DO use param.Parameterized, pn.viewable.Viewer or similar approach to create new components and apps with state and reactivity
class HelloWorld(pn.viewable.Viewer):
"""
A simple Panel app that displays a "Hello World" message with a slider to control the length of the message.
"""
# DO define parameters to hold state and drive the reactivity
characters = param.Integer(default=text_len, bounds=(0, text_len), doc="Number of characters to display")
def __init__(self, **params):
super().__init__(**params)
# DO use sizing_mode="stretch_width" for components unless "fixed" or other sizing_mode is specifically needed
with pn.config.set(sizing_mode="stretch_width"):
# DO create widgets using `.from_param` method
self._characters_input = pmui.IntSlider.from_param(self.param.characters, margin=(10,20))
# DO Collect input widgets into horizontal, columnar layout unless other layout is specifically needed
self._inputs = pmui.Column(self._characters_input, max_width=300)
# DO collect output components into some layout like Column, Row, FlexBox or Grid depending on use case
self._outputs = pmui.Column(self.model)
self._panel = pmui.Row(self._inputs, self._outputs)
# DO use caching to speed up bound methods that are expensive to compute or load data and return the same result for a given state of the class.
@pn.cache
# DO prefer .depends over .bind over .rx for reactivity methods on Parameterized classes as it can be typed and documented
# DON'T use `watch=True` or `.watch` methods to update UI. Only for updating overall app or component state.
# DO use `watch=True` or `.watch` for triggering side effect like saving file or sending email.
@param.depends("characters")
def model(self):
"""
Returns the "Hello World" message truncated to the specified number of characters.
"""
return transform(text, self.characters)
# DO provide a method for displaying the component in a notebook setting, i.e. without using a Template or Page element
def __panel__(self):
return self._panel
# DO provide a method to create a .servable app
@classmethod
def create_app(cls, **params):
"""
Create the Panel app with the interactive model and slider.
"""
instance = cls(**params)
# DO use the `Page` to layout the served app unless otherwise specified
return pmui.Page(
# DO provide a title for the app
title="Hello World App",
# DO provide optional image, optional app description, optional navigation menu, input widgets, optional documentation and optional links in the sidebar
# DO provide as list of components or a list of single horizontal layout like Column as the sidebar by default is 300 px wide
sidebar=list(instance._inputs),
# DO provide a list of layouts and output components in the main area of the app.
# DO use Grid or FlexBox layouts for complex dashboard layouts instead of combination Rows and Columns.
main=list(instance._outputs),
)
# DO provide a method for quick development preview with `python`
if __name__ == "__main__":
# DO run with `python path_to_this_file.py` for quick development preview
HelloWorld.create_app().show(port=5007, autoreload=True, open=True)
# DO provide a method to serve the app with `panel serve`
elif pn.state.served:
# DO run with `panel serve path_to_this_file.py --port 5007 --dev` add `--show` to open the app in a browser
HelloWorld.create_app().servable() # DO mark the element(s) to serve with .servable()
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 12d ago First seen · 354 lines · 27 tokens per session scan A c8b625cc34a1
panel-material-ui is a skill published in the GitHub repository MarcSkovMadsen/holoviz-mcp (34 stars, last pushed 11d ago), licensed BSD-3-Clause. It adds 27 tokens to every session and 2,992 once invoked, about $0.0001 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other skills, from other repositories
dataviz-mcp
Show Python visualizations live in the browser with the dataviz-mcp MCP tools (show, screenshot). Use when those tools are available and the user asks to display, plot, chart, or visualize anything. Do not use for apps the user serves themselves with panel serve.
reimagine-it-extract
Emit the content signals reimagine-it reads from an HTML file — title, anchors, proper nouns, dates, numbers, emails, links, source hex colors, and the derived palette — as JSON without generating a redesign. Use when the user says /reimagine-it extract, "what does the engine see in this page", "extract the palette"…
frame-pentagram-stat
Swiss-grid statistic anchor — giant number, red accent, growing bars, black data bar. Rational and editorial.
archscribe
A tool for turning technical descriptions, articles, processes, or reference images into hand-drawn-style diagrams. It can produce editable Excalidraw diagrams, image and video previews, and interactive HTML.
data-bi-tools
Use this skill when asked about BI, dashboard, Metabase, Superset, Looker, Tableau, PowerBI, reporting, data visualization, business intelligence, KPI dashboards, semantic layer, embedded analytics, or LookML. This skill enforces: tool selection based on team size and use case, semantic layer design with…
relational-database-design
Designs or reviews a relational database schema for a given domain. Covers table structure, normalization, indexes, constraints, and migration strategy. Invoked when the user asks to design a schema, review a database structure, or optimize a data model.