Repository navigation
✨ 17 个工具补齐 MCP ToolAnnotations(四 hint 全显式)
全部工具现声明 readOnlyHint / destructiveHint / idempotentHint / openWorldHint,按 handler 真实行为取值——只读组不再依赖规范缺省(规范缺省 destructive=true,会让纯读工具被客户端当危险工具对待)。tools/list 只增元数据,不改任何既有键,符合「版本与兼容承诺」的只增不改。
- 分组语义:纯本地解析(ro=T / openWorld=F)· 联网只读(ro=T / openWorld=T)· 监听/代理生命周期(非 ro、非破坏、非幂等——重复 start 对同端口报错、stop 对不存在端口抛 ValueError)· 写类(非 ro + destructive=T 宁严勿松)
- 黄金锁
tests/test_tool_annotations.py:wire camelCase 逐键 + 注册集合双向覆盖,新增工具不登记即挂测试 - 背景:M8ven Trust Index 扫描指出 17/17 工具缺 hint(OpenAI 目录会拒收缺任一 hint 的工具)——本版后四键全显式,复扫应转绿
🐛 sim_modbus_slave 兼容 pymodbus 3.15
3.15 起弃用 ModbusSlaveContext/ServerContext(legacy 包装丢块起始地址且 ImportError)——SimDevice/SimData 新 API 并保留 <3.15 legacy 双路径;外部地址布局与 e2e 同款。
🔧 评测 harness 去 OPENAI_API_KEY 品牌化(仅开发期,运行时零 AI 依赖不变)
eval/baseline.py 的取钥变量 OPENAI_API_KEY → PLCTAP_BASELINE_API_KEY,并移除内置默认端点(api.openai.com)与默认模型(gpt-4.1-mini)——PLCTAP_BASELINE_API_KEY/BASE_URL/MODEL 三变量显式必填、缺失即 fail-fast。发布产物(wheel)只含 src/plctap,MCP server 运行时零 AI/LLM 依赖,不读也不需要任何模型 API 凭据。
质量
- 581 pytest 全绿(含 annotations 黄金锁 2 项 + wire 复核 17/17 四键 camelCase)
- 发布前台架预验 38/38:五仿真器(Modbus/S7/MELSEC/FINS/OPC UA)+ MCP 工具链 + 第三方客户端交叉读回(pymodbus / python-snap7 / pymcprotocol)+ 写审计逐帧留痕,隔离 wheel 环境实证
- wire 只增不改:工具名/参数/返回结构零变化
安装
uvx plctap # 任意 MCP 客户端一行接入
pip install plctap==0.6.2