Skip to main content
Glama
daedalus

mcp-snap7

by daedalus
README.md
# mcp-snap7

> MCP server for python-snap7, enabling MCP clients to interact with Siemens PLCs

[![PyPI](https://img.shields.io/pypi/v/mcp-snap7.svg)](https://pypi.org/project/mcp-snap7/)
[![Python](https://img.shields.io/pypi/pyversions/mcp-snap7.svg)](https://pypi.org/project/mcp-snap7/)
[![Coverage](https://codecov.io/gh/daedalus/mcp-snap7/branch/main/graph/badge.svg)](https://codecov.io/gh/daedalus/mcp-snap7)
[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)

## Install

```bash
pip install mcp-snap7
```

## Requirements

- python-snap7 requires the libsnap7 library to be installed on your system.
  See [python-snap7 documentation](https://python-snap7.readthedocs.io/) for installation instructions.

## Usage

### As MCP Server

Configure your MCP client to use `mcp-snap7` as a stdio server:

```json
{
  "mcpServers": {
    "mcp-snap7": {
      "command": "mcp-snap7"
    }
  }
}
```

### Available Tools

- `connect_plc` - Connect to a Siemens PLC
- `disconnect_plc` - Disconnect from PLC
- `get_connected` - Check connection status
- `db_read` / `db_write` - Read/write data blocks
- `mb_read` / `mb_write` - Read/write memory bytes
- `tm_read` / `tm_write` - Read/write timers
- `ct_read` / `ct_write` - Read/write counters
- `eb_read` / `eb_write` - Read/write edge inputs
- `ab_read` / `ab_write` - Read/write absolute bytes
- `get_cpu_info` - Get CPU information
- `get_cpu_state` - Get CPU state
- `get_protection` - Get PLC protection level
- `plc_cold_start` - Trigger cold start
- `plc_hot_start` - Trigger hot start
- `plc_stop` - Stop PLC
- `get_error_text` - Get error description

## Development

```bash
git clone https://github.com/daedalus/mcp-snap7.git
cd mcp-snap7
pip install -e ".[test]"

# run tests
pytest

# format
ruff format src/ tests/

# lint
ruff check src/ tests/

# type check
mypy src/
```

TDQS

B3.4/5.0

Scored across 22 tools

Disambiguation5/5

Each tool has a distinct purpose: connecting/disconnecting, reading/writing specific memory areas, retrieving CPU information, and controlling PLC state. There is no overlap or ambiguity.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern with snake_case (e.g., connect_plc, db_read, plc_stop). The naming is predictable and easy to parse.

Tool Count4/5

22 tools is on the higher side but appropriate for the complex domain of PLC interaction, covering multiple memory types and control operations. It feels well-scoped without being bloated.

Completeness4/5

The tool set provides comprehensive read/write access to common PLC memory areas and basic control functions. Minor gaps like safety operations or additional diagnostics exist, but core workflows are covered.

Maintenance

ActivityInactive
ResponsivenessNo issues