@douglaslinsmeyer/infor-mcp-server
v1.11.1
Published
MCP server for accessing Infor M3 tenant information via ION API
Downloads
90
Maintainers
Readme
Infor MCP Server
An MCP (Model Context Protocol) server for accessing Infor M3 tenant information via ION API. This server enables AI assistants like Claude to interact with your Infor M3 system.
Quick Start
Prerequisites
- Infor ION API Key: You need a
.ionapifile from your Infor ION API setup - Node.js: Version 18 or higher installed on your system
- Claude Desktop or Claude Code: An MCP-compatible AI assistant
Setup Instructions
Claude Desktop Configuration
Claude Desktop stores MCP configurations in:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
Method 1: Using Complete .ionapi JSON (Recommended)
- Copy your entire
.ionapifile content - Edit the Claude Desktop config file and add:
{
"mcpServers": {
"infor-m3": {
"command": "npx",
"args": ["-y", "@douglaslinsmeyer/infor-mcp-server"],
"env": {
"IONAPI_KEY": "{\"ti\":\"YOUR_TENANT_ID\",\"cn\":\"Connection Name\",\"ci\":\"YOUR_CLIENT_ID\",\"cs\":\"YOUR_CLIENT_SECRET\",\"iu\":\"https://your-ionapi.inforcloudsuite.com\",\"pu\":\"https://your-sso.inforcloudsuite.com/tenant/as/\",\"oa\":\"authorization.oauth2\",\"ot\":\"token.oauth2\",\"or\":\"revoke_token.oauth2\",\"sc\":[\"Infor-ION\",\"Infor-M3\"],\"v\":\"1.1\",\"saak\":\"YOUR_SAAK\",\"sask\":\"YOUR_SASK\"}"
}
}
}
}Note: The IONAPI_KEY value must be a single-line JSON string with escaped quotes.
Method 2: Using Individual Environment Variables
{
"mcpServers": {
"infor-m3": {
"command": "npx",
"args": ["-y", "@douglaslinsmeyer/infor-mcp-server"],
"env": {
"INFOR_TENANT_ID": "YOUR_TENANT_ID",
"INFOR_CLIENT_ID": "YOUR_CLIENT_ID",
"INFOR_CLIENT_SECRET": "YOUR_CLIENT_SECRET",
"INFOR_ION_BASE_URL": "https://your-ionapi.inforcloudsuite.com",
"INFOR_OAUTH_URL": "https://your-sso.inforcloudsuite.com/tenant/as/",
"INFOR_SAAK": "YOUR_SERVICE_ACCOUNT_ACCESS_KEY",
"INFOR_SASK": "YOUR_SERVICE_ACCOUNT_SECRET_KEY",
"INFOR_SCOPES": "Infor-ION,Infor-M3"
}
}
}
}Method 3: Using Config Object (Legacy)
{
"mcpServers": {
"infor-m3": {
"command": "npx",
"args": ["-y", "@douglaslinsmeyer/infor-mcp-server"],
"config": {
"ionApiKey": {
"ti": "YOUR_TENANT_ID",
"cn": "Connection Name",
"ci": "YOUR_CLIENT_ID",
"cs": "YOUR_CLIENT_SECRET",
"iu": "https://your-ionapi.inforcloudsuite.com",
"pu": "https://your-sso.inforcloudsuite.com/tenant/as/",
"oa": "authorization.oauth2",
"ot": "token.oauth2",
"or": "revoke_token.oauth2",
"sc": ["Infor-ION", "Infor-M3"],
"v": "1.1",
"saak": "YOUR_SAAK",
"sask": "YOUR_SASK"
}
}
}
}
}Enabling Safe Mode (Prevents Write Operations)
Add the safe mode environment variables to any of the above configurations:
{
"mcpServers": {
"infor-m3": {
"command": "npx",
"args": ["-y", "@douglaslinsmeyer/infor-mcp-server"],
"env": {
"IONAPI_KEY": "YOUR_IONAPI_JSON_STRING",
"INFOR_MCP_SAFE_MODE": "true",
"INFOR_MCP_SAFE_MODE_STRICT": "false",
"INFOR_MCP_AUDIT_LOG": "false"
}
}
}
}After updating the configuration, restart Claude Desktop for changes to take effect.
Claude Code Setup
Claude Code uses the command-line interface for MCP configuration.
Method 1: Using Complete .ionapi JSON
# Copy your .ionapi file content and use it directly
claude mcp add infor-m3 \
-e IONAPI_KEY='{"ti":"YOUR_TENANT","cn":"Connection","ci":"CLIENT_ID","cs":"SECRET","iu":"https://ionapi.com","pu":"https://sso.com/as/","oa":"authorization.oauth2","ot":"token.oauth2","or":"revoke_token.oauth2","sc":["Infor-ION","Infor-M3"],"v":"1.1","saak":"SAAK","sask":"SASK"}' \
-- npx -y @douglaslinsmeyer/infor-mcp-serverMethod 2: Using .ionapi File
# Read from a file
claude mcp add infor-m3 \
-e IONAPI_KEY="$(cat /path/to/your.ionapi)" \
-- npx -y @douglaslinsmeyer/infor-mcp-serverMethod 3: Using Individual Environment Variables
claude mcp add infor-m3 \
-e INFOR_TENANT_ID="YOUR_TENANT" \
-e INFOR_CLIENT_ID="YOUR_CLIENT_ID" \
-e INFOR_CLIENT_SECRET="YOUR_SECRET" \
-e INFOR_ION_BASE_URL="https://your-ionapi.com" \
-e INFOR_OAUTH_URL="https://your-sso.com/tenant/as/" \
-e INFOR_SAAK="YOUR_SAAK" \
-e INFOR_SASK="YOUR_SASK" \
-e INFOR_SCOPES="Infor-ION,Infor-M3" \
-- npx -y @douglaslinsmeyer/infor-mcp-serverWith Safe Mode Enabled
claude mcp add infor-m3 \
-e IONAPI_KEY="$(cat /path/to/your.ionapi)" \
-e INFOR_MCP_SAFE_MODE="true" \
-- npx -y @douglaslinsmeyer/infor-mcp-serverEnvironment Variables
Authentication Variables
| Variable | Description | Required |
|----------|-------------|----------|
| IONAPI_KEY | Complete .ionapi JSON content as a string | Yes* |
| INFOR_TENANT_ID | Infor tenant identifier | Yes** |
| INFOR_CLIENT_ID | OAuth client ID | Yes** |
| INFOR_CLIENT_SECRET | OAuth client secret | Yes** |
| INFOR_ION_BASE_URL | ION API base URL | Yes** |
| INFOR_OAUTH_URL | OAuth token endpoint URL | Yes** |
| INFOR_SAAK | Service Account Access Key | Optional |
| INFOR_SASK | Service Account Secret Key | Optional |
| INFOR_SCOPES | Comma-separated OAuth scopes | Optional |
* Required if not using individual variables
** Required if not using IONAPI_KEY
Safe Mode Variables
| Variable | Description | Default |
|----------|-------------|---------|
| INFOR_MCP_SAFE_MODE | Enable safe mode to block write operations | false |
| INFOR_MCP_SAFE_MODE_STRICT | Block unknown operations in safe mode | false |
| INFOR_MCP_SAFE_MODE_WHITELIST | Comma-separated list of allowed transactions (e.g., "CRS610MI/Get,MMS200MI/List") | None |
| INFOR_MCP_AUDIT_LOG | Log all operations for auditing | false |
Data Fabric Variables
| Variable | Description | Default |
|----------|-------------|---------|
| INFOR_DATAFABRIC_MAX_RECORDS | Maximum records for Data Fabric queries | 10000 |
| INFOR_DATAFABRIC_TIMEOUT | Query timeout in milliseconds | 300000 |
Session Management Variables
| Variable | Description | Default |
|----------|-------------|---------|
| INFOR_DEFAULT_DIVISION | Default division for operations | None |
| INFOR_DEFAULT_FACILITY | Default facility for operations | None |
| INFOR_DEFAULT_WAREHOUSE | Default warehouse for operations | None |
| INFOR_DEFAULT_COMPANY | Default company code | 001 |
Features
- 👥 100+ Persona-Based Tools: Specialized tools for Finance, Supply Chain, Sales, Production, and Executive users
- 🔒 Safe Mode: Prevent accidental write operations with configurable safe mode
- 🧠 Smart Session Management: Context-aware operations with role-based defaults and preferences
- ⚡ Advanced Data Handling: Two-tier caching, pagination, and aggregation for 25,000+ record datasets
- 🚀 Response Chunking: Automatic chunking for large API responses to prevent Claude context overflow
- 🔐 OAuth 2.0 Authentication: Secure authentication using Infor .ionapi key format
- 🔍 API Discovery Tools: Explore available endpoints and operations
- 📊 Cross-Functional Analytics: Order-to-Cash, Procure-to-Pay, and multi-module analysis
- 🛠️ Generic API Access: Query any M3 API endpoint with the generic query tool
- 🔄 Automatic Token Management: Token refresh and management handled automatically
- 📱 Multi-Platform Support: Works with Claude Desktop, Claude Code, and other MCP-compatible AI assistants
- 📈 Data Fabric Integration: Query Data Lake with SQL, validated against Data Catalog metadata
Installation
Using npx (Recommended)
No installation needed! You can run directly with npx:
npx @douglaslinsmeyer/infor-mcp-serverLocal Installation
npm install @douglaslinsmeyer/infor-mcp-serverFrom Source
git clone https://github.com/douglaslinsmeyer/infor-ion-mcp
cd infor-ion-mcp
npm install
npm run buildConfiguration
The server accepts ION API configuration in multiple ways:
Method 1: Environment Variable (for Claude Code CLI)
Set the IONAPI_KEY environment variable with your complete .ionapi JSON content.
Method 2: Individual Environment Variables
INFOR_TENANT_ID=your_tenant_id
INFOR_CLIENT_ID=your_client_id
INFOR_CLIENT_SECRET=your_client_secret
INFOR_ION_URL=https://your-ionapi-url.com
INFOR_PU_URL=https://your-sso-url.com/tenant/as/
INFOR_SAAK=your_service_account_access_key
INFOR_SASK=your_service_account_secret_key
INFOR_SCOPES=Infor-ION,Infor-M3Method 3: Configuration Object (for Claude Desktop)
Pass the ION API key in the following JSON format:
{
"ti": "tenant_id",
"cn": "connection_name",
"ci": "client_id",
"cs": "client_secret",
"iu": "https://your-ionapi-url.com",
"pu": "https://your-sso-url.com/tenant/as/",
"saak": "service_account_access_key",
"sask": "service_account_secret_key",
...
}Setup Instructions
Prerequisites
- Infor ION API Key: You need a
.ionapifile from your Infor ION API setup - Node.js: Version 18 or higher installed on your system
Claude Code Setup
Claude Code stores MCP server configurations in a JSON file. To add the Infor MCP server:
Locate your Claude Code configuration file:
- On macOS/Linux:
~/.config/claude/claude.json - On Windows:
%APPDATA%\claude\claude.json
- On macOS/Linux:
Edit the file and add the MCP server configuration under
mcpServers:
{
"mcpServers": {
"infor-m3": {
"command": "npx",
"args": ["-y", "@douglaslinsmeyer/infor-mcp-server"],
"config": {
"ionApiKey": {
"ti": "your_tenant_id",
"cn": "your_connection_name",
"ci": "your_client_id",
"cs": "your_client_secret",
"iu": "https://your-ionapi-url.com",
"pu": "https://your-sso-url.com/tenant/as/",
"oa": "authorization.oauth2",
"ot": "token.oauth2",
"or": "revoke_token.oauth2",
"sc": ["Infor-ION", "Infor-M3"],
"ev": "your_event_version",
"v": "1.1",
"saak": "your_service_account_access_key",
"sask": "your_service_account_secret_key"
}
}
}
}
}- Save the file and restart Claude Code
Tip: You can copy the entire content of your .ionapi file and paste it as the value for ionApiKey.
Claude Desktop Setup
- Open Claude Desktop
- Click on the settings icon (gear) in the bottom left
- Navigate to "Developer" → "Edit Config"
- Add the MCP server configuration:
{
"mcpServers": {
"infor-m3": {
"command": "npx",
"args": [
"-y",
"@douglaslinsmeyer/infor-mcp-server"
],
"config": {
"ionApiKey": {
// Paste your entire .ionapi JSON object here
}
}
}
}
}- Save and restart Claude Desktop
Claude Web (via Browser Extension)
The Claude web interface doesn't directly support MCP servers. However, you can:
- Use Claude Desktop instead for MCP functionality
- Or use the API Explorer CLI tool separately and paste results into Claude web
Configuration Options
Using NPX (Recommended - No Installation Required)
{
"command": "npx",
"args": ["-y", "@douglaslinsmeyer/infor-mcp-server"]
}Using Global Installation
First install globally:
npm install -g @douglaslinsmeyer/infor-mcp-serverThen configure:
{
"command": "infor-mcp"
}Using Local Installation
{
"command": "node",
"args": ["/absolute/path/to/node_modules/@douglaslinsmeyer/infor-mcp-server/dist/index.js"]
}Available Tools
The server provides 100+ specialized tools organized by user persona, plus general API discovery and M3-specific tools.
Persona-Based Tools
Session Management (5 tools)
session_set_context- Set user context with role, division, warehouse, facilitysession_get_context- Get current session settingssession_clear_context- Reset to defaultssession_update_preferences- Update user preferencessession_get_defaults- Get role-specific defaults
Finance Tools (15 tools)
- GL Management: Balance queries, transaction lists, account analysis
- AR/AP: Customer balances, aging analysis, payment tracking
- Cash Management: Cash position, working capital, liquidity analysis
- Period Analysis: Period comparisons, budget variance, trend analysis
Supply Chain Tools (19 tools)
- Inventory: Balance checks, availability, health metrics, ABC/FSN analysis
- Order Fulfillment: Order tracing (CO→MO→PO), ATP checks, delivery performance
- Supply Planning: Multi-level BOM explosion, supply network visualization
- Warehouse Ops: Utilization metrics, picking/receiving performance
Sales Tools (7 tools)
- Customer Analytics: Performance metrics, profitability, RFM segmentation
- Pipeline Management: Order pipeline, conversion rates, quote analysis
- Pricing: Price analysis, discount impact, margin optimization
Production Tools (9 tools)
- MO Management: Status summaries, schedule adherence, material availability
- Capacity Planning: Utilization analysis, bottleneck identification
- Quality Metrics: Defect rates, first pass yield, OEE calculations
Executive Tools (9 tools)
- KPI Dashboards: Consolidated metrics with targets and trends
- Cross-Functional: Order-to-Cash, Procure-to-Pay cycle analysis
- Strategic Analysis: Trend forecasting, risk indicators, balanced scorecards
API Discovery Tools
discover_api_suites
Discover available API suites in the Infor tenant.
searchCriteria(optional): Filter suites by name, description, or contextpageSize(optional): Number of results (default: 100)
get_api_suite_details
Get detailed information about a specific API suite.
suiteContext(required): Suite context ID (e.g., "infor.m3.ca")
discover_products
Discover available products in the Infor tenant.
searchCriteria(optional): Filter productspageSize(optional): Number of results (default: 100)
search_operations
Search for API operations across all products and suites.
searchCriteria(optional): Search by summary, path, or parameterssuiteContext(optional): Filter by suitelogicalIdPrefix(optional): Filter by product (e.g., "lid://infor.m3")pageSize(optional): Number of results (default: 50)
M3-Specific Tools
m3_api_call
Execute a generic M3 API call using the m3api-rest interface.
program(required): M3 API program (e.g., "CRS610MI")transaction(required): Transaction name (e.g., "Get", "List")record(optional): Input parametersmaxrecs(optional): Max records for List operations (default: 50)includeMetadata(optional): Include metadata in responsechunkIndex(optional): Index of chunk to return for large responses (0-based, default: 0)
customer_get
Get customer information from M3.
customerNumber(required): Customer number (CUNO)
customer_list
List customers with optional filters.
customerName(optional): Filter by name (partial match)customerStatus(optional): Filter by statusmaxRecords(optional): Max records (default: 50)chunkIndex(optional): Index of chunk to return for large responses (0-based, default: 0)
item_get
Get item/product information from M3.
itemNumber(required): Item number (ITNO)
item_list
List items/products with optional filters.
itemName(optional): Filter by name (partial match)itemType(optional): Filter by typemaxRecords(optional): Max records (default: 50)chunkIndex(optional): Index of chunk to return for large responses (0-based, default: 0)
item_search_by_description
Search for items using fuzzy/partial matching on item descriptions (FUDS field). Uses M3 SearchItem API for intelligent text matching.
searchQuery(required): Search text to match against item descriptions. Supports fuzzy matching and partial terms.maxRecords(optional): Max records (default: 50)chunkIndex(optional): Index of chunk to return for large responses (0-based, default: 0)
order_get
Get customer order information.
orderNumber(required): Order number (ORNO)
order_list
List customer orders with filters.
customerNumber(optional): Filter by customerorderStatus(optional): Filter by statusfromDate(optional): From date (YYYYMMDD)toDate(optional): To date (YYYYMMDD)maxRecords(optional): Max records (default: 50)chunkIndex(optional): Index of chunk to return for large responses (0-based, default: 0)
mo_list
List Manufacturing Orders (MOs) with optional filters.
facility(optional): Filter by facility (FACI)itemNumber(optional): Filter by item number (ITNO)moNumber(optional): Filter by MO number (MFNO) - supports partial matchingmoStatus(optional): Filter by MO status (WHST) - e.g., "20" for Released, "90" for ClosedplannedStartDate(optional): Filter by planned start date (STDT) in YYYYMMDD formatplannedFinishDate(optional): Filter by planned finish date (FIDT) in YYYYMMDD formatresponsible(optional): Filter by responsible person (RESP)maxRecords(optional): Max records (default: 50)chunkIndex(optional): Index of chunk to return for large responses (0-based, default: 0)
mo_get
Get detailed Manufacturing Order (MO) information.
facility(required): Facility (FACI)moNumber(required): Manufacturing Order number (MFNO)productNumber(optional): Product number (PRNO) - can be auto-retrievedchunkIndex(optional): Index of chunk to return for large responses (0-based, default: 0)
mop_list
List Manufacturing Order Proposals (MOPs) with optional filters.
facility(optional): Filter by facility (FACI)itemNumber(optional): Filter by item number (ITNO)mopNumber(optional): Filter by MOP number (MOPO) - supports partial matchingmopStatus(optional): Filter by MOP status (MPST) - e.g., "10" for Planning, "20" for ApprovedplannedOrderDate(optional): Filter by planned order date (PLDT) in YYYYMMDD formatdemandOrderCategory(optional): Filter by demand order category (DOCA)buyer(optional): Filter by buyer (BUYE)maxRecords(optional): Max records (default: 50)chunkIndex(optional): Index of chunk to return for large responses (0-based, default: 0)
mop_get
Get detailed Manufacturing Order Proposal (MOP) information.
mopNumber(required): Manufacturing Order Proposal number (MOPO)chunkIndex(optional): Index of chunk to return for large responses (0-based, default: 0)
warehouse_list
List warehouses from M3.
facility(optional): Filter by facilitymaxRecords(optional): Max records (default: 50)chunkIndex(optional): Index of chunk to return for large responses (0-based, default: 0)
purchase_order_get
Get purchase order information.
purchaseOrderNumber(required): PO number (PUNO)
Schema-Aware Tools
get_api_schema
Get schema information for an M3 API program.
program(required): M3 API program name (e.g., "CRS610MI")operation(optional): Specific operation to get details for
validate_api_params
Validate parameters against M3 API schema.
program(required): M3 API program name (e.g., "CRS610MI")operation(required): Operation name (e.g., "GetBasicData")parameters(required): Parameters to validate
smart_m3_call
Make an M3 API call with automatic schema validation and helpful error messages.
program(required): M3 API program name (e.g., "CRS610MI")operation(required): Operation name (e.g., "GetBasicData")parameters(optional): API parametersmaxrecs(optional): Maximum records for List operations (default: 50)includeMetadata(optional): Include metadata in response
list_api_fields
List available fields/parameters for an M3 API operation.
program(required): M3 API program name (e.g., "CRS610MI")operation(required): Operation name (e.g., "GetBasicData")
list_api_operations
List all available operations for an M3 API program.
program(required): M3 API program name (e.g., "CRS610MI")
Generic Query Tool
query_m3
Execute any query against the Infor API.
endpoint(required): API endpoint pathmethod(optional): HTTP method (default: GET)data(optional): Request body for POST/PUT
API Explorer CLI
The project includes a CLI tool to explore available Infor APIs:
# Get API metadata version
npm run explore -- -i /path/to/your.ionapi version
# List all API suites
npm run explore -- -i /path/to/your.ionapi suites
# Search for specific API suites
npm run explore -- -i /path/to/your.ionapi suites -s "M3"
# Get details for a specific suite
npm run explore -- -i /path/to/your.ionapi suite infor.m3.ca
# List all products
npm run explore -- -i /path/to/your.ionapi products
# Search for operations
npm run explore -- -i /path/to/your.ionapi operations -q "customer"
# List M3-specific APIs
npm run explore -- -i /path/to/your.ionapi m3-apis
# Search M3 operations
npm run explore -- -i /path/to/your.ionapi m3-apis -q "order"Development
# Run in development mode
npm run dev
# Run tests
npm test
# Run tests with coverage
npm run test:coverage
# Lint code
npm run lint
# Type check
npm run typecheck
# Update Data Catalog metadata (run periodically)
npm run fetch-metadataArchitecture
The server is organized into several key modules:
- Persona Tools (
src/tools/): Specialized tools for each user role - Session Management (
src/tools/session-tools.ts): Context and preference management - Cache Manager (
src/services/cache-manager.ts): Two-tier caching system - Response Manager (
src/utils/response-manager.ts): Smart chunking and aggregation - Pagination Helper (
src/utils/pagination-helper.ts): Cursor and offset pagination - M3 API Helper (
src/utils/m3-api-helper.ts): Standardized M3 API execution
Updating Data Catalog Metadata
The Data Fabric tools use cached metadata from the Data Catalog to validate SQL queries. This metadata is stored in src/data/datacatalog-metadata.json and is committed to version control.
To update the metadata:
- Ensure your
IONAPI_KEYenvironment variable is set - Run
npm run fetch-metadata - Commit the updated
datacatalog-metadata.jsonfile
This should be done periodically when table schemas change in your Data Lake.
Common M3 API Programs
The MCP server includes tools for common M3 operations:
- CRS610MI - Customer management
- MMS200MI - Item/Product management
- OIS100MI - Customer Order management
- MMS005MI - Warehouse management
- PPS200MI - Purchase Order management
You can also use the m3_api_call tool to access any other M3 API program/transaction combination.
How to Use with Claude
Once configured, you can use persona-based workflows or direct API access.
Persona-Based Workflows
Finance User Example
You: "Set my context as a finance user for division 100"
Claude: [Uses session_set_context with finance role]
You: "What's our current working capital position?"
Claude: [Uses finance_working_capital to calculate current assets vs liabilities]
You: "Show me AR aging for customers with balance over $10,000"
Claude: [Uses finance_ar_aging_analysis with filters]Supply Chain User Example
You: "I'm a supply chain manager. Show inventory health for warehouse 200"
Claude: [Sets context and uses supply_chain_inventory_health with ABC/FSN analysis]
You: "Trace order CO12345 through the supply chain"
Claude: [Uses supply_chain_order_trace to show CO→MO→PO→Inventory flow]
You: "Check if we can fulfill 1000 units of ITEM001 by next week"
Claude: [Uses supply_chain_atp_check to verify availability]Executive Dashboard Example
You: "Give me the executive KPI dashboard for this month"
Claude: [Uses executive_kpi_dashboard with standard metrics]
You: "Analyze our order-to-cash cycle performance"
Claude: [Uses executive_order_to_cash to identify bottlenecks]
You: "Show revenue trends with 3-month forecast"
Claude: [Uses executive_trend_analysis with forecast enabled]Direct API Access
- Discover APIs: "What API suites are available in my Infor system?"
- List Companies: "Show me all companies configured in M3"
- Get Customer Info: "Get details for customer 10000"
- Search Items: "Find all items with 'WIDGET' in the name"
- List Orders: "Show me all orders from the last 30 days"
- Explore Operations: "What customer-related APIs are available?"
- Schema Discovery: "What fields are available for the customer API?"
- Validate Parameters: "Check if these customer parameters are valid before calling the API"
Example Conversations
You: "What companies are configured in M3?"
Claude: I'll check the companies configured in your M3 system using the MCP server...
[Claude uses the m3_api_call tool with MNS095MI/List]You: "Get information about customer ABC123"
Claude: I'll retrieve the customer information for ABC123...
[Claude uses the customer_get tool]You: "List all customers, but I need to see them in chunks since there are many"
Claude: I'll get the customer list in chunks. Let me start with the first chunk...
[Claude uses customer_list with chunkIndex: 0, then can get subsequent chunks]Response Chunking
For large datasets, the server automatically chunks responses to prevent context overflow:
- Automatic Detection: Responses >100KB or >50 records are automatically chunked
- Navigation: Each chunk shows "Chunk 1 of 3" with instructions for next chunk
- Manual Control: Use
chunkIndexparameter to get specific chunks - Smart Formatting: Chunked responses include summary and navigation hints
Example:
// Get first chunk (automatic)
customer_list()
// Get specific chunk
customer_list({ chunkIndex: 1 })
// Smaller page size with chunking
customer_list({ maxRecords: 25, chunkIndex: 0 })Troubleshooting
Common Issues
"OAuth client not initialized"
- Ensure your ionApiKey is properly formatted in the config
- Check that all required fields are present in the ionApiKey
Connection timeouts
- Verify your Infor ION API URLs are accessible
- Check firewall/proxy settings
"No tools available" in Claude
- Restart Claude Desktop/Code after adding the configuration
- Verify the MCP server started successfully (check logs)
- Ensure you're using the correct package name:
@douglaslinsmeyer/infor-mcp-server
Authentication failures
- Ensure your service account credentials (saak/sask) are valid
- Check that the OAuth scopes include "Infor-M3"
Getting Your ION API Key
- Log into Infor ION API
- Navigate to "Authorized Apps"
- Create or select a service account
- Download the .ionapi file
- Open the file and copy the JSON content to your MCP configuration
Viewing Logs
To see MCP server logs:
- Claude Desktop: Check the Developer console
- Claude Code: View Output panel → MCP Server logs
Security Considerations
Safe Mode (New Feature)
The MCP server includes a Safe Mode feature that prevents accidental write operations to your M3 system. When enabled, only read-only operations are allowed, blocking any transactions that could create, update, or delete data.
Enabling Safe Mode
Option 1: Environment Variable
export INFOR_MCP_SAFE_MODE=trueOption 2: Command-line Argument
node dist/index.js --safe-modeSafe Mode Configuration Options
INFOR_MCP_SAFE_MODE: Enable/disable safe mode (true/false)INFOR_MCP_SAFE_MODE_STRICT: Block unknown transactions (true/false)INFOR_MCP_AUDIT_LOG: Log all operations for audit (true/false)INFOR_MCP_SAFE_MODE_WHITELIST: Comma-separated list of allowed transactions
Example with whitelisting:
export INFOR_MCP_SAFE_MODE=true
export INFOR_MCP_SAFE_MODE_WHITELIST="CRS610MI/GetBasicData,MMS200MI/Get"How Safe Mode Works
Safe mode automatically classifies M3 API transactions as:
- Write Operations: Add, Create, Update, Delete, Send, Print, etc.
- Read Operations: Get, List, Select, Search, etc.
- Unknown Operations: Transactions that don't match known patterns
When safe mode is enabled:
- ✅ Read operations are always allowed
- ❌ Write operations are blocked with helpful error messages
- ⚠️ Unknown operations are allowed (or blocked in strict mode)
Example Safe Mode Error
{
"error": "Safe Mode: Operation Blocked",
"program": "CRS610MI",
"transaction": "Add",
"message": "Safe mode is enabled. The operation 'Add' is blocked because it is a write operation.",
"suggestions": [
"Disable safe mode by setting INFOR_MCP_SAFE_MODE=false",
"Whitelist this transaction: INFOR_MCP_SAFE_MODE_WHITELIST=CRS610MI/Add"
]
}General Security Best Practices
- Store your ION API credentials securely
- Never commit .ionapi files to version control
- Consider using environment variables for sensitive data in production
- The MCP server only has access to what the service account can access in M3
- Use Safe Mode when performing read-only analysis or reporting
Performance Optimization
The server includes several optimizations for handling large M3 datasets:
Caching Strategy
- API Cache: 15-minute TTL for raw API responses
- Aggregation Cache: 5-minute TTL for computed aggregations
- LRU Eviction: Automatic cleanup when cache size exceeds limits
- Cache Invalidation: Pattern-based cache clearing for related data
Data Handling
- Aggregation-First: Summary data returned by default for large datasets
- Smart Pagination: Cursor-based for real-time data, offset-based for static
- Response Chunking: Automatic splitting of responses >15,000 tokens
- Parallel Processing: Concurrent API calls where possible
Best Practices
- Set session context once to avoid repetitive parameters
- Use aggregation tools before requesting detailed data
- Enable caching for frequently accessed data
- Use appropriate
maxRecordslimits for your use case - Monitor response sizes with metadata flags
Contributing
Contributions are welcome! Please:
- Fork the repository
- Create a feature branch
- Write tests for new functionality
- Ensure all tests pass (
npm test) - Submit a pull request
Documentation
- API Reference - Complete tool documentation
- Persona Guides - User-specific workflows
- Improvement Plan - Development roadmap
Support
- GitHub Issues: https://github.com/douglaslinsmeyer/infor-ion-mcp/issues
- Documentation: This README and docs/ folder
- Infor ION API Docs: Available in your Infor portal
License
MIT
