MCP server for read-only access to Modbus, OPC-UA, SMB shares, on-premises SQL databases, HTTP services, and SOAP endpoints. Enforces capability-based access control via signed grants.
FieldLink demonstrates solid definition quality with consistent naming, comprehensive descriptions, and explicit tool annotations. All 8 tools follow verb_noun naming (read_*, list_*, browse_*, call_*, query_*). Descriptions are detailed (100-200 chars typical) and explain read-only semantics clearly. Tool annotations (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) are present on all tools. However, input schemas are not visible in the provided source code, only parameter names and descriptions are shown. This prevents full schema validation. Error handling guidance is minimal; tools lack recovery hints for common failure modes (e.g., 'If device not found, check config.yaml'). Composition is strong: each tool has one clear responsibility, and related tools (read_opcua + browse_opcua) are well-paired.
List the children of an OPC-UA node, so the model can discover node IDs it doesn't already know instead of guessing. Scoped the same way as read_opcua: both the node being browsed and every child returned must fall within the grant's node_prefixes. Read-only.
GET or HEAD an internal HTTP URL. Redirects are not followed automatically. Read-only: no other methods are supported.
Invoke a named, pre-declared SOAP operation against a configured legacy endpoint. Only operations the operator has explicitly declared in config.yaml (as a fixed XML template) can be called — there is no WSDL parsing and no arbitrary XML. Unlike FieldLink's other tools, read-only here is an operator attestation about the declared operation, not something enforced from the wire the way SELECT-only SQL or HTTP GET are.
List entries in a directory (local or smb://<share-name>/<path>), optionally filtered by glob and recursed. Read-only.
Run a single read-only SELECT or WITH query against a named datasource, with bound parameters. Read-only: statements other than SELECT/WITH are rejected, and the database account FieldLink connects with should itself be read-only.
Input schemas not visible in source code. Only parameter names and descriptions are shown; JSON Schema type definitions, constraints (min/max, enums, patterns), and required field declarations cannot be verified.
Error handling lacks recovery guidance. Tools do not document what to do on common failures (device not found, endpoint unreachable, query timeout, invalid node ID). LLMs cannot self-correct without actionable error messages.
Output schemas not documented. Descriptions do not specify what fields are returned, their types, or structure. LLMs cannot plan downstream tool calls or extract required data (e.g., does read_modbus return {value, unit, timestamp}?).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2025-06-18+ | v2 |
Read a file's contents, from the local filesystem or from a configured SMB share via smb://<share-name>/<path>. Read-only: this tool cannot write, create, or delete. Files larger than max_bytes return a SHA-256 digest instead of content.
Read a named register from a configured Modbus device. Register names come from the device's register map, available as a resource. Returns a decoded, scaled value with units. Read-only: write function codes are not implemented.
Read one or more OPC-UA node values by node ID from a configured endpoint. Read-only: no write service is implemented.
call_soap description relies on operator attestation for read-only semantics rather than enforced constraints. Unlike SELECT-only SQL or HTTP GET, SOAP operations are not validated server-side. This creates audit and compliance risk.
Parameter descriptions lack format/constraint details. E.g., read_file 'path' does not specify max length, allowed characters, or SMB URL format. query_database 'parameters' does not document binding syntax or type coercion rules.