# GenieACS (oci · drumsergio/genieacs-mcp)

MCP server bridging GenieACS TR-069 ACS instances to LLMs for CPE device management

- Trust score: 49/100 (low)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- npm · `genieacs-mcp`: 48/100, [markdown](https://verifymcp.io/servers/geiserx-genieacs-mcp/genieacs-mcp.md), [page](https://verifymcp.io/servers/geiserx-genieacs-mcp/genieacs-mcp)
- oci · `drumsergio/genieacs-mcp`: 49/100 (this document), [markdown](https://verifymcp.io/servers/geiserx-genieacs-mcp/drumsergio-genieacs-mcp.md), [page](https://verifymcp.io/servers/geiserx-genieacs-mcp/drumsergio-genieacs-mcp)

## Channel facts

- Registry: `oci`
- Package: `drumsergio/genieacs-mcp`
- Version: `v0.4.1`
- Transport: `stdio`

## Trust breakdown

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. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-05.

- **Supply Chain Security**: 0/100
  - 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: this artifact ships no SBOM or dependency manifest, so there is no dependency list to read.
  - Install-script risk not yet assessed.
  - Dependency health could not be checked: this artifact ships no SBOM or dependency manifest, so there is no dependency list to read.
- **Provenance & Transparency**: 35/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - License check failed: no license is declared.
  - Actively maintained (last published 7 days ago).
  - Publishes a security disclosure policy (SECURITY.md).
- **Schema Quality & AI Usability**: 79/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 3724 tokens (~248/item across 15 items; 12 tools + 3 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 69/100
  - Stability check failed: the tool surface changed between v0.3.6 and v0.4.1: 0 tool removals, 1 breaking changes, 0 additions.
- **Tool Coverage**: 100/100
  - 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 (50% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - All 2 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.
  - An AI judge read all 14 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

**Unverified: 1 category.** A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

## Install

### How do I install the GenieACS MCP server?

GenieACS runs locally as a container image, launched with docker run --rm -i -e ACS_URL -e ACS_USER -e ACS_PASS -e DEVICE_LIMIT -e GENIEACS_READ_ONLY -e GENIEACS_TOOLS -e ACS_TIMEOUT -e ACS_MAX_RESPONSE_BYTES drumsergio/genieacs-mcp:v0.4.1. Ready-made configuration for Claude, Cursor, VS Code, Codex and 3 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add geiserx-genieacs-mcp -- docker run --rm -i -e ACS_URL -e ACS_USER -e ACS_PASS -e DEVICE_LIMIT -e GENIEACS_READ_ONLY -e GENIEACS_TOOLS -e ACS_TIMEOUT -e ACS_MAX_RESPONSE_BYTES drumsergio/genieacs-mcp:v0.4.1
```

This image reads ACS_URL, ACS_USER, ACS_PASS, DEVICE_LIMIT, GENIEACS_READ_ONLY, GENIEACS_TOOLS, ACS_TIMEOUT and ACS_MAX_RESPONSE_BYTES. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### Cursor

```json
{
  "mcpServers": {
    "geiserx-genieacs-mcp": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-e",
        "ACS_URL",
        "-e",
        "ACS_USER",
        "-e",
        "ACS_PASS",
        "-e",
        "DEVICE_LIMIT",
        "-e",
        "GENIEACS_READ_ONLY",
        "-e",
        "GENIEACS_TOOLS",
        "-e",
        "ACS_TIMEOUT",
        "-e",
        "ACS_MAX_RESPONSE_BYTES",
        "drumsergio/genieacs-mcp:v0.4.1"
      ]
    }
  }
}
```

This image reads ACS_URL, ACS_USER, ACS_PASS, DEVICE_LIMIT, GENIEACS_READ_ONLY, GENIEACS_TOOLS, ACS_TIMEOUT and ACS_MAX_RESPONSE_BYTES. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### VS Code

```json
{
  "servers": {
    "geiserx-genieacs-mcp": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-e",
        "ACS_URL",
        "-e",
        "ACS_USER",
        "-e",
        "ACS_PASS",
        "-e",
        "DEVICE_LIMIT",
        "-e",
        "GENIEACS_READ_ONLY",
        "-e",
        "GENIEACS_TOOLS",
        "-e",
        "ACS_TIMEOUT",
        "-e",
        "ACS_MAX_RESPONSE_BYTES",
        "drumsergio/genieacs-mcp:v0.4.1"
      ]
    }
  }
}
```

This image reads ACS_URL, ACS_USER, ACS_PASS, DEVICE_LIMIT, GENIEACS_READ_ONLY, GENIEACS_TOOLS, ACS_TIMEOUT and ACS_MAX_RESPONSE_BYTES. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### Codex

```bash
codex mcp add geiserx-genieacs-mcp -- docker run --rm -i -e ACS_URL -e ACS_USER -e ACS_PASS -e DEVICE_LIMIT -e GENIEACS_READ_ONLY -e GENIEACS_TOOLS -e ACS_TIMEOUT -e ACS_MAX_RESPONSE_BYTES drumsergio/genieacs-mcp:v0.4.1
```

This image reads ACS_URL, ACS_USER, ACS_PASS, DEVICE_LIMIT, GENIEACS_READ_ONLY, GENIEACS_TOOLS, ACS_TIMEOUT and ACS_MAX_RESPONSE_BYTES. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "geiserx-genieacs-mcp": {
      "type": "local",
      "command": [
        "docker",
        "run",
        "--rm",
        "-i",
        "-e",
        "ACS_URL",
        "-e",
        "ACS_USER",
        "-e",
        "ACS_PASS",
        "-e",
        "DEVICE_LIMIT",
        "-e",
        "GENIEACS_READ_ONLY",
        "-e",
        "GENIEACS_TOOLS",
        "-e",
        "ACS_TIMEOUT",
        "-e",
        "ACS_MAX_RESPONSE_BYTES",
        "drumsergio/genieacs-mcp:v0.4.1"
      ],
      "enabled": true
    }
  }
}
```

This image reads ACS_URL, ACS_USER, ACS_PASS, DEVICE_LIMIT, GENIEACS_READ_ONLY, GENIEACS_TOOLS, ACS_TIMEOUT and ACS_MAX_RESPONSE_BYTES. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### Hermes

```yaml
mcp_servers:
  geiserx-genieacs-mcp:
    command: "docker"
    args: ["run", "--rm", "-i", "-e", "ACS_URL", "-e", "ACS_USER", "-e", "ACS_PASS", "-e", "DEVICE_LIMIT", "-e", "GENIEACS_READ_ONLY", "-e", "GENIEACS_TOOLS", "-e", "ACS_TIMEOUT", "-e", "ACS_MAX_RESPONSE_BYTES", "drumsergio/genieacs-mcp:v0.4.1"]
```

This image reads ACS_URL, ACS_USER, ACS_PASS, DEVICE_LIMIT, GENIEACS_READ_ONLY, GENIEACS_TOOLS, ACS_TIMEOUT and ACS_MAX_RESPONSE_BYTES. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### Netclaw

```json
{
  "McpServers": {
    "geiserx-genieacs-mcp": {
      "Transport": "stdio",
      "Command": "docker",
      "Arguments": [
        "run",
        "--rm",
        "-i",
        "-e",
        "ACS_URL",
        "-e",
        "ACS_USER",
        "-e",
        "ACS_PASS",
        "-e",
        "DEVICE_LIMIT",
        "-e",
        "GENIEACS_READ_ONLY",
        "-e",
        "GENIEACS_TOOLS",
        "-e",
        "ACS_TIMEOUT",
        "-e",
        "ACS_MAX_RESPONSE_BYTES",
        "drumsergio/genieacs-mcp:v0.4.1"
      ]
    }
  }
}
```

This image reads ACS_URL, ACS_USER, ACS_PASS, DEVICE_LIMIT, GENIEACS_READ_ONLY, GENIEACS_TOOLS, ACS_TIMEOUT and ACS_MAX_RESPONSE_BYTES. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### Other

```json
{
  "mcpServers": {
    "geiserx-genieacs-mcp": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-e",
        "ACS_URL",
        "-e",
        "ACS_USER",
        "-e",
        "ACS_PASS",
        "-e",
        "DEVICE_LIMIT",
        "-e",
        "GENIEACS_READ_ONLY",
        "-e",
        "GENIEACS_TOOLS",
        "-e",
        "ACS_TIMEOUT",
        "-e",
        "ACS_MAX_RESPONSE_BYTES",
        "drumsergio/genieacs-mcp:v0.4.1"
      ]
    }
  }
}
```

This image reads ACS_URL, ACS_USER, ACS_PASS, DEVICE_LIMIT, GENIEACS_READ_ONLY, GENIEACS_TOOLS, ACS_TIMEOUT and ACS_MAX_RESPONSE_BYTES. Set them in your client's env block for this server; docker run -e passes each one through to the container.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-11-05 (score 49, +1)

No change was recorded against any check on this day. Stability & Change Management went from 66 to 69.

### 2026-11-03 (score 48, +1)

No change was recorded against any check on this day. Stability & Change Management went from 59 to 63.

### 2026-10-31 (score 47, +1)

No change was recorded against any check on this day. Stability & Change Management went from 49 to 53.

### 2026-10-29 (score 46, +1)

No change was recorded against any check on this day. Stability & Change Management went from 43 to 46.

### 2026-10-28 (score 45, 0)

- [security regression] Stability: fail → unverified
- [security regression] Tool safety: pass → unverified
- [functional regression] Tool coverage: 100 → unverified
- [functional regression] Capabilities: pass → unverified
- [functional regression] Schema quality: 100 → unverified
- [functional] Package version: v0.4.0 → v0.4.1

### 2026-10-27 (score 45, 0)

- [security regression] Stability: 0.40 → fail
- [functional] First check of Tool coverage: 50
- [functional] MCP protocol: Implements a current MCP spec version (2026-07-28).
- [functional] Package version: v0.3.7 → v0.4.0

### 2026-10-25 (score 45, +1)

No change was recorded against any check on this day. Stability & Change Management went from 33 to 37. That category is still filling its 30-day observation window: 10 days of observed history at the previous scan, 11 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-23 (score 44, +1)

- [functional improvement] Security disclosure: unverified → pass

## MCP tools (12)

### `connection_request` (~197 tokens)

Wake device (connection request)

Send a TR-069 connection request so a CPE device contacts GenieACS now instead of at its next periodic inform. Use it to run tasks that are already queued, or to apply a preset change without waiting. It queues nothing itself. Succeeds when the device answered; fails with ACS error 504 when the device is unreachable (offline, or behind NAT without STUN). Example: connection_request(device_id="202BC1-BM632w-000001").

Input parameters:

- `device_id` (string, required): The GenieACS device id (the _id field), exactly as GenieACS stores it, usually OUI-ProductClass-SerialNumber, e.g. "202BC1-BM632w-000001". GenieACS escapes characters other than letters and digits in…

### `delete_task` (~166 tokens)

Delete queued task

Remove a task from the GenieACS queue before the device runs it, for example a firmware download or reboot queued by mistake, or a faulted task you do not want retried. GenieACS already deletes a task once the device has run it, so every task you can see in genieacs://tasks/{device_id} is either waiting or faulted. Fails with ACS error 503 while the device is in a session with GenieACS; try again a few seconds later. Use retry_task instead to run a faulted task again. Example: delete_task(task_id="67abc123def4560012345678").

Input parameters:

- `task_id` (string, required): The task's _id, from genieacs://tasks/{device_id} or from the task_id a task tool returned.

### `download_firmware` (~323 tokens)

Push firmware or file to device

Tell a CPE device to download and apply a file stored on GenieACS: a firmware image, a configuration file or another file the device accepts. A wrong image can leave a device unusable, so check the file's metadata (genieacs://file/{name}: OUI, product class, version) against the device first. GenieACS queues a download task and sends a connection request at once; the transfer itself can take minutes after the tool returns. Check genieacs://tasks/{device_id} and genieacs://faults/{device_id} afterwards. Example: download_firmware(device_id="202BC1-BM632w-000001", file_id="firmware-v2.0.bin").

Input parameters:

- `device_id` (string, required): The GenieACS device id (the _id field), exactly as GenieACS stores it, usually OUI-ProductClass-SerialNumber, e.g. "202BC1-BM632w-000001". GenieACS escapes characters other than letters and digits in…
- `file_id` (string, required): The _id of the file on GenieACS, which is its filename, e.g. "firmware-v2.0.bin". Check it exists with genieacs://file/{name}.
- `filename` (string): Optional target file name sent to the device (TR-069 TargetFileName). Omit it to let the device choose.

Output parameters:

- `device_id` (string): The device the task was queued on.
- `message` (string): What happened, in one sentence.
- `status` (string): done: the device ran the task in the session GenieACS opened at once. queued: the device did not answer within 3 seconds, so the task runs at its next inform or connection request.
- `task`: The task document GenieACS returned.
- `task_id` (string): The GenieACS task id; use it with delete_task or retry_task, or look for it in genieacs://tasks/{device_id}.

### `get_parameter` (~262 tokens)

Read cached device parameters

Read TR-069 parameter values GenieACS has cached for a device, without contacting the device: firmware version, serial number, uptime, WiFi SSID, IP addresses and so on. Values are what the device reported at its last inform or refresh, with a timestamp each; call refresh_parameter first when you need a value from the device now. Give one path or a comma-separated list; an object path such as "Device.WiFi" returns every cached leaf under it. Returns found=false for an unknown device id, and lists paths with no cached value under missing.

Input parameters:

- `device_id` (string, required): The GenieACS device id (the _id field), exactly as GenieACS stores it, usually OUI-ProductClass-SerialNumber, e.g. "202BC1-BM632w-000001". GenieACS escapes characters other than letters and digits in…
- `parameter_path` (string, required): Comma-separated TR-069 paths. Example: "Device.DeviceInfo.SoftwareVersion" or "InternetGatewayDevice.DeviceInfo.SoftwareVersion,InternetGatewayDevice.DeviceInfo.UpTime".

Output parameters:

- `device_id` (string)
- `found` (boolean): false when no device has this id.
- `missing` (null|array): Requested paths with no cached value; refresh_parameter can fetch them.
- `parameters` (object): Every cached leaf parameter at or under the requested paths, keyed by full path.

### `manage_preset` (~289 tokens)

Create, replace or delete preset

Create, replace or delete a GenieACS preset. A preset is a fleet-wide rule: at their next inform, every device matching its precondition gets its configurations applied, so a broad precondition (or an empty one) reconfigures the whole fleet. Confirm the precondition and the devices it matches (search_devices with the same filter) before a put. action="put" creates or overwrites the preset with body; action="delete" removes it. body is a JSON object: weight (integer, higher wins), precondition (a MongoDB-style filter as a JSON string, e.g. "{\"_tags\":\"office\"}"), and configurations (an array of {type: "value" | "provision" | "add_object" | "delete_object", ...}). Example body: {"weight":0,"precondition":"{\"_tags\":\"pilot\"}","configurations":[{"type":"provision","name":"myScript"}]}. Read genieacs://presets/list first.

Input parameters:

- `action` (string, required): "put" creates or replaces the preset, "delete" removes it.
- `body` (string): For action="put": the preset document as a JSON object string, with weight, precondition and configurations. Ignored for "delete".
- `name` (string, required): The preset name, its id on GenieACS. It cannot contain a dot.

### `manage_provision` (~221 tokens)

Create, replace or delete provision script

Create, replace or delete a GenieACS provision script. A provision is JavaScript that GenieACS runs during the inform session of every device a preset applies it to, so replacing one changes how those devices are configured. Scripts use the GenieACS sandbox API (declare, commit, clear, ext, log); ext() calls extension scripts that run on the ACS host with full privileges, so treat a provision as code running on your ACS. action="put" uploads or overwrites the script (raw JavaScript, not JSON; GenieACS answers 400 on a syntax error); action="delete" removes it. Presets reference provisions by name. Read genieacs://provisions/list first. Example script: log("Device " + DeviceID.ID + " informed");

Input parameters:

- `action` (string, required): "put" creates or replaces the script, "delete" removes it.
- `name` (string, required): The provision name, its id on GenieACS.
- `script` (string): For action="put": the JavaScript source. Ignored for "delete".

### `reboot_device` (~233 tokens)

Reboot device

Reboot a CPE device through GenieACS. Use it when a device needs a restart, for example after a configuration change or to recover an unresponsive device. The device drops its service while it restarts. GenieACS queues the task and sends a connection request at once: status "done" means the device ran it in that session, "queued" means it runs at the device's next inform. A reboot does not confirm the device came back; read Device.DeviceInfo.UpTime (or InternetGatewayDevice.DeviceInfo.UpTime) with refresh_parameter afterwards. Example: reboot_device(device_id="202BC1-BM632w-000001").

Input parameters:

- `device_id` (string, required): The GenieACS device id (the _id field), exactly as GenieACS stores it, usually OUI-ProductClass-SerialNumber, e.g. "202BC1-BM632w-000001". GenieACS escapes characters other than letters and digits in…

Output parameters:

- `device_id` (string): The device the task was queued on.
- `message` (string): What happened, in one sentence.
- `status` (string): done: the device ran the task in the session GenieACS opened at once. queued: the device did not answer within 3 seconds, so the task runs at its next inform or connection request.
- `task`: The task document GenieACS returned.
- `task_id` (string): The GenieACS task id; use it with delete_task or retry_task, or look for it in genieacs://tasks/{device_id}.

### `refresh_parameter` (~290 tokens)

Refresh parameter from device

Ask a CPE device for the current value of a TR-069 parameter, or of every parameter under an object path, and store it in GenieACS. Use it when get_parameter's cached value may be stale. It changes nothing on the device. GenieACS queues a getParameterValues task and sends a connection request at once: status "done" means the fresh value is already stored, so read it with get_parameter; "queued" means it arrives at the device's next inform. Example: refresh_parameter(device_id="202BC1-BM632w-000001", parameter="Device.DeviceInfo.SoftwareVersion").

Input parameters:

- `device_id` (string, required): The GenieACS device id (the _id field), exactly as GenieACS stores it, usually OUI-ProductClass-SerialNumber, e.g. "202BC1-BM632w-000001". GenieACS escapes characters other than letters and digits in…
- `parameter` (string, required): Full dotted TR-069 path in the device's data model. Examples: "Device.DeviceInfo.SoftwareVersion", "InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.SSID", or an object such as "Device.WiFi." fo…

Output parameters:

- `device_id` (string): The device the task was queued on.
- `message` (string): What happened, in one sentence.
- `status` (string): done: the device ran the task in the session GenieACS opened at once. queued: the device did not answer within 3 seconds, so the task runs at its next inform or connection request.
- `task`: The task document GenieACS returned.
- `task_id` (string): The GenieACS task id; use it with delete_task or retry_task, or look for it in genieacs://tasks/{device_id}.

### `retry_task` (~116 tokens)

Retry faulted task

Run a faulted task again: GenieACS clears the task's fault, and the device runs the task at its next session. Read genieacs://faults/{device_id} first to see why it failed; retrying a task whose cause is unchanged faults again. A task that has not faulted is left as it is. Example: retry_task(task_id="67abc123def4560012345678").

Input parameters:

- `task_id` (string, required): The faulted task's _id, from genieacs://tasks/{device_id}.

### `search_devices` (~413 tokens)

Search devices

Find CPE devices in GenieACS with a MongoDB-style filter: by tag, manufacturer, model, firmware version, last inform time or any TR-069 parameter. It only reads. Examples: {"_tags":"office"}; {"InternetGatewayDevice.DeviceInfo.Manufacturer":"Huawei"} (GenieACS adds ._value to parameter paths); {"_lastInform":{"$lt":"2026-01-01T00:00:00Z"}} for devices silent since that date; {"_id":{"$regex":"^202BC1-"}}. Query operators such as $eq, $ne, $gt, $lt, $in, $nin, $exists, $regex, $and and $or work; $where, $function, $accumulator and $expr are refused, and a $regex pattern may be at most 256 characters. By default each device comes back as a summary (id, last inform, tags, manufacturer, product class, serial); ask for other fields with projection. Results come in pages of limit (default 50, at most 200); page with skip.

Input parameters:

- `limit` (integer): Most devices to return in this page, 1 to 200. Default 50.
- `projection` (string): Comma-separated fields to return per device, e.g. "_id,InternetGatewayDevice.DeviceInfo.SoftwareVersion". Default: the summary fields. "all" returns whole device documents, which can be large (tens o…
- `query` (string, required): The filter, as a JSON object string. Example: {"_tags":"office"} or {"_id":"202BC1-BM632w-000001"}.
- `skip` (integer): Matching devices to skip before this page, for paging. Default 0.
- `sort` (string): Sort order as a JSON object string: 1 ascending, -1 descending. Example: {"_lastInform":-1} for the most recent first.

Output parameters:

- `count` (integer): Devices in this page.
- `devices` (null|array): The matching device documents, with the fields the projection asked for.
- `limit` (integer): The page size used.
- `more` (boolean): true when the page is full, so more devices may match: call again with skip = skip + count.
- `skip` (integer): Devices skipped before this page.

### `set_parameter` (~389 tokens)

Set device parameters

Write one or more TR-069 parameter values on a CPE device, overwriting the current values: WiFi SSID or key, periodic inform interval, management server URL, or any writable parameter. A wrong value can cut the device off (a wrong WAN or ACS URL setting, for example). parameter_values is a JSON array of [path, value] or [path, value, xsdType] tuples; xsd types include xsd:string, xsd:boolean, xsd:unsignedInt, xsd:int and xsd:dateTime, and GenieACS infers the type when it is omitted. Example: [["InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.SSID","Lab-2","xsd:string"]]. GenieACS queues the task and sends a connection request at once: status "done" means the device applied it, "queued" means it runs at the next inform. A read-only or unknown parameter makes the device fault the task; see genieacs://faults/{device_id}. Read the current value with get_parameter first.

Input parameters:

- `device_id` (string, required): The GenieACS device id (the _id field), exactly as GenieACS stores it, usually OUI-ProductClass-SerialNumber, e.g. "202BC1-BM632w-000001". GenieACS escapes characters other than letters and digits in…
- `parameter_values` (string, required): JSON array of tuples, each [path, value] or [path, value, xsdType]. Example: [["Device.WiFi.SSID.1.SSID","NewName","xsd:string"],["Device.ManagementServer.PeriodicInformInterval",300,"xsd:unsignedInt…

Output parameters:

- `device_id` (string): The device the task was queued on.
- `message` (string): What happened, in one sentence.
- `status` (string): done: the device ran the task in the session GenieACS opened at once. queued: the device did not answer within 3 seconds, so the task runs at its next inform or connection request.
- `task`: The task document GenieACS returned.
- `task_id` (string): The GenieACS task id; use it with delete_task or retry_task, or look for it in genieacs://tasks/{device_id}.

### `tag_device` (~281 tokens)

Add or remove device tag

Add a tag to a CPE device or remove one. Tags group devices: presets match on them (precondition {"_tags":"office"}) and search_devices finds by them. Adding or removing a tag can therefore make a preset apply to the device, or stop applying, at its next inform. Tags are case-sensitive. Use letters, digits, "-" and "_": GenieACS rejects a tag with other characters (a "." for example) with a 404. Fails with ACS error 404 when the device id does not exist. Example: tag_device(device_id="202BC1-BM632w-000001", tag="office", action="add").

Input parameters:

- `action` (string, required): "add" tags the device, "remove" untags it.
- `device_id` (string, required): The GenieACS device id (the _id field), exactly as GenieACS stores it, usually OUI-ProductClass-SerialNumber, e.g. "202BC1-BM632w-000001". GenieACS escapes characters other than letters and digits in…
- `tag` (string, required): The tag, e.g. "office", "floor-2", "firmware_pending".

## Diagnostics

Captured diagnostic sections: Provenance. The full working is on the page: https://verifymcp.io/servers/geiserx-genieacs-mcp/drumsergio-genieacs-mcp#diagnostics

## Score history

- 2026-11-05: 49
- 2026-11-04: 48
- 2026-11-03: 48
- 2026-11-02: 47
- 2026-11-01: 47
- 2026-10-31: 47
- 2026-10-30: 46
- 2026-10-29: 46
- 2026-10-28: 45
- 2026-10-27: 45
- 2026-10-26: 45
- 2026-10-25: 45
- 2026-10-24: 44
- 2026-10-23: 44
- 2026-10-22: 43
- 2026-10-21: 43
- 2026-10-20: 42
- 2026-10-19: 42
- 2026-10-18: 41
- 2026-10-17: 41
- 2026-10-16: 39
- 2026-10-15: 39
- 2026-10-14: 39
- 2026-10-13: 7
- 2026-10-12: 7
- 2026-10-06: 7

## Common questions

### What is the GenieACS MCP server?

GenieACS is an MCP server listed in the public MCP registry as io.github.GeiserX/genieacs-mcp. MCP server bridging GenieACS TR-069 ACS instances to LLMs for CPE device management. This page covers its container image (drumsergio/genieacs-mcp).

### Is the GenieACS MCP server safe to use?

GenieACS scores 49 out of 100 on VerifyMCP. 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 GenieACS MCP server expose?

GenieACS exposes 12 tools: connection_request, delete_task, download_firmware, get_parameter, manage_preset, and 7 more. Their descriptions and schemas cost roughly 3,180 tokens of context every time the server is loaded.

### Is the GenieACS MCP server still maintained?

GenieACS is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- Docker Hub: https://hub.docker.com/r/drumsergio/genieacs-mcp
- Repository: https://github.com/GeiserX/genieacs-mcp
- Website: https://geiserx.github.io/genieacs-mcp/
- Changelog RSS feed: https://verifymcp.io/servers/geiserx-genieacs-mcp/drumsergio-genieacs-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/geiserx-genieacs-mcp/drumsergio-genieacs-mcp.json
- HTML version of this page: https://verifymcp.io/servers/geiserx-genieacs-mcp/drumsergio-genieacs-mcp
