Behavior notes and limits¶
Conventions that hold across the whole tool surface, and limits worth knowing before you rely on a result.
Calls and arguments¶
- Unknown arguments are refused, not ignored. A call carrying a top-level argument the tool does not declare fails with the same error as a missing required argument, naming the argument, the one you probably meant (for example
gateway_logssearchorfiltersuggestscontains) and what the tool takes. This applies to calls from MCP clients and to calls arriving from other gateways, before any other check runs._metais allowed, and the contents of declared object arguments (api_callqueryandbody,settingsand similar) are not checked. policy_explainexplains the call you describe. It takestoolandarguments; any other top-level key is refused, naming the right one. The response carriesargumentsEvaluated, so you can see exactly which call was explained.- Every refusal says how to fix it. See Refusals and remediation.
- Every mutating tool supports
dryRun: true, and dry runs are checked by the same gates as real calls, including ownership of inherited resources, the redundancy role and the name echo.
Results¶
- Non-finite numbers are strings.
tag_read,tag_browse,tag_historyanddb_queryreturn NaN and infinities as"NaN","Infinity"and"-Infinity", so one such value cannot make a whole response unreadable. - Bounded reads say they are bounded. Database results report
rowCount,truncatedandmaxRows; the dependency graph reports what it parsed and skipped;deploy_applyreportsrollbackArmedandintegrityChecked;gateway_logsreturnshasMoreand a cursor. Read these fields before treating a short result as complete. - A refusal is never an empty result. Under per-key read scoping, a read outside the key's lists is refused, not answered with "not found".
tag_historytakes historian paths, not tag paths. Each entry must carry thehistprovcomponent (histprov:<provider>:/drv:<driver>:/tag:<path>). A[provider]Folder/Tagpath is refused, naming the entry and pointing athistory_browse, which produces the right form.gateway_logsis a query, not a live tail. See gateway_logs.- Log reads mask session cookies (
Cookie,Set-Cookie,JSESSIONID) and every exact occurrence of this module's API tokens and gateway API key.
Projects and inheritance¶
deploy_export_for_gitexports only what a project defines. Inherited resources belong in the repository of the project that defines them. Their count is reported asinheritedExcluded(withinheritsFrom) in the response and in the zip's owndeploy-manifest.json.deploy_diffcompares a baseline carryinginheritedExcludedagainst the project's own resources only, and any other baseline against the merged set, reporting which asliveSideOwnResourcesOnly.project_manifestanddeploy_diffread the project's ancestors too, so a key narrowed to a child project needs its parents inresourceReadAllowlistfor those two tools.deploy_applytakes an optionalsha256of the zip. It is checked against the decoded bytes and the call is refused on mismatch rather than half-applied. The response carriesintegrityChecked, and anintegrityNotewhen no digest was given. This detects a damaged zip; it does not repair one.deploy_applydoes not validate script or JSON content. Useproject_resource_writewhen you need write-time validation. See Writing project resources.view_patchkeeps null-valued keys. A Perspective view stores an unset param or custom key as an explicitnull. Dropping it would leave its property configuration behind, and every binding reading it would resolve against a missing path with no error logged.
Settings¶
- API keys must be unique. Keys sharing a name or a token are disabled at load, with a WARN, until they are made unique.
- Bare tool-family allowlist entries are flagged. An entry such as
security/,configorapilogs a WARN, because it also covers a project of that name. - Settings saves are checked for conflicting edits. Two administrators cannot silently overwrite each other's changes. A settings tab left open across a module restart gets one 409 response and needs a reload.
- Profiles that match nothing are reported at startup with a WARN per pattern. See Tool profiles.
- Script endpoints register only at startup. See Script endpoints.
Clients¶
- The server is stateless.
GETon the MCP endpoint returns 405; there is no event stream, and the server does not push tool-list changes. Reconnect a client after its key's profile, the enabled providers or the declared script endpoints change.
Network¶
- IP-based controls use the direct peer address. Behind a reverse proxy,
localhostOnlyno longer restricts anything and the failed-authentication backoff is shared by all clients. See Security.
Features without a dedicated tool¶
Report schedules have no dedicated tool. Where the gateway's REST API covers a feature, reach it through api_call, or expose a project function for it as a script endpoint.