DAQiFi
NUGET · DAQIFI.MCP · SCANNED SEP 20
Discover, configure and read DAQiFi Nyquist data-acquisition hardware from an AI agent
Available components
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 Security100
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- No install/post-install scripts declared.Pass
- No production dependencies, so there is no dependency health to assess. View diagnostics → Pass
Provenance & Transparency45
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 11 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability80
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 3379 tokens (~129/item across 26 items; 26 tools + 0 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 Management40
- Stability observed for 12 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
Tool Safety75
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- 0 of 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "delete_sd_file" implies "delete" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Fail
- An AI judge read all 26 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
How do I install the DAQiFi MCP server?
DAQiFi runs locally as a NuGet package, launched with dnx Daqifi.Mcp@1.8.0 --yes. Ready-made configuration for Claude, Cursor, VS Code, Codex and 3 more is on this page, copied from each client's own documentation.
nuget · Daqifi.Mcp
claude mcp add daqifi-daqifi-mcp -- dnx Daqifi.Mcp@1.8.0 --yes
{
"mcpServers": {
"daqifi-daqifi-mcp": {
"command": "dnx",
"args": [
"Daqifi.Mcp@1.8.0",
"--yes"
]
}
}
} {
"servers": {
"daqifi-daqifi-mcp": {
"command": "dnx",
"args": [
"Daqifi.Mcp@1.8.0",
"--yes"
]
}
}
} codex mcp add daqifi-daqifi-mcp -- dnx Daqifi.Mcp@1.8.0 --yes
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"daqifi-daqifi-mcp": {
"type": "local",
"command": [
"dnx",
"Daqifi.Mcp@1.8.0",
"--yes"
],
"enabled": true
}
}
} mcp_servers:
daqifi-daqifi-mcp:
command: "dnx"
args: ["Daqifi.Mcp@1.8.0", "--yes"] {
"McpServers": {
"daqifi-daqifi-mcp": {
"Transport": "stdio",
"Command": "dnx",
"Arguments": [
"Daqifi.Mcp@1.8.0",
"--yes"
]
}
}
} {
"mcpServers": {
"daqifi-daqifi-mcp": {
"command": "dnx",
"args": [
"Daqifi.Mcp@1.8.0",
"--yes"
]
}
}
} 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.
- 20 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 37 to 40. That category is still filling its 30-day observation window: 11 days of observed history at the previous scan, 12 at this one. The score rises as the window fills, whether or not the server changes.
- 18 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 30 to 33. That category is still filling its 30-day observation window: 9 days of observed history at the previous scan, 10 at this one. The score rises as the window fills, whether or not the server changes.
- 16 Sept 26 +4
- Stability: unverified → 0.27 ▲ functional
- 8 Sept 26 70
First indexed and scored.
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 20 Sept 2026 · Analysed nuget/Daqifi.Mcp@1.8.0
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | nuget |
| Reason | Signature present, unreadable |
Background: How many MCP packages publish verified provenance →
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_samples ~366
Capture a block of live data as rows: one row per sample tick, one column per enabled channel (columns are named AI0/DIO0 and listed in the result). The capture ends at whichever budget runs out first, the duration or the row count, and reports what it actually got — rows, the rate it achieved, and the number of samples dropped because this server could not keep up. Compare measuredRateHz (this machine's clock) with sampleRateHz to see whether the device is streaming as fast as it was asked to, and with deviceClockRateHz (the device's own timestamps) to see whether its clock is keeping real time. Configure channels and the sample rate first. If the device is not already streaming this starts its stream and stops it again afterwards (refused in --read-only mode); a stream that was already running is read and left running. The device is held exclusively for the whole capture, so other tool calls on it wait.
| Name | Type | Req | Description |
|---|---|---|---|
| deviceId | string | yes | The device_id to capture from. |
| durationMs | integer | – | How long to capture for, in milliseconds (default 1000; clamped to 250..60000). The floor is bench-measured: a device that is not streaming yet sends nothing for the first ~100 ms after the start com… |
| maxRows | integer | – | Most rows to return (default 500; clamped to 1..10000). A row is one sample tick across all enabled channels, so 1000 rows at 1 kHz is one second of data. rowLimitReached in the result tells you the… |
No output schema declared.
No examples provided.
configure_analog_channels ~130
Enable exactly the given analog input channels (by channel number) and disable the rest. Pass an empty list to disable all analog channels. Widening the channel set can lower the device's sample-rate ceiling; if the currently set rate no longer fits, it is automatically lowered to the new ceiling and the response's sampleRateAdjustedFromHz reports the rate it was lowered from.
| Name | Type | Req | Description |
|---|---|---|---|
| deviceId | string | yes | The device_id to configure. |
| enabledChannels | array | yes | Analog channel numbers to enable, e.g. [0,1,2,3]. Channels not listed are disabled. |
No output schema declared.
No examples provided.
configure_digital_channels ~130
Enable exactly the given digital channels (by channel number) and disable the rest. Enabled digital channels are sampled during streaming; the device's DIO enable is global, so enabling any digital channel powers the whole port. Pass an empty list to disable all digital channels. As with configure_analog_channels, an over-cap live sample rate is automatically lowered and reported via sampleRateAdjustedFromHz.
| Name | Type | Req | Description |
|---|---|---|---|
| deviceId | string | yes | The device_id to configure. |
| enabledChannels | array | yes | Digital channel numbers to enable, e.g. [0,1,2]. Channels not listed are disabled. |
No output schema declared.
No examples provided.
connect_device ~76
Connect to a previously-discovered device. Pass a device_id from discover_devices. Channels are populated on connect. If that physical device is already connected (including over a different transport), the existing connection is returned — use the device_id from the result for follow-up calls.
| Name | Type | Req | Description |
|---|---|---|---|
| deviceId | string | yes | The device_id from discover_devices. |
No output schema declared.
No examples provided.
delete_sd_file ~89
Permanently delete a file from the device's SD card. There is no undo and no recycle bin — download it first if the data matters. Refused in --read-only mode, and refused while the device is logging.
| Name | Type | Req | Description |
|---|---|---|---|
| deviceId | string | yes | The device_id to delete from. |
| fileName | string | yes | The on-card file name, exactly as list_sd_files reports it. |
No output schema declared.
No examples provided.
disable_pwm ~149
Stop PWM output on a digital channel. The pin is left high-impedance (not driven); use set_digital_direction/set_digital_output to drive it digitally again. Allowed on any digital channel, including one that isn't PWM-capable — this is the only recovery path for the firmware's half-armed PWM state. This call always succeeds from the caller's point of view: if the channel was never actually armed, the firmware rejects the command internally but that rejection is not surfaced here (the tool never throws for it and the result carries no error field).
| Name | Type | Req | Description |
|---|---|---|---|
| channel | integer | yes | The digital channel number to stop PWM on. |
| deviceId | string | yes | The device_id to control. |
No output schema declared.
No examples provided.
disconnect_device ~30
Disconnect from a connected device and release it.
| Name | Type | Req | Description |
|---|---|---|---|
| deviceId | string | yes | The device_id to disconnect. |
No output schema declared.
No examples provided.
discover_devices ~178
Discover DAQiFi devices on USB/serial and WiFi. Returns a list whose device_id values are used by the other tools. Call this first.
| Name | Type | Req | Description |
|---|---|---|---|
| serial | boolean | – | Include USB/serial discovery (default true). |
| timeoutMs | integer | – | Discovery timeout in milliseconds (default 2000; clamped to 1000..30000). The floor is bench-measured: the serial identify handshake takes ~830 ms, so a lower budget returns an empty list before a de… |
| wifi | boolean | – | Include WiFi/network discovery (default true). |
No output schema declared.
No examples provided.
download_sd_file ~215
Download an SD-card log file to this machine and, by default, parse it into a CSV you can read. Returns the local path of both files plus the sample and CSV row counts (a row is one timestamp, not one sample). Run SD retrieval before any live streaming on the same connection: a stream collapses the device's SD buffer and later downloads come back empty. Filenames come from list_sd_files. Large files take as long as the transfer takes.
| Name | Type | Req | Description |
|---|---|---|---|
| deviceId | string | yes | The device_id to download from. |
| exportCsv | boolean | – | Also parse the download and write a CSV next to it (default true). Set false to fetch the raw file only, e.g. when it is large and you just want it on disk. If the parse fails, the download still suc… |
| fileName | string | yes | The on-card file name as list_sd_files reports it (matched without case sensitivity). A name that is not on the card is rejected straight away. |
No output schema declared.
No examples provided.
get_device_status ~48
Get a live status snapshot for a connected device: connection state, streaming/logging flags, sample rate, and enabled analog channels.
| Name | Type | Req | Description |
|---|---|---|---|
| deviceId | string | yes | The device_id to inspect. |
No output schema declared.
No examples provided.
get_sd_storage ~65
Report free, used, and total space on the device's SD card. Refused while the device is logging (the SD card is busy) — call stop_sd_logging first. Available in --read-only mode.
| Name | Type | Req | Description |
|---|---|---|---|
| deviceId | string | yes | The device_id to inspect. |
No output schema declared.
No examples provided.
get_server_info ~145
Report this MCP server's own version and whether a newer Daqifi.Mcp has been published to NuGet. Call it when a tool you expected does not exist, when behaviour disagrees with the documentation, or before telling a user that a DAQiFi cannot do something: the tool surface grows with each release, so an out-of-date server is missing capabilities rather than the hardware lacking them. The message field says what to do about it. Needs no device and no connection, costs no device round-trip, and is available in --read-only mode. The comparison is made once per server start; --no-version-check disables it, and then versionCheck reads 'disabled'.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
latch_analog_outputs ~69
Apply every analog output voltage staged with set_analog_output latch=false, so the staged channels change together. Returns the state of every analog output afterwards. Harmless with nothing staged — the device re-applies what it already holds.
| Name | Type | Req | Description |
|---|---|---|---|
| deviceId | string | yes | The device_id to latch. |
No output schema declared.
No examples provided.
list_analog_outputs ~230
List the device's analog output (DAC) channels with the voltage range each accepts, its resolution, and the value it is driving. Call this before set_analog_output to learn the legal range. An empty list means no DAC channel is modelled, which happens two ways: the board has none (analog output is Nyquist 3 hardware), or it has them but did not describe them in its capability document (firmware below v3.5.0). Do not read an empty list as 'writing is impossible' — in the second case set_analog_output still drives the channel by number and answers with rangeChecked false, saying that nothing validated the voltage; only in the first is it refused. Available in --read-only mode; costs no device round-trip, so `volts` is only what this server has written or read back this session — a null there means this server has not touched the channel, NOT that the pin is at 0 V. Use read_analog_output to ask the device itself.
| Name | Type | Req | Description |
|---|---|---|---|
| deviceId | string | yes | The device_id to inspect. |
No output schema declared.
No examples provided.
list_channels ~38
List all channels on a connected device with their type, enabled state, and direction.
| Name | Type | Req | Description |
|---|---|---|---|
| deviceId | string | yes | The device_id to inspect. |
No output schema declared.
No examples provided.
list_connected_devices ~25
List the devices currently connected to this server. Cheap; safe to call often.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
list_sd_files ~75
List the log files on the device's SD card, with size and creation date where the device reports them. An empty list always means an empty card — a device that fails to answer the listing raises an error instead. Available in --read-only mode.
| Name | Type | Req | Description |
|---|---|---|---|
| deviceId | string | yes | The device_id to list files on. |
No output schema declared.
No examples provided.
read_analog_output ~130
Ask the device what voltage an analog output channel is holding. This is a round-trip to the firmware, so it reflects what the device actually accepted — including a value written before this server connected — but it is not a measurement of the pin: the DAC has no readback path, so the device answers with the value it was last told to drive. Refused while the device is streaming, because the binary stream corrupts the reply. Available in --read-only mode.
| Name | Type | Req | Description |
|---|---|---|---|
| channel | integer | yes | The analog output channel number. |
| deviceId | string | yes | The device_id to query. |
No output schema declared.
No examples provided.
read_channel_values ~237
Read the latest value on every enabled channel: volts for analog inputs, 0/1 for digital ones, each with the timestamp it was sampled at. Returns as soon as every enabled channel has reported, so it normally costs one sample period rather than the full timeout; a channel that reported nothing comes back with a null value rather than a zero. Configure and enable channels first — with none enabled the device sends nothing and the call is refused. If the device is not already streaming this starts its stream and stops it again afterwards (refused in --read-only mode, since that is a change); a stream that was already running is read and left running.
| Name | Type | Req | Description |
|---|---|---|---|
| deviceId | string | yes | The device_id to read. |
| timeoutMs | integer | – | How long to wait for every enabled channel to report, in milliseconds (default 2000; clamped to 500..30000). Reached only when a channel stays silent: a device already streaming at 1 kHz answers in a… |
No output schema declared.
No examples provided.
set_analog_output ~246
Drive an analog output (DAC) channel to a voltage. Nyquist 3 hardware only; on any other board the call is refused rather than silently discarded by the firmware. A voltage outside the channel's range is rejected before anything is sent — call list_analog_outputs for the range. By default the value takes effect immediately; pass latch=false to stage it instead and apply several channels together with latch_analog_outputs. Note that the latch is device-wide, not per-channel: a call with latch=true also applies anything staged earlier on OTHER channels, and the result reports only the channel written — call list_analog_outputs afterwards to see them all.
| Name | Type | Req | Description |
|---|---|---|---|
| channel | integer | yes | The analog output channel number, as list_analog_outputs reports it. |
| deviceId | string | yes | The device_id to control. |
| latch | boolean | – | Apply the value now (default). Pass false to stage it without changing the pin; it takes effect on the next latch_analog_outputs, which is how several outputs are made to change together. |
| volts | number | yes | The output voltage in volts. Must lie inside the channel's range (commonly 0-10 V). |
No output schema declared.
No examples provided.
set_digital_direction ~113
Set a digital channel's direction: 'input' (high-impedance, sampled during streaming) or 'output' (driven by the device; set the level with set_digital_output). Rejected while PWM is enabled on the channel — call disable_pwm first.
| Name | Type | Req | Description |
|---|---|---|---|
| channel | integer | yes | The digital channel number (e.g. 0-15 on Nyquist). |
| deviceId | string | yes | The device_id to configure. |
| direction | string | yes | 'input' or 'output'. |
No output schema declared.
No examples provided.
set_digital_output ~112
Drive a digital channel high or low. If the channel is currently an input it is switched to output direction first, so one call is enough to drive a pin. Rejected while PWM is enabled on the channel — call disable_pwm first.
| Name | Type | Req | Description |
|---|---|---|---|
| channel | integer | yes | The digital channel number (e.g. 0-15 on Nyquist). |
| deviceId | string | yes | The device_id to control. |
| high | boolean | yes | true to drive the pin high, false to drive it low. |
No output schema declared.
No examples provided.
set_pwm_output ~204
Start PWM output on a PWM-capable digital channel (Nyquist: channels 0, 3, 4, 5, 6, 7). Sets the duty cycle, optionally the device-wide frequency, then enables the channel. The frequency is shared by ALL PWM channels (one hardware timer). While PWM runs, set_digital_direction/set_digital_output on the channel are rejected rather than silently ignored — call disable_pwm first to drive it digitally again.
| Name | Type | Req | Description |
|---|---|---|---|
| channel | integer | yes | The PWM-capable digital channel number. |
| deviceId | string | yes | The device_id to control. |
| dutyCyclePercent | integer | yes | Duty cycle in whole percent, 1-100. To stop the output use disable_pwm, not duty 0. |
| frequencyHz | integer | – | PWM frequency in Hz, 6-50000, applied device-wide. Pass 0 to keep the current session frequency (defaults to 1000 Hz until explicitly set). |
No output schema declared.
No examples provided.
set_sample_rate ~136
Set the device sample (streaming) rate in Hz, applied to streaming and SD-card logging. The achievable maximum depends on how many channels are currently enabled (configure channels first for an accurate ceiling) and is further capped by --max-sample-rate-hz if set; a request above the effective cap is rejected — the call throws rather than silently applying a lower rate.
| Name | Type | Req | Description |
|---|---|---|---|
| deviceId | string | yes | The device_id to configure. |
| rateHz | integer | yes | Sample rate in Hz. The ceiling varies with the enabled channel count; get_device_status or a prior configure_analog_channels call error message reports the current limit. |
No output schema declared.
No examples provided.
start_sd_logging ~109
Start on-device SD-card logging using the currently enabled channels and sample rate. Requires a USB/serial connection (the SD card and WiFi share a bus). Configure channels and sample rate first.
| Name | Type | Req | Description |
|---|---|---|---|
| deviceId | string | yes | The device_id to log on. |
| fileName | string|null | – | Optional log file name. If omitted, the device auto-generates log_<timestamp>. |
| format | string | – | Log format: 'protobuf' (default), 'json', or 'csv'. |
No output schema declared.
No examples provided.
stop_sd_logging ~34
Stop on-device SD-card logging on a device.
| Name | Type | Req | Description |
|---|---|---|---|
| deviceId | string | yes | The device_id to stop logging on. |
No output schema declared.
No examples provided.
What is the DAQiFi MCP server?
DAQiFi is an MCP server listed in the public MCP registry as io.github.daqifi/daqifi-mcp. Discover, configure and read DAQiFi Nyquist data-acquisition hardware from an AI agent. This page covers its NuGet package (Daqifi.Mcp).
Is the DAQiFi MCP server safe to use?
DAQiFi scores 76 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 20 September 2026. It declares no install or post-install scripts. 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 DAQiFi MCP server expose?
DAQiFi exposes 26 tools: download_sd_file, start_sd_logging, configure_digital_channels, get_device_status, list_connected_devices, and 21 more. Their descriptions and schemas cost roughly 3,379 tokens of context every time the server is loaded.
Is the DAQiFi MCP server still maintained?
DAQiFi is still listed as active in the MCP registry. We last reached this channel on 20 September 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 DAQiFi MCP server under?
DAQiFi declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.