dglab-mcp
This server lets MCP clients safely control DG-LAB Coyote V2/V3 electrostimulation hardware through natural-language tools, with pairing, telemetry, intensity management, waveforms, and safety overrides.
Pair:
dglab_connectreturns a QR code/session link for the DG-LAB 4 app;dglab_disconnectstops output and destroys the session.Monitor:
dglab_get_statusreports relay state, safety lease, paired apps, devices (battery, Bluetooth, channel intensity/condition, limits), and waveform tasks.Control intensity:
dglab_set_intensitysets an absolute A/B target (0-200, capped at 30 by default);dglab_adjust_intensityapplies a signed delta (+5 max upward).Play waveforms:
dglab_list_waveformslists built-in and hot-loaded.pulsefiles;dglab_play_waveformplays a named waveform;dglab_play_custom_waveformcompiles ramp/hold/pulse/silence segments.Stop safely:
dglab_stop_channelclears one channel;dglab_emergency_stopimmediately stops all channels and tasks.Keep alive:
dglab_heartbeatrenews the 20s safety lease to prevent watchdog shutdown.Configure/provision: optional environment caps and
--presetsources import.pulsewaveform collections.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@dglab-mcpPair my Coyote and show me the QR code"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
@zakotoys/dglab-mcp
Safety-first Model Context Protocol server for DG-LAB Coyote V2/V3 hardware. It connects Claude Desktop, Cursor, OpenCode, Codex, or any MCP client to the DG-LAB 4 V4 WebSocket relay through a local stdio process.
Safety first
This software controls a device that delivers real electrical stimulation to a human body. Use it only with informed consent, active human supervision, and the physical device within reach.
Default ceiling:
30/200(DGLAB_MAX_INTENSITY); higher targets are rejected.Default step limit:
5(DGLAB_MAX_STEP) for each upward command.Watchdog: output is set to zero after 20 seconds without a command or heartbeat.
Emergency stop:
dglab_emergency_stopclears every device and queued task.
Related MCP server: InstrMCP
Features
Natural-language control through standard MCP tools.
QR pairing with the DG-LAB 4 mobile app; no computer Bluetooth is required.
Live battery, connection, channel, and task telemetry.
Built-in presets, custom waveforms, and hot-loaded
.pulsefiles.Hard safety caps, step guards, telemetry gating, per-channel queues, and a global control lease.
Requirements
Node.js 22 or newer.
DG-LAB 4 on iOS or Android, with a Coyote V2 or V3 paired over Bluetooth.
Claude Desktop, Cursor, OpenCode, Codex, MCP Inspector, or another MCP client.
Quick start
Claude Desktop, Cursor, OpenCode, or Codex
Use this MCP server command in the client's configuration:
{
"command": "npx",
"args": ["-y", "@zakotoys/dglab-mcp@latest"]
}To install .pulse files from any supported source, add --preset (or -p)
and its source. For example, this imports a GitHub tree recursively:
{
"command": "npx",
"args": [
"-y",
"@zakotoys/dglab-mcp@latest",
"--preset",
"https://github.com/zakotoys/dglab-pulse-collect/tree/main/pulses/pulse-001"
]
}By default, synchronization fails when any downloaded .pulse file is invalid.
Add --skip-invalid-presets to ignore invalid waveform files and import only the
valid files from each source. Download failures, oversized responses, and other
source errors still fail the synchronization.
For Windows clients that require it, use cmd:
{
"command": "cmd",
"args": ["/c", "npx", "-y", "@zakotoys/dglab-mcp@latest"]
}Embed the object above under the client's MCP server map. Examples:
Claude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"dglab": {
"command": "npx",
"args": ["-y", "@zakotoys/dglab-mcp@latest"]
}
}
}Cursor (~/.cursor/mcp.json or .cursor/mcp.json):
{
"mcpServers": {
"dglab": {
"command": "npx",
"args": ["-y", "@zakotoys/dglab-mcp@latest"]
}
}
}OpenCode (opencode.json):
{
"mcp": {
"dglab": {
"type": "local",
"command": ["npx", "-y", "@zakotoys/dglab-mcp@latest"]
}
}
}Codex (~/.codex/config.toml):
[mcp_servers.dglab]
command = "npx"
args = ["-y", "@zakotoys/dglab-mcp@latest"]MCP Inspector
npx @modelcontextprotocol/inspector -y @zakotoys/dglab-mcp@latestConnect over stdio, then call dglab_connect to display the pairing QR code.
Pair a device
Call
dglab_connectfrom your MCP client.Scan the returned QR code with the DG-LAB 4 app, or open its session link.
Call
dglab_get_statusand confirm that the Coyote is paired and telemetry is current.Start low, for example
dglab_set_intensitywithtarget: 3, then play a waveform. Calldglab_disconnectwhen finished; it stops output first.
Multiple apps and devices can be connected. Pass clientId and slotId when
needed; an omitted target is accepted only when exactly one compatible Coyote is
available.
MCP tools
Tool | Purpose |
| Start or reuse a relay session and return the QR code. |
| Stop all output and destroy the session. |
| Read relay, safety, device, channel, and task state. |
| Set an A/B channel target after safety validation. |
| Apply a signed, safety-checked channel delta. |
| List built-in and external waveforms. |
| Play a named waveform for a bounded duration. |
| Compile and play ramp/hold/pulse/silence segments. |
| Stop tasks and reset one channel. |
| Immediately stop every channel and task. |
| Renew the active control lease. |
Nonzero output requires a paired, supported Coyote with known telemetry. Errors
use stable codes such as NOT_CONNECTED, AMBIGUOUS_TARGET, SAFETY_LIMIT, and
INVALID_WAVEFORM.
Configuration
All variables are optional:
Variable | Default | Description |
|
| Absolute output ceiling on the 0-200 scale. |
|
| Maximum upward change per command. |
|
| Watchdog timeout for the control lease. |
|
| Maximum waveform duration. |
|
| DG-LAB V4 relay endpoint. |
|
| Directory for external |
The effective channel ceiling is the minimum of the configured limit and every limit advertised by the app or device.
External waveforms
Put official-format .pulse files anywhere under DGLAB_PULSE_DIR:
~/.dglab-mcp/pulses/
waves.pulse
favourites/
my-favourite.pulseThe directory is rescanned recursively on every list/play call. Files are limited to 64 KiB, and the catalog accepts at most 100 files. Names match built-in ids and labels case- and separator-insensitively, but matching is exact rather than fuzzy.
At startup, --preset <source>... or -p <source>... uses the same source grammar as
npx skills: local paths, GitHub/GitLab repository or tree sources, GitHub
shorthand (owner/repo), direct .pulse downloads, and well-known HTTP(S)
directory listings. GitHub and GitLab repository trees are traversed through
their repository APIs; generic HTTP directories are crawled recursively on the
same origin. Relative subdirectories are preserved. Direct git clone sources
are supported for repositories containing .pulse files. Hosted archive URLs
are recognized as download sources but are not extracted; use a direct .pulse
URL instead. Multiple sources are synchronized sequentially in the order given;
repeat --preset/-p to append more sources. The server writes manifest.json
in DGLAB_PULSE_DIR with each source, local path, and SHA-256 hash. On later
starts, a source whose local
files still match the manifest is used without another network request; missing
or modified managed files are downloaded again. Download and cache diagnostics
go to stderr so stdout remains exclusively available to MCP JSON-RPC.
Development
npm install
npm run ci # typecheck, lint, coverage, build, and pack check
npm run build # compile dist/ and make the CLI executable
npm test
npm run lint:fixThe test suite uses a fake V4 relay and fake DG-LAB app, so it does not require hardware.
Releases
GitHub Actions publishes matching vX.Y.Z tags with npm Trusted Publishing and
provenance, then creates a GitHub Release with automatically generated changelog
notes. If the workflow is rerun, an existing Release is kept unchanged.
Configure the npm package's Trusted Publisher as:
Provider: GitHub Actions
Organization/user:
zakotoysRepository:
dglab-mcpWorkflow filename:
publish.ymlEnvironment: blank
Allowed action:
npm publish
For a new checkout, bootstrap the scoped public package once while logged in to the npm organization:
npm login
npm publish --access publicThen release future versions from a clean checkout:
npm version patch # or minor / major
git push origin main --follow-tagsThe workflow runs the full CI suite and publishes only when the tag matches the
version in package.json.
Scope
This project supports Coyote V2/V3 through the DG-LAB 4 V4 relay only. Legacy V3 relay, direct BLE, HTTP transport, GUI, raw frames, and Opossum output control are outside the current scope.
License
Available Tools
11 toolsdglab_adjust_intensityAdjust channel intensityA
Apply a signed intensity delta to one channel. Positive deltas are limited to +5 per call and to the effective ceiling; negative deltas are unrestricted.
| Name | Required | Description | Default |
|---|---|---|---|
| delta | Yes | Signed intensity delta. | |
| slotId | No | Device slot id within the app. Omit when exactly one compatible device exists. | |
| channel | Yes | Output channel | |
| clientId | No | Paired app (controlled client) id. Omit when exactly one app is attached. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only convey read-only/mutation flags. The description adds concrete behavior: positive deltas capped at +5 per call and by the effective ceiling, while negative deltas are unrestricted. This is useful context beyond annotations and does not contradict them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence communicates the core operation and the key constraints without wasted words. Every clause contributes necessary information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a small mutating tool with 100% schema coverage, the description covers the critical operational constraints. It could be slightly more complete by noting what happens when a positive delta exceeds +5 and by explicitly contrasting with set_intensity, but nothing essential is missing for selecting and calling the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents all four parameters, so the baseline is 3. The description adds meaning for the delta parameter by clarifying the effective positive limit and the unrestricted negative side, which goes beyond the schema's generic -200..200 range.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: 'Apply a signed intensity delta to one channel.' This is more informative than the title and differentiates the tool from sibling dglab_set_intenensity, which would be for absolute setting rather than relative adjustment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The word 'delta' implies this is for incremental relative changes, so an agent can infer when it applies, but the description does not explicitly say when to prefer it over set_intensity or stop_channel, nor does it name any exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dglab_connectConnect DG-LAB relayAIdempotent
Start (or reuse) the DG-LAB 4 V4 relay session. Returns the pairing QR code (PNG), the app socket URL, and the session link. Scan the QR code or open the link with the DG-LAB 4 mobile app to pair. Safe to call again to fetch pairing info for an existing session.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate idempotentHint=true and safe read-like behavior (destructiveHint=false), and the description reinforces this by stating it is safe to call again to fetch pairing info. It also reveals a behavioral trait beyond annotations: it returns a QR code and link for pairing. No contradictions found.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured, front-loading the core action and outputs. Each sentence adds useful information: what it does, what it returns, how to use it, and that it is idempotent. No redundant phrases.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no parameters and no output schema, the description is quite complete. It specifies the outputs, the pairing method, and the safe re-call property. A minor gap is not describing what the 'app socket URL' or 'session link' are used for in detail, but the core calling context is fully covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so schema coverage is complete (100%). The description adds value by explaining what the session setup entails and what outputs are delivered, which is meaningful despite the absence of parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: start or reuse a DG-LAB 4 V4 relay session and return pairing information. It explicitly lists the outputs (QR code, app socket URL, session link) and distinguishes this from an ordinary connect action by noting it is safe to call again.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context: call to initiate pairing or fetch existing pairing info. It does not explicitly contrast with sibling tools, but the context is clear. No alternative tools are named, so it lacks explicit exclusions but still provides sufficient guidance for typical use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dglab_disconnectDisconnect relay sessionADestructiveIdempotent
Emergency-stop every device, then destroy the relay session and all cached pairing state.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructive=true and idempotent=true, and the description adds valuable extra context about what exactly gets destroyed: 'the relay session and all cached pairing state.' It also discloses the broad side effect of emergency-stopping every device, which is meaningful behavioral information beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with a clear before/after sequence: emergency-stop first, then destroy session and pairing state. Every part adds information, and the most safety-critical action is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter destructive disconnection tool with strong annotations and no output schema, the description covers everything needed: the scope, the sequence, and the collateral effects. The only minor gap is explicit routing versus emergency_stop, which is more of a usage-guidelines nuance than a completeness gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has no parameters and the schema has 100% coverage with an empty properties object, so there are no parameter semantics to document. The baseline for zero-parameter tools is 4, and the description appropriately focuses on behavior rather than non-existent parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb plus resource: it 'emergency-stop every device, then destroy the relay session and all cached pairing state.' This goes beyond the title by detailing the exact sequence and side effects, making it clearly distinguishable from siblings like dglab_emergency_stop, which likely only stops stimulation without destroying the session or pairing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than explicitly stated: the description strongly suggests this is the full teardown tool for disconnecting and clearing pairing state. However, it does not explicitly say when to prefer it over dglab_emergency_stop or dglab_stop_channel, nor does it warn against using it when only a temporary stop is needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dglab_emergency_stopEmergency stopADestructiveIdempotent
Immediately stop every channel and waveform task on every paired app and device, bypassing all queues. Cannot be undone by pending commands.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructive and idempotent behavior, so the description's added value comes from 'bypassing all queues' and 'Cannot be undone by pending commands.' These clarify real-world execution behavior and are not redundant with the annotation metadata.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences with no filler. Critical information—scope, immediacy, queue behavior, and non-undoability—is front-loaded and every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless global stop action, the description covers scope, behavior, and an important consequence, while annotations cover safety traits like destructiveness and idempotence. It does not describe the return value or error behavior, but with no output schema and this simplicity, that is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and schema description coverage is 100%, so there is no parameter burden for the description to carry. The baseline of 4 is appropriate; no additional parameter explanation is needed or possible.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('stop') and a precise resource ('every channel and waveform task on every paired app and device'), and it distinguishes itself from the sibling dglab_stop_channel by its global scope. There is no ambiguity about what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Immediately stop every channel and waveform task on every paired app and device' and 'bypassing all queues' clearly conveys the emergency, global-use context. It does not explicitly name dglab_stop_channel as the alternative for stopping a single channel, but the scope contrast is strong enough to guide an agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dglab_get_statusGet DG-LAB statusARead-onlyIdempotent
Read relay state, the safety lease, paired apps, devices (battery, Bluetooth state, A/B intensity, channel condition, mute, comfort limits, effective ceilings), and waveform tasks. Set refresh to re-query device lists from the apps first.
| Name | Required | Description | Default |
|---|---|---|---|
| slotId | No | Device slot id within the app. Omit when exactly one compatible device exists. | |
| refresh | No | Re-request the device list from every paired app before reporting. | |
| clientId | No | Paired app (controlled client) id. Omit when exactly one app is attached. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the description does not need to restate safety. It adds meaningful behavioral context by explaining that setting refresh causes a re-query of device lists from the paired apps first. There is no contradiction with any annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. The first sentence front-loads the tool's purpose with a compact but complete enumeration of what is read, and the second sentence crisply explains when and why to set refresh.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with no required parameters and no output schema, the description fully covers what the agent should expect: relay state, safety lease, app/device details, and waveform tasks. Optional parameter disambiguation is already provided by the input schema, and the refresh side-effect is disclosed. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already explains slotId, refresh, and clientId thoroughly. The description does restate the refresh behavior, but it adds no new parameter semantics beyond what the schema provides. Baseline 3 is appropriate given full schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Read relay state...' and enumerates the full scope of the status payload: safety lease, paired apps, device battery, Bluetooth state, intensities, channel condition, mute, comfort limits, ceilings, and waveform tasks. This clearly distinguishes it from the sibling mutation/control tools such as dglab_set_intensity or dglab_emergency_stop.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The leading verb 'Read' and the detailed state inventory make the intended usage obvious: fetch current DG-LAB status whenever the agent needs device/app/safety state. The refresh condition is also stated explicitly. It does not explicitly name alternatives or state when not to use it, so it falls just short of full guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dglab_heartbeatRenew safety leaseARead-onlyIdempotent
Renew the control lease (timeout 20000ms) to keep output enabled while idle. When no output is active this succeeds as a no-op. If the lease ever expires, all outputs are stopped automatically.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description contradicts the annotations. It describes renewing a control lease and preventing automatic output shutdown, which is an active side effect, while readOnlyHint=true declares the operation read-only. Per the rubric, any contradiction between description and annotations yields a score of 1, despite the description otherwise offering useful timeout and expiry behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences each add essential information: the lease renewal purpose and timeout, the no-op behavior, and the consequence of lease expiry. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with no output schema, the description is complete: it states the timeout, behavior when idle, when it is a no-op, and what happens on expiry. An agent has everything needed to decide when and why to call it, apart from the annotation contradiction noted above.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters and the schema description coverage is 100%, so the baseline is 4. The description does not need to explain input semantics because there are no inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the operation: renew the control lease with an explicit timeout of 20000ms to keep output enabled. This is specific and distinct from sibling tools, which focus on connect/disconnect, intensity, or waveform actions rather than lease renewal.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states when to call this tool: while idle to keep output enabled, and that it is a no-op when no output is active. It does not explicitly name alternatives or exclusions, but no sibling tool fulfills this lease-renewal role, so the guidance is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dglab_list_waveformsList waveformsARead-onlyIdempotent
List built-in Coyote presets and external .pulse waveforms with ids, labels, source, and natural duration. The pulse directory is rescanned on every call, so newly added or changed files appear immediately.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld, and non-destructive behavior. The description adds a valuable behavioral detail beyond annotations: the pulse directory is rescanned on every call, so fresh files appear immediately. This explains dynamic behavior an agent would not otherwise know.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The first sentence states the core purpose and returned fields; the second adds a useful behavioral note. The purpose is front-loaded and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless read-only tool with annotations covering safety, the description is complete enough to invoke correctly. It also compensates for the absent output schema by naming the returned fields, leaving little ambiguity about what the agent will receive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and 100% schema coverage, so there is nothing to document. Per baseline, a parameterless tool receives a 4; the description's mention of returned fields is output semantics, which is acceptable given there is no output schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and names the exact resource ('built-in Coyote presets and external .pulse waveforms'), plus the fields returned (ids, labels, source, natural duration). This clearly differentiates it from sibling tools that connect, play, stop, or adjust — none of which are listing operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description establishes this as the enumeration tool for available waveforms, and the rescan note tells agents this is the way to see newly added or changed files on disk. It does not explicitly mention alternatives, but among siblings it is the only list-style tool, so the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dglab_play_custom_waveformPlay custom waveformA
Compile and play semantic waveform segments (ramp, hold, pulse, silence) on one channel. Total duration is capped at 10000ms. Requires a safe nonzero intensity on the channel; never changes intensity.
| Name | Required | Description | Default |
|---|---|---|---|
| slotId | No | Device slot id within the app. Omit when exactly one compatible device exists. | |
| channel | Yes | Output channel | |
| clientId | No | Paired app (controlled client) id. Omit when exactly one app is attached. | |
| segments | Yes | Waveform segments compiled in order. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is a non-read-only, non-idempotent, non-destructive operation, but the description adds important behavioral context: total duration is capped at 10000ms, a safe nonzero intensity is required, and the tool never changes intensity. This goes beyond the structured annotations and helps an agent assess safety and side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action, and every clause adds value: the segment types, single-channel scope, duration cap, and intensity safety precondition. No filler or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with a rich nested schema and four segment variants, the description covers the key cross-segment constraints: total duration cap, channel scope, and the critical safety requirement that intensity is not changed. It leaves some operational details to the schema and does not describe result/error behavior, but the essential invocation guidance is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema fully documents each segment type and its parameters. The description's mention of segment kinds adds framing but does not add meaning beyond the schema. Baseline 3 is appropriate here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Compile and play semantic waveform segments' on one channel. It also lists the segment types (ramp, hold, pulse, silence), which distinguishes it from the sibling dglab_play_waveform tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly indicates this tool is for custom waveform segments, implicitly separating it from playing saved/predefined waveforms via dglab_play_waveform. It also states key preconditions: a safe nonzero intensity is required, and the tool never changes intensity. It does not explicitly name alternatives, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dglab_play_waveformPlay named waveformA
Play a named waveform (built-in preset or hot-loaded .pulse file; matching is case/separator-insensitive across ids and English/Chinese names) on one channel. Optionally repeat or truncate it to durationMs (max 10000ms). Requires a safe nonzero intensity on the channel; never changes intensity. Playback replaces the channel's current waveform task.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Waveform name or id. | |
| slotId | No | Device slot id within the app. Omit when exactly one compatible device exists. | |
| channel | Yes | Output channel | |
| clientId | No | Paired app (controlled client) id. Omit when exactly one app is attached. | |
| durationMs | No | Bound the playback to this duration by repeating/truncating. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond annotations (readOnlyHint=false, destructiveHint=false): it discloses that playback 'replaces the channel's current waveform task', that it 'requires a safe nonzero intensity', and that it 'never changes intensity'. It also clarifies duration semantics via 'repeat or truncate'. No contradiction with annotations exists — the replacement is a task swap, not data destruction. Note: 'max 10000ms' conflicts with the schema's maximum of 30000, a description-vs-schema inconsistency, not an annotation contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences with the primary verb-resource pair front-loaded in 'Play a named waveform'. Each sentence earns its place: matching semantics, duration option, intensity requirement, and replacement side effect. The first sentence's parenthetical is somewhat heavy but packs crucial matching information without bloat.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the essentials for a mutating tool with 5 params and no output schema: what it plays, where (channel), the precondition (safe nonzero intensity), what it does not do (never changes intensity), and side effect (replaces current task). Gaps remain: no behavior for missing waveforms or unsafe intensity, no acknowledgment/return expectations, and the durationMs max discrepancy leaves the agent uncertain which bound is authoritative.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3 with no obligation to compensate. The description does add value beyond the schema: case/separator-insensitive matching across ids and English/Chinese names for 'name', and repeat/truncate semantics for 'durationMs'. However, it introduces an error — 'max 10000ms' contradicts the schema's maximum of 30000 — which an agent could mistakenly trust, offsetting the added value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Play a named waveform ... on one channel' — and distinguishes itself from siblings: 'named waveform (built-in preset or hot-loaded .pulse file)' separates it from dglab_play_custom_waveform, while 'never changes intensity' separates it from dglab_set_intensity/dglab_adjust_intensity and 'replaces the channel's current waveform task' from dglab_stop_channel. The behavioral scope is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage context: 'Requires a safe nonzero intensity on the channel' states a precondition, and 'never changes intensity' + 'Playback replaces the channel's current waveform task' convey when-not and consequences. However, it never explicitly names sibling alternatives or states 'use dglab_list_waveforms to discover names' or 'use dglab_play_custom_waveform for arbitrary patterns', so the exclusion logic is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dglab_set_intensitySet channel intensityAIdempotent
Set one output channel (A or B) to an absolute target on the 0-200 scale. The target must not exceed the effective ceiling (software cap DGLAB_MAX_INTENSITY=30 tightened by device limits) and increases are limited to steps of 5. Reductions and 0 are always allowed.
| Name | Required | Description | Default |
|---|---|---|---|
| slotId | No | Device slot id within the app. Omit when exactly one compatible device exists. | |
| target | Yes | Absolute intensity target (0-200). | |
| channel | Yes | Output channel | |
| clientId | No | Paired app (controlled client) id. Omit when exactly one app is attached. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses important behavioral constraints: the effective ceiling DGLAB_MAX_INTENSITY=30, the 5-step increase limit, and that reductions and 0 are always allowed. This is valuable operational detail consistent with the idempotentHint and destructiveHint=false annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences with no filler. The core operation is stated first, followed by the constraints. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 4-parameter tool with no output schema, the description plus schema cover the key invocation details: channel selection, target semantics, caps, and step limits. It could be slightly more complete by explicitly noting when to prefer dglab_adjust_intensity, but this is not essential for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning not present in the schema: the effective ceiling, the step increment rule, and the absolute-target semantics. The schema only provides min/max, so this is a meaningful supplement.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Set'), the resource ('one output channel (A or B)'), and the specific semantics ('absolute target on the 0-200 scale'). This inherently distinguishes it from sibling dglab_adjust_intensity, which implies relative adjustment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context: absolute target setting, the 0-200 scale, the effective ceiling, and the step rule for increases. It does not explicitly mention alternatives like dglab_adjust_intensity for relative changes, but the 'absolute' phrasing gives enough context for most agents.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dglab_stop_channelStop channelADestructiveIdempotent
Clear all waveform tasks and reset the intensity of one channel to 0.
| Name | Required | Description | Default |
|---|---|---|---|
| slotId | No | Device slot id within the app. Omit when exactly one compatible device exists. | |
| channel | Yes | Output channel | |
| clientId | No | Paired app (controlled client) id. Omit when exactly one app is attached. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds specific behavioral detail beyond the annotations: it clears all waveform tasks and resets intensity exactly to 0 for one channel. The destructiveHint and readOnlyHint annotations are consistent with this behavior, and the description clarifies the exact scope of the destructive action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that immediately states the two effects: clearing waveform tasks and resetting intensity. There is no filler or redundant restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is well covered by a rich annotation set, a 100% documented schema, and a concise accurate description. The main gap is the lack of explicit relationship to emergency_stop or other stopping alternatives, but for basic selection and invocation the definition is largely sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all three parameters are already documented with clear descriptions and an enum for channel. The description adds no substantial parameter-level meaning, such as how slotId or clientId affect routing, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: clear all waveform tasks and reset the intensity of one channel to 0. This clearly distinguishes it from intensity-setting tools and general status tools, though it could be more explicit about how it differs from emergency_stop.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool versus alternatives such as dglab_emergency_stop or dglab_set_intensity. The intended use is only implied by the action described, with no explicit context or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
11 tool updates
v0.1.2- First observed
dglab_adjust_intensity - First observed
dglab_connect - First observed
dglab_disconnect - First observed
dglab_emergency_stop - First observed
dglab_get_status - First observed
dglab_heartbeat - First observed
dglab_list_waveforms - First observed
dglab_play_custom_waveform - First observed
dglab_play_waveform - First observed
dglab_set_intensity - First observed
dglab_stop_channel
TDQS
Scored across 11 tools
Each tool targets a distinct concern: session lifecycle, status, channel stopping, absolute vs. relative intensity, waveform discovery, file-based vs. custom playback, emergency stop, and lease renewal. Even similar tools like set_intensity and adjust_intensity are clearly separated by absolute vs. delta semantics.
All tools share the dglab_ prefix and mostly follow a verb_object pattern: connect, disconnect, stop_channel, set_intensity, play_waveform. The main deviation is dglab_heartbeat, which is a noun rather than a verb_object command, but it remains predictable and readable within the set.
Eleven tools is well-scoped for a device-control server. Each tool covers a meaningful part of session management, safety, intensity control, and waveform playback without excessive fragmentation.
The tool surface covers the full control lifecycle: connect, disconnect, status, intensity, waveform playback, emergency stop, and lease renewal. A minor gap is that status exposes settings like mute and comfort limits, but there are no direct tools to modify those settings.
Maintenance
Related MCP Connectors
QuLab MCP remote server (Streamable HTTP) for computational science and lab tools.
- mcpOAuthcom.gibsonai
GibsonAI MCP server: manage your databases with natural language
Remote MCP for AI video, image, music and speech generation.
- QuallaaOAuthcom.quallaa
Talk to your public-facing AI from any MCP client — Claude, ChatGPT, Cursor, Cline, Windsurf.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAI-native oscilloscope control. A pure-Python MCP service that lets LLM agents control Keysight EDUX1052G oscilloscopes via a compact DSL.MIT
- AlicenseNot gradedqualityBmaintenanceMCP server for quantum device physics laboratory instrumentation control, enabling LLMs to interact with physics instruments and measurement systems through QCodes and JupyterLab.36MIT
- AlicenseAqualityDmaintenanceMCP server that lets AI assistants control Siglent SDG waveform generators over a local network using natural language, supporting signal generation, modulation, sweep, burst, and arbitrary waveforms.215 npmMIT
- AlicenseNot gradedqualityDmaintenanceEnables natural language control of a live GNU Radio SDR flowgraph, allowing users to tune frequencies, adjust gain, capture IQ samples, analyze spectra, and detect signals through an MCP-compatible client.1MIT