Skip to content

feat(adapters): add read-only Claris FileMaker Data API adapter - #1624

Merged
helpcodeai merged 3 commits into
HelpCode-ai:mainfrom
GallaGit:adapter/filemaker
Nov 10, 2026
Merged

helpcodeai merged 3 commits into
HelpCode-ai:mainfrom
GallaGit:adapter/filemaker

Conversation

@GallaGit

Copy link
Copy Markdown
Contributor

Closes #1405

Read-only adapter for Claris FileMaker Server through the FileMaker Data API, following the plan approved in #1405.

Auth

  • LOGIN_TOKEN with loginBasicAuth: true (from feat(engine): loginBasicAuth flag for LOGIN_TOKEN logins #1460): POST /fmi/data/vLatest/databases/{db}/sessions with HTTP Basic and an empty JSON body, token read from response.token and sent as Bearer.
  • tokenTTLSeconds: 900 with proactive refresh, plus refreshOn401: true, so an expired session (15 min of inactivity) triggers a fresh login.

Tools (all read-only)

  • filemaker_list_layouts
  • filemaker_get_layout_metadata
  • filemaker_find_records (POST _find)
  • filemaker_get_record

The filemaker_find_records description and the instructions say that FileMaker code "401" in messages[] means an empty result, not a failure, and is not the same as HTTP 401.

Tests

  • Static spec: login flow, every tool's method/URL/body through the real RestEngine, response transforms, env var metadata, and the 401 wording.
  • Live spec (skipped unless RUN_FILEMAKER_LIVE=1): ran against FileMaker Server 26.0.3 (trial, self-hosted in Docker) with a read-only file account that has the fmrest privilege. 21/21 passing: sign-in, wrong password refused without echoing credentials, list layouts, metadata, find, get record.
  • Manual checks on the same server:
    • a matching find returns the record;
    • an empty find returns code 401 "No records match the request". On FileMaker Server 26 this came back with HTTP 200, not 500, so the wording now covers both;
    • a closed/invalid token returns HTTP 401 with code 952, which is what triggers the re-login.

Opening as draft for early feedback. I will sign the CLA.

LOGIN_TOKEN with loginBasicAuth against FileMaker Server sessions,
Bearer token with refreshOn401 for the 15-minute inactivity timeout,
and four read-only tools (list layouts, layout metadata, find, get
record). The find tool description states that FileMaker messages
code 401 (HTTP 500) means no matching records, not auth failure.
Closes HelpCode-ai#1405.
@GallaGit
GallaGit marked this pull request as ready for review November 10, 2026 18:50
# Conflicts:
#	CITATION.cff
#	README.de.md
#	README.ja.md
#	README.md
#	README.zh-CN.md
#	glama.json
#	llms-full.txt
#	llms.txt
#	package.json
#	server.json

@helpcodeai helpcodeai left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @GallaGit, this is a clean adapter, and the live run against FileMaker Server 26 is what I hoped for.

What I checked:

  • Auth: LOGIN_TOKEN with loginBasicAuth sends Basic only on the sessions call, with the empty JSON body. The token is read from response.token and sent as Bearer, and refreshOn401 plus the 900 s TTL cover the 15-minute inactivity timeout. The password is marked secret, and loginHeaders carries no Authorization.
  • Read-only: three GETs and the POST _find, all with read-only annotations. No record writes, scripts, containers or logout.
  • Inputs: layout and record_id are path-encoded. Optional recordId, limit, offset and sort are left out when unset, and the spec pins that.
  • Code "401": the find description and the instructions both separate the empty result from HTTP 401, including the HTTP 200 answer you saw on Server 26.
  • Self-hosted vs Cloud: the SSRF and TLS notes are accurate for both.
  • Locally: validate-adapters shows no FileMaker warnings, adapter-count --check is OK at 731, and regenerating the catalog leaves no diff. CI is green, and the logo is a plain path SVG.

Two small things for a later PR, neither blocking:

  1. filemaker_get_layout_metadata names its parameter recordId, while filemaker_get_record uses record_id. One name for both would be easier for the model.
  2. FileMaker file names often contain spaces, and FILEMAKER_DATABASE goes into baseUrl as typed. If you still have the trial server, could you check a file like My Contacts end to end?

I'll merge shortly.

@helpcodeai
helpcodeai merged commit 929615e into HelpCode-ai:main Nov 10, 2026
16 checks passed
@github-actions github-actions Bot locked and limited conversation to collaborators Nov 10, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Adapter: Claris FileMaker (Data API)

2 participants