chuk-mcp-solver 0.1.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- chuk_mcp_solver-0.1.2/.claude/settings.local.json +28 -0
- chuk_mcp_solver-0.1.2/.dockerignore +47 -0
- chuk_mcp_solver-0.1.2/.github/workflows/fly-deploy.yml +18 -0
- chuk_mcp_solver-0.1.2/.github/workflows/test.yml +65 -0
- chuk_mcp_solver-0.1.2/.gitignore +140 -0
- chuk_mcp_solver-0.1.2/CHANGELOG.md +134 -0
- chuk_mcp_solver-0.1.2/Dockerfile +81 -0
- chuk_mcp_solver-0.1.2/LICENSE +21 -0
- chuk_mcp_solver-0.1.2/MANIFEST.in +10 -0
- chuk_mcp_solver-0.1.2/Makefile +492 -0
- chuk_mcp_solver-0.1.2/PKG-INFO +1027 -0
- chuk_mcp_solver-0.1.2/README.md +993 -0
- chuk_mcp_solver-0.1.2/docker-compose.yml +44 -0
- chuk_mcp_solver-0.1.2/examples/README.md +162 -0
- chuk_mcp_solver-0.1.2/examples/advanced_search_demo.py +330 -0
- chuk_mcp_solver-0.1.2/examples/caching_demo.py +302 -0
- chuk_mcp_solver-0.1.2/examples/delivery_router.py +190 -0
- chuk_mcp_solver-0.1.2/examples/embedding_pipeline_scheduler.py +538 -0
- chuk_mcp_solver-0.1.2/examples/gpu_job_scheduler.py +547 -0
- chuk_mcp_solver-0.1.2/examples/inventory_manager.py +303 -0
- chuk_mcp_solver-0.1.2/examples/knapsack_optimizer.py +156 -0
- chuk_mcp_solver-0.1.2/examples/ml_pipeline_orchestrator.py +468 -0
- chuk_mcp_solver-0.1.2/examples/multi_objective_planner.py +291 -0
- chuk_mcp_solver-0.1.2/examples/project_scheduler.py +232 -0
- chuk_mcp_solver-0.1.2/examples/resource_scheduler.py +238 -0
- chuk_mcp_solver-0.1.2/examples/sudoku_solver.py +179 -0
- chuk_mcp_solver-0.1.2/examples/tool_selector.py +238 -0
- chuk_mcp_solver-0.1.2/examples/validation_demo.py +250 -0
- chuk_mcp_solver-0.1.2/fly.toml +22 -0
- chuk_mcp_solver-0.1.2/pyproject.toml +116 -0
- chuk_mcp_solver-0.1.2/src/chuk_mcp_solver/__init__.py +10 -0
- chuk_mcp_solver-0.1.2/src/chuk_mcp_solver/cache.py +164 -0
- chuk_mcp_solver-0.1.2/src/chuk_mcp_solver/config.py +77 -0
- chuk_mcp_solver-0.1.2/src/chuk_mcp_solver/diagnostics.py +273 -0
- chuk_mcp_solver-0.1.2/src/chuk_mcp_solver/models.py +585 -0
- chuk_mcp_solver-0.1.2/src/chuk_mcp_solver/observability.py +311 -0
- chuk_mcp_solver-0.1.2/src/chuk_mcp_solver/providers/__init__.py +28 -0
- chuk_mcp_solver-0.1.2/src/chuk_mcp_solver/server.py +165 -0
- chuk_mcp_solver-0.1.2/src/chuk_mcp_solver/solver/__init__.py +32 -0
- chuk_mcp_solver-0.1.2/src/chuk_mcp_solver/solver/ortools/__init__.py +9 -0
- chuk_mcp_solver-0.1.2/src/chuk_mcp_solver/solver/ortools/constraints.py +310 -0
- chuk_mcp_solver-0.1.2/src/chuk_mcp_solver/solver/ortools/objectives.py +99 -0
- chuk_mcp_solver-0.1.2/src/chuk_mcp_solver/solver/ortools/responses.py +183 -0
- chuk_mcp_solver-0.1.2/src/chuk_mcp_solver/solver/ortools/solver.py +281 -0
- chuk_mcp_solver-0.1.2/src/chuk_mcp_solver/solver/provider.py +33 -0
- chuk_mcp_solver-0.1.2/src/chuk_mcp_solver/validation.py +468 -0
- chuk_mcp_solver-0.1.2/tests/conftest.py +89 -0
- chuk_mcp_solver-0.1.2/tests/solver/__init__.py +0 -0
- chuk_mcp_solver-0.1.2/tests/solver/ortools/__init__.py +0 -0
- chuk_mcp_solver-0.1.2/tests/solver/ortools/test_constraints.py +591 -0
- chuk_mcp_solver-0.1.2/tests/solver/ortools/test_edge_cases.py +225 -0
- chuk_mcp_solver-0.1.2/tests/solver/ortools/test_responses.py +84 -0
- chuk_mcp_solver-0.1.2/tests/solver/ortools/test_solver.py +392 -0
- chuk_mcp_solver-0.1.2/tests/test_cache.py +381 -0
- chuk_mcp_solver-0.1.2/tests/test_config.py +66 -0
- chuk_mcp_solver-0.1.2/tests/test_diagnostics.py +433 -0
- chuk_mcp_solver-0.1.2/tests/test_imports.py +56 -0
- chuk_mcp_solver-0.1.2/tests/test_init.py +28 -0
- chuk_mcp_solver-0.1.2/tests/test_models.py +455 -0
- chuk_mcp_solver-0.1.2/tests/test_observability.py +291 -0
- chuk_mcp_solver-0.1.2/tests/test_performance.py +311 -0
- chuk_mcp_solver-0.1.2/tests/test_solver.py +25 -0
- chuk_mcp_solver-0.1.2/tests/test_validation.py +607 -0
- chuk_mcp_solver-0.1.2/uv.lock +1213 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"permissions": {
|
|
3
|
+
"allow": [
|
|
4
|
+
"Bash(tree:*)",
|
|
5
|
+
"Bash(find:*)",
|
|
6
|
+
"Bash(uv pip install:*)",
|
|
7
|
+
"Bash(uv venv:*)",
|
|
8
|
+
"Bash(source .venv/bin/activate)",
|
|
9
|
+
"Bash(pytest:*)",
|
|
10
|
+
"Bash(python:*)",
|
|
11
|
+
"Bash(pip install:*)",
|
|
12
|
+
"Bash(=9.10.0)",
|
|
13
|
+
"Bash(uv pip list:*)",
|
|
14
|
+
"Bash(uv run pytest:*)",
|
|
15
|
+
"Bash(make check:*)",
|
|
16
|
+
"Bash(make format:*)",
|
|
17
|
+
"Bash(make typecheck:*)",
|
|
18
|
+
"Bash(cat:*)",
|
|
19
|
+
"Bash(uv run python:*)",
|
|
20
|
+
"Bash(timeout 10 uv run pytest:*)",
|
|
21
|
+
"Bash(make:*)",
|
|
22
|
+
"Bash(python3.11 -m pytest:*)",
|
|
23
|
+
"Bash(uv run mypy:*)"
|
|
24
|
+
],
|
|
25
|
+
"deny": [],
|
|
26
|
+
"ask": []
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
*.so
|
|
6
|
+
.Python
|
|
7
|
+
*.egg-info/
|
|
8
|
+
dist/
|
|
9
|
+
build/
|
|
10
|
+
*.egg
|
|
11
|
+
|
|
12
|
+
# Virtual environments
|
|
13
|
+
.venv/
|
|
14
|
+
venv/
|
|
15
|
+
ENV/
|
|
16
|
+
env/
|
|
17
|
+
|
|
18
|
+
# IDE
|
|
19
|
+
.vscode/
|
|
20
|
+
.idea/
|
|
21
|
+
*.swp
|
|
22
|
+
*.swo
|
|
23
|
+
*~
|
|
24
|
+
|
|
25
|
+
# Testing
|
|
26
|
+
.pytest_cache/
|
|
27
|
+
.coverage
|
|
28
|
+
htmlcov/
|
|
29
|
+
.tox/
|
|
30
|
+
.mypy_cache/
|
|
31
|
+
|
|
32
|
+
# Git
|
|
33
|
+
.git/
|
|
34
|
+
.gitignore
|
|
35
|
+
.gitattributes
|
|
36
|
+
|
|
37
|
+
# CI/CD
|
|
38
|
+
.github/
|
|
39
|
+
|
|
40
|
+
# Documentation
|
|
41
|
+
docs/
|
|
42
|
+
|
|
43
|
+
# Other
|
|
44
|
+
*.md
|
|
45
|
+
!README.md
|
|
46
|
+
.DS_Store
|
|
47
|
+
*.log
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# See https://fly.io/docs/app-guides/continuous-deployment-with-github-actions/
|
|
2
|
+
|
|
3
|
+
name: Fly Deploy
|
|
4
|
+
on:
|
|
5
|
+
push:
|
|
6
|
+
branches:
|
|
7
|
+
- main
|
|
8
|
+
jobs:
|
|
9
|
+
deploy:
|
|
10
|
+
name: Deploy app
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
concurrency: deploy-group # optional: ensure only one action runs at a time
|
|
13
|
+
steps:
|
|
14
|
+
- uses: actions/checkout@v4
|
|
15
|
+
- uses: superfly/flyctl-actions/setup-flyctl@master
|
|
16
|
+
- run: flyctl deploy --remote-only
|
|
17
|
+
env:
|
|
18
|
+
FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
name: Test
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main, develop]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main, develop]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
test:
|
|
11
|
+
runs-on: ${{ matrix.os }}
|
|
12
|
+
strategy:
|
|
13
|
+
matrix:
|
|
14
|
+
os: [ubuntu-latest, windows-latest, macos-latest]
|
|
15
|
+
python-version: ["3.11", "3.12", "3.13"]
|
|
16
|
+
|
|
17
|
+
steps:
|
|
18
|
+
- name: Checkout code
|
|
19
|
+
uses: actions/checkout@v4
|
|
20
|
+
|
|
21
|
+
- name: Set up uv
|
|
22
|
+
uses: astral-sh/setup-uv@v4
|
|
23
|
+
with:
|
|
24
|
+
enable-cache: true
|
|
25
|
+
|
|
26
|
+
- name: Set up Python ${{ matrix.python-version }}
|
|
27
|
+
run: uv python install ${{ matrix.python-version }}
|
|
28
|
+
|
|
29
|
+
- name: Install dependencies
|
|
30
|
+
run: |
|
|
31
|
+
uv sync --all-extras --dev
|
|
32
|
+
|
|
33
|
+
- name: Lint with ruff
|
|
34
|
+
run: |
|
|
35
|
+
uv run ruff check src/ tests/
|
|
36
|
+
|
|
37
|
+
- name: Format check with ruff
|
|
38
|
+
run: |
|
|
39
|
+
uv run ruff format --check src/ tests/
|
|
40
|
+
|
|
41
|
+
- name: Type check with mypy
|
|
42
|
+
run: |
|
|
43
|
+
uv run mypy src/
|
|
44
|
+
|
|
45
|
+
- name: Run tests
|
|
46
|
+
run: |
|
|
47
|
+
uv run pytest tests/ -v --tb=short -m "not network"
|
|
48
|
+
|
|
49
|
+
- name: Run tests with coverage
|
|
50
|
+
if: matrix.os == 'ubuntu-latest' && matrix.python-version == '3.12'
|
|
51
|
+
run: |
|
|
52
|
+
uv run pytest tests/ --cov=src/chuk_mcp_solver --cov-report=xml --cov-report=term -m "not network"
|
|
53
|
+
|
|
54
|
+
- name: Upload coverage to Codecov
|
|
55
|
+
if: matrix.os == 'ubuntu-latest' && matrix.python-version == '3.12'
|
|
56
|
+
uses: codecov/codecov-action@v4
|
|
57
|
+
with:
|
|
58
|
+
file: ./coverage.xml
|
|
59
|
+
fail_ci_if_error: false
|
|
60
|
+
token: ${{ secrets.CODECOV_TOKEN }}
|
|
61
|
+
|
|
62
|
+
- name: Check coverage threshold
|
|
63
|
+
if: matrix.os == 'ubuntu-latest' && matrix.python-version == '3.12'
|
|
64
|
+
run: |
|
|
65
|
+
uv run pytest tests/ --cov=src/chuk_mcp_solver --cov-report=term --cov-fail-under=90 -m "not network"
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# Byte-compiled / optimized / DLL files
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
|
|
6
|
+
# C extensions
|
|
7
|
+
*.so
|
|
8
|
+
|
|
9
|
+
# Distribution / packaging
|
|
10
|
+
.Python
|
|
11
|
+
build/
|
|
12
|
+
develop-eggs/
|
|
13
|
+
dist/
|
|
14
|
+
downloads/
|
|
15
|
+
eggs/
|
|
16
|
+
.eggs/
|
|
17
|
+
lib/
|
|
18
|
+
lib64/
|
|
19
|
+
parts/
|
|
20
|
+
sdist/
|
|
21
|
+
var/
|
|
22
|
+
wheels/
|
|
23
|
+
pip-wheel-metadata/
|
|
24
|
+
share/python-wheels/
|
|
25
|
+
*.egg-info/
|
|
26
|
+
.installed.cfg
|
|
27
|
+
*.egg
|
|
28
|
+
MANIFEST
|
|
29
|
+
|
|
30
|
+
# PyInstaller
|
|
31
|
+
*.manifest
|
|
32
|
+
*.spec
|
|
33
|
+
|
|
34
|
+
# Unit test / coverage reports
|
|
35
|
+
htmlcov/
|
|
36
|
+
.tox/
|
|
37
|
+
.nox/
|
|
38
|
+
.coverage
|
|
39
|
+
.coverage.*
|
|
40
|
+
.cache
|
|
41
|
+
nosetests.xml
|
|
42
|
+
coverage.xml
|
|
43
|
+
*.cover
|
|
44
|
+
*.py,cover
|
|
45
|
+
.hypothesis/
|
|
46
|
+
.pytest_cache/
|
|
47
|
+
|
|
48
|
+
# Translations
|
|
49
|
+
*.mo
|
|
50
|
+
*.pot
|
|
51
|
+
|
|
52
|
+
# Django stuff:
|
|
53
|
+
*.log
|
|
54
|
+
local_settings.py
|
|
55
|
+
db.sqlite3
|
|
56
|
+
db.sqlite3-journal
|
|
57
|
+
|
|
58
|
+
# Flask stuff:
|
|
59
|
+
instance/
|
|
60
|
+
.webassets-cache
|
|
61
|
+
|
|
62
|
+
# Scrapy stuff:
|
|
63
|
+
.scrapy
|
|
64
|
+
|
|
65
|
+
# Sphinx documentation
|
|
66
|
+
docs/_build/
|
|
67
|
+
|
|
68
|
+
# PyBuilder
|
|
69
|
+
target/
|
|
70
|
+
|
|
71
|
+
# Jupyter Notebook
|
|
72
|
+
.ipynb_checkpoints
|
|
73
|
+
|
|
74
|
+
# IPython
|
|
75
|
+
profile_default/
|
|
76
|
+
ipython_config.py
|
|
77
|
+
|
|
78
|
+
# pyenv
|
|
79
|
+
.python-version
|
|
80
|
+
|
|
81
|
+
# pipenv
|
|
82
|
+
Pipfile.lock
|
|
83
|
+
|
|
84
|
+
# PEP 582
|
|
85
|
+
__pypackages__/
|
|
86
|
+
|
|
87
|
+
# Celery stuff
|
|
88
|
+
celerybeat-schedule
|
|
89
|
+
celerybeat.pid
|
|
90
|
+
|
|
91
|
+
# SageMath parsed files
|
|
92
|
+
*.sage.py
|
|
93
|
+
|
|
94
|
+
# Environments
|
|
95
|
+
.env
|
|
96
|
+
.venv
|
|
97
|
+
env/
|
|
98
|
+
venv/
|
|
99
|
+
ENV/
|
|
100
|
+
env.bak/
|
|
101
|
+
venv.bak/
|
|
102
|
+
|
|
103
|
+
# Spyder project settings
|
|
104
|
+
.spyderproject
|
|
105
|
+
.spyproject
|
|
106
|
+
|
|
107
|
+
# Rope project settings
|
|
108
|
+
.ropeproject
|
|
109
|
+
|
|
110
|
+
# mkdocs documentation
|
|
111
|
+
/site
|
|
112
|
+
|
|
113
|
+
# mypy
|
|
114
|
+
.mypy_cache/
|
|
115
|
+
.dmypy.json
|
|
116
|
+
dmypy.json
|
|
117
|
+
|
|
118
|
+
# Pyre type checker
|
|
119
|
+
.pyre/
|
|
120
|
+
|
|
121
|
+
# Ruff
|
|
122
|
+
.ruff_cache/
|
|
123
|
+
|
|
124
|
+
# uv
|
|
125
|
+
.uv/
|
|
126
|
+
|
|
127
|
+
# IDE
|
|
128
|
+
.vscode/
|
|
129
|
+
.idea/
|
|
130
|
+
*.swp
|
|
131
|
+
*.swo
|
|
132
|
+
*~
|
|
133
|
+
|
|
134
|
+
# OS
|
|
135
|
+
.DS_Store
|
|
136
|
+
Thumbs.db
|
|
137
|
+
|
|
138
|
+
# Temporary files
|
|
139
|
+
*.tmp
|
|
140
|
+
*.bak
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
## [0.1.1] - 2025-12-02
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
|
|
9
|
+
#### Cache Deadlock Fix
|
|
10
|
+
- **Issue**: `test_cache_stats` test was hanging due to deadlock in `SolutionCache.stats()` method
|
|
11
|
+
- **Root Cause**: The `stats()` method acquired `self._lock`, then called the `hit_rate` property which tried to acquire the same lock again. Since `threading.Lock` is not reentrant, this caused a deadlock.
|
|
12
|
+
- **Fix**: Changed `threading.Lock` to `threading.RLock` (Reentrant Lock) in `src/chuk_mcp_solver/cache.py`
|
|
13
|
+
- Line 10: Updated import from `Lock` to `RLock`
|
|
14
|
+
- Line 38: Changed `self._lock = Lock()` to `self._lock = RLock()`
|
|
15
|
+
- **Impact**: All cache tests now pass without hanging
|
|
16
|
+
|
|
17
|
+
#### Performance Test Fix
|
|
18
|
+
- **Issue**: `test_partial_solution_on_timeout` was failing with timeout status instead of returning a partial solution
|
|
19
|
+
- **Root Cause**: Test timeout was too short (1ms) for OR-Tools CP-SAT to find even a trivial feasible solution before timing out
|
|
20
|
+
- **Fix**: Increased timeout in `tests/test_performance.py:178` from 1ms to 50ms
|
|
21
|
+
- **Additional**: Updated `src/chuk_mcp_solver/solver/ortools/solver.py:164` to check for both `cp_model.FEASIBLE` and `cp_model.OPTIMAL` statuses when handling partial solutions
|
|
22
|
+
- **Impact**: Test now reliably passes by giving solver enough time to find at least one feasible solution
|
|
23
|
+
|
|
24
|
+
### Added
|
|
25
|
+
|
|
26
|
+
#### Docker Support
|
|
27
|
+
- **Dockerfile**: Multi-stage build for optimized image size (~300-400MB)
|
|
28
|
+
- Based on `python:3.11-slim`
|
|
29
|
+
- Runs as non-root user (`mcpuser`) for security
|
|
30
|
+
- Includes health check
|
|
31
|
+
- Default command: HTTP mode on port 8000
|
|
32
|
+
- **docker-compose.yml**: Service definition with resource limits and health checks
|
|
33
|
+
- **.dockerignore**: Optimizes Docker build context by excluding unnecessary files
|
|
34
|
+
- **DOCKER.md**: Comprehensive Docker usage guide with examples for:
|
|
35
|
+
- Building and running containers
|
|
36
|
+
- Configuration with environment variables
|
|
37
|
+
- Transport modes (HTTP vs STDIO)
|
|
38
|
+
- Production deployment
|
|
39
|
+
- CI/CD integration
|
|
40
|
+
- Troubleshooting
|
|
41
|
+
|
|
42
|
+
#### Makefile Docker Targets
|
|
43
|
+
- `docker-build`: Build Docker image
|
|
44
|
+
- `docker-run`: Run Docker container
|
|
45
|
+
- `docker-stop`: Stop running container
|
|
46
|
+
- `docker-clean`: Remove container and image
|
|
47
|
+
- `docker-test`: Run tests in Docker container
|
|
48
|
+
- `docker-shell`: Open shell in running container
|
|
49
|
+
- `docker-push`: Push image to registry
|
|
50
|
+
- `docker-compose-up`: Start services with docker-compose
|
|
51
|
+
- `docker-compose-down`: Stop services with docker-compose
|
|
52
|
+
- `docker-compose-rebuild`: Rebuild and restart services
|
|
53
|
+
|
|
54
|
+
#### Package Distribution
|
|
55
|
+
- **MANIFEST.in**: Ensures proper file inclusion in source distributions
|
|
56
|
+
- Includes README.md, LICENSE, pyproject.toml
|
|
57
|
+
- Recursively includes Python files from src/ and examples/
|
|
58
|
+
- Excludes compiled bytecode files
|
|
59
|
+
|
|
60
|
+
#### Public MCP Endpoint
|
|
61
|
+
- Added documentation for hosted solver at `https://solver.chukai.io/mcp`
|
|
62
|
+
- No installation required - use directly from Claude Desktop
|
|
63
|
+
- Perfect for testing, demos, or production use
|
|
64
|
+
|
|
65
|
+
#### Enhanced Installation Options
|
|
66
|
+
- Highlighted `uvx` as recommended installation method
|
|
67
|
+
- Added `uvx install` option for global installation
|
|
68
|
+
- Organized installation options by use case
|
|
69
|
+
|
|
70
|
+
### Changed
|
|
71
|
+
|
|
72
|
+
#### Server Transport Handling
|
|
73
|
+
- **Breaking**: Simplified command-line argument parsing in `src/chuk_mcp_solver/server.py`
|
|
74
|
+
- **Removed**: `argparse` dependency
|
|
75
|
+
- **Default**: STDIO mode (for Claude Desktop compatibility)
|
|
76
|
+
- **HTTP Mode**: Pass `http` or `--http` argument
|
|
77
|
+
- **Logging**: Improved logging suppression in STDIO mode to reduce noise
|
|
78
|
+
- **Pattern**: Now matches chuk-mcp-celestial transport handling
|
|
79
|
+
|
|
80
|
+
#### Documentation Updates
|
|
81
|
+
- **README.md**:
|
|
82
|
+
- Updated test count from 151+ to 170 tests
|
|
83
|
+
- Added public MCP endpoint section
|
|
84
|
+
- Enhanced Quick Start with three options (Public, uvx, Development)
|
|
85
|
+
- Added Docker usage section
|
|
86
|
+
- Improved installation instructions with emojis and clear hierarchy
|
|
87
|
+
- **Test Count**: Updated badges and documentation to reflect 170 passing tests
|
|
88
|
+
|
|
89
|
+
### Test Results
|
|
90
|
+
|
|
91
|
+
All 170 tests passing:
|
|
92
|
+
- Fixed hanging cache tests (test_cache_stats)
|
|
93
|
+
- Fixed failing performance test (test_partial_solution_on_timeout)
|
|
94
|
+
- All existing functionality preserved
|
|
95
|
+
- No breaking changes to core API
|
|
96
|
+
|
|
97
|
+
### Migration Notes
|
|
98
|
+
|
|
99
|
+
#### For Users
|
|
100
|
+
- No action required - all changes are backward compatible
|
|
101
|
+
- Consider using the public endpoint at `https://solver.chukai.io/mcp` for quick testing
|
|
102
|
+
- For production use, consider Docker deployment for better isolation
|
|
103
|
+
|
|
104
|
+
#### For Developers
|
|
105
|
+
- If running the server programmatically, note the simplified transport handling:
|
|
106
|
+
- Default: STDIO mode (no arguments)
|
|
107
|
+
- HTTP mode: Pass `"http"` or `"--http"` as argument
|
|
108
|
+
- Old `--transport` flag is no longer supported
|
|
109
|
+
|
|
110
|
+
#### For Docker Users
|
|
111
|
+
- Use `make docker-build` and `make docker-run` for easy Docker operations
|
|
112
|
+
- Default container runs in HTTP mode on port 8000
|
|
113
|
+
- See DOCKER.md for comprehensive deployment guide
|
|
114
|
+
|
|
115
|
+
### Security
|
|
116
|
+
|
|
117
|
+
- Docker image runs as non-root user (`mcpuser`)
|
|
118
|
+
- Minimal runtime dependencies reduce attack surface
|
|
119
|
+
- Health checks ensure service availability
|
|
120
|
+
- No secrets or credentials in Docker image
|
|
121
|
+
|
|
122
|
+
### Performance
|
|
123
|
+
|
|
124
|
+
- Multi-stage Docker build reduces image size
|
|
125
|
+
- Cache now uses reentrant locks for better concurrency
|
|
126
|
+
- Partial solution timeout handling improved for better user experience
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## [0.1.0] - 2024-12-01
|
|
131
|
+
|
|
132
|
+
Initial release with comprehensive constraint solving and optimization capabilities.
|
|
133
|
+
|
|
134
|
+
See README.md for full feature list.
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# CHUK MCP Solver Dockerfile
|
|
2
|
+
# ========================================
|
|
3
|
+
# Multi-stage build for optimal image size
|
|
4
|
+
# Based on chuk-mcp-server patterns
|
|
5
|
+
|
|
6
|
+
# Build stage
|
|
7
|
+
FROM python:3.11-slim as builder
|
|
8
|
+
|
|
9
|
+
# Set working directory
|
|
10
|
+
WORKDIR /app
|
|
11
|
+
|
|
12
|
+
# Install system dependencies
|
|
13
|
+
RUN apt-get update && apt-get install -y \
|
|
14
|
+
build-essential \
|
|
15
|
+
curl \
|
|
16
|
+
git \
|
|
17
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
18
|
+
|
|
19
|
+
# Install uv for fast dependency management
|
|
20
|
+
RUN curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
21
|
+
ENV PATH="/root/.local/bin:${PATH}"
|
|
22
|
+
|
|
23
|
+
# Copy project configuration
|
|
24
|
+
COPY pyproject.toml README.md ./
|
|
25
|
+
COPY src ./src
|
|
26
|
+
|
|
27
|
+
# Install the package with all dependencies
|
|
28
|
+
# Use --no-cache to reduce layer size
|
|
29
|
+
RUN uv pip install --system --no-cache -e .
|
|
30
|
+
|
|
31
|
+
# Runtime stage
|
|
32
|
+
FROM python:3.11-slim
|
|
33
|
+
|
|
34
|
+
# Set working directory
|
|
35
|
+
WORKDIR /app
|
|
36
|
+
|
|
37
|
+
# Install minimal runtime dependencies
|
|
38
|
+
RUN apt-get update && apt-get install -y \
|
|
39
|
+
ca-certificates \
|
|
40
|
+
curl \
|
|
41
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
42
|
+
|
|
43
|
+
# Copy Python environment from builder
|
|
44
|
+
COPY --from=builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages
|
|
45
|
+
COPY --from=builder /usr/local/bin /usr/local/bin
|
|
46
|
+
|
|
47
|
+
# Copy application code
|
|
48
|
+
COPY --from=builder /app/src ./src
|
|
49
|
+
COPY --from=builder /app/README.md ./
|
|
50
|
+
COPY --from=builder /app/pyproject.toml ./
|
|
51
|
+
|
|
52
|
+
# Create non-root user for security
|
|
53
|
+
RUN useradd -m -u 1000 mcpuser && \
|
|
54
|
+
chown -R mcpuser:mcpuser /app
|
|
55
|
+
|
|
56
|
+
# Switch to non-root user
|
|
57
|
+
USER mcpuser
|
|
58
|
+
|
|
59
|
+
# Environment variables
|
|
60
|
+
ENV PYTHONUNBUFFERED=1 \
|
|
61
|
+
PYTHONDONTWRITEBYTECODE=1 \
|
|
62
|
+
PYTHONPATH=/app/src
|
|
63
|
+
|
|
64
|
+
# Health check
|
|
65
|
+
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
|
|
66
|
+
CMD python -c "import sys; sys.path.insert(0, '/app/src'); import chuk_mcp_solver; print('OK')" || exit 1
|
|
67
|
+
|
|
68
|
+
# Default command - run MCP server in HTTP mode for Docker
|
|
69
|
+
CMD ["python", "-m", "chuk_mcp_solver.server", "http"]
|
|
70
|
+
|
|
71
|
+
# Expose port for HTTP mode
|
|
72
|
+
EXPOSE 8000
|
|
73
|
+
|
|
74
|
+
# Labels for metadata
|
|
75
|
+
LABEL maintainer="info@chuk.ai" \
|
|
76
|
+
description="CHUK MCP Solver - General-purpose constraint and optimization solver" \
|
|
77
|
+
version="0.1.1" \
|
|
78
|
+
org.opencontainers.image.source="https://github.com/chuk-ai/chuk-mcp-solver" \
|
|
79
|
+
org.opencontainers.image.title="CHUK MCP Solver" \
|
|
80
|
+
org.opencontainers.image.description="MCP server for constraint satisfaction and optimization using OR-Tools" \
|
|
81
|
+
org.opencontainers.image.authors="CHUK AI <info@chuk.ai>"
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 CHUK AI
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|