appkit-bpmn-server
by jenreh
README.md
# appkit-bpmn-server
An [MCP Apps](https://apps.extensions.modelcontextprotocol.io/api/)-compliant server that generates, edits, and manages BPMN 2.0 diagrams from natural language — powered by LLMs.
Describe a business process in plain text and get a valid, layouted BPMN diagram with an interactive viewer rendered inline in any MCP Apps-capable host (Claude, ChatGPT, VS Code, etc.).

## Features
- **Natural language to BPMN** — Generate process diagrams from text descriptions
- **Interactive viewer** — Built-in bpmn-js editor with zoom, pan, and editing capabilities
- **Update diagrams** — Modify existing diagrams via follow-up prompts without starting over
- **Persistent storage** — SQLite-backed diagram storage with Alembic migrations
- **User assignment** — Associate diagrams with specific users via `x-user-id` header or query parameter (defaults to `-1`)
- **Auto-layout** — Automatic swimlane arrangement and edge routing
- **Validation** — Generated BPMN XML is validated before storage
- **MCP Apps UI** — Inline rendering in any compliant chat host
## Architecture
```text
MCP Host (Claude, ChatGPT, …)
│
│ MCP over HTTP (stateless)
▼
appkit-bpmn-server ← this repo (configuration + startup)
│
├─ appkit-mcp-bpmn ← MCP tools, viewer, BPMN generation
├─ appkit-commons ← shared config, OpenAI client, registry
└─ SQLite database ← diagram persistence
```
## Prerequisites
- Python 3.14+
- [uv](https://docs.astral.sh/uv/) package manager
- An OpenAI-compatible API key (Azure OpenAI or OpenAI)
## Getting Started
### 1. Clone and install
```bash
git clone https://github.com/jenreh/appkit-bpmn-server.git
cd appkit-bpmn-server
uv sync
```
### 2. Configure environment
Create a `.env` file in the project root:
```env
OPENAI_API_KEY=your-api-key
OPENAI_BASE_URL=https://your-endpoint.openai.azure.com/v1
```
### 3. Run database migrations
```bash
uv run alembic upgrade head
```
### 4. Start the server
```bash
uv run appkit_bpmn_server
```
The MCP endpoint will be available at `http://127.0.0.1:8000/mcp`.
### 5. Connect from an MCP client
Add the server to your MCP client configuration:
```json
{
"mcpServers": {
"bpmn": {
"url": "http://127.0.0.1:8000/mcp"
}
}
}
```
## MCP Tools
| Tool | Description |
| --- | --- |
| `new_bpmn_diagram` | Generate a new BPMN diagram from a natural language description |
| `update_bpmn_diagram` | Modify an existing diagram using a follow-up prompt |
| `save_bpmn_diagram` | Save pre-built BPMN XML |
| `get_bpmn_xml` | Retrieve the BPMN XML for a diagram (app-only) |
| `save_or_update` | Persist edits made in the viewer (app-only) |
| `rename_bpmn_diagram` | Rename a diagram (app-only) |
Tools marked *app-only* are hidden from the model and callable only from the interactive viewer.
## Configuration
Server settings are in [`configuration/config.yaml`](configuration/config.yaml):
```yaml
app:
mcp_bpmn:
storage_mode: database # database, filesystem, or both
default_model: gpt-5.3-codex # LLM model for generation
max_file_size_mb: 10
diagram_types:
- process
```
## User Assignment
Diagrams can be associated with a specific user by sending an `x-user-id` value. This can be provided as:
- **HTTP header:** `x-user-id: 123`
- **Query parameter:** `?x-user-id=123`
If neither is provided, the user ID defaults to `-1`.
## Project Structure
```text
├── configuration/
│ ├── config.yaml # Development configuration
│ ├── config.prod.yaml # Production overrides
│ └── logging.yaml # Logging configuration
├── alembic/ # Database migrations
├── src/
│ └── appkit_bpmn_server/
│ └── main.py # Server entry point
├── pyproject.toml
└── .env # API keys (not committed)
```
This server cannot be deployed
Maintenance
ActivityInactive
ResponsivenessNo issues