@renanlido/tia-openness-mcp 1.0.2 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -8
- package/dist/index.js +22 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# TIA Openness MCP server
|
|
2
2
|
|
|
3
3
|
Servidor **MCP (stdio)** que é um **cliente HTTP puro** sobre a API `serve` do TIA Openness
|
|
4
|
-
(veja
|
|
4
|
+
(veja `docs/API-HTTP.md` no repositório). Não referencia Openness / net48 / x64 — toda a
|
|
5
5
|
complexidade (`AssemblyResolve`, worker serial MTA) vive no processo `serve`. Aqui só falamos **MCP de um
|
|
6
6
|
lado** e **HTTP/JSON do outro**.
|
|
7
7
|
|
|
@@ -76,12 +76,12 @@ com o **mesmo `planHash`**. Hash errado ou `approved` ausente → envelope `requ
|
|
|
76
76
|
re-externalizado, o "Load Preview" real não é exposto e o G3 é a salvaguarda da **camada do MCP** (não bypassável só por texto do LLM).
|
|
77
77
|
|
|
78
78
|
### M5 — ingestão de project-spec (orquestra M1–M4)
|
|
79
|
-
Aceita o **project-spec** estruturado (
|
|
79
|
+
Aceita o **project-spec** estruturado (`docs/TIA-BEST-PRACTICES.md` §13.2; JSON Schema em `.claude-plugin/schemas/project-spec.schema.json`):
|
|
80
80
|
- **`tia_spec_validate`** (R, determinístico, **sem serve**): valida forma + regras de campo cruzado — R-NAMES (nomes únicos), R-TYPEID (`OrderNumber:<MLFB>/V<fw>`), R-SUBNET (IP∈CIDR, CPU+IO na mesma subnet, 1 IO-system), R-LANGFAM (STL/GRAPH só S7-1500), R-MODLIMIT, e **G5** (`safety.required && autonomous ⇒ REJECT`).
|
|
81
81
|
- **`tia_spec_plan`** (sem serve): transforma um spec válido na sequência ordenada de operações (subnets→devices→módulos→rede→tags→blocos→compile).
|
|
82
82
|
- **`tia_spec_apply`**: orquestra o build OFFLINE num projeto aberto (valida → G5 → executa serial → compila), **para no 1º erro** e **nunca baixa** (download é o GATE G3, sempre humano). `dryRun:true` devolve o plano.
|
|
83
83
|
|
|
84
|
-
> **MCP M0–M5 COMPLETO** (
|
|
84
|
+
> **MCP M0–M5 COMPLETO** (~74 tools), **validado em runtime** contra um TIA Portal V21 real (incluindo **deploy em hardware** num S7-1200) e **publicado no npm**. Roadmap e marcos em `docs/ROADMAP.md` §3.
|
|
85
85
|
|
|
86
86
|
## Configuração (env)
|
|
87
87
|
|
|
@@ -149,7 +149,7 @@ npm install -g . # o prepack compila e instala o b
|
|
|
149
149
|
## Publicação (npm público + semantic-release)
|
|
150
150
|
|
|
151
151
|
Versionamento **automático por commits convencionais** (`feat` → minor, `fix` → patch, `BREAKING CHANGE`
|
|
152
|
-
→ major). O workflow
|
|
152
|
+
→ major). O workflow `.github/workflows/release-mcp.yml` dispara
|
|
153
153
|
no push para `main` **quando algo em `mcp/` muda** (e `semantic-release-monorepo` filtra os commits por
|
|
154
154
|
esse path), builda e publica no **npm público** (`registry.npmjs.org`, `publishConfig.access: public`).
|
|
155
155
|
|
|
@@ -169,16 +169,24 @@ commitar o `CHANGELOG`.
|
|
|
169
169
|
> Config validada localmente: versões dedupadas em `semantic-release@24`; o dry-run carregou config/plugins
|
|
170
170
|
> e só parou por o repo remoto ainda não existir.
|
|
171
171
|
|
|
172
|
-
## Registro no Claude Code
|
|
172
|
+
## Registro no Claude Code
|
|
173
173
|
|
|
174
|
-
|
|
174
|
+
**Não precisa instalar nada** — o recomendado é o `npx`, que baixa e roda o pacote publicado. Um comando
|
|
175
|
+
só (escopo de **usuário**):
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
claude mcp add --transport stdio --env TIA_API_BASE=http://localhost:5000 --scope user tia -- npx -y @renanlido/tia-openness-mcp
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
Confira com `claude mcp list` e `claude mcp get tia`. O equivalente por **`.mcp.json`** na raiz do projeto
|
|
182
|
+
(escopo de **projeto**) — também via `npx`, sem instalar:
|
|
175
183
|
|
|
176
184
|
```jsonc
|
|
177
185
|
{
|
|
178
186
|
"mcpServers": {
|
|
179
187
|
"tia": {
|
|
180
|
-
"command": "
|
|
181
|
-
"args": [],
|
|
188
|
+
"command": "npx", // baixa e roda o pacote do npm — NADA instalado
|
|
189
|
+
"args": ["-y", "@renanlido/tia-openness-mcp"],
|
|
182
190
|
"env": {
|
|
183
191
|
"TIA_API_BASE": "${TIA_API_BASE:-http://localhost:5000}" // IP:porta do serve (use o IP da VM se remoto)
|
|
184
192
|
}
|
|
@@ -187,6 +195,15 @@ O [../.mcp.json](../.mcp.json) na raiz já registra o servidor `tia` apontando p
|
|
|
187
195
|
}
|
|
188
196
|
```
|
|
189
197
|
|
|
198
|
+
> **`tia-openness-mcp` NÃO é um arquivo do repositório** — é o nome do **bin** do pacote (`package.json` →
|
|
199
|
+
> `"bin": { "tia-openness-mcp": "dist/index.js" }`). Esse atalho só fica no seu PATH **se** você instalar
|
|
200
|
+
> global (`npm install -g @renanlido/tia-openness-mcp`); só então faria sentido
|
|
201
|
+
> `"command": "tia-openness-mcp", "args": []`. O `npx` dispensa esse passo — por isso é o recomendado.
|
|
202
|
+
|
|
203
|
+
**Outros clientes** (Claude Desktop, Codex, Gemini CLI, Cursor, VS Code, Windsurf): o guia canônico de
|
|
204
|
+
instalação — com os formatos exatos de cada um e a pegadinha do `cmd /c npx` no Windows — está em
|
|
205
|
+
`docs/INSTALL.md` no repositório.
|
|
206
|
+
|
|
190
207
|
**Envs opcionais** (default embutido no MCP — só defina para sobrescrever): `TIA_API_TIMEOUT_MS` (15000),
|
|
191
208
|
`TIA_SLOW_TIMEOUT_MS` (120000), `TIA_CONNECT_TIMEOUT_MS` (30000). Ex.: `--env TIA_SLOW_TIMEOUT_MS=180000`
|
|
192
209
|
no `claude mcp add`, ou a chave correspondente no `env` do `.mcp.json`.
|
package/dist/index.js
CHANGED
|
@@ -31539,6 +31539,14 @@ async function deviceCreateFlow(args) {
|
|
|
31539
31539
|
summary: `criar device "${args.deviceName ?? args.deviceItemName ?? "?"}" (${args.typeIdentifier})`
|
|
31540
31540
|
});
|
|
31541
31541
|
}
|
|
31542
|
+
async function deviceChangeVersionFlow(args) {
|
|
31543
|
+
const bad = gd5Violation(args.typeIdentifier);
|
|
31544
|
+
if (bad) return guardError("Gd5", bad, { typeIdentifier: args.typeIdentifier });
|
|
31545
|
+
return mutate("POST", `/plcs/${seg2(args.plc)}/device/changeversion`, jsonBody2({ typeIdentifier: args.typeIdentifier, dryRun: args.dryRun }), {
|
|
31546
|
+
dryRun: args.dryRun,
|
|
31547
|
+
summary: `trocar firmware da CPU "${args.plc}" para ${args.typeIdentifier}`
|
|
31548
|
+
});
|
|
31549
|
+
}
|
|
31542
31550
|
var dryRunField = {
|
|
31543
31551
|
dryRun: external_exports.boolean().optional().describe("Gd11: plano-sem-aplicar \u2014 valida os guards e descreve a a\xE7\xE3o SEM mutar o projeto")
|
|
31544
31552
|
};
|
|
@@ -31557,6 +31565,19 @@ function registerAuthoringTools(server2) {
|
|
|
31557
31565
|
},
|
|
31558
31566
|
async (args) => deviceCreateFlow(args)
|
|
31559
31567
|
);
|
|
31568
|
+
server2.registerTool(
|
|
31569
|
+
"tia_device_change_version",
|
|
31570
|
+
{
|
|
31571
|
+
title: "TIA \u2014 trocar firmware da CPU (in-place)",
|
|
31572
|
+
description: "Troca a vers\xE3o de FIRMWARE da CPU IN-PLACE (wrap do DeviceItem.ChangeType), PRESERVANDO o programa \u2014 alternativa ao delete+recreate (habilita o 'auto-FW-match'). Guard Gd5: o typeIdentifier segue 'OrderNumber:<MLFB>/V<fw>' com '/V' (barra), nunca ':V' \u2014 resolva via tia_catalog. Regra: a vers\xE3o de firmware do PROJETO deve ser \u2264 a do DEVICE f\xEDsico (project FW \u2264 device FW). dryRun (Gd11) devolve o plano sem mutar. Mapeia POST /plcs/{plc}/device/changeversion. Classe M-off.",
|
|
31573
|
+
inputSchema: {
|
|
31574
|
+
plc: external_exports.string().describe("nome do CLP (CPU) cujo firmware ser\xE1 trocado"),
|
|
31575
|
+
typeIdentifier: external_exports.string().describe('OrderNumber:<MLFB>/V<fw> do firmware destino (Gd5; resolva via tia_catalog) \u2014 ex.: "OrderNumber:6ES7 214-1HG40-0XB0/V4.4"'),
|
|
31576
|
+
...dryRunField
|
|
31577
|
+
}
|
|
31578
|
+
},
|
|
31579
|
+
async ({ plc, typeIdentifier, dryRun }) => deviceChangeVersionFlow({ plc, typeIdentifier, dryRun })
|
|
31580
|
+
);
|
|
31560
31581
|
server2.registerTool(
|
|
31561
31582
|
"tia_device_plug",
|
|
31562
31583
|
{
|
|
@@ -32441,7 +32462,7 @@ function registerSpecTools(server2) {
|
|
|
32441
32462
|
}
|
|
32442
32463
|
|
|
32443
32464
|
// src/index.ts
|
|
32444
|
-
var server = new McpServer({ name: "tia-openness", version: "1.
|
|
32465
|
+
var server = new McpServer({ name: "tia-openness", version: "1.1.1" });
|
|
32445
32466
|
server.registerTool(
|
|
32446
32467
|
"tia_ping",
|
|
32447
32468
|
{
|
package/package.json
CHANGED