MCP-Claude-FileMaker
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., "@MCP-Claude-FileMakershow me the customers in the sales database"
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.
MCP Claude FileMaker
A comprehensive Model Context Protocol (MCP) server for integrating Claude with FileMaker databases. This server enables Claude to interact with your FileMaker databases through the FileMaker Data API, providing seamless database operations, script execution, and metadata discovery.
š Features
Core Functionality
Multi-Database Support: Connect to multiple FileMaker databases simultaneously
Dynamic Configuration: Configure databases via environment variables
Intelligent Caching: Built-in caching for improved performance
Self-Signed Certificate Support: Works with FileMaker Cloud and on-premise servers
Comprehensive Error Handling: Robust error handling and recovery
Database Operations
List Databases: Enumerate all configured databases
Test Connections: Verify database connectivity
Get Metadata: Retrieve database schemas and layout information
Query Records: Advanced record querying with filtering and sorting
Create Records: Insert new records into layouts
Update Records: Modify existing records
Delete Records: Remove records from the database
Execute Scripts: Run FileMaker scripts with parameters
Script Discovery: List available scripts
Authentication Methods
Username/Password: Traditional FileMaker authentication
API Key: OttoFMS and modern FileMaker authentication
Related MCP server: Dataverse MCP Server
šļø Technical Architecture
System Overview
The MCP-Claude-FileMaker server is built on a sophisticated multi-layered architecture designed for enterprise-grade FileMaker integration:
āāāāāāāāāāāāāāāāāāā āāāāāāāāāāāāāāāāāāāā āāāāāāāāāāāāāāāāāāāāāāā
ā Claude AI āāāāāŗā MCP Protocol āāāāāŗā FileMaker Server ā
ā ā ā (JSON-RPC) ā ā (Data API v1) ā
āāāāāāāāāāāāāāāāāāā āāāāāāāāāāāāāāāāāāāā āāāāāāāāāāāāāāāāāāāāāāā
ā ā ā
ā āāāāāāāāāāāāāāāāāāā ā
āāāāāāāāāāāāāāāŗā MCP Server āāāāāāāāāāāāāāāā
ā (Node.js) ā
āāāāāāāāāāāāāāāāāāā
ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā Core Components ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā¤
ā ⢠Database Discovery Engine ā
ā ⢠Dual-Cache System ā
ā ⢠Authentication Manager ā
ā ⢠Script Execution Engine ā
ā ⢠Query Processing Layer ā
ā ⢠SSL Certificate Handler ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāCore Architecture Components
1. Database Discovery Engine
Automatically discovers and configures multiple FileMaker databases:
Environment scanning: Detects
FM_SERVER_*,FM_DATABASE_*patternsDynamic configuration: Supports unlimited database connections
Authentication flexibility: Mixed auth methods per database
Validation: Ensures complete configuration before startup
2. Dual-Cache System
Intelligent caching for optimal performance:
// Data Cache (14 minutes TTL)
- Database metadata and layouts
- Query results and record sets
- Script lists and definitions
// Session Cache (13 minutes TTL)
- Authentication tokens
- Connection state management
- Auto-refresh before expiration3. Authentication Manager
Robust authentication with automatic recovery:
Token lifecycle management: Automatic refresh and retry
Multi-method support: Username/password and API keys
Session persistence: Cached tokens across requests
Error recovery: 401 auto-retry with new authentication
4. Script Execution Engine
Comprehensive FileMaker script automation:
Script discovery:
/scriptsendpoint enumeration with cachingParameter passing: URL-encoded parameter support
Layout context: Script execution within specific layouts
Response capture: Full script result and error handling
Workflow automation: Chained script execution via Claude conversations
5. Query Processing Layer
Advanced data query capabilities:
Smart endpoint selection: GET vs POST based on query complexity
Complex find requests: Multi-criteria, AND/OR logic support
Sorting and pagination: Full FileMaker Data API feature coverage
Record operations: Complete CRUD functionality
6. SSL Certificate Handler
Production-ready security management:
Self-signed certificate support: Development-friendly defaults
Production hardening: Configurable SSL verification levels
HTTPS Agent: Custom agent for certificate management
Data Flow Architecture
Claude Request ā MCP Protocol ā Tool Validation ā Database Selection
ā ā
Authentication Check ā Session Cache ā Token Manager ā Database Config
ā ā
FileMaker API Call ā HTTPS Request ā FileMaker Server ā Data/Script Response
ā ā
Response Processing ā Data Cache ā Result Formatting ā Raw API Response
ā
Claude Response (JSON)Performance Optimizations
Intelligent Caching Strategy
Metadata caching: Database schemas cached for 14 minutes
Session reuse: Authentication tokens cached for 13 minutes
Query optimization: Repeated queries served from cache
Cache invalidation: Manual cache clearing available
Connection Management
Connection pooling: Reused HTTPS connections
Automatic retry: 401 errors trigger re-authentication
Timeout handling: Graceful handling of connection timeouts
SSL optimization: Custom HTTPS agent for performance
Request Optimization
Batch operations: Multiple database operations in single requests
Smart querying: Optimal endpoint selection based on query type
Parameter encoding: Proper URL encoding for special characters
Response streaming: Efficient handling of large result sets
Security Architecture
Authentication Security
Credential isolation: Environment variable storage only
Token rotation: Automatic token refresh prevents stale sessions
Mixed authentication: Different methods per database
Access control: Database-specific permission validation
Network Security
TLS configuration: Configurable SSL/TLS verification
Certificate management: Self-signed and CA certificate support
Firewall compatibility: Standard HTTPS ports (80/443)
Request signing: FileMaker Data API token-based authentication
Data Security
No persistent storage: All data flows through, never stored
Cache encryption: In-memory cache only, no disk persistence
Audit trail: All operations logged for security monitoring
Error sanitization: Sensitive data excluded from error messages
Script Execution Architecture
The script execution system provides full automation capabilities:
Claude: "Run monthly report script with parameter Q4-2024"
ā
Script Discovery: fm_get_scripts ā Cache Check ā FileMaker /scripts API
ā
Script Validation: Verify script exists and is accessible
ā
Script Execution: fm_run_script ā Layout Context ā Parameter Encoding
ā
FileMaker API: GET /layouts/{layout}/script/{script}?script.param={param}
ā
Result Processing: Script response ā Error handling ā Claude responseScript Features
Natural language execution: "Run the backup script"
Parameter support: Complex parameter passing
Context awareness: Layout-specific script execution
Error handling: Comprehensive script error reporting
Batch execution: Multiple scripts via conversation flow
Multi-Database Architecture
Supports enterprise environments with multiple FileMaker systems:
Environment Variables Pattern:
FM_SERVER_PROD=prod.company.com ā Production Database
FM_SERVER_DEV=dev.company.com ā Development Database
FM_SERVER_CRM=crm.company.com ā CRM Database
FM_SERVER_INVENTORY=inv.company.com ā Inventory Database
Each database can have:
- Different authentication methods
- Separate caching strategies
- Independent script libraries
- Unique security requirementsError Handling & Recovery
Graceful Degradation
Connection failures: Clear error messages with troubleshooting guidance
Authentication errors: Automatic retry with fresh credentials
Timeout handling: Configurable timeout with fallback responses
API errors: FileMaker error code translation to human-readable messages
Monitoring & Observability
Health checks: Built-in container health monitoring
Debug logging: Comprehensive debug mode for troubleshooting
Performance metrics: Cache hit rates and response times
Error tracking: Detailed error logging with context
š¦ Installation
Prerequisites
Node.js 18+ installed
FileMaker Server with Data API enabled
Claude Desktop (for MCP integration)
Quick Start
Clone or Download
git clone https://github.com/datacraftdevelopment/MCP-Claude-FileMaker.git cd MCP-Claude-FileMakerInstall Dependencies
npm installConfigure Environment
cp .env.example .env # Edit .env with your FileMaker database detailsConfigure Claude Desktop Add to your Claude Desktop configuration:
{ "mcpServers": { "filemaker": { "command": "node", "args": ["/path/to/MCP-Claude-FileMaker/server.js"], "env": { "FM_PROTOCOL": "https", "FM_API_VERSION": "v1", "FM_SSL_VERIFY": "false", "NODE_TLS_REJECT_UNAUTHORIZED": "0", "FM_SERVER_MYDB": "your-filemaker-server.com", "FM_DATABASE_MYDB": "YourDatabase", "FM_ACCOUNT_MYDB": "your_username", "FM_PASSWORD_MYDB": "your_password" } } } }Restart Claude Desktop
āļø Configuration
Environment Variables
The server uses environment variables for configuration. You can configure multiple databases using a simple naming pattern.
Global Settings
FM_PROTOCOL=https # http or https
FM_API_VERSION=v1 # FileMaker Data API version
FM_SSL_VERIFY=false # Set to true for production
NODE_TLS_REJECT_UNAUTHORIZED=0 # Set to 1 for production
CACHE_TTL=840 # Data cache TTL in seconds (14 minutes)
SESSION_TTL=780 # Session cache TTL in seconds (13 minutes)Database Configuration Pattern
For Username/Password Authentication:
FM_SERVER_IDENTIFIER=your-server.com
FM_DATABASE_IDENTIFIER=YourDatabase
FM_ACCOUNT_IDENTIFIER=username
FM_PASSWORD_IDENTIFIER=passwordFor API Key Authentication:
FM_SERVER_IDENTIFIER=your-server.com
FM_DATABASE_IDENTIFIER=YourDatabase
FM_API_KEY_IDENTIFIER=your-api-keyMultiple Database Example
# Production Database
FM_SERVER_PROD=prod.filemaker-server.com
FM_DATABASE_PROD=MainDatabase
FM_ACCOUNT_PROD=api_user
FM_PASSWORD_PROD=secure_password
# Development Database
FM_SERVER_DEV=dev.filemaker-server.com
FM_DATABASE_DEV=TestDatabase
FM_API_KEY_DEV=dev-api-key-12345
# Customer Database
FM_SERVER_CUSTOMERS=customers.filemaker-server.com
FM_DATABASE_CUSTOMERS=CustomerDB
FM_ACCOUNT_CUSTOMERS=readonly
FM_PASSWORD_CUSTOMERS=readonly_passClaude Desktop Configuration
Simple Single Database
{
"mcpServers": {
"filemaker": {
"command": "node",
"args": ["/absolute/path/to/MCP-Claude-FileMaker/server.js"],
"env": {
"FM_PROTOCOL": "https",
"FM_API_VERSION": "v1",
"FM_SSL_VERIFY": "false",
"NODE_TLS_REJECT_UNAUTHORIZED": "0",
"FM_SERVER_MAIN": "your-server.com",
"FM_DATABASE_MAIN": "YourDatabase",
"FM_ACCOUNT_MAIN": "your_username",
"FM_PASSWORD_MAIN": "your_password"
}
}
}
}Multiple Databases
{
"mcpServers": {
"filemaker": {
"command": "node",
"args": ["/absolute/path/to/MCP-Claude-FileMaker/server.js"],
"env": {
"FM_PROTOCOL": "https",
"FM_API_VERSION": "v1",
"FM_SSL_VERIFY": "false",
"NODE_TLS_REJECT_UNAUTHORIZED": "0",
"FM_SERVER_PROD": "prod.your-server.com",
"FM_DATABASE_PROD": "Production",
"FM_ACCOUNT_PROD": "api_user",
"FM_PASSWORD_PROD": "prod_password",
"FM_SERVER_DEV": "dev.your-server.com",
"FM_DATABASE_DEV": "Development",
"FM_API_KEY_DEV": "dev-api-key-123"
}
}
}
}š§ Available Tools
Database Management
fm_list_databases
List all configured databases.
No parameters requiredfm_test_connection
Test connection to a specific database.
database: Database identifier to testfm_get_metadata
Get database metadata (layouts/tables).
database: Database identifierfm_get_layout_metadata
Get detailed metadata for a specific layout.
database: Database identifier
layout: Layout nameData Operations
fm_query_records
Query records with advanced filtering and sorting.
database: Database identifier
layout: Layout name
query: (optional) Array of find requests
sort: (optional) Sort array
limit: (optional) Max records to return
offset: (optional) Records to skipfm_create_record
Create a new record.
database: Database identifier
layout: Layout name
fieldData: Object with field names and valuesfm_update_record
Update an existing record.
database: Database identifier
layout: Layout name
recordId: FileMaker record ID
fieldData: Object with field names and new valuesfm_delete_record
Delete a record.
database: Database identifier
layout: Layout name
recordId: FileMaker record IDScript Operations
fm_run_script
Execute a FileMaker script with comprehensive parameter support.
database: Database identifier
layout: Layout context (script execution environment)
script: Script name (exact name as appears in FileMaker)
parameter: (optional) Script parameter (string, JSON, or complex data)Script Execution Features:
Layout Context: Scripts run within specified layout for proper context
Parameter Encoding: Automatic URL encoding of parameters with special characters
Response Capture: Full script execution results and return values
Error Handling: Comprehensive error reporting for script failures
Timeout Management: Graceful handling of long-running scripts
Parameter Examples:
// Simple string parameter
{ "parameter": "weekly-report" }
// Date range parameter
{ "parameter": "2024-01-01,2024-12-31" }
// JSON parameter for complex data
{ "parameter": "{\"type\": \"export\", \"format\": \"csv\", \"fields\": [\"name\", \"email\"]}" }
// Multi-value parameter
{ "parameter": "department=sales®ion=west&quarter=Q4" }fm_get_scripts
Discover and list all available scripts in a database.
database: Database identifierScript Discovery Features:
Complete enumeration: Lists all scripts accessible to the API account
Cached results: Script lists cached for performance (14-minute TTL)
Permission awareness: Only shows scripts the account can execute
Metadata included: Script names and availability status
Example Response:
{
"response": {
"scripts": [
{
"name": "Daily Backup",
"isFolder": false
},
{
"name": "Reports",
"isFolder": true
},
{
"name": "Customer Export",
"isFolder": false
}
]
}
}Utility Operations
fm_clear_cache
Clear cached data.
type: Type of cache to clear ("data", "session", "all")š Usage Examples
Basic Usage with Claude
List Available Databases
"List all my FileMaker databases"Explore Database Structure
"Show me the layouts in my PROD database" "Get the field definitions for the Customers layout"Query Data
"Find all customers with status 'Active' in the PROD database" "Show me the last 10 orders from the Orders layout"Create Records
"Create a new customer record with name 'John Doe' and email 'john@example.com'"Run Scripts
"Run the 'Calculate Totals' script on the Orders layout" "Execute the backup script with parameter 'weekly'" "List all available scripts in my PROD database" "Run the monthly report script with parameter Q4-2024"
Script Automation Examples
Script Discovery Workflow
User: "What scripts are available in my production database?"
Claude: Uses fm_get_scripts to list all scripts
User: "Run the customer report script"
Claude: Uses fm_run_script with discovered script nameComplex Script Workflows
User: "Generate the end-of-month reports with parameter December-2024"
Claude:
1. Discovers available scripts using fm_get_scripts
2. Identifies "End of Month Report" script
3. Executes script with parameter "December-2024"
4. Reports execution status and results
User: "Run the data validation scripts for the customer database"
Claude:
1. Lists scripts in customer database
2. Identifies validation-related scripts
3. Executes multiple scripts in sequence
4. Provides comprehensive execution summaryAutomated Maintenance Workflows
User: "Perform database maintenance on the inventory system"
Claude:
1. Connects to inventory database
2. Runs "Daily Cleanup" script
3. Executes "Reindex Database" script
4. Runs "Generate Summary Reports" script
5. Provides maintenance completion statusScript Parameter Examples
# Simple parameter passing
"Run the backup script with parameter 'full-backup'"
# Date-based parameters
"Execute the sales report script with parameter '2024-12-01,2024-12-31'"
# JSON parameter passing
"Run the data import script with parameter '{"source": "csv", "validate": true}'"
# Multiple parameter scenarios
"Execute the user notification script with parameters for email alerts"Error Handling in Script Execution
User: "Run the data synchronization script"
Claude:
- Executes fm_run_script
- Captures script return values
- Reports success/failure status
- Provides error details if script fails
- Suggests troubleshooting stepsAdvanced Queries
// Complex find request
{
"query": [
{
"FirstName": "John",
"Status": "Active"
},
{
"LastName": "Smith",
"omit": "true"
}
],
"sort": [
{
"fieldName": "LastName",
"sortOrder": "ascend"
}
],
"limit": 50
}š Security Considerations
Production Deployment
Set
FM_SSL_VERIFY=trueSet
NODE_TLS_REJECT_UNAUTHORIZED=1Use strong passwords or API keys
Limit database privileges for API accounts
Use HTTPS for all connections
Keep the MCP server updated
Authentication Best Practices
Create dedicated API accounts with minimal required privileges
Use API keys when possible (OttoFMS)
Regularly rotate passwords and API keys
Monitor access logs
š³ Docker Deployment
Build and Run
# Build the image
docker build -t mcp-claude-filemaker .
# Run with environment file
docker run -d --env-file .env --name mcp-filemaker mcp-claude-filemaker
# Run with inline environment variables
docker run -d \
-e FM_PROTOCOL=https \
-e FM_SERVER_MAIN=your-server.com \
-e FM_DATABASE_MAIN=YourDB \
-e FM_ACCOUNT_MAIN=username \
-e FM_PASSWORD_MAIN=password \
--name mcp-filemaker \
mcp-claude-filemakerš FileMaker Connector Extension
Included in the connectors/ directory is filemaker-connector-v2.1.0.dxt - a powerful FileMaker extension that provides enhanced integration capabilities with Claude and the MCP server. This drag-and-drop extension simplifies the process of connecting your FileMaker databases to Claude.
What is the FileMaker Connector?
The FileMaker Connector is a pre-built extension (.dxt file) that:
Provides a user-friendly interface for configuring database connections
Automatically generates the necessary server configuration
Includes connection testing and validation tools
Streamlines the setup process for non-technical users
Works alongside the MCP server to provide seamless Claude integration
Installation Steps
Step 1: Install the Extension
Open Claude Desktop on your computer
Locate the connector file:
connectors/filemaker-connector-v2.1.0.dxtDrag and drop the
.dxtfile directly onto the Claude Desktop application windowFollow the installation prompts that appear
Claude Desktop will automatically integrate the FileMaker connector
Step 2: Access the Connector
After installation, the connector will be integrated into Claude Desktop and available through:
Claude's interface for FileMaker database configuration
Automatic detection when you mention FileMaker operations
Enhanced FileMaker integration capabilities within Claude conversations
Step 3: Configure Your Connection
Open the connector from the Extensions menu
Fill in your server details:
Server Address: Your FileMaker Server URL (e.g.,
your-server.com)Database Name: The FileMaker database filename (without .fmp12)
Username/Password: FileMaker account credentials with API access
Protocol: Usually
httpsfor production serversAPI Version: Typically
v1(FileMaker Data API version)
Step 4: Test and Generate Configuration
Test the connection using the built-in connection tester
Generate MCP configuration - the connector will create the proper environment variables
Copy the generated configuration to use in your Claude Desktop setup
Using the Generated Configuration
After configuring the connector, it will generate environment variables in this format:
FM_PROTOCOL=https
FM_API_VERSION=v1
FM_SSL_VERIFY=false
FM_SERVER_YOURDB=your-server.com
FM_DATABASE_YOURDB=YourDatabase
FM_ACCOUNT_YOURDB=your_username
FM_PASSWORD_YOURDB=your_passwordYou can then use these in your Claude Desktop configuration or .env file.
Connector Features
Connection Management
Multiple Database Support: Configure connections to multiple FileMaker databases
Credential Validation: Test credentials before saving configuration
SSL Certificate Handling: Automatic handling of self-signed certificates
Connection Status Monitoring: Real-time connection health checks
Configuration Generation
Auto-Generate Environment Variables: Creates properly formatted
.envfilesClaude Desktop Config: Generates ready-to-use Claude Desktop JSON configuration
Export/Import Settings: Save and share configuration templates
Backup Configuration: Keep copies of working configurations
Advanced Features
Script Discovery: Browse available FileMaker scripts
Layout Inspection: View database schema and field definitions
Permission Testing: Verify account privileges and access levels
Performance Monitoring: Check response times and server performance
Troubleshooting the Connector
Connector Won't Install
Ensure you're using Claude Desktop latest version
Check that Claude Desktop has permission to install extensions
Try restarting Claude Desktop and installing again
Verify the
.dxtfile is not corrupted
Connection Test Fails
Verify server URL is correct and accessible
Check that FileMaker Server Data API is enabled
Confirm username/password are correct and account is active
Test network connectivity to the FileMaker Server
Configuration Not Working
Double-check generated environment variables
Ensure MCP server can access the same network as FileMaker Server
Verify Claude Desktop is using the correct configuration file path
Manual Configuration (Alternative)
If you prefer not to use the connector extension, you can manually configure the MCP server by:
Setting up environment variables as shown in the Configuration section above
Testing connections using the MCP server's built-in connection tools
Configuring Claude Desktop manually with your database details
The connector simply automates this process and provides a user-friendly interface for configuration management.
š§ Technical Implementation Details
Caching Strategy Deep Dive
The MCP server implements a sophisticated dual-cache strategy optimized for FileMaker Data API characteristics:
Cache Architecture
// Data Cache Configuration
const dataCache = new NodeCache({
stdTTL: parseInt(process.env.CACHE_TTL) || 840, // 14 minutes
checkperiod: 120 // Check every 2 minutes
});
// Session Cache Configuration
const sessionCache = new NodeCache({
stdTTL: parseInt(process.env.SESSION_TTL) || 780, // 13 minutes
checkperiod: 60 // Check every minute
});Cache Key Strategy
// Data cache keys (hierarchical)
`metadata_${database}` // Database layouts and schemas
`layout_${database}_${layout}` // Specific layout metadata
`scripts_${database}` // Available scripts list
`find_${database}_${layout}_${hash}` // Query results with hash
// Session cache keys
`session_${database}` // Authentication tokens per databaseCache Performance Benefits
Metadata requests: 95%+ cache hit rate after initial loading
Authentication: Eliminates ~75% of authentication API calls
Script discovery: Instant script listing after first query
Response time improvement: 60-90% faster response on cached operations
Session Management Implementation
Token Lifecycle Management
async function authenticateFileMaker(dbConfig) {
const cacheKey = `session_${dbConfig.database}`;
const cachedSession = sessionCache.get(cacheKey);
if (cachedSession) {
return cachedSession; // Use cached token
}
// Create new session with FileMaker Data API
const response = await axios.post(`${baseURL}/sessions`, {}, {
auth: { username: dbConfig.username, password: dbConfig.password },
httpsAgent
});
const token = response.data.response.token;
sessionCache.set(cacheKey, token); // Cache for 13 minutes
return token;
}Automatic Token Refresh
// Auto-retry mechanism for expired tokens
try {
const response = await axios({ method, url: endpoint, headers: { 'Authorization': `Bearer ${token}` } });
return response.data;
} catch (error) {
if (error.response?.status === 401) {
sessionCache.del(`session_${dbConfig.database}`); // Clear expired token
const newToken = await authenticateFileMaker(dbConfig); // Get fresh token
// Retry request with new token
const retryResponse = await axios({ method, url: endpoint, headers: { 'Authorization': `Bearer ${newToken}` } });
return retryResponse.data;
}
throw error;
}Error Handling & Recovery
Comprehensive Error Classification
// FileMaker API Error Handling
switch (error.response?.status) {
case 401:
// Authentication failure - retry with fresh token
return await retryWithNewAuthentication();
case 404:
// Resource not found (layout, script, record)
throw new Error(`Resource not found: ${error.response.data?.messages?.[0]?.message}`);
case 500:
// FileMaker Server error
throw new Error(`FileMaker Server error: ${error.response.data?.messages?.[0]?.message}`);
case 503:
// Service unavailable
throw new Error(`FileMaker Server temporarily unavailable`);
default:
// Generic error handling
throw new Error(`Request failed: ${error.response?.data?.messages?.[0]?.message || error.message}`);
}Graceful Degradation Patterns
Cache failures: Fall back to direct API calls
Network timeouts: Return helpful error messages with retry suggestions
Partial failures: Continue processing other operations when possible
Configuration errors: Provide specific guidance for fixing issues
Performance Optimizations
Connection Pooling & Reuse
// HTTPS Agent with connection reuse
const httpsAgent = new https.Agent({
rejectUnauthorized: process.env.FM_SSL_VERIFY === 'true',
keepAlive: true, // Reuse connections
keepAliveMsecs: 1000, // Keep alive for 1 second
maxSockets: 10, // Max concurrent connections per host
maxFreeSockets: 5 // Max free connections to keep open
});Smart Query Optimization
// Endpoint selection based on query complexity
let endpoint = `/layouts/${encodeURIComponent(layout)}/records`;
let method = 'GET';
let requestData = null;
if (query && query.length > 0) {
// Complex query - use POST to _find endpoint
endpoint = `/layouts/${encodeURIComponent(layout)}/_find`;
method = 'POST';
requestData = { query, sort, limit, offset };
} else {
// Simple query - use GET with URL parameters
const params = new URLSearchParams();
if (limit) params.append('_limit', limit.toString());
if (offset) params.append('_offset', offset.toString());
if (params.toString()) endpoint += `?${params.toString()}`;
}Response Processing Optimization
JSON streaming: Efficient handling of large result sets
Memory management: Automatic garbage collection of large responses
Compression: GZIP support for large data transfers
Pagination: Smart handling of large record sets
Security Implementation
Credential Security
// Environment variable isolation
const dbConfig = {
server: process.env[`FM_SERVER_${identifier}`],
database: process.env[`FM_DATABASE_${identifier}`],
username: process.env[`FM_ACCOUNT_${identifier}`] || '',
password: process.env[`FM_PASSWORD_${identifier}`] || '',
apiKey: process.env[`FM_API_KEY_${identifier}`]
};
// Never log sensitive information
console.error(`Connecting to database: ${dbConfig.database} at ${dbConfig.server}`);
// Credentials are never logged or exposedSSL/TLS Configuration
// Flexible SSL handling for different environments
const httpsAgent = new https.Agent({
rejectUnauthorized: process.env.FM_SSL_VERIFY === 'true' &&
process.env.NODE_TLS_REJECT_UNAUTHORIZED === '1',
secureProtocol: 'TLSv1_2_method', // Force TLS 1.2+
honorCipherOrder: true, // Use server cipher preference
ciphers: 'ECDHE+AESGCM:ECDHE+AES256:ECDHE+AES128:!aNULL:!MD5:!DSS' // Strong ciphers only
});Multi-Database Architecture
Database Discovery Algorithm
// Dynamic database configuration discovery
const databases = {};
const envKeys = Object.keys(process.env);
const serverKeys = envKeys.filter(key => key.startsWith('FM_SERVER_'));
for (const serverKey of serverKeys) {
const identifier = serverKey.replace('FM_SERVER_', '');
const config = {
server: process.env[serverKey],
database: process.env[`FM_DATABASE_${identifier}`],
username: process.env[`FM_ACCOUNT_${identifier}`],
password: process.env[`FM_PASSWORD_${identifier}`],
apiKey: process.env[`FM_API_KEY_${identifier}`]
};
// Validate configuration completeness
if (config.server && config.database &&
((config.username && config.password) || config.apiKey)) {
databases[identifier] = config;
}
}Concurrent Database Operations
Parallel processing: Multiple database operations execute concurrently
Connection isolation: Each database maintains separate connection state
Cache separation: Database-specific cache namespacing
Error isolation: Failures in one database don't affect others
Script Execution Implementation
Script Parameter Encoding
// Robust parameter handling for FileMaker scripts
let endpoint = `/layouts/${encodeURIComponent(layout)}/script/${encodeURIComponent(scriptName)}`;
if (parameter) {
// Handle complex parameters (JSON, special characters, etc.)
const encodedParam = encodeURIComponent(parameter);
endpoint += `?script.param=${encodedParam}`;
}Script Result Processing
// Comprehensive script response handling
const result = await makeFileMakerRequest(dbConfig, 'GET', endpoint);
return {
content: [{
type: 'text',
text: JSON.stringify({
scriptResult: result.response?.scriptResult || null,
scriptError: result.response?.scriptError || '0',
success: result.response?.scriptError === '0',
messages: result.messages || [],
timestamp: new Date().toISOString()
}, null, 2)
}]
};Monitoring & Observability
Performance Metrics
// Built-in performance monitoring
const performanceMetrics = {
cacheHitRate: dataCache.getStats(),
sessionCacheHitRate: sessionCache.getStats(),
activeConnections: databases.length,
requestCount: requestCounter,
averageResponseTime: responseTimeTracker.getAverage()
};Health Check Implementation
# Docker health check
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
CMD node -e "console.log('Health check passed')" || exit 1š ļø Development
Build from Source
# Install dependencies
npm install
# Build TypeScript (if using src/)
npm run build
# Start development server
npm run dev
# Run tests
npm testProject Structure
MCP-Claude-FileMaker/
āāā server.js # Main server file (production ready)
āāā src/ # TypeScript source files
ā āāā index.ts # TypeScript entry point
ā āāā filemaker-client.ts # FileMaker client class
āāā connectors/ # FileMaker extensions
ā āāā filemaker-connector-v2.1.0.dxt
āāā package.json # Node.js package configuration
āāā tsconfig.json # TypeScript configuration
āāā Dockerfile # Docker container definition
āāā .env.example # Environment configuration template
āāā README.md # This fileš¤ Contributing
Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.
Development Setup
Fork the repository
Clone your fork
Create a feature branch
Make your changes
Test thoroughly
Submit a pull request
š License
This project is licensed under the MIT License - see the LICENSE file for details.
ā” Troubleshooting
Common Issues
Connection Failed
Verify FileMaker Server Data API is enabled
Check server URL and credentials
Ensure firewall allows connections on port 443/80
Verify SSL certificate settings
Authentication Errors
Check username/password or API key
Verify account privileges in FileMaker
Ensure account is not disabled
No Databases Found
Check environment variable naming pattern
Verify all required variables are set
Check for typos in variable names
Cache Issues
Use
fm_clear_cacheto clear cached dataRestart the server for persistent issues
Debug Mode
Set environment variable DEBUG=1 for verbose logging:
DEBUG=1 node server.jsScript Execution Issues
Script Not Found
Use
fm_get_scriptsto list available scriptsCheck script name spelling and case sensitivity
Verify account has permission to access the script
Ensure script is not in a folder (use full path if needed)
Script Execution Fails
Check FileMaker script for errors using FileMaker Pro
Verify script parameters are correctly formatted
Ensure the layout context is appropriate for the script
Check script privileges and account permissions
Script Timeout
Long-running scripts may timeout at the server level
Consider breaking complex scripts into smaller operations
Use FileMaker Server timeout settings for script execution
Implement progress reporting within scripts
Parameter Handling Issues
Ensure parameters are properly URL encoded
Use JSON format for complex parameter structures
Verify parameter parsing within the FileMaker script
Test parameters directly in FileMaker Pro first
Script Permission Errors
Verify account has "Execute scripts" privilege
Check extended privileges include
fmrestfor Data API accessEnsure scripts are not set to "no access" for the account
Confirm script-level security settings in FileMaker
š Support
For support and questions:
Create an issue on GitHub
Check the troubleshooting section
Review FileMaker Data API documentation
Test script execution directly in FileMaker Pro for debugging
Made with ā¤ļø for the FileMaker and Claude communities
Available Tools
11 toolsfm_clear_cacheC
Clear cached data
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Type of cache to clear |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full behavioral burden. 'Clear cached data' implies a destructive or refresh action, but the description does not state whether clearing is reversible, what happens to active sessions, performance impacts, or required permissions. This is a significant gap for a mutation-style tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely short and front-loaded, but it is a bare fragment that omits necessary context. It is concise to the point of being under-specified rather than optimally structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations, no output schema, and only a minimal three-word description, the definition is incomplete for a tool that clears cache. It does not explain the types of cache available (beyond the enum name), when clearing is safe, or what the result of the operation is.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single 'type' parameter has an enum with a clear schema description. The tool description adds no additional parameter meaning beyond what the schema already provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb (clear) and resource (cached data), so the basic action is unambiguous. However, it does not specify the scope or kind of cache beyond the parameter enum, nor does it differentiate from any sibling (none of which deal with caches).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool, when not to use it, or what alternatives exist. An agent must guess whether clearing cache is appropriate or what side effects it may have.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fm_create_recordD
Create a new record
| Name | Required | Description | Default |
|---|---|---|---|
| layout | Yes | Layout name | |
| database | Yes | Database identifier | |
| fieldData | Yes | Field data for the new record |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states no mutation semantics, no required permissions, no side effects, no response format. 'Create a new record' is a tautology that adds nothing beyond the name.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single short sentence with no wasted words, but it is under-specified rather than concisely informative. Every sentence should earn its place, and this one barely adds value beyond the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with three required parameters, no annotations, and no output schema, the description is inadequate. It does not explain required database/layout context, the shape of fieldData, or what happens on success/failure. It leaves the agent to rely entirely on the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters (database, layout, fieldData). The description adds no parameter meaning beyond what the schema provides. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Create a new record' restates the tool name (fm_create_record) almost verbatim. It gives a vague verb+resource but provides zero differentiation from siblings like fm_update_record or fm_delete_record beyond the obvious create/update/delete split.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool, no prerequisites, no mention of alternatives. An agent must infer entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fm_delete_recordC
Delete a record
| Name | Required | Description | Default |
|---|---|---|---|
| layout | Yes | Layout name | |
| database | Yes | Database identifier | |
| recordId | Yes | FileMaker record ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. 'Delete a record' signals a destructive write, but it says nothing about irreversibility, required permissions, side effects on related data, or whether confirmation is neededācritical omissions for a deletion tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The single sentence is structurally concise and front-loaded, but it is under-specified rather than efficient. For a destructive tool with three required parameters and no annotations, a bare 'Delete a record' fails to earn its place by conveying necessary context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations, no output schema, three required parameters, and destructive semantics, the description is completely inadequate. It omits permissions, reversibility, error behavior, and any usage context an agent would need to invoke it safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents database, layout, and recordId fully. The description adds no additional meaning about parameter format, constraints, or relationships beyond what the schema provides, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
State a specific verb ('Delete') and resource ('record'), so the core operation is unambiguous. However, it does not differentiate this tool from the many other record-level siblings (fm_update_record, fm_create_record, fm_query_records), leaving the agent to infer the distinction from the name alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives such as fm_update_record or fm_create_record, and it offers no warnings or prerequisites for a destructive operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fm_get_layout_metadataC
Get detailed metadata for a specific layout
| Name | Required | Description | Default |
|---|---|---|---|
| layout | Yes | Layout name | |
| database | Yes | Database identifier |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It does not say what 'detailed metadata' contains, whether any fields are expensive or cached, or whether permissions are required, leaving a read tool's behavior largely undisclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no wasted words. It is efficient, though its brevity is partly under-specification rather than disciplined conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, the description should explain what metadata is returned and in what shape, but it does not. For a metadata-retrieval tool the payload is the whole point, so this leaves a real gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the layout string plus the MAIN-only database enum are fully documented in the schema. The description adds no syntax, format, or naming-convention detail beyond that, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: get detailed metadata for a specific layout. An agent can identify the operation. However, it does not differentiate itself from the sibling fm_get_metadata, so the scope distinction must be inferred from the name alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus fm_get_metadata, fm_get_scripts, or fm_list_databases, and no stated prerequisites. The agent must infer usage purely from the name and the required layout parameter.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fm_get_metadataC
Get database metadata (layouts/tables)
| Name | Required | Description | Default |
|---|---|---|---|
| database | Yes | Database identifier |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It does not mention that this is a read-only operation, whether it requires an active connection, what the response contains, or any rate-limit/caching behavior. Only the implicit 'Get' verb hints at a read.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded phrase with no filler or redundancy. It is appropriately short for a one-parameter lookup, though the 'layouts/tables' parenthetical is ambiguous rather than informative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no annotations and no output schema, the description is too thin: it neither clarifies the overlapping scope with fm_get_layout_metadata nor describes what metadata is returned. The agent cannot confidently route between the metadata-related siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single 'database' parameter is a fully documented enum constrained to MAIN, so the schema already does the work. The description adds no additional meaning about the parameter, which is the expected baseline when coverage is complete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a verb (Get) and resource (database metadata) with a parenthetical hint of layouts/tables, so the basic purpose is legible. However, it does not distinguish itself from the sibling fm_get_layout_metadata, which sounds like it returns the same layouts information, leaving the agent unsure which to pick. The parenthetical also raises doubt about whether tables are truly in scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No indication of when to call this versus fm_get_layout_metadata, fm_list_databases, or fm_get_scripts. There are no stated prerequisites, exclusions, or alternatives despite several closely related siblings existing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fm_get_scriptsC
Get list of available scripts
| Name | Required | Description | Default |
|---|---|---|---|
| database | Yes | Database identifier |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden. 'Get list' implies a read, but the description says nothing about scope (whole file vs. current layout), whether the result is cached, or permission requirements ā meaningful gaps for a metadata-fetching tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short, front-loaded sentence with no filler. It is efficient, though its brevity is closer to under-specification than to exemplary conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, no-output-schema read tool the definition is minimally viable, but with no annotations and no output schema it should at least clarify what 'available scripts' are scoped to and how they relate to siblings like fm_run_script.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% (the single 'database' parameter is documented with an enum), so the baseline is 3. The description adds no meaning about what the database argument selects beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb ('Get list') and resource ('available scripts'), so an agent can tell broadly what the tool returns. It does not differentiate from siblings such as fm_get_metadata or fm_get_layout_metadata, which could plausibly also enumerate scripts, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to call this tool versus fm_get_metadata, fm_get_layout_metadata, or fm_run_script, and no prerequisites mentioned. Usage must be inferred entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fm_list_databasesB
List all configured FileMaker databases
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure, and it says nothing about side effects, permissions, or connection prerequisites. It does not even confirm the implied read-only nature of 'List'. For a tool with zero annotation coverage this is a notable gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One efficient sentence with the verb and resource front-loaded and no wasted words. It is terse to the point of under-specification, but nothing is padded or buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter list tool the statement of intent is sufficient to invoke, but with no output schema the description never indicates what a database entry looks like (name, ID, path) or how many to expect. Minimal but adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, which is the baseline-4 case. There is nothing for the description to clarify beyond the name of the resource being listed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('List') and resource ('configured FileMaker databases'), making the operation legible at a glance. It is clearly distinct in subject matter from record-oriented siblings like fm_query_records, though it never explicitly contrasts itself with them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to call this tool versus alternatives such as fm_get_metadata or fm_test_connection, nor any stated precondition or follow-up. The agent must infer that this is a discovery call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fm_query_recordsC
Query records with advanced filtering and sorting
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Sort array | |
| limit | No | Max records to return | |
| query | No | Find requests array | |
| layout | Yes | Layout name | |
| offset | No | Records to skip | |
| database | Yes | Database identifier |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, yet it discloses nothing: not that it is a read-only operation, not whether results are paginated (despite limit/offset params), not caps or default page sizes. For an unannotated 6-parameter query tool this is a serious gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single efficient sentence with the core purpose front-loaded and no filler. It is economical, though arguably over-terse given the tool's filtering complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With six parameters, no annotations, and no output schema, the description should explain read-only nature, pagination expectations, and the filter/sort semantics. It supplies none of these, leaving the agent to reconstruct behavior from the schema alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all six parameters, which sets the baseline at 3. The description's mention of filtering and sorting loosely maps to the query and sort params but adds no syntax, defaults, or semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb+resource ('Query records') with the added scope of filtering and sorting. It implicitly distinguishes itself from the write-oriented siblings (fm_create_record, fm_update_record, fm_delete_record), though it never names them explicitly, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus alternatives, no prerequisites, and no statement of what 'advanced filtering' means in practice. An agent must infer that this is the general read path for records without any explicit routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fm_run_scriptC
Execute a FileMaker script
| Name | Required | Description | Default |
|---|---|---|---|
| layout | Yes | Layout context | |
| script | Yes | Script name | |
| database | Yes | Database identifier | |
| parameter | No | Script parameter |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and discloses nothing: it does not say whether the script can mutate records, whether it is read-only or destructive, what permissions are required, or how errors are surfaced. For a tool that runs arbitrary server-side scripts, this is a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short, front-loaded sentence with no filler. It is efficient, though the brevity stems partly from under-specification rather than disciplined conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter, mutation-capable tool with no annotations and no output schema, the description omits side effects, return behavior, and error handling. An agent has almost nothing to rely on beyond the parameter names.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so layout, script, database, and parameter are each documented in the schema; the baseline of 3 applies. The description adds no extra meaning, such as how the script parameter is passed or how the layout context affects execution.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Execute) and resource (FileMaker script), so the agent knows exactly what action is performed. It does not differentiate from any sibling or clarify scope, but the action itself is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus the sibling data tools (query_records, create_record, update_record, etc.), nor any mention of prerequisites such as needing a valid layout context or which scripts are available. Usage is inferred purely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fm_test_connectionC
Test connection to a FileMaker database
| Name | Required | Description | Default |
|---|---|---|---|
| database | Yes | Database identifier to test |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, yet it discloses nothing about auth requirements, timeouts, failure semantics, or what a 'successful' test means. It restates the name without adding behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with no waste, front-loaded with the action. Brevity here is appropriate to a one-parameter tool, though it is under-specified rather than maximally informative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, the description should explain what the tool returns (success/failure signal, error detail). It leaves the agent unable to anticipate results or failure modes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter, fully documented in the schema (100% coverage) and constrained by an enum. The description adds no syntax or meaning beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: testing a connection to a FileMaker database. It is clearly distinguishable in intent from siblings like fm_query_records or fm_run_script, though it never explicitly names a sibling or scoping condition.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no prerequisites, and no mention of alternatives. The agent must infer that this is a pre-flight/health-check tool rather than something to run as part of normal data flow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fm_update_recordC
Update an existing record
| Name | Required | Description | Default |
|---|---|---|---|
| layout | Yes | Layout name | |
| database | Yes | Database identifier | |
| recordId | Yes | FileMaker record ID | |
| fieldData | Yes | Field data to update |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, and it discloses almost nothing: it does not say whether the update is partial or full-replace, what happens to fields omitted from fieldData, whether it requires write permission, or whether it is reversible. For an unannotated mutation tool with a nested object parameter, this is a substantial gap. The single word 'Update' only implies mutation, which the name already conveyed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence with zero filler; the action and resource come first. It is efficient, though the terseness borders on under-specification given the tool's four required parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter mutation tool with a nested object (fieldData), no annotations, and no output schema, the description is far too thin. Although the schema covers parameter names and types, nothing explains update semantics, merge behavior, permissions, or failure modes, which an agent invoking a write operation needs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters (database, layout, recordId, fieldData) are already documented in the schema and the baseline is 3. The description adds nothing about fieldData's partial-update semantics or the significance of recordId, so it does not exceed the schema baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description pairs a specific verb ('Update') with a specific resource ('existing record'), so an agent can distinguish it from fm_create_record and fm_delete_record by the verb alone. It stops short of differentiating from siblings by scope or behavior, and gives no hint of what 'existing' requires beyond the name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus fm_create_record, fm_query_records, or fm_run_script. No prerequisites, no exclusions, no context about when an update is the right call. The agent must infer everything from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
11 tool updates
v1.0.0- First observed
fm_clear_cache - First observed
fm_create_record - First observed
fm_delete_record - First observed
fm_get_layout_metadata - First observed
fm_get_metadata - First observed
fm_get_scripts - First observed
fm_list_databases - First observed
fm_query_records - First observed
fm_run_script - First observed
fm_test_connection - First observed
fm_update_record
TDQS
Scored across 11 tools
Most tools have clearly distinct purposes: record CRUD, script execution, connection testing, and cache clearing are unambiguous. The only mild overlap is between fm_get_metadata (database-level layouts/tables overview) and fm_get_layout_metadata (detailed metadata for a specific layout), but descriptions make the boundary reasonably clear.
All tools use a consistent fm_ prefix followed by a verb_noun snake_case pattern (e.g. fm_list_databases, fm_run_script, fm_create_record). No mixed conventions or vague imperative names.
Eleven tools is well-scoped for a FileMaker integration: it covers connection, discovery, metadata, scripts, and record lifecycle without excessive granularity. Each tool appears to earn its place.
The set covers core record CRUD (create, query, update, delete), connection testing, database listing, script execution/listing, and metadata retrieval. A minor gap is the absence of a direct get-by-id record tool, though fm_query_records can retrieve records with filtering.
Maintenance
Related MCP Connectors
Connect Claude to Fathom meeting recordings, transcripts, and summaries
- platform7nOAuthtech.p7n
Connect Claude to your Platform7n workspaces ā chat, links, and tasks. One-click OAuth.
Give Claude only the Google Drive files you choose. Every action logged.
Personal CRM for Claude. Contacts live as plain-text files in your own Google Drive.
Related MCP Servers
- 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.286 npm3MIT
- FlicenseAqualityDmaintenanceEnables direct interaction with Microsoft Dataverse from Claude Desktop, supporting full CRUD, bulk operations, FetchXML queries, actions, and metadata discovery.20-
- FlicenseNot gradedqualityDmaintenanceEnables Claude to access Ninox database schema and data, supporting table inspection, data queries, and context retrieval.-
- AlicenseBqualityDmaintenanceAn MCP server that connects Claude to FileMaker databases via the Data API, enabling natural language queries, record management, layout exploration, and script execution.11MIT