# Changelog All notable changes to `fms-odata-mcp` are documented in this file. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). --- ## [0.8.3] - 2026-06-22 Bug-fix and consistency release. No new tools; tool count remains 35 (29 standard + 6 optional schema editing). ### Fixed - **Dockerfile healthcheck** — The healthcheck command used `require()` in an ESM project (`"type": "module"`), causing `ReferenceError: require is not defined` and making the container always report unhealthy. Now uses `node --input-type=commonjs -e`. - **Logger file path** — File logs were written to `~/fms-odata-mcp/logs/` instead of `~/.fms-odata-mcp/logs/` due to a `".."` traversal in the path construction. Logs now correctly land alongside the config file. - **Multi-field `groupBy` in client-side aggregate fallback** — `computeClientSideAggregate` typed `groupBy` as `string` but the tool schema passes `string[]`. Multi-field groupings (e.g. `['Region', 'Status']`) collapsed all records into a single bucket. Now builds a composite key from all groupBy fields and emits one column per field in the result rows. - **`buildParameterizedFilter` `$` injection** — `String.replace` with a string replacement interprets `$&`, `$1`, etc. specially. A param value containing `$100` would corrupt the output. Now uses a function replacement so `$` is treated literally. - **Aggregate filter not normalized** — The `filter` passed to `fm_odata_aggregate` was embedded directly into the `$apply` expression without going through `normalizeFilter`, so non-ASCII field names (and v26+ FMFID resolution) were not applied. `normalizeFilter` is now public and called on the filter before building the `$apply` expression. - **`http-server.ts` broken transport wiring** — The standalone HTTP entry point passed the `FileMakerODataServer` wrapper to `setupSimpleHttpTransport`, which expects a real MCP `Server` (with a `connect` method). Rewrote to construct a bare `Server` with the same request handlers. - **`countdistinct` counted null/undefined** — The client-side fallback for `countdistinct` included `undefined` values for records missing the field, inflating the distinct count by 1. Null/undefined values are now excluded. - **`runScript` URL not encoded** — Script names with spaces or special characters (`#`, `?`, `%`) were sent unencoded in the URL path. Now wrapped in `encodeURIComponent`. ### Changed - **`fm_odata_list_connections`** — Now lists both active in-memory sessions and saved connections in a single combined view, differentiating it from `fm_odata_config_list_connections` (saved-only) and `fm_odata_list_active_sessions` (active-only). Previously it was a duplicate of `fm_odata_config_list_connections`. - **`fm_odata_connect_multi` duplicate alias detection** — Now rejects the call up front when two entries resolve to the same alias, instead of silently overwriting the first session in the cache. - **`getClient` cached-client warning** — When `verifySsl`/`timeout` are passed but a cached client already exists for the connection name, a debug log now surfaces that the caller-supplied options are being ignored, with guidance to call `removeClient()` first. - **Error message format unified** — All tool error responses now use `Error: ${message}`. Previously `index.ts` used `Error executing tool: ...` while other handlers used `Error: ...`. - **`normalizeFilter` signature** — Removed unused `table` parameter and made the method public (was private) so it can be called from the aggregate path. ### Tests - Fixed `fm-version.test.ts` groupBy test to pass an array (`["Category"]`) instead of a string, matching the tool's JSON schema. - Total: 251 tests across 8 suites (unchanged count; one test corrected). --- ## [0.8.2] - 2026-06-17 Enhanced FileMaker Server 2026 (v26) metadata parsing and automatic FMFID field resolution. Tool count increases from 34 to 35 (29 standard + 6 optional schema editing). ### Added - **`fm_odata_describe_table`** — Returns full field metadata for a single table, including type, nullability, internal field ID (`FMFID`), computed/indexed flags, permissions (Read/ReadWrite), comments, and AI annotations. Enriched on v26+; basic info on older servers. - **Automatic FMFID resolution in `$filter` (v26+)** — `ODataClient.normalizeFilter()` now resolves non-ASCII field names to their stable internal `FMFID` IDs when connected to FM Server 2026+. A name→FMFID lookup map is built from cached `$metadata` XML. Falls back to the existing double-quote auto-quoting strategy when the FMFID is not found or on older servers. - **`parseMetadataForFields` v26 block-style parsing** — The parser now handles both self-closing `` tags (v22/v25) and block-style `...` elements containing child `` tags (v26+). Extracts: - `com.filemaker.odata.FieldID` → `FMFID:` - `Org.OData.Core.V1.Computed` → `computed: true` - `com.filemaker.odata.Index` → `indexed: true` - `com.filemaker.odata.Calculation` → `calculation: true` - `Org.OData.Core.V1.Permissions` → `permissions: "Read" | "Read/Write"` - `com.filemaker.odata.FMComment` → `comment` - `com.filemaker.odata.AIAnnotation` → `aiAnnotation` - **`field_id_in_metadata` feature flag** — Gated at FM Server `26.0.0`. Added to `FM_FEATURE_MATRIX` in `src/fm-version.ts`. ### Changed - **`ODataClient` metadata caching** — `$metadata` XML is now cached after the first `getMetadata()` or `getServerVersion()` call, and a `_fieldIdMap` is built from it on v26+ servers. ### Tests - New: v26 block-style Property annotation parsing, mixed self-closing/block-style fixtures, backward compat for v25, FMFID resolution in `normalizeFilter`, fallback to auto-quoting when FMFID is absent. - Total: 251 tests across 8 suites (up from 244). --- ## [0.8.1] - 2026-06-17 FileMaker script execution via OData. Tool count increases from 32 to 34 (adds `fm_odata_run_script` and `fm_odata_list_scripts`). ### Added - **`fm_odata_run_script`** — Run a FileMaker script by `scriptName` or `scriptId` (mutually exclusive). Accepts optional `scriptParam` (string, number, or JSON object). Returns `{ scriptName|scriptId, code, resultParameter, success }`. Non-zero script error codes surface as MCP tool errors. - **`fm_odata_list_scripts`** — Parse `` elements from `$metadata` to list available scripts with their internal FMSID, parameter type, and return type. v26+ only; returns empty list on older servers. - **`ODataClient.runScript(scriptName, scriptParam?)`** — POST to `/Script.{scriptName}`. - **`ODataClient.runScriptById(scriptId, scriptParam?)`** — POST to `/Script.FMSID:{scriptId}`. v26+ preferred: calling by ID prevents breakage when scripts are renamed in FileMaker. - **`ODataParser.parseMetadataForScripts`** — Extracts script metadata from `` elements in `$metadata` XML. - **`run_scripts` and `script_metadata` feature flags** — Added to `FM_FEATURE_MATRIX`. `run_scripts` gated at FM 19.0.0 (all supported servers). `script_metadata` gated at FM 26.0.0. ### Tests - New: `tests/unit/odata-client.test.ts` — script execution tests (by name without param, with string param, with JSON object param, error handling, invalid response format, by ID without param, by ID with param, privilege failure). - New: `tests/unit/odata-parser.test.ts` — `parseMetadataForScripts` tests (empty metadata, no Script actions, full parsing with all fields, missing optional fields). - Total: 244 tests across 8 suites (up from 223). --- ## [0.8.0] - 2026-06-11 Documentation overhaul, project reorganization, and roadmap updates. No functional code changes. ### Changed - **Documentation reorganization** — Moved working/development docs (`ARCHITECTURE.md`, `TESTING_GUIDE.md`, `PROJECT_STRUCTURE.md`, etc.) from `dev_stuf/` to new `private/` folder. Added `private/` to `.gitignore` so internal working documents are excluded from publication. - **All public documentation reviewed and updated** — `README.md`, `CLAUDE.md`, `CONTRIBUTING.md`, `DOCKER.md`, `dev_stuf/*.md`: updated tool counts (32 total), `FM_ALLOW_SCHEMA_EDITS` references, MCP server key (`filemaker-odata`), broken link removals, and schema editing documentation. - **ROADMAP.md** — Moved to repository root. Added v0.6.x/v0.7.0 history. Added 3 new planned features with confirmed FileMaker support: script execution, container upload, and batch requests. Assigned target versions: v0.8.1 (scripts), v0.8.3 (containers), v0.8.5 (batch), v0.9.0 (performance). --- ## [0.7.0] - 2026-06-11 FileMaker OData schema (DDL) editing support. Tool count: 26 by default, 32 when schema editing is enabled. ### Added - **6 schema (DDL) tools** wrapping FileMaker's proprietary OData schema extension (`FileMaker_Tables` / `FileMaker_Indexes` system endpoints): - `fm_odata_create_table` — `POST /FileMaker_Tables` with table name and field definitions - `fm_odata_add_fields` — `PATCH /FileMaker_Tables/{table}` with a fields array - `fm_odata_delete_table` — `DELETE /FileMaker_Tables/{table}` (destructive) - `fm_odata_delete_field` — `DELETE /FileMaker_Tables/{table}/{field}` (destructive) - `fm_odata_create_index` — `POST /FileMaker_Indexes/{table}` with `{indexName}` - `fm_odata_delete_index` — `DELETE /FileMaker_Indexes/{table}/{field}` - **`FM_ALLOW_SCHEMA_EDITS` environment flag** — schema tools are only registered when set to `true`. Disabled tools return a clear "schema editing is disabled" error if called anyway. New `getAllTools()` export evaluates the flag at request time. - **`confirm: true` guard** — `fm_odata_delete_table` and `fm_odata_delete_field` refuse to execute without an explicit `confirm: true` argument, returning a warning describing the data that would be destroyed. - **`ODataClient` DDL methods** — `createTable`, `addFields`, `deleteTable`, `deleteField`, `createIndex`, `deleteIndex` with URL-encoded path segments. New exported interfaces `FMFieldDefinition` and `FMTableDefinition`. - All 6 tools accept the optional per-call `connection` parameter (multi-session). ### Tests - New: `tests/unit/schema-tools.test.ts` — 23 tests covering env gating, routing, confirm-flag refusal, URL/body construction, special-character encoding, and error surfacing. - Total: 223 tests across 8 suites (up from 200 across 7). --- ## [0.6.1] - 2026-06-10 FileMaker Server 2026 (v26) OData metadata enhancement support. Tool count stays 26. (Iterative build 0.6.1 — replaces 0.6.0 for easier testing tracking.) ### Added - **`metadata_comments` feature flag** — added to `FM_FEATURE_MATRIX` in `src/fm-version.ts`. Gated at FM Server `26.0.0` (FileMaker 2026). Exposed in `fm_odata_get_server_version` feature-compatibility report. - **Version-gated metadata comment extraction** — `ODataParser.parseMetadataForTables` and `parseMetadataForFields` now accept an optional `serverVersion` parameter. When the connected server is v26+, table comments and AI annotations are extracted from OData `$metadata` XML annotations and surfaced in tool output. On v25 and older (or when version is unknown) the parser skips these elements entirely to avoid false positives. - **`fm_odata_list_tables` — optional `includeDetails` parameter** — when set to `true` and the server is v26+, table names are returned with their user-provided comments (e.g. `contact — Contact table`). Defaults to `false` for backwards compatibility. - **`fm_odata_describe_sessions` — enriched field metadata** — when connected to a v26+ server, the merged schema output now includes `comment` on tables and both `comment` and `aiAnnotation` on fields. ### Server-side fixes (no MCP code changes required) FileMaker Server v26 fixed the following OData issues; MCP clients benefit automatically: - Value-list metadata crash (8309 / "FirstValues" column reference) — metadata requests for files with field-based value lists no longer fail. - Text resembling timestamps no longer misinterpreted as timestamps. - OData log file 35 MB hang resolved. - Negative decimal values between -1 and 0 (e.g. `-0.25`) now emitted as valid JSON. - Webhooks now fire on Delete All Records / Truncate Table, returning `ROWID -1`. - `?` values in number fields now returned as `null` (valid JSON) instead of literal `?`. - Null bytes in text fields are now escaped/omitted in JSON, XML, and HTML responses. - Excel OData connection failure due to missing `ROWID` property is fixed. ### Tests - New: v26 metadata parser tests — comment extraction gated by server version, AI annotation parsing, backwards-compatibility for v25 and unknown servers. - New: `metadata_comments` feature-matrix assertions in `fm-version.test.ts`. - Updated: `parseMetadataForTables` tests now expect `TableInfo[]` instead of `string[]`. - Total: 199 tests across 7 suites (up from 191). --- ## [0.5.1] - 2026-06-02 Server version detection, feature compatibility matrix, and smart fallbacks. Tool count increases from 25 to 26. ### Added - **`fm_odata_get_server_version`** — detects FileMaker Server version from `$metadata` XML (cached per session, zero extra HTTP calls on subsequent uses). Returns structured JSON: `{ session, server, database, version, features }` where `features` is a compatibility map (`basic_odata`, `cast`, `build_filter`, `aggregate`). - **`src/fm-version.ts`** — new module: `FMServerVersion` interface, `FM_FEATURE_MATRIX`, `parseServerVersion()`, `compareVersions()`, `isFeatureSupported()`, `featureWarning()`, `buildFeatureReport()`. - **Version detection** reads the `Org.OData.Core.V1.ProductVersion` annotation in `$metadata` XML first; falls back to the `Version` attribute on `edmx:Edmx`; returns `null` if undetectable. Result is cached in `ODataClient._cachedVersion` for the session lifetime. - **Feature compatibility matrix**: - `basic_odata` — FM 19.0.0+ (all supported servers) - `cast` — FM 21.1.0+ (FileMaker 2024) - `build_filter` — FM 21.1.0+ (FileMaker 2024) - `aggregate` — FM 22.0.1+ (FileMaker 2025) ### Changed - **`fm_odata_aggregate`** — now version-gated: executes server-side `$apply` on FM 22.0.1+; falls back to client-side computation (sum/avg/min/max/count/countdistinct and groupBy) capped at 10 000 records on older or unknown servers. A `[Compatibility]` advisory notice is prepended to the result when the fallback is used. - **`fm_odata_cast`** and **`fm_odata_build_filter`** — prepend an advisory notice when the server version is known-incompatible or undetectable. Expression is always returned; no hard errors. - **`fm_odata_list_active_sessions`** — appends `| FM Server x.x.x` when version is already cached for a session (zero extra HTTP calls). ### Tests - New: `tests/unit/fm-version.test.ts` — 55 tests covering version parsing (8 EDMX fixture variants), `compareVersions`, `isFeatureSupported` across all boundaries, `featureWarning`, `buildFeatureReport` for v19/v22/null, all 6 client-side aggregate methods, groupBy, server-side path, and `fm_odata_get_server_version` routing. - Total: 191 tests across 7 suites (up from 146 across 6 suites). --- ## [0.5.0] - 2026-06-02 ### Added - **`fm_odata_connect_multi`** — bulk-connect N databases in one call. Accepts a shared `server`/`user`/`password` plus a `databases` array where each entry can override credentials and set an `alias` and `primary` flag. Connects and tests all sessions in parallel; sets the primary (or first successful) session as active. Designed for FileMaker separation-of-concerns solutions (LOGIC + DATA files) and multi-solution server setups. - **`fm_odata_list_active_sessions`** — list all live in-memory sessions. Returns alias, server, database, user, and which session is currently active. Replaces guessing for AI agents working in multi-file environments. - **`fm_odata_describe_sessions`** — merged schema across all active sessions. Calls `$metadata` on every session in parallel, returns a flat annotated table list `[{table, connection, fieldCount, fields[]}]`. Flags table name collisions across sessions and suggests using the `connection` param to disambiguate. - **Per-call `connection` parameter** on all 11 connection-dependent OData tools (`fm_odata_get_service_document`, `fm_odata_get_metadata`, `fm_odata_list_tables`, `fm_odata_query_records`, `fm_odata_get_record`, `fm_odata_get_records`, `fm_odata_count_records`, `fm_odata_aggregate`, `fm_odata_create_record`, `fm_odata_update_record`, `fm_odata_delete_record`). Lets AI agents target a specific session per call without changing the active session pointer. Stateless tools (`fm_odata_cast`, `fm_odata_build_filter`) are unaffected. - **`ConnectionManager.getClientByName()`** — side-effect-free session lookup by alias; does not mutate the active connection pointer. - **`ConnectionManager.listActiveSessions()`** — returns `SessionInfo[]` for all in-memory sessions including `isCurrent` flag. - **Explicit alias support** in `ConnectionManager.createInlineClientNamed()` — multi-connect sessions are registered under human-readable aliases rather than auto-generated `inline_…` keys. ### Changed - **`fm_odata_set_connection`** — now accepts runtime session aliases (inline / multi-connect) in addition to persisted config names. - **`ConnectionManager.setCurrentConnection()`** — checks in-memory session cache first, then falls back to persisted config, eliminating the need to re-register inline sessions. ### Fixed - **`working-http-transport.ts` TypeScript strict-null error** — pre-existing `TS2345` ("undefined not assignable to string | number") in the pending-response map lookup; guarded with an explicit null check. ### Tests - New: `tests/unit/multi-session.test.ts` — 30 tests covering ConnectionManager primitives, tool routing for all 3 new tools, per-call connection targeting, session switching, collision detection. - Extended: `tests/unit/tool-routing.test.ts` — 3 new routing assertions. - Total: 146 tests across 6 suites (up from 121 across 5 suites). --- ## [0.4.0] - 2026-06-01 Three new expression-builder tools for FileMaker Server 2025 OData capabilities. All three are **connection-free** — they build query expressions locally and return strings ready to pass into existing tools like `fm_odata_query_records`. Total tool count increases from 19 to 22. ### Added - **`fm_odata_aggregate`** — server-side aggregation via OData `$apply` (requires FileMaker Server v22.0.1+ / FileMaker 2025 or later). Accepts `table`, `method` (sum/average/min/max/countdistinct/count), `alias`, optional `field`, `groupBy` array, and `filter` pre-condition. Internally builds `groupby((…),aggregate(…))` / `filter(…)/…` expressions via `ODataParser.buildApplyExpression()` and executes a GET with `?$apply=…`. - **`fm_odata_cast`** — server-side type coercion via OData property path segments (requires FileMaker Server v21.1+ / FileMaker 2024 or later). Accepts an array of `{field, type}` pairs and an optional `context` (`select` or `filter`). Returns `Field/Edm.Type` expressions ready for use in `$select` or embedded in `$filter`. No active connection required. Supported types: `String`, `Int32`, `Int64`, `Decimal`, `Double`, `Boolean`, `Date`, `TimeOfDay`, `DateTimeOffset`. - **`fm_odata_build_filter`** — parameterized `$filter` builder via OData `@alias` syntax (requires FileMaker Server v21.1+ / FileMaker 2024 or later). Accepts a `template` string with `@alias` placeholders, a `params` map, and an optional `mode`: - `resolved` (default): substitutes alias values into the template and returns a plain filter string for immediate use in `fm_odata_query_records`. - `raw`: returns the OData parameterized query string form (`$filter=…&@alias=value`) for manual URL construction. String values are auto-quoted and internal single quotes doubled; numbers, booleans, and `null` are passed through as-is. No active connection required. - **`ODataParser.buildApplyExpression()`** — static helper building `$apply` expressions from structured aggregation inputs. - **`ODataParser.buildCastExpression()`** — static helper producing `Field/Edm.Type` path segments; normalises bare type names and `Edm.`-prefixed names to the same output. - **`ODataParser.buildParameterizedFilter()`** — static helper for `@alias` substitution in filter templates; supports resolved and raw modes. - **`ODataClient.aggregateRecords()`** — new method executing GET with `?$apply=`. - **`AGENTS.md`** — project-level rules file for AI agents: no attribution footers in commits, documented FileMaker OData unsupported features (lambda `any`/`all`, `$search`, geo functions). ### Not implemented (FileMaker limitation) - **Lambda operators `any` / `all`** — officially unsupported by FileMaker Server OData (listed in Claris `odata-unsupported-features.html`, current as of 2026). Will not be implemented until Claris adds support. ### Tests - 22 new unit tests: `buildApplyExpression` (9), `buildCastExpression` (6), `buildParameterizedFilter` (10), plus 6 routing/behaviour tests for the new tools. - Total: 121 tests across 5 suites (up from 90). --- ## [0.3.1] - 2026-05-25 Patch release on top of 0.3.0. Version bump and npm publish housekeeping. ### Changed - Version bumped to 0.3.1 for npm release consistency --- ## [0.3.0] - 2026-05-25 Major stability and correctness release. All changes since 0.2.8 are included here. FileMaker 2025 advanced OData features (aggregation, type casting, parametrization) were deferred from this release to keep it focused on reliability; they are implemented in v0.4.0. Lambda operators (`any`/`all`) remain unsupported by FileMaker Server OData and are not planned. ### Added - **`fm_odata_test_connection_detailed`** — new tool that surfaces the real underlying error (network, SSL, auth) when a connection attempt fails, replacing opaque failures ([#8](https://github.com/fsans/fms-odata-mcp/issues/8)) - **Docker localhost warning** — server prints a clear warning at startup when `MCP_HOST=localhost` is detected inside a container, guiding users to use `0.0.0.0` ([#10](https://github.com/fsans/fms-odata-mcp/issues/10)) ### Fixed - **OData URL construction** — fixed FileMaker-incompatible URL building that caused query failures on certain table/filter combinations ([#2](https://github.com/fsans/fms-odata-mcp/pull/2)) - **OData response parser** — corrected response parsing bugs introduced by the above; regex metacharacters in table names are now properly escaped ([#11](https://github.com/fsans/fms-odata-mcp/issues/11)) - **Tool routing** — tools are now dispatched by exact name-set lookup instead of fragile string-prefix matching, preventing mis-routing of similarly named tools ([#2](https://github.com/fsans/fms-odata-mcp/issues/2)) - **JSON-RPC response correlation** — concurrent HTTP requests no longer receive each other's responses; responses are matched by request `id` ([#3](https://github.com/fsans/fms-odata-mcp/issues/3)) - **CORS middleware ordering** — CORS headers are now registered before route handlers, fixing preflight (`OPTIONS`) request failures ([#6](https://github.com/fsans/fms-odata-mcp/issues/6)) - **SIGTERM / graceful shutdown** — server now handles `SIGTERM` for clean Docker container stops; `dumb-init` no longer required to avoid zombie processes ([#20](https://github.com/fsans/fms-odata-mcp/issues/20)) - **Failed inline connection cleanup** — a failed `fm_odata_connect` call no longer leaves a broken partial connection in state; the real error is reported ([#14](https://github.com/fsans/fms-odata-mcp/issues/14)) - **`validateConfig` at startup** — configuration is now validated when the server starts, not lazily on first use; misconfigured environments fail fast with a clear message ([#15](https://github.com/fsans/fms-odata-mcp/issues/15)) - **Centralised default ports** — default HTTP (3333) and HTTPS (3443) ports now live in a single shared constants file, eliminating drift between transport modules ([#12](https://github.com/fsans/fms-odata-mcp/issues/12)) - **Runtime version** — server version is now read from `package.json` at runtime instead of being hardcoded, so it always matches the published package ([#9](https://github.com/fsans/fms-odata-mcp/issues/9)) ### Security - **Password redaction in debug logs** — passwords are scrubbed from tool argument objects before they are written to debug output, preventing credential exposure in log files ([#22](https://github.com/fsans/fms-odata-mcp/issues/22)) ### Refactored - **Config saved-file schema** — tightened validation schema for `~/.fms-odata-mcp/config.json`; added field trimming and a dedicated `verifySsl` helper to centralise SSL flag coercion ([#16](https://github.com/fsans/fms-odata-mcp/issues/16), [#17](https://github.com/fsans/fms-odata-mcp/issues/17), [#18](https://github.com/fsans/fms-odata-mcp/issues/18)) ### Tests - Added unit tests for tool routing and config helpers; tightened mock typings - Removed unused MCP schema imports from `tools/odata.ts` - Removed unused `Express` import from `simple-http-transport.ts` --- ## [0.2.8] - 2026-03-26 ### Changed - Version bump to 0.2.8; documentation updates --- ## [0.2.7] - 2026-03-24 ### Changed - Documentation updates --- ## [0.2.6] - 2026-03-19 ### Added - Multi-platform Docker support (ARM64 / Apple M-series) --- ## [0.2.x] - 2026-03-19 Early patch releases (0.2.2 – 0.2.5) addressing Docker image naming, case sensitivity, and initial ARM64 build pipeline issues. --- ## [0.2.0] - 2026-03-xx ### Added - HTTP and HTTPS transport modes (`MCP_TRANSPORT=http|https`) - Docker deployment with Docker Compose and health checks - `fms-odata-mcp` CLI binary (installable via `npm install -g` or `npx`) --- ## [0.1.x] - 2026-xx-xx ### Added - Initial release with 19 MCP tools over stdio transport - OData 4.01 CRUD operations against FileMaker Server - Saved and default connection management (`~/.fms-odata-mcp/config.json`) - SSL support with optional certificate verification bypass - `DEBUG=fms-odata-mcp:*` logging support