{"$schema":"https://verifymcp.io/schemas/trust-report.json","schemaVersion":1,"license":{"name":"CC BY-NC 4.0","url":"https://creativecommons.org/licenses/by-nc/4.0/"},"generatedAt":"2026-11-06T05:54:24.927Z","url":"https://verifymcp.io/servers/com-otdeck-otdeck-mcp/otdeck-mcp","markdownUrl":"https://verifymcp.io/servers/com-otdeck-otdeck-mcp/otdeck-mcp.md","server":{"slug":"com-otdeck-otdeck-mcp","name":"OTDeck","registryName":"com.otdeck/otdeck-mcp","description":"Read MQTT, Modbus and OPC UA from AI agents; writes only after the user allows each in OTDeck.","registryStatus":"active","deletedAt":null,"statusMessage":null,"liveness":"live","publisher":{"class":"unknown","claimed":false}},"component":{"slug":"otdeck-mcp","type":"mcpb","identifier":"https://github.com/otdeck/releases/releases/download/v0.4.0/otdeck-mcp-0.4.0.mcpb","withdrawn":false,"url":"https://verifymcp.io/servers/com-otdeck-otdeck-mcp/otdeck-mcp","version":null,"transport":"stdio","scoredAt":"2026-11-06T00:45:41.936Z"},"score":{"total":32,"tier":"low","status":"scored","weekDelta":null,"history":[{"date":"2026-11-06","total":32},{"date":"2026-11-05","total":31},{"date":"2026-11-04","total":31}]},"categories":[{"name":"Supply Chain Security","score":0,"verdict":"unverified","reasons":["No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.","Known CVEs could not be checked: we found no dependency list to check in this bundle: either it runs a compiled binary, whose bundled manifests we do not read, or none of the package.json, requirements.txt, pyproject.toml or uv.lock files it ships for its runtime declares a dependency we can read (a requirements.txt that only points at a setup.py project, a local path, or a nested requirements file we cannot follow counts as none).","Install-script risk not yet assessed.","Dependency health could not be checked: we found no dependency list to check in this bundle: either it runs a compiled binary, whose bundled manifests we do not read, or none of the package.json, requirements.txt, pyproject.toml or uv.lock files it ships for its runtime declares a dependency we can read (a requirements.txt that only points at a setup.py project, a local path, or a nested requirements file we cannot follow counts as none)."],"codes":[{"code":"supplychain.malware_inconclusive","args":{"reason":"ecosystem_unsupported"}},{"code":"cve.inconclusive","args":{"reason":"no_manifest_bundled"}},{"code":"installscript.inconclusive","args":{"reason":"no_install_concept"}},{"code":"dephealth.inconclusive","args":{"reason":"no_manifest_bundled"}}]},{"name":"Provenance & Transparency","score":6,"verdict":"fail","reasons":["Repository check failed: no source repository is declared.","Provenance check failed: no build-provenance attestation is published.","License check failed: the license (SEE LICENSE IN https://otdeck.com/legal/terms) isn't a recognized OSI-approved license.","Actively maintained (last published 0 days ago).","Disclosure check failed: no security disclosure policy was found in the source repository."],"codes":[{"code":"provenance.repo_none","args":{}},{"code":"provenance.none","args":{}},{"code":"license.non_osi","args":{"spdx":"SEE LICENSE IN https://otdeck.com/legal/terms"}},{"code":"maintenance.recent","args":{"age_days":"0"}},{"code":"disclosure.absent","args":{}}]},{"name":"Schema Quality & AI Usability","score":64,"verdict":"fail","reasons":["AI-judged instruction clarity (good).","Context-footprint check failed: tool/resource definitions use about 2714 tokens (~180/item across 15 items; 15 tools + 0 resources), over budget; trim descriptions and params.","Usage-examples check failed: none of the tools include examples."],"codes":[{"code":"schema.ai_quality","args":{"band":"good"}},{"code":"schema.footprint_heavy","args":{"avg":"180","items":"15","tools":"15","tokens":"2714","resources":"0"}},{"code":"schema.examples_absent","args":{}}]},{"name":"Stability & Change Management","score":7,"verdict":"partial","reasons":["Stability observed for 2 of 30 days with no destabilising changes; credit accrues until the full window elapses."],"codes":[{"code":"stability.building_history","args":{"days":"2"}}]},{"name":"Tool Coverage","score":100,"verdict":"pass","reasons":["100% of tools have a non-trivial description (not blank, and not just the tool's name).","100% of tool parameters carry a description.","Structured output schemas are declared (100% of tools); any adoption earns full credit."],"codes":[{"code":"toolquality.descriptions","args":{"pct":"100"}},{"code":"toolquality.param_docs","args":{"pct":"100"}},{"code":"toolquality.output_present","args":{"pct":"100"}}]},{"name":"Tool Safety","score":100,"verdict":"pass","reasons":["No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.","All 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.","An AI judge read all 16 captured unit(s) of tool text and found none that tries to manipulate the model reading it."],"codes":[{"code":"toolsafety.injection_clean","args":{}},{"code":"toolsafety.destructive_declared","args":{"pct":"100","annotated":"1","destructive":"1"}},{"code":"toolsafety.manipulation_clean","args":{"units":"16","judged":"16"}}]},{"name":"Capabilities","score":100,"verdict":"pass","reasons":["Implements a current MCP spec version (2026-07-28)."],"codes":[{"code":"protocol.current","args":{"version":"2026-07-28"}}]}],"inconclusive":["No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.","Known CVEs could not be checked: we found no dependency list to check in this bundle: either it runs a compiled binary, whose bundled manifests we do not read, or none of the package.json, requirements.txt, pyproject.toml or uv.lock files it ships for its runtime declares a dependency we can read (a requirements.txt that only points at a setup.py project, a local path, or a nested requirements file we cannot follow counts as none).","Install-script risk not yet assessed.","Dependency health could not be checked: we found no dependency list to check in this bundle: either it runs a compiled binary, whose bundled manifests we do not read, or none of the package.json, requirements.txt, pyproject.toml or uv.lock files it ships for its runtime declares a dependency we can read (a requirements.txt that only points at a setup.py project, a local path, or a nested requirements file we cannot follow counts as none)."],"malware":[],"components":[{"slug":"otdeck-mcp","type":"mcpb","identifier":"https://github.com/otdeck/releases/releases/download/v0.4.0/otdeck-mcp-0.4.0.mcpb","withdrawn":false,"score":32,"current":true,"url":"https://verifymcp.io/servers/com-otdeck-otdeck-mcp/otdeck-mcp","markdownUrl":"https://verifymcp.io/servers/com-otdeck-otdeck-mcp/otdeck-mcp.md"}],"facts":[{"label":"Registry","value":"mcpb"},{"label":"Package","value":"https://github.com/otdeck/releases/releases/download/v0.4.0/otdeck-mcp-0.4.0.mcpb"},{"label":"Transport","value":"stdio"},{"label":"SHA-256","value":"5bec1b4327ee5604ca42e8f459ecf8adac1bbecec9ed50fe0996681872a0ac13"}],"install":{"available":true,"bundleSha256":"5bec1b4327ee5604ca42e8f459ecf8adac1bbecec9ed50fe0996681872a0ac13"},"tools":[{"name":"browse","title":null,"description":"List the children of an OPC UA node (hierarchical references): node id, browse and display name, node class. Start at i=85 (Objects) and descend; variables are what read_nodes reads.","inputs":[{"name":"connection","type":"string","required":true,"description":"OPC UA connection name or id"},{"name":"limit","type":"integer","required":false,"description":"max children returned (default 200, max 1000)"},{"name":"node_id","type":"string","required":false,"description":"node to list the children of, e.g. i=85 (Objects, the default), i=84 (Root) or ns=2;s=Plant1.Line1"}],"outputs":[{"name":"children","type":"null|array","required":true,"description":null},{"name":"connection","type":"string","required":true,"description":null},{"name":"node_id","type":"string","required":true,"description":null},{"name":"note","type":"string","required":false,"description":null},{"name":"role","type":"string","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":124},{"name":"list_connections","title":null,"description":"List the connections configured in OTDeck: name, protocol (mqtt, modbus, opcua), role (lab, staging, production), address, agents (read, or write when the user lets agents ask for writes), the tools for it, the Modbus register ranges and the OPC UA watch list set up in the app. Use the name as `connection` in other tools.","inputs":[],"outputs":[],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":86},{"name":"list_events","title":null,"description":"Listen to the events of an OPC UA object (default the Server object, every event) for wait_ms and return them newest first, plus the alarms the server still retains (Alarms & Conditions: active, acknowledged, confirmed, severity 1-1000). Read-only: acknowledging alarms is done by a person in the OTDeck app.","inputs":[{"name":"connection","type":"string","required":true,"description":"OPC UA connection name or id, see list_connections"},{"name":"limit","type":"integer","required":false,"description":"at most this many events, newest first (default 50, at most 200)"},{"name":"min_severity","type":"integer","required":false,"description":"only events with at least this severity (1-1000)"},{"name":"notifier","type":"string","required":false,"description":"object whose events to receive (default i=2253, the Server object: every event)"},{"name":"wait_ms","type":"integer","required":false,"description":"how long to listen for new events (default 2000, at most 10000)"}],"outputs":[{"name":"alarms","type":"null|array","required":true,"description":null},{"name":"connection","type":"string","required":true,"description":null},{"name":"events","type":"null|array","required":true,"description":null},{"name":"note","type":"string","required":false,"description":null},{"name":"notifier","type":"string","required":true,"description":null},{"name":"role","type":"string","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":190},{"name":"list_recordings","title":null,"description":"List the recordings saved by the OTDeck app (newest first): id, name, start, length, sample count and per series the source and min/max/mean.","inputs":[],"outputs":[{"name":"recordings","type":"null|array","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":44},{"name":"list_topics","title":null,"description":"List MQTT topics seen on a connection with message counts, rate, retained flag and the last value (truncated). The first call on a connection listens for wait_ms to collect retained and live messages.","inputs":[{"name":"connection","type":"string","required":true,"description":"connection name or id, see list_connections"},{"name":"filter","type":"string","required":false,"description":"MQTT topic filter, default # (every topic); + matches one level, # the rest"},{"name":"limit","type":"integer","required":false,"description":"max topics returned (default 500, max 5000)"},{"name":"wait_ms","type":"integer","required":false,"description":"on a fresh connection, how long to collect messages first (default 1500, max 10000)"}],"outputs":[{"name":"note","type":"string","required":false,"description":null},{"name":"topics","type":"null|array","required":true,"description":null},{"name":"total","type":"integer","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":136},{"name":"publish_message","title":null,"description":"Ask the user to publish one MQTT message (QoS 0-2, optionally retained). Every call opens a window in the OTDeck app: the user sees the values now and the new ones with your reason, and allows or denies it (no answer in 60 s is a denial). Works only on connections the user set to Read and write for agents (OTDeck Pro).","inputs":[{"name":"connection","type":"string","required":true,"description":"MQTT connection name or id (it must be set to Read and write for agents)"},{"name":"encoding","type":"string","required":false,"description":"text (default), hex or base64"},{"name":"payload","type":"string","required":true,"description":"message payload (up to 64 KB)"},{"name":"qos","type":"integer","required":false,"description":"0 (default), 1 or 2"},{"name":"reason","type":"string","required":true,"description":"one sentence for the user: why this message is needed; shown in OTDeck before they allow it"},{"name":"retain","type":"boolean","required":false,"description":"keep the message on the broker for new subscribers"},{"name":"topic","type":"string","required":true,"description":"topic name, without + or #"}],"outputs":[{"name":"connection","type":"string","required":true,"description":null},{"name":"result","type":"string","required":true,"description":null},{"name":"written","type":"null|array","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":212},{"name":"read_history","title":null,"description":"Read the raw history an OPC UA server keeps for a node (HistoryRead): values with time, number and status, plus min/max/mean, for a time range (default the last hour). The node's AccessLevel must include history read; OTDeck pages through the server's continuation points and releases what it does not read.","inputs":[{"name":"connection","type":"string","required":true,"description":"OPC UA connection name or id, see list_connections"},{"name":"from","type":"string","required":false,"description":"start, RFC 3339 (default: seconds before to)"},{"name":"max_values","type":"integer","required":false,"description":"at most this many values (default 500; at most 5000, 1000 on production connections)"},{"name":"node_id","type":"string","required":true,"description":"node id of a variable whose AccessLevel includes history read, e.g. ns=2;s=Plant1.Line1.Press.Temperature"},{"name":"seconds","type":"integer","required":false,"description":"length of the range ending at to when from is not given (default 3600)"},{"name":"to","type":"string","required":false,"description":"end, RFC 3339 (default: now)"}],"outputs":[{"name":"connection","type":"string","required":true,"description":null},{"name":"count","type":"integer","required":true,"description":null},{"name":"from","type":"string","required":true,"description":null},{"name":"max","type":"null|number","required":false,"description":null},{"name":"mean","type":"null|number","required":false,"description":null},{"name":"min","type":"null|number","required":false,"description":null},{"name":"more","type":"boolean","required":false,"description":null},{"name":"node_id","type":"string","required":true,"description":null},{"name":"note","type":"string","required":false,"description":null},{"name":"role","type":"string","required":true,"description":null},{"name":"to","type":"string","required":true,"description":null},{"name":"values","type":"null|array","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":219},{"name":"read_nodes","title":null,"description":"Read the current Value of OPC UA nodes: value (strings and arrays truncated), number when numeric, data type, status (Good/Uncertain/Bad with its meaning) and timestamps.","inputs":[{"name":"connection","type":"string","required":true,"description":"OPC UA connection name or id"},{"name":"node_ids","type":"null|array","required":true,"description":"node ids to read the Value of, e.g. ns=2;s=Plant1.Line1.Press.Temperature (find them with browse)"}],"outputs":[{"name":"connection","type":"string","required":true,"description":null},{"name":"role","type":"string","required":true,"description":null},{"name":"values","type":"null|array","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":99},{"name":"read_recording","title":null,"description":"Read a recording: its summary and, per series, statistics and thinned points (≤500, minima and maxima kept) for an optional time range. Reads the file only; no device is contacted.","inputs":[{"name":"from","type":"string","required":false,"description":"RFC 3339 start time (default: the beginning)"},{"name":"id","type":"string","required":true,"description":"the recording id from list_recordings"},{"name":"points","type":"integer","required":false,"description":"points per series, up to 500 (default 100); min and max of each interval are kept"},{"name":"series","type":"null|array","required":false,"description":"labels of the series to return (default: all)"},{"name":"to","type":"string","required":false,"description":"RFC 3339 end time (default: the end)"}],"outputs":[{"name":"complete","type":"boolean","required":true,"description":null},{"name":"ended","type":"string","required":false,"description":null},{"name":"id","type":"string","required":true,"description":null},{"name":"name","type":"string","required":true,"description":null},{"name":"note","type":"string","required":false,"description":null},{"name":"samples","type":"integer","required":true,"description":null},{"name":"seconds","type":"number","required":true,"description":null},{"name":"series","type":"null|array","required":true,"description":null},{"name":"started","type":"string","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":147},{"name":"read_registers","title":null,"description":"Read Modbus coils, discrete inputs, holding or input registers and decode them (int16/uint16/int32/uint32/int64/uint64/float32/float64/string/hex/bool) with byte and word order. Addresses are 0-based protocol addresses. Use `range` to read a range configured in the app; such a range may carry a scale (value and number are then scaled, raw_value is the register value), a unit and a description from the register map. A device exception is returned in plain words in `error` (with the code in `exception`), not as a failed call.","inputs":[{"name":"address","type":"integer","required":false,"description":"0-based protocol address of the first register (register 40001 in 1-based notation is holding address 0)"},{"name":"byte_order","type":"string","required":false,"description":"big (AB, default) or little (BA): byte order inside each register"},{"name":"connection","type":"string","required":true,"description":"Modbus connection name or id, see list_connections"},{"name":"count","type":"integer","required":false,"description":"number of values to read (default 1); a float32 takes 2 registers, a float64 4"},{"name":"length","type":"integer","required":false,"description":"for type string: registers per string (2 characters each)"},{"name":"range","type":"string","required":false,"description":"label or id of a register range configured in the app (list_connections shows them); replaces table/address/count/type"},{"name":"table","type":"string","required":false,"description":"coils, discrete (discrete inputs), holding (default) or input (input registers)"},{"name":"type","type":"string","required":false,"description":"bool, int16, uint16 (default), int32, uint32, int64, uint64, float32, float64, string or hex; coils and discrete inputs are always bool"},{"name":"word_order","type":"string","required":false,"description":"high (default, ABCD) or low (CDAB): which register holds the high word of 32/64-bit values"}],"outputs":[{"name":"at","type":"string","required":false,"description":null},{"name":"connection","type":"string","required":true,"description":null},{"name":"error","type":"string","required":false,"description":null},{"name":"exception","type":"integer","required":false,"description":null},{"name":"note","type":"string","required":false,"description":null},{"name":"range","type":"object","required":true,"description":null},{"name":"role","type":"string","required":true,"description":null},{"name":"values","type":"null|array","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":391},{"name":"read_topic","title":null,"description":"Read the latest value of an MQTT topic (or of every topic matching a filter, up to 100). Waits up to wait_ms when no value is known yet; retained values arrive at once.","inputs":[{"name":"connection","type":"string","required":true,"description":"connection name or id"},{"name":"topic","type":"string","required":true,"description":"topic name, or a filter with + and # for several topics"},{"name":"wait_ms","type":"integer","required":false,"description":"how long to wait for a value when none is known yet (default 3000, max 30000)"}],"outputs":[{"name":"note","type":"string","required":false,"description":null},{"name":"values","type":"null|array","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":110},{"name":"sample_messages","title":null,"description":"Listen to an MQTT topic filter and return the messages that arrive (up to limit, for at most wait_ms). Payloads are decoded as JSON or text (binary as hex) and truncated to a few KB.","inputs":[{"name":"connection","type":"string","required":true,"description":"connection name or id"},{"name":"filter","type":"string","required":true,"description":"MQTT topic filter, e.g. factory/line1/# or +/+/temperature"},{"name":"limit","type":"integer","required":false,"description":"max messages (default 20, max 200)"},{"name":"wait_ms","type":"integer","required":false,"description":"how long to listen (default 5000, max 30000); returns early when limit is reached"}],"outputs":[{"name":"messages","type":"null|array","required":true,"description":null},{"name":"note","type":"string","required":false,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":132},{"name":"trend_snapshot","title":null,"description":"Recent values of the series on the OTDeck app's trend panel (what the engineer is watching): per series the source, min/max/mean and thinned points over the last `seconds` (≤300). Needs the app running with values on its trend panel.","inputs":[{"name":"points","type":"integer","required":false,"description":"points per series, up to 300 (default 60); min and max of each interval are kept"},{"name":"seconds","type":"integer","required":false,"description":"how far back, up to 300 (default 60)"},{"name":"series","type":"null|array","required":false,"description":"labels or ids of the series to return (default: all on the panel)"}],"outputs":[{"name":"note","type":"string","required":false,"description":null},{"name":"series","type":"null|array","required":true,"description":null},{"name":"writtenAt","type":"string","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":133},{"name":"write_nodes","title":null,"description":"Ask the user to write the Value of OPC UA nodes; OTDeck converts the text to each node's data type. Every call opens a window in the OTDeck app: the user sees the values now and the new ones with your reason, and allows or denies it (no answer in 60 s is a denial). Works only on connections the user set to Read and write for agents (OTDeck Pro).","inputs":[{"name":"connection","type":"string","required":true,"description":"OPC UA connection name or id (it must be set to Read and write for agents)"},{"name":"reason","type":"string","required":true,"description":"one sentence for the user: why this write is needed; shown in OTDeck before they allow it"},{"name":"writes","type":"null|array","required":true,"description":"nodes and their new values (up to 25)"}],"outputs":[{"name":"connection","type":"string","required":true,"description":null},{"name":"result","type":"string","required":true,"description":null},{"name":"written","type":"null|array","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":161},{"name":"write_registers","title":null,"description":"Ask the user to write Modbus holding registers (functions 06/16) or coils (05/15) at consecutive 0-based addresses, encoded like read_registers decodes them. Every call opens a window in the OTDeck app: the user sees the values now and the new ones with your reason, and allows or denies it (no answer in 60 s is a denial). Works only on connections the user set to Read and write for agents (OTDeck Pro).","inputs":[{"name":"address","type":"integer","required":true,"description":"0-based protocol address of the first register or coil"},{"name":"byte_order","type":"string","required":false,"description":"big (default) or little"},{"name":"connection","type":"string","required":true,"description":"Modbus connection name or id, see list_connections (it must be set to Read and write for agents)"},{"name":"reason","type":"string","required":true,"description":"one sentence for the user: why this write is needed; shown in OTDeck before they allow it"},{"name":"scale","type":"number","required":false,"description":"multiplier of a scaled register (the scale read_registers reports for the range, e.g. 0.1): values are then engineering values and the register gets value / scale, which must be a whole number for in…"},{"name":"table","type":"string","required":false,"description":"holding (default) or coils; input registers and discrete inputs cannot be written"},{"name":"type","type":"string","required":false,"description":"holding registers: int16, uint16 (default), int32, uint32, int64, uint64, float32, float64; a 32-bit value takes 2 registers"},{"name":"values","type":"null|array","required":true,"description":"values to write to consecutive addresses (up to 100), as text: numbers for registers, true/false or 1/0 for coils"},{"name":"word_order","type":"string","required":false,"description":"high (default) or low"}],"outputs":[{"name":"connection","type":"string","required":true,"description":null},{"name":"result","type":"string","required":true,"description":null},{"name":"written","type":"null|array","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":371}],"toolsTruncatedAtCapture":false,"diagnostics":{"capturedAt":"2026-11-06T00:45:41.000Z","track":"package","endpoint":null,"declaredUrl":null,"truncated":false,"tls":null,"dnssec":null,"auth":null,"httpsRedirect":null,"transports":[],"provenance":{"outcome":"none","label":"No attestation","reason":"no_attestation","reasonLabel":"No attestation published","discovery":null,"discoveryLabel":null,"sourceRepo":null,"attestationSkipped":null,"attestationSkippedLabel":null},"installScripts":[],"installScriptsTotal":null,"vulnerabilities":[],"vulnerabilitiesTotal":null,"dependencies":null},"mismatches":[],"changelog":{"trackingSince":"2026-11-04","recent":[{"id":"chg_01a1ae51-8ac4-74a6-8c0a-338a08a170d3","kind":"check.measure","summary":"Schema quality (2305 → 2714)","materiality":"functional","direction":"regression","scoreDelta":null,"occurredOn":"2026-11-06","url":"https://verifymcp.io/servers/com-otdeck-otdeck-mcp/otdeck-mcp#chg-chg_01a1ae51-8ac4-74a6-8c0a-338a08a170d3"},{"id":"chg_01a1ae2d-5ab8-7d5e-961f-2b1cdd96ce71","kind":"score.total_changed","summary":"Trust score (31 → 32)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-11-06","url":"https://verifymcp.io/servers/com-otdeck-otdeck-mcp/otdeck-mcp#chg-chg_01a1ae2d-5ab8-7d5e-961f-2b1cdd96ce71"},{"id":"chg_01a1abd6-b9d8-7d6c-be38-91e864ca110f","kind":"check.unverifiable","summary":"Stability (0.00 → unverified)","materiality":"security","direction":"regression","scoreDelta":null,"occurredOn":"2026-11-05","url":"https://verifymcp.io/servers/com-otdeck-otdeck-mcp/otdeck-mcp#chg-chg_01a1abd6-b9d8-7d6c-be38-91e864ca110f"},{"id":"chg_01a1abd6-b9d9-78cd-a2da-c8747bbaf50f","kind":"score.total_changed","summary":"Trust score (32 → 31)","materiality":"functional","direction":"regression","scoreDelta":-1,"occurredOn":"2026-11-05","url":"https://verifymcp.io/servers/com-otdeck-otdeck-mcp/otdeck-mcp#chg-chg_01a1abd6-b9d9-78cd-a2da-c8747bbaf50f"},{"id":"chg_01a1aa3b-a97f-7736-9316-5507686350cb","kind":"score.total_changed","summary":"Trust score (31 → 32)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-11-05","url":"https://verifymcp.io/servers/com-otdeck-otdeck-mcp/otdeck-mcp#chg-chg_01a1aa3b-a97f-7736-9316-5507686350cb"},{"id":"chg_01a1a74c-8fb4-72a5-992d-3dd1de80953b","kind":"score.first_scored","summary":"First indexed and scored","materiality":"functional","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-04","url":"https://verifymcp.io/servers/com-otdeck-otdeck-mcp/otdeck-mcp#chg-chg_01a1a74c-8fb4-72a5-992d-3dd1de80953b"},{"id":"chg_01a1a74a-9bb1-714f-9cd8-5bf5d2bd83ae","kind":"score.first_scored","summary":"First indexed and scored","materiality":"functional","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-04","url":"https://verifymcp.io/servers/com-otdeck-otdeck-mcp/otdeck-mcp#chg-chg_01a1a74a-9bb1-714f-9cd8-5bf5d2bd83ae"}],"truncated":false,"feedUrl":"https://verifymcp.io/servers/com-otdeck-otdeck-mcp/otdeck-mcp/changelog.json"},"links":{"html":"https://verifymcp.io/servers/com-otdeck-otdeck-mcp/otdeck-mcp","markdown":"https://verifymcp.io/servers/com-otdeck-otdeck-mcp/otdeck-mcp.md","changelogJson":"https://verifymcp.io/servers/com-otdeck-otdeck-mcp/otdeck-mcp/changelog.json","changelogRss":"https://verifymcp.io/servers/com-otdeck-otdeck-mcp/otdeck-mcp.xml","external":[{"label":"Website","href":"https://otdeck.com/mcp"}]}}