MCP server for the MultiFlexi task scheduler
console applicationUtilityapt install mcp-server-multiflexiMultiFlexi MCP Server is a Model Context Protocol server that lets AI assistants manage MultiFlexi companies, applications, run templates, jobs and credentials.
MCP (Model Context Protocol) Server for MultiFlexi API integration. This server provides tools and resources for interacting with MultiFlexi applications, jobs, companies, users, and run templates.
pip install multiflexi-mcp-server
git clone https://github.com/VitexSoftware/multiflexi-mcp-server.git
cd multiflexi-mcp-server
pip install -e .
The server can be configured using environment variables:
MULTIFLEXI_HOST: MultiFlexi API host URL. No default - without it the server still
starts and lists its tools, but every tool call returns a configuration error. Must include the full API base path, e.g.
https://your-instance.example.com/api/VitexSoftware/MultiFlexi/1.0.0; the
/VitexSoftware/MultiFlexi/1.0.0 segment is required by the server's routing.MULTIFLEXI_USERNAME: Username for basic authenticationMULTIFLEXI_PASSWORD: Password for basic authenticationMULTIFLEXI_VERIFY_SSL: Whether to verify SSL certificates (default: true)MULTIFLEXI_TIMEOUT: Request timeout in seconds (default: 30)MULTIFLEXI_MAX_RETRIES: Maximum number of retries (default: 3)MULTIFLEXI_DEBUG: Enable debug logging (default: false)MULTIFLEXI_READONLY: When true (the default), all mutating tools
(create/update/set/delete/assign/unassign) are rejected before any API call
is made. Set to false to allow writes.There is no zero-config default: tool calls always require an explicit
MULTIFLEXI_HOST (and, unless your instance allows anonymous access,
MULTIFLEXI_USERNAME/MULTIFLEXI_PASSWORD) so it never silently talks to an
unintended backend. If you just want to try the server without your own
MultiFlexi instance, VitexSoftware runs a public demo you can point at
explicitly: MULTIFLEXI_HOST=https://demo.multiflexi.eu/api/VitexSoftware/MultiFlexi/1.0.0 with
MULTIFLEXI_USERNAME=demo / MULTIFLEXI_PASSWORD=demo.
export MULTIFLEXI_HOST="https://your-multiflexi-instance.example.com/api/VitexSoftware/MultiFlexi/1.0.0"
export MULTIFLEXI_USERNAME="your-username"
export MULTIFLEXI_PASSWORD="your-password"
export MULTIFLEXI_VERIFY_SSL="true"
export MULTIFLEXI_DEBUG="false"
multiflexi-mcp-server
Add the following to your Claude Desktop configuration (~/Library/Application Support/Claude/claude_desktop_config.json on macOS or %APPDATA%\Claude\claude_desktop_config.json on Windows):
{
"mcpServers": {
"multiflexi": {
"command": "multiflexi-mcp-server",
"env": {
"MULTIFLEXI_HOST": "https://your-multiflexi-instance.example.com/api/VitexSoftware/MultiFlexi/1.0.0",
"MULTIFLEXI_USERNAME": "your-username",
"MULTIFLEXI_PASSWORD": "your-password"
}
}
}
}
The server provides the following resources:
multiflexi://apps - List of applicationsmultiflexi://jobs - List of jobsmultiflexi://companies - List of companiesmultiflexi://users - List of usersmultiflexi://runtemplates - List of run templatesmultiflexi://credentials - List of credentialsmultiflexi://credential_types - List of credential typesmultiflexi://topics - List of topics (capability contracts)multiflexi://eventsources - List of event sourcesmultiflexi://eventrules - List of event rulesmultiflexi://tasks - List of tasks (per-window fulfilment obligations)diagnose_job_failure (job_id) - Investigate why a job failed and whether a
retry is safetask_fulfillment_report (runtemplate_id, optional) - Summarize Task states
(fulfilled/fulfilled_late/failed/missed) for one or all RunTemplatesgdpr_export_checklist (export_type, optional) - Request a GDPR data export
and produce a compliance-ready summary once it completesRequires a multiflexi-client build generated from the current
openapi-schema.yaml (not yet released to PyPI as of this writing — see
"Known limitations" below).
get_app - Get application by IDget_apps - List all applications (via resources)get_job - Get job by IDcreate_job - Schedule a job from a RunTemplate (runtemplate_id, scheduled, executor, env)get_job_status - Get job execution statusget_jobs - List all jobs (via resources)get_company - Get company by IDlist_companies - List all companieslist_company_users - List users assigned to a companyassign_user_to_company - Assign a user to a company with an access roleunassign_user_from_company - Remove a user's assignment from a companyget_user - Get user by IDlist_users - List all usersget_user_roles - Get RBAC roles assigned to a userset_user_roles - Assign RBAC roles to a userlist_credentials / get_credential / update_credential - List/get/update credentialslist_credential_types / get_credential_type / update_credential_type - List/get/update credential typeslist_topics / get_topic / update_topic - List/get/update topicslist_event_sources / get_event_source - List/get event sourcesset_event_source - Create or update an event sourcedelete_event_source - Delete an event sourcetest_event_source_connection - Live-test connectivity/credentialslist_event_rules / get_event_rule - List/get event rulesset_event_rule - Create or update an event ruledelete_event_rule - Delete an event rulelist_tasks - List tasks, optionally filtered by state/runtemplate_idget_task - Get a task by ID, including its job attempt historyget_runtemplate - Get run template by IDupdate_runtemplate - Update run templateget_runtemplates - List all templates (via resources)request_data_export - Request data exportget_export_status - Check export statusset_company_by_id still has no requestBody defined in
openapi-schema.yaml, so Company writes are not exposed as an MCP tool —
only list/get. update_credentials, update_credential_type, and
update_topic now have requestBody schemas and are exposed as
update_credential, update_credential_type, and update_topic.get_credential's schema declares a required token parameter alongside
credential_id that looks like a schema-authoring artifact on a
session-authenticated endpoint; it's exposed but defaults to an empty
string.multiflexi-client
builds omit basicAuth in _auth_settings. This server always injects an
Authorization: Basic … header when credentials are configured so those
endpoints still authenticate. Prefer a client regenerated from the current
openapi-schema.yaml (basicAuth on those paths, Job.env object|string,
longer credential names, free-form EventRule.operation).environment / exitCodes and id-keyed list endpoints (apps,
jobs, …) require a matching API server build; older servers that emit JSON
arrays for those fields break generated clients.{
"tool": "get_app",
"arguments": {
"app_id": 123,
"format": "json"
}
}
{
"tool": "create_job",
"arguments": {
"runtemplate_id": 15,
"scheduled": "now",
"env": {"DOCID": "FV-2025-0042"}
}
}
{
"tool": "request_data_export",
"arguments": {
"export_type": "personal_data",
"format": "json"
}
}
git clone https://github.com/VitexSoftware/multiflexi-mcp-server.git
cd multiflexi-mcp-server
# Create virtual environment
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
# Install dependencies
pip install -e ".[dev]"
pytest
tests/live_capability_scenario.py exercises every MCP resource, read-only
tool, prompt, and the read-only guard for mutating tools against a real
MultiFlexi API. It reports whether each capability gets usable data back.
# Public demo (login demo/demo)
python tests/live_capability_scenario.py \
--host https://demo.multiflexi.eu/api/VitexSoftware/MultiFlexi/1.0.0 \
--username demo --password demo \
--json-out /tmp/mcp-demo.json
# Dev host (path prefix /multiflexi/api/...)
python tests/live_capability_scenario.py \
--host https://vyvojar.spoje.net/multiflexi/api/VitexSoftware/MultiFlexi/1.0.0 \
--username "$MULTIFLEXI_USERNAME" --password "$MULTIFLEXI_PASSWORD" \
--json-out /tmp/mcp-vyvojar.json
Exit code is non-zero when any non-skipped check fails. Use --json-out for
a machine-readable report.
# Format code
black src/ tests/
# Sort imports
isort src/ tests/
# Type checking
mypy src/
# Linting
ruff src/ tests/
This server integrates with the MultiFlexi API. For detailed API documentation, refer to:
The server provides comprehensive error handling:
All errors are returned in a consistent JSON format:
{
"error": true,
"operation": "get_app",
"status": 404,
"reason": "Not Found",
"details": {
"message": "Application with ID 123 not found"
}
}
This project is licensed under the MIT License - see the LICENSE file for details.
See CHANGELOG.md for the full history. Highlights:
multiflexi_client (the generated API SDK)
is now imported lazily on first use instead of at module load, cutting
process startup from ~5s to well under 1s -- this matters because the server
is spawned fresh per connection by consumers with a bounded handshake timeout.update_credential, update_credential_type, and update_topic toolsmultiflexi-clientTento balíček zatím možná není v naší databázi zaindexován. Zkuste to prosím později, nebo zkontrolujte přímo repozitář balíčků.