Sign In

devicecloud-mcp

Package Overview
Dependencies
Maintainers
1
Versions
11
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

devicecloud-mcp - npm Package Compare versions

Comparing version
0.3.0
to
0.3.1
+10
-0
dist/index.test.js

@@ -87,2 +87,12 @@ import { describe, it } from "node:test";

});
it("does not match a screenshot whose name merely contains the flow key as a substring", () => {
const results = {
results: [{ test_file_name: "./flows/login.yaml", status: "FAILED", fail_reason: "boom", duration_seconds: 5, retry_of: null }],
};
const d = buildDiagnosis(status, results, {
failureScreenshots: ["/tmp/r/relogin-failure-screenshot-1.png", "/tmp/r/login-failure-screenshot-1.png"],
reportDir: "/tmp/r",
});
assert.deepEqual(d.failures[0].failureScreenshots, ["/tmp/r/login-failure-screenshot-1.png"]);
});
it("folds a fail-then-pass retry into flakyRecovered, not a failure", () => {

@@ -89,0 +99,0 @@ const results = {

+7
-1

@@ -23,2 +23,8 @@ // DeviceCloud upload `name` fields come back with trailing \r\n from CI; strip on every string field.

}
// Match a flow key as a whole word within a screenshot filename, not a loose substring —
// e.g. flow "login" must not match "relogin-failure-screenshot-1.png".
function matchesFlowKey(screenshot, key) {
const escaped = key.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
return new RegExp(`(^|[^a-z0-9])${escaped}([^a-z0-9]|$)`, "i").test(screenshot.toLowerCase());
}
// Fold a run's status + per-flow results into one triage object an agent can act on.

@@ -73,3 +79,3 @@ // Retries are collapsed per flow: a flow that failed then passed counts as flaky-recovered, not a failure.

retried: attempts.length > 1,
failureScreenshots: key ? screenshots.filter((s) => s.toLowerCase().includes(key)) : [],
failureScreenshots: key ? screenshots.filter((s) => matchesFlowKey(s, key)) : [],
});

@@ -76,0 +82,0 @@ continue;

+2
-2
{
"name": "devicecloud-mcp",
"version": "0.3.0",
"version": "0.3.1",
"mcpName": "io.github.RubenGlez/devicecloud",

@@ -18,3 +18,3 @@ "description": "Triage failing DeviceCloud Maestro test runs from your AI assistant — fail reasons, failure screenshots, and flaky-flow analytics, without opening the web console",

},
"homepage": "https://github.com/RubenGlez/devicecloud-mcp#readme",
"homepage": "https://rubenglez.dev/devicecloud-mcp",
"bugs": {

@@ -21,0 +21,0 @@ "url": "https://github.com/RubenGlez/devicecloud-mcp/issues"

# devicecloud-mcp
[![npm version](https://img.shields.io/npm/v/devicecloud-mcp)](https://www.npmjs.com/package/devicecloud-mcp)
**Triage failing DeviceCloud runs so your agent can fix them, without opening the dashboard.**
**Project page:** [rubenglez.dev/devicecloud-mcp](https://rubenglez.dev/devicecloud-mcp)
When a [DeviceCloud](https://console.devicecloud.dev) run goes red in CI, the reason why is buried in the web dashboard: the fail reason, the failure screenshot, the logs. This server pulls all of it straight into your editor, so your AI assistant (Claude Code, Cursor, Claude Desktop, etc.) can read the evidence, find the root cause, and fix the flow or app code. You commit, CI re-runs, and the dashboard stays closed.

@@ -25,2 +29,4 @@

**Requires Node.js 24+** — check with `node --version`. There's no separate install step; the server runs on demand via `npx`.
Add this to your MCP client config:

@@ -44,2 +50,12 @@

### Claude Code: add it with one command
Skip editing JSON — register the server in one step:
```sh
claude mcp add devicecloud --env DEVICE_CLOUD_API_KEY=<your-key> -- npx -y devicecloud-mcp
```
Add `-s user` to make it available in every project instead of only the current one.
## Configure your assistant

@@ -46,0 +62,0 @@