mdk-create-app
Scaffold a new MDK App package ready to publish.
Skill by tetherto
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/tetherto-mdk-create-app
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: design, productivity
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md and code. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/mdk-create-app
What's inside
- Skill name
mdk-create-app- Description
- Scaffold a new MDK App package ready to publish. Use whenever a task mentions "create app", "scaffold app", "mdk create app", or generating an MDK App's mdk-app.yaml, package.json, plugin/, and ui/ modules.
- License
- Apache-2.0
- Metadata
- suite: mdk-developer-skill · mdk_version: {{MDK_VERSION}}
- Instructions
- 220 lines in SKILL.md · view on GitHub
Files (1)
- SKILL.md
SKILL.md (first lines)
# Create an MDK App (`mdk-create-app`)
An MDK App is a self-contained, publishable npm package that bundles a backend plugin, a UI shell module, and an `mdk-app.yaml` manifest.
This skill governs the **creation and scaffolding phase** of an MDK App before it is added to a site or published.
---
## 1. The Package Layout
Every scaffolded app follows the canonical structure:
```text
@tetherto/mdk-app-<name>@<version>
├── package.json # name, version, files, dependencies, peerDependencies
├── mdk-app.yaml # app manifest
├── plugin/ # backend plugin template
│ ├── mdk-plugin.json # route table (the Gateway serves it under /apps/<name> unless mounted)
│ ├── controllers/ # route handlers
│ └── lib/ # client helper used by the handlers
└── ui/ # built UI module with index entry point
└── index.js
```
---
## 2. The Strict `mdk-app.yaml` Specification
`mdk-app.yaml` defines the app's identity, permissions, and configuration. It contains these 5 keys, plus an optional
one-line `description`:
```yaml
id: io.tether.sentinel # 1. Immutable identity, reverse-DNS
version: 0.1.0 # 2. Semver; must equal package.json version
displayName: Sentinel # 3. Shown in shell's sidebar and CLI
permissions: # 4. What the app asks the operator to approve (not enforced by the Kernel yet)
- resources: [devices]
verbs: [read] # Default: read (least privilege; [read, write] for controls/tuning)
resourceNames: ["*"] # Default: allow all devices ("*"), or scoped: family/brand/worker/device
config: # 5. Operational defaults (overridable in mdk.yaml)
driftThresholdPct: 10
```
### Critical Negative Constraints: What NOT to Add
* **DO NOT add extraneous top-level keys**: Never add `icon`, `routes`, `auth`, `mcp`, `devices`, `metadata`, or `entry`. The specification limits the manifest to these 5 keys plus `description`; `mdk validate app` reports any other key.
* **`config` must always be an object**: If the app has no default configuration parameters, write `config: {}`. Never leave it null, undefined, or an array.
---
## 3. Edge Cases & Validation Rules
### Edge Case 1: Directory & Location Context
* **Standalone Repo Mode (Outside an MDK project)**: If the current directory is an empty folder or standalone repo (no `mdk.yaml` in current or parent directories), scaffold files **directly at the root of the current directory**:
`./package.json`, `./mdk-app.yaml`, `./plugin/`, `./ui/`.
* **Site Project Mode (Inside an MDK project)**: If an `mdk.yaml` exists in the current or parent directory, scaffold under `apps/<name>/`.
* **Distinction from Dashboard Shells**: An MDK App package (`@tetherto/mdk-app-<name>`) is a backend plugin + dynamic UI shell module. It is distinct from a standalone Vite dashboard shell created via `mdk create dashboard <name>` (which defaults to `apps/dashboard`). If developing an app inside a site repo alongside an existing dashboard, ensure distinct directory names (e.g. `apps/<name>-app` or keep the dashboard at `apps/dashboard`).
### Edge Case 2: RBAC Permissions & Device Hierarchy
* **Not enforced yet**: The Kernel does not enforce `permissions` today. They are declared for operator review, and the app
runtime's Kernel key is admitted with full access. Declare least privilege anyway, so review is meaningful.
* **Target resources**: only `devices`, `workers` and `actions`, each with its own verbs
([`kernel-access.md`](../mdk-app-rbac/references/kernel-access.md)); derive them from the plugin code with the
[`mdk-app-rbac`](../mdk-app-rbac/SKILL.md) skill. The scaffold's summary route uses `resources: [workers]`, `verbs: [list]`.
Never `[*]`, `[plugins]` or `[kernel]`.
* **Verbs**:
* Default: `verbs: [read]` (least privilege; for monitoring, telemetry, and metrics dashboards).
* Control / Tuning apps (reboots, parameter tuning, commands): `verbs: [read, write]`.
* **Device Scoping (`resourceNames`)**: Defaults to `["*"]` to allow all devices. When scoped, it must follow the 4-part MDK device hierarchy:
`family / brand / worker / device`
* `*` — All devices across all families (Default: allow all).
* `miner/*` — All miners across all brands.
* `miner/antminer/*` — All Antminers across all workers.
* `miner/antminer/antminer-a/*` — Devices under worker `antminer-a`.
* `powermeter/*` — All power meters (note: backend family identifier is `powermeter`, not `power-meter`).
* `sensor/*`, `container/*` — Sensors and containers.
* **Multiple Device Families**: If an app needs access to multiple hardware types, declare separate scoped rule blocks:
```yaml
permissions:
- resources: [devices]
verbs: [read, write]
resourceNames: ["miner/*"]
- resources: [devices]
verbs: [read]
resourceNames: ["powermeter/*"]
```
### Edge Case 3: Naming, Scoping & Version Parity
* **`<name>`**: Lowercase kebab-case slug (`^[a-z0-9][a-z0-9._-]*$`). No uppercase letters, spaces, or slashes.
* **`id`**: Immutable reverse-DNS format (`^[a-z][a-z0-9]*(\.[a-z0-9][a-z0-9-]*)+$`, e.g. `io.tether.<name>`).
* **`package.json` Name**: Defaults to `@tetherto/mdk-app-<name>` (or `@<scope>/mdk-app-<name>` if custom org specified).
* **Version Parity**: `package.json#version` and `mdk-app.yaml#version` **must match byte-for-byte** (defaults to `0.1.0`).
### Edge Case 4: Route Namespacing in `plugin/mdk-plugin.json`
* **The Gateway adds the prefix**: The Gateway serves every route of an app under `/apps/<name>`, where `<name>` is the app's
`spec.apps[].name` in `mdk.yaml`. Declare paths **without** that prefix:
* Example: `/status` in `mdk-plugin.json` is served at `/apps/sentinel/status`.
* Never write `/apps/<name>/...` in the route table; it would be served at `/apps/<name>/apps/<name>/...`.
* **Root mount**: An app whose client calls fixed root paths (the agent app's `/agent/sessions`, an identity app's `/oauth/...`)
sets `mount: /` on its `spec.apps` entry instead, and its paths are served as written. Prefixed is the default because it
keeps installed apps from colliding.
### Edge Case 5: Dynamic UI Shell Module Contract
* The UI entry point (`ui/index.js`) is read dynamically by the UI shell.
* It must export a default object with:
```javascript
export default {
id: 'io.tether.<name>',
displayName: '<DisplayName>',
routes: [],
panels: []
};
```
---
## 4. Execution Workflow
### Step 1: Collect App Definition (The Interview)
Collect or confirm the definition parameters with sensible fallbacks:From tetherto/mdk, Apache-2.0.
More from tetherto/mdk
- 0.637score
mdk-site-sizing
tetherto
Size an MDK deployment from a plain description of a site using measured benchmark envelopes.
SkillAFreshness: A★ 11Claude Code +9 - 0.637score
mdk-ui-component
tetherto
Build a UI page/panel that renders data from an MDK Worker or Gateway plugin.
SkillAFreshness: A★ 11Claude Code +9 - 0.637score
mdk-gateway-plugin
tetherto
Build the HTTP routes of an MDK app (route table + controllers, served through the Gateway) over one or more MDK Workers.
SkillAFreshness: A★ 11Claude Code +9 - 0.637score
mdk-publish-security
tetherto
Run the pre-publish security audit for every publishable @tetherto/mdk-* package (or any non-private package in an npm monorepo).
SkillAFreshness: A★ 11Claude Code +9 - 0.633score
mdk
tetherto
Build on the MDK (Mining Device Kit) platform.
SkillAFreshness: A★ 11Claude Code +9 - 0.633score
mdk-worker-plugin
tetherto
Integrate a new device into MDK as a device Worker.
SkillAFreshness: A★ 11Claude Code +9 - 0.632score
mdk-docs-style
tetherto
Router for MDK docs-authoring rules in mdk-prv.
SkillAFreshness: A★ 11Claude Code +9 - 0.632score
mdk-deployment
tetherto
Deploy and run a working MDK stack from mdk.yaml.
SkillAFreshness: A★ 11Claude Code +9 - 0.628score
changelog
tetherto
Generate the changelog for the next MDK release by carefully diffing the previous release tag against the current tree, rotating the existing CHANGELOG.md…
SkillAFreshness: A★ 11Claude Code +9 - 0.627score
mdk-skill-suite
tetherto
The MDK product skill suite (mdk, mdk-worker-plugin, mdk-gateway-plugin, mdk-ui-component, mdk-deployment, mdk-site-sizing) is not installed in this checkout.
SkillAFreshness: A★ 11Claude Code +9 - 0.624score
bump-mdk
tetherto
Bump package versions across the MDK monorepo and resync every affected lockfile the way CI expects.
SkillAFreshness: A★ 11Claude Code +9
Signals
- Stars
- 11
- Forks
- 13
- Open issues
- 0
- Last commit (this folder)
- Oct 22, 2026 (6 days ago)
- Last release
- Oct 19, 2026 (9 days ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- Apache-2.0
- Repository
- github.com/tetherto/mdk
- Website
- mdk.tether.io
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from tetherto
- 0.637score
mdk-site-sizing
tetherto
Size an MDK deployment from a plain description of a site using measured benchmark envelopes.
SkillAFreshness: A★ 11Claude Code +9 - 0.637score
mdk-ui-component
tetherto
Build a UI page/panel that renders data from an MDK Worker or Gateway plugin.
SkillAFreshness: A★ 11Claude Code +9 - 0.637score
mdk-gateway-plugin
tetherto
Build the HTTP routes of an MDK app (route table + controllers, served through the Gateway) over one or more MDK Workers.
SkillAFreshness: A★ 11Claude Code +9 - 0.637score
mdk-publish-security
tetherto
Run the pre-publish security audit for every publishable @tetherto/mdk-* package (or any non-private package in an npm monorepo).
SkillAFreshness: A★ 11Claude Code +9 - 0.633score
mdk
tetherto
Build on the MDK (Mining Device Kit) platform.
SkillAFreshness: A★ 11Claude Code +9 - 0.633score
mdk-worker-plugin
tetherto
Integrate a new device into MDK as a device Worker.
SkillAFreshness: A★ 11Claude Code +9
Cite this page
mdk-create-app skill. Agent Mart. https://agentmart.dev/skills/tetherto-mdk-create-app (last updated 2026-10-24)