filemaker-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@filemaker-mcp show me the schema for the Customers table"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
filemaker-mcp
Connect Claude (or any MCP client) to a FileMaker database — read-only queries, schema discovery, and pandas-powered analytics.
What It Does
filemaker-mcp is an MCP server that gives AI assistants live access to your FileMaker data via OData v4. Load it in Claude Desktop or Claude Code and ask questions about your data in plain English.
Tools provided:
fm_query_records— Search and filter records with OData expressionsfm_get_record— Fetch a single record by primary keyfm_count_records— Count records with optional filtersfm_list_tables— List available tablesfm_get_schema— Discover field names, types, and keysfm_load_dataset— Pull records into memory for analyticsfm_analyze— Run groupby/sum/count/mean/min/max on loaded datafm_list_datasets— See what datasets are loaded
Related MCP server: filemaker-odata-mcp
Quick Start
Prerequisites
Python 3.12+
uv package manager
FileMaker Server with OData v4 enabled
An FM account with
fmodataextended privilege
Install
git clone https://github.com/nietsneuah/filemaker-mcp.git
cd filemaker-mcp
cp .env.example .env
# Edit .env with your FileMaker server details
uv syncConfigure Claude Desktop
Add to your Claude Desktop MCP config
(~/Library/Application Support/Claude/claude_desktop_config.json on macOS):
{
"mcpServers": {
"filemaker": {
"command": "uv",
"args": ["run", "--directory", "/path/to/filemaker-mcp", "filemaker-mcp"],
"env": {
"FM_HOST": "your-server.example.com",
"FM_DATABASE": "your_database",
"FM_USERNAME": "mcp_agent",
"FM_PASSWORD": "your_password"
}
}
}
}Run
uv run filemaker-mcpSchema Discovery
On startup, the server auto-discovers your tables from the OData service
document. For richer schema (field types, primary keys, tiers), install the
optional GetTableDDL FileMaker script — see docs/FM_ACCOUNT_SETUP.md.
Analytics
For reports and summaries, use the analytics tools instead of raw queries:
fm_load_dataset— Fetch records into a pandas DataFrame (auto-paginates)fm_analyze— Run aggregations instantly (no additional FM round trips)
This returns ~200 tokens instead of ~400K for raw records — much more efficient for dashboards and trend analysis.
Documentation
Architecture — System design and security model
FM Account Setup — FileMaker privilege configuration
Tool Reference — Detailed parameter docs
License
GPL-3.0 — see LICENSE
Author
Doug Hauenstein / FM Rug Software
Available Tools
13 toolsfm_analyzeA
Analyze a loaded dataset with groupby/aggregation. No FM round trip.
Runs pandas aggregation on a previously loaded dataset OR a table from the auto-populated table cache (from query_records). Returns compact summary tables instead of raw records — ~200 tokens vs ~400K tokens.
Behavior by parameter combination:
groupby + aggregate: Grouped aggregation (most common)
aggregate only: Scalar aggregation across all rows
groupby only: Group counts (value_counts)
neither: Summary statistics (describe)
period: Time-series resampling (week/month/quarter)
pivot_column: Cross-tabulation pivot table
Supported aggregate functions: sum, count, mean, min, max, median, nunique, std
Args: dataset: Name of a previously loaded dataset (from fm_load_dataset), or a table name from the auto-populated table cache. groupby: Comma-separated field names to group by. Example: "Technician,Region" aggregate: Comma-separated function:field pairs. Example: "sum:Amount,count:Amount,mean:Amount" filter: Pandas query expression to narrow data before aggregating. Example: "Region == 'A'" or "Amount > 500" sort: Sort result by column name with optional direction. Example: "Amount_sum desc" limit: Maximum rows in output (default 50). period: Time-series resampling — "week", "month", or "quarter". First groupby field must be a datetime column. Example: groupby="ServiceDate", period="month" pivot_column: Cross-tabulate by this column (pivot table). Requires groupby for row index and aggregate for values. Example: groupby="Technician", pivot_column="Region", aggregate="sum:Amount"
Returns: Formatted summary table with aggregation results.
Inputs: dataset (required), sort, limit, filter, +4 more. Returns: result
fm_count_recordsA
Get the total record count for an FileMaker table, optionally filtered.
Quick way to check data volume or validate filter expressions before running a full query.
Args: table: Table name (see fm_query_records for available tables). filter: Optional OData $filter expression to count matching records.
Returns: The record count as a text message.
Inputs: table (required), filter. Returns: result
fm_delete_contextA
Delete an operational learning about a FileMaker field or table.
Call this to remove stale or incorrect context entries — for example, when a table or field has been renamed/deleted, or when a previously saved hint is no longer accurate.
The record is deleted from FM and removed from the local cache immediately.
Args: table_name: Table this applies to (e.g., "Invoices"). field_name: Specific field name, or empty for table-level context. context_type: Category — "field_values", "syntax_rule", "query_pattern", "relationship".
Returns: Confirmation message or error description.
Inputs: table_name (required), field_name, context_type. Returns: result
fm_flush_datasetsA
Flush cached table data from session memory.
The MCP server auto-caches query results per table for fast repeat access. Use this to force a fresh fetch from FileMaker — for example, after data has been modified, or to free memory.
Args: table: Specific table to flush (e.g., "Invoices"). Leave empty to flush ALL cached tables.
Returns: Confirmation with number of rows/tables flushed.
Inputs: table. Returns: result
fm_get_recordA
Get a single FileMaker record by its primary key.
Use this when you know the specific record ID and want full details.
Args: table: Table name (use fm_list_tables for available tables). record_id: The primary key value to look up. id_field: The primary key field name (use fm_get_schema to find PKs).
Returns: Formatted text with all fields for the matching record.
Inputs: table (required), record_id (required), id_field. Returns: result
fm_get_schemaA
Get the database schema (field names and types) from FileMaker.
Use this to discover exact field names, their types, and primary keys before constructing queries. Essential for building accurate filter and select expressions.
IMPORTANT: Always call this with a specific table name before querying that table for the first time — many field names contain spaces.
Schema is cached in memory for the session. If you need a table not in the standard list, just request it — the server will auto-discover it from FileMaker.
Args: table: Table name to get fields for (e.g., "Customers", "Orders"). Leave empty to list all available tables. You can request any table that exists in FileMaker — not just the standard list. Unknown tables are auto-discovered. refresh: Force re-fetch from live FM server. Use when you suspect the schema has changed (e.g., new fields added in FileMaker). Default uses cached DDL (instant, no API call). show_all: Show all fields including internal/system fields. Default hides internal fields (globals, speed fields, etc.) to keep schema output concise.
Returns: Formatted listing of fields with names, types, and annotations.
Inputs: table, refresh, show_all. Returns: result
fm_list_datasetsA
List all datasets currently loaded in session memory.
Shows what's available for analysis with fm_analyze. Includes dataset name, source table, row count, columns, and load time.
Returns: Formatted list of loaded datasets, or message if none loaded.
Inputs: no named parameters. Returns: result
fm_list_tablesA
List all available FileMaker tables and their descriptions.
Use this to understand what data is available before querying. Always start here if unsure which table to query.
Returns: List of table names with descriptions of what each contains.
Inputs: no named parameters. Returns: result
fm_list_tenantsA
List all configured FileMaker tenants and show which is active.
Shows tenant names, hosts, and databases. Use fm_use_tenant() to switch to a different tenant.
Returns: Formatted list of tenants with the active one marked.
Inputs: no named parameters. Returns: result
fm_load_datasetA
Load FileMaker records into a named dataset for fast analytics.
Fetches records from FM and stores them as a pandas DataFrame in session memory. Load once, then run multiple analyses with fm_analyze — no additional FM round trips needed.
Auto-paginates if more than 10,000 records match. Loading a dataset with an existing name replaces it (refresh).
IMPORTANT: Call fm_get_schema(table) first to discover field names.
Args: name: Your chosen identifier for this dataset (e.g., "inv25", "customers"). table: FM table to query (see fm_list_tables for available tables). filter: OData $filter expression. Use exact field names from get_schema. Example: "ServiceDate ge 2025-01-01 and ServiceDate lt 2026-01-01" select: Comma-separated fields to fetch. Leave empty for all fields. TIP: Select only the fields you need — reduces memory and speeds loading. Example: "Technician,Region,Amount,ServiceDate"
Returns: Summary with row count, columns, and memory usage.
Inputs: name (required), table (required), filter, select. Returns: result
fm_query_recordsA
Query FileMaker records from a FileMaker table using OData v4.
Use this tool to search, filter, and retrieve records from your FileMaker database.
Args: table: Table name (use fm_list_tables to see available tables). filter: OData $filter expression. ALWAYS call fm_get_schema(table) first — field names vary by table. Examples (use exact names from get_schema): - "City eq 'Springfield'" - "ServiceDate ge 2026-01-01" - "Amount gt 500" - "Region eq 'A' and Status eq 'Open'" select: Comma-separated field names to return. Leave empty for all fields. Example: "Company Name,Phone,City,Email" top: Maximum records to return (default 20, max 10000). skip: Number of records to skip (for pagination). orderby: OData $orderby expression. Example: "ServiceDate desc" or "Company Name asc" count: Include total record count in response (default True).
Returns: Formatted text with matching records and field values.
Inputs: table (required), top, skip, count, +3 more. Returns: result
fm_save_contextA
Save an operational learning about a FileMaker field or table.
Call this when you discover useful information during queries:
Field value mappings (e.g., Commercial field uses "1" not "Yes")
OData syntax rules (e.g., "ne" operator not supported)
Query patterns (e.g., how to join two tables)
Relationships (e.g., FK between Invoices and Customers)
Value normalization maps (e.g., "Jake" and "Jacob Owens" are the same person)
The learning is saved to FM and loaded automatically at next startup, so future sessions benefit immediately.
Args: table_name: Table this applies to (e.g., "Invoices"). context: What you learned. For most types, free text (e.g., "Boolean: 1=yes, empty/0=no"). For "value_map" type, MUST be a JSON object mapping variant values to their canonical form, e.g. '{"Jake": "Jacob Owens", "Bob": "Robert Smith"}'. field_name: Specific field name, or empty for table-level context. context_type: Category — "field_values", "syntax_rule", "query_pattern", "relationship", or "value_map". Use "value_map" when the user identifies that two field values represent the same entity (e.g., nicknames, abbreviations, data entry variants). Value maps are applied automatically during fm_analyze groupby. source: How this was discovered — "auto", "auto:filter_discovery", "manual".
Returns: Confirmation message or error description.
Inputs: context (required), table_name (required), source, field_name, +1 more. Returns: result
fm_use_tenantA
Switch to a different FileMaker tenant.
Connects to the named tenant's FM server and discovers its schema. First switch triggers full bootstrap (may take a few seconds). All subsequent queries go to this tenant.
Args: name: Tenant name as configured (e.g., "production", "staging"). Case-insensitive. Use fm_list_tenants() to see available names.
Returns: Connection summary with host, database, and table count.
Inputs: name (required). Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 13 tools
Each tool has a clearly distinct purpose: querying records, fetching single records, counting, listing tables, fetching schema, loading datasets, analyzing, managing datasets, switching tenants, and managing context. No overlapping functionality.
All tools follow the consistent 'fm_verb_noun' pattern (e.g., fm_query_records, fm_list_tables, fm_get_schema). The naming is uniform and predictable.
13 tools is well-scoped for the server's purpose of querying, analyzing, and managing FileMaker data across tenants with context saving. Each tool earns its place.
The tool set covers read operations and analytics well, but lacks write capabilities (no create, update, or delete records). This is a notable gap for a database interaction server.
Maintenance
Related MCP Connectors
The AI that understands raw data: Schema over your tables and databases, as MCP tools.
Every spreadsheet is a table: Excel, CSV, Parquet and JSON as SQL tables for AI agents.
Connect your AI assistants to Keboola and expose your data, transformations, SQL queries, ...
AI data analyst: ask about your Excel, CSV, GA4 or database data and get charts and dashboards back
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables AI-powered business intelligence and data analysis using pandas and LLM code generation. Supports automated data processing, statistical analysis, and visualization creation through natural language interactions.15-
- AlicenseNot gradedqualityBmaintenanceMCP server for FileMaker Server OData 4.01 API integration, enabling AI assistants to discover databases, perform CRUD operations, and manage connections.21 npm14MIT
- AlicenseBqualityDmaintenanceProvides AI agents with direct access to FileMaker databases through the FileMaker Data API, enabling natural language interactions for querying, managing records, and database introspection.2828 npm4MIT
- AlicenseAqualityCmaintenanceAn MCP server that provides AI assistants with direct access to FileMaker databases via OData v4 API, enabling CRUD operations, script execution, and schema introspection.196MIT