@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.
Files changed (3) hide show
  1. package/README.md +25 -8
  2. package/dist/index.js +22 -1
  3. 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 [../docs/API-HTTP.md](../docs/API-HTTP.md)). Não referencia Openness / net48 / x64 — toda a
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 ([../docs/TIA-BEST-PRACTICES.md](../docs/TIA-BEST-PRACTICES.md) §13.2; JSON Schema em [../.claude-plugin/schemas/project-spec.schema.json](../.claude-plugin/schemas/project-spec.schema.json)):
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** (73 tools). O que falta é **runtime** (validar contra um TIA real — precisa reload + serve + hardware nos gates) e o **C# P0.5** (re-externalizar o auto-confirm do download p/ o G3 expor o Load-Preview de verdade). Detalhe em [../docs/ROADMAP.md](../docs/ROADMAP.md) §3.
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 [../.github/workflows/release-mcp.yml](../.github/workflows/release-mcp.yml) dispara
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 (escopo de projeto)
172
+ ## Registro no Claude Code
173
173
 
174
- O [../.mcp.json](../.mcp.json) na raiz já registra o servidor `tia` apontando para o binário instalado:
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": "tia-openness-mcp", // binário do pacote (PATH); requer instalação (A ou B)
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.0.2" });
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@renanlido/tia-openness-mcp",
3
- "version": "1.0.2",
3
+ "version": "1.1.1",
4
4
  "description": "MCP server (stdio) — thin HTTP client over the TIA Openness `serve` API. Zero Openness/net48 references.",
5
5
  "license": "MIT",
6
6
  "type": "module",