Install
Ailimu ships as one container. It needs a FileMaker Server it can reach and an account it can sign in as.
Before you start
Create a dedicated FileMaker account for Ailimu rather than reusing a person's. Give it a privilege set that can see only what you are willing to expose: Ailimu is another client and your privilege set still governs it, so this is your strongest control.
That account's privilege set needs extended privileges:
| Extended privilege | Needed for |
|---|---|
fmodata |
Reading tables. This is the default and the better choice: real field types, declared keys, relationships and your field comments. |
fmrest |
Scripts, and the layout list they run against. Also the fallback way of reading data, through layouts. |
Enable both if you intend to expose scripts. If you only want to read tables,
fmodata alone is enough.
Reading through layouts instead of tables. The Data API sees only fields placed on a layout, and returns the literal text
<No Access>for fields the account cannot reach through it. On one large file that meant 4,352 fields of which 85% were unreadable, against 2,099 readable fields over OData. Use OData unless it is unavailable to you.
Run it
docker pull ailimu/ailimu:latest
Create a .env beside your compose file:
FM_USER=ailimu
FM_PASS=your-filemaker-password
Those two are the only required settings. Credentials are read from the environment and are never written to the config file, so they stay out of your backups. See the reference for the rest.
docker-compose.yml:
services:
ailimu:
image: ailimu/ailimu:latest
ports:
- "8081:8081"
env_file:
- path: .env
required: false
volumes:
- ailimu-config:/config
restart: unless-stopped
volumes:
ailimu-config:
docker compose up -d
docker compose logs
The connector prints where to go:
ailimu up on :8081
Setup wizard: http://localhost:8081/admin/?token=YOUR-ADMIN-TOKEN
MCP endpoint: http://localhost:8081/mcp (or /mcp/<profile>)
MCP token: YOUR-MCP-TOKEN
Open that wizard URL. The token in it guards the wizard: anyone with it can change what is exposed, so treat it as a password.
About that volume
/config holds everything that survives a restart:
| Path | What |
|---|---|
profiles/<slug>.json |
One published profile per FileMaker file. |
schema/<slug>.json |
The last discovery, cached so opening a profile is instant. Shape only: no record values. |
tokens.json |
The generated admin and per-profile tokens, mode 0600. |
audit.log |
One line per write or script call. |
Back it up and you can rebuild an install without redoing the setup. Lose it and the tokens are regenerated, which invalidates the config you gave Claude.
Tokens
Set ADMIN_TOKEN and MCP_TOKEN yourself if you want stable values. Leave them
unset and the connector generates them on first boot and persists them to the
volume, so a container recreate does not invalidate a saved Claude config.
Environment always wins.
Upgrading
docker compose pull && docker compose up -d
Your profiles and cached schemas are on the volume and survive. A setup written before profiles existed is migrated automatically the first time the new version reads it: it becomes a profile named after the file, and the old file is renamed rather than deleted.