Metadata-Version: 2.4
Name: multiflexi-mcp-server
Version: 0.2.0
Summary: MCP Server for MultiFlexi API integration
Author-email: CyberVitexus <info@vitexsoftware.cz>
License-Expression: MIT
Project-URL: Homepage, https://github.com/VitexSoftware/multiflexi-mcp-server
Project-URL: Documentation, https://github.com/VitexSoftware/multiflexi-mcp-server/blob/main/README.md
Project-URL: Repository, https://github.com/VitexSoftware/multiflexi-mcp-server.git
Project-URL: Issues, https://github.com/VitexSoftware/multiflexi-mcp-server/issues
Project-URL: Changelog, https://github.com/VitexSoftware/multiflexi-mcp-server/blob/main/CHANGELOG.md
Keywords: mcp,multiflexi,model-context-protocol,api,automation,jobs
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: System Administrators
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Topic :: System :: Systems Administration
Classifier: Topic :: Internet :: WWW/HTTP
Classifier: Typing :: Typed
Requires-Python: >=3.9
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: mcp>=1.0.0
Requires-Dist: multiflexi-client>=1.1.0
Requires-Dist: pydantic>=2.0.0
Requires-Dist: python-dateutil>=2.8.0
Requires-Dist: urllib3>=2.0.0
Provides-Extra: dev
Requires-Dist: pytest>=7.0.0; extra == "dev"
Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
Requires-Dist: black>=23.0.0; extra == "dev"
Requires-Dist: isort>=5.12.0; extra == "dev"
Requires-Dist: mypy>=1.5.0; extra == "dev"
Requires-Dist: ruff>=0.0.291; extra == "dev"
Dynamic: license-file

# MultiFlexi MCP Server

[![PyPI version](https://badge.fury.io/py/multiflexi-mcp-server.svg)](https://badge.fury.io/py/multiflexi-mcp-server)
[![Python 3.9+](https://img.shields.io/badge/python-3.9+-blue.svg)](https://www.python.org/downloads/)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)

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.

## Features

- **Applications**: List, retrieve, and manage MultiFlexi applications
- **Jobs**: Create, retrieve, and monitor job execution
- **Companies**: Manage company data and configurations
- **Users**: Access user information and profiles
- **Run Templates**: Create and update execution templates
- **GDPR Compliance**: Request and manage data exports
- **Authentication**: Support for basic authentication
- **Error Handling**: Comprehensive error handling and logging

## Installation

### Using pip

```bash
pip install multiflexi-mcp-server
```

### From source

```bash
git clone https://github.com/VitexSoftware/multiflexi-mcp-server.git
cd multiflexi-mcp-server
pip install -e .
```

## Configuration

The server can be configured using environment variables:

### Required Configuration

- `MULTIFLEXI_HOST`: MultiFlexi API host URL (default: demo server)

### Optional Configuration

- `MULTIFLEXI_USERNAME`: Username for basic authentication
- `MULTIFLEXI_PASSWORD`: Password for basic authentication
- `MULTIFLEXI_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)

### Example Configuration

```bash
export MULTIFLEXI_HOST="https://your-multiflexi-instance.com"
export MULTIFLEXI_USERNAME="your-username"
export MULTIFLEXI_PASSWORD="your-password"
export MULTIFLEXI_VERIFY_SSL="true"
export MULTIFLEXI_DEBUG="false"
```

## Usage

### Running the Server

```bash
multiflexi-mcp-server
```

### Claude Desktop Integration

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):

```json
{
  "mcpServers": {
    "multiflexi": {
      "command": "multiflexi-mcp-server",
      "env": {
        "MULTIFLEXI_HOST": "https://your-multiflexi-instance.com",
        "MULTIFLEXI_USERNAME": "your-username",
        "MULTIFLEXI_PASSWORD": "your-password"
      }
    }
  }
}
```

### Using with MCP Clients

The server provides the following resources:

- `multiflexi://apps` - List of applications
- `multiflexi://jobs` - List of jobs
- `multiflexi://companies` - List of companies
- `multiflexi://users` - List of users
- `multiflexi://runtemplates` - List of run templates
- `multiflexi://credentials` - List of credentials
- `multiflexi://credential_types` - List of credential types
- `multiflexi://topics` - List of topics (capability contracts)
- `multiflexi://eventsources` - List of event sources
- `multiflexi://eventrules` - List of event rules
- `multiflexi://tasks` - List of tasks (per-window fulfilment obligations)

### Available Tools

Requires a `multiflexi-client` build generated from the current
`openapi-schema.yaml` (not yet released to PyPI as of this writing — see
"Known limitations" below).

#### Application Management
- `get_app` - Get application by ID
- `get_apps` - List all applications (via resources)

#### Job Management
- `get_job` - Get job by ID
- `create_job` - Schedule a job from a RunTemplate (`runtemplate_id`, `scheduled`, `executor`, `env`)
- `get_job_status` - Get job execution status
- `get_jobs` - List all jobs (via resources)

#### Company Management
- `get_company` - Get company by ID
- `list_companies` - List all companies
- `list_company_users` - List users assigned to a company
- `assign_user_to_company` - Assign a user to a company with an access role
- `unassign_user_from_company` - Remove a user's assignment from a company

#### User Management
- `get_user` - Get user by ID
- `list_users` - List all users
- `get_user_roles` - Get RBAC roles assigned to a user
- `set_user_roles` - Assign RBAC roles to a user

#### Credential & Credential Type Management
- `list_credentials` / `get_credential` / `update_credential` - List/get/update credentials
- `list_credential_types` / `get_credential_type` / `update_credential_type` - List/get/update credential types

#### Topic Management
- `list_topics` / `get_topic` / `update_topic` - List/get/update topics

#### Event Source Management
- `list_event_sources` / `get_event_source` - List/get event sources
- `set_event_source` - Create or update an event source
- `delete_event_source` - Delete an event source
- `test_event_source_connection` - Live-test connectivity/credentials

#### Event Rule Management
- `list_event_rules` / `get_event_rule` - List/get event rules
- `set_event_rule` - Create or update an event rule
- `delete_event_rule` - Delete an event rule

#### Task (read-only — tasks are system-materialized per RunTemplate window)
- `list_tasks` - List tasks, optionally filtered by `state`/`runtemplate_id`
- `get_task` - Get a task by ID, including its job attempt history

#### Run Template Management
- `get_runtemplate` - Get run template by ID
- `update_runtemplate` - Update run template
- `get_runtemplates` - List all templates (via resources)

#### GDPR Compliance
- `request_data_export` - Request data export
- `get_export_status` - Check export status

### Known limitations

- `set_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.

### Example Tool Usage

```json
{
  "tool": "get_app",
  "arguments": {
    "app_id": 123,
    "format": "json"
  }
}
```

```json
{
  "tool": "create_job",
  "arguments": {
    "runtemplate_id": 15,
    "scheduled": "now",
    "env": {"DOCID": "FV-2025-0042"}
  }
}
```

```json
{
  "tool": "request_data_export",
  "arguments": {
    "export_type": "personal_data",
    "format": "json"
  }
}
```

## Development

### Prerequisites

- Python 3.9+
- pip
- virtualenv (recommended)

### Setup Development Environment

```bash
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]"
```

### Running Tests

```bash
pytest
```

### Code Formatting

```bash
# Format code
black src/ tests/

# Sort imports
isort src/ tests/

# Type checking
mypy src/

# Linting
ruff src/ tests/
```

## API Documentation

This server integrates with the MultiFlexi API. For detailed API documentation, refer to:
- [MultiFlexi API Documentation](https://github.com/multiflexi/multiflexi-api)
- [OpenAPI Specification](https://virtserver.swaggerhub.com/VitexSoftware/MultiFlexi/1.0.0)

## Error Handling

The server provides comprehensive error handling:

- **API Errors**: Formatted with status codes and detailed messages
- **Authentication Errors**: Clear authentication failure messages
- **Validation Errors**: Input validation with descriptive errors
- **Network Errors**: Timeout and connection error handling

All errors are returned in a consistent JSON format:

```json
{
  "error": true,
  "operation": "get_app",
  "status": 404,
  "reason": "Not Found",
  "details": {
    "message": "Application with ID 123 not found"
  }
}
```

## Security Considerations

- **Authentication**: Use environment variables for credentials
- **SSL Verification**: Enable SSL verification in production
- **Network Security**: Ensure secure network connections
- **Data Privacy**: Handle GDPR exports with appropriate security

## Contributing

1. Fork the repository
2. Create a feature branch
3. Make your changes
4. Add tests
5. Run the test suite
6. Submit a pull request

## License

This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.

## Support

- **Issues**: [GitHub Issues](https://github.com/VitexSoftware/multiflexi-mcp-server/issues)
- **Documentation**: [GitHub Wiki](https://github.com/VitexSoftware/multiflexi-mcp-server/wiki)
- **Email**: info@vitexsoftware.cz

## Changelog

See [CHANGELOG.md](CHANGELOG.md) for the full history. Highlights:

### v0.2.0
- Fixed slow cold-start import time: `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.
- Added `update_credential`, `update_credential_type`, and `update_topic` tools
- Fixed several API method/response mismatches against `multiflexi-client`

### v0.1.0 (Initial Release)
- Basic MCP server implementation
- MultiFlexi API integration
- Application, job, company, user, and template management
- GDPR compliance features
- Comprehensive error handling
- Environment-based configuration
