Skip to main content
Glama
README.md
# Opti-MCP: Optimization MCP Server

A Model Context Protocol (MCP) server that provides tools for solving optimization problems using Google OR-Tools. This server enables AI assistants to solve Linear Programming (LP), Integer Programming (IP), Mixed-Integer Programming (MIP), and classic combinatorial optimization problems.

## Features

- **Linear Programming**: Solve continuous optimization problems with linear constraints
- **Integer/Mixed-Integer Programming**: Solve optimization problems with integer decision variables
- **Knapsack Problem**: Solve the classic 0/1 knapsack problem efficiently
- Built on Google OR-Tools for robust, production-grade optimization
- Simple JSON-based interface

## Prerequisites

- Node.js 18 or higher
- Python 3.8 or higher
- Google OR-Tools Python library

## Installation

1. Clone this repository:
```bash
git clone <your-repo-url>
cd opti-mcp
```

2. Install Node.js dependencies:
```bash
npm install
```

3. Install Python dependencies:
```bash
pip install ortools
```

4. Build the TypeScript code:
```bash
npm run build
```

## Configuration

Add to your MCP settings file (e.g., `claude_desktop_config.json`):

```json
{
  "mcpServers": {
    "opti-mcp": {
      "command": "node",
      "args": ["/absolute/path/to/opti-mcp/dist/index.js"]
    }
  }
}
```

## Available Tools

### 1. solve_linear_program

Solves linear programming problems where all variables are continuous.

**Example: Production Planning**
```json
{
  "objective": {
    "coefficients": [3, 5],
    "maximize": true
  },
  "constraints": [
    {
      "coefficients": [1, 0],
      "upper_bound": 4
    },
    {
      "coefficients": [0, 2],
      "upper_bound": 12
    },
    {
      "coefficients": [3, 2],
      "upper_bound": 18
    }
  ],
  "variable_bounds": [[0, "Infinity"], [0, "Infinity"]]
}
```

This maximizes `3x₀ + 5x₁` subject to:
- x₀ ≤ 4
- 2x₁ ≤ 12
- 3x₀ + 2x₁ ≤ 18
- x₀, x₁ ≥ 0

### 2. solve_integer_program

Solves integer or mixed-integer programming problems.

**Example: Assignment Problem**
```json
{
  "objective": {
    "coefficients": [1, 2, 3, 4],
    "maximize": false
  },
  "constraints": [
    {
      "coefficients": [1, 1, 0, 0],
      "lower_bound": 1,
      "upper_bound": 1
    },
    {
      "coefficients": [0, 0, 1, 1],
      "lower_bound": 1,
      "upper_bound": 1
    }
  ],
  "variable_bounds": [[0, 1], [0, 1], [0, 1], [0, 1]],
  "integer_variables": [0, 1, 2, 3]
}
```

This solves an assignment problem where variables must be binary (0 or 1).

### 3. solve_knapsack

Solves the 0/1 knapsack problem.

**Example: Item Selection**
```json
{
  "values": [360, 83, 59, 130, 431, 67, 230, 52, 93, 125],
  "weights": [7, 0, 30, 22, 80, 94, 11, 81, 70, 64],
  "capacity": 850
}
```

Maximizes total value while keeping total weight ≤ capacity.

## Example Problems

### Diet Problem
Minimize cost while meeting nutritional requirements:

```json
{
  "objective": {
    "coefficients": [2.5, 1.8, 3.0, 0.5],
    "maximize": false
  },
  "constraints": [
    {
      "coefficients": [10, 5, 8, 2],
      "lower_bound": 50
    },
    {
      "coefficients": [3, 8, 1, 6],
      "lower_bound": 30
    },
    {
      "coefficients": [5, 4, 7, 3],
      "lower_bound": 40
    }
  ]
}
```

### Bin Packing
Pack items into minimum number of bins:

```json
{
  "objective": {
    "coefficients": [1, 1, 1],
    "maximize": false
  },
  "constraints": [
    {
      "coefficients": [5, 0, 0],
      "upper_bound": 10
    },
    {
      "coefficients": [0, 7, 0],
      "upper_bound": 10
    },
    {
      "coefficients": [0, 0, 4],
      "upper_bound": 10
    }
  ],
  "integer_variables": [0, 1, 2]
}
```

## Response Format

All solvers return a JSON response with:

```json
{
  "status": "OPTIMAL",
  "objective_value": 34.0,
  "solution": [2.0, 6.0],
  "solve_time_ms": 15
}
```

- `status`: OPTIMAL, INFEASIBLE, UNBOUNDED, or UNKNOWN
- `objective_value`: The optimal value found (null if not optimal)
- `solution`: Array of variable values (null if not optimal)
- `solve_time_ms`: Time taken to solve in milliseconds

For knapsack problems:
```json
{
  "status": "OPTIMAL",
  "total_value": 1030,
  "total_weight": 850,
  "selected_items": [0, 2, 3, 4],
  "capacity": 850
}
```

## Development

```bash
# Watch mode for development
npm run dev

# Build for production
npm run build

# Run the server
npm start
```

## How It Works

The MCP server:
1. Receives optimization problems via MCP tool calls
2. Translates them into Python scripts using OR-Tools
3. Executes the Python scripts
4. Returns formatted results

## Limitations

- Requires Python 3.8+ with OR-Tools installed
- Currently uses GLOP for LP and SCIP for MIP (requires SCIP installation for best performance)
- Large problems may take significant time to solve

## License

MIT

## Contributing

Contributions welcome! Please open an issue or PR.

TDQS

B3.2/5.0

Scored across 3 tools

Disambiguation4/5

The three tools target distinct problem classes (LP, IP/MIP, knapsack), and descriptions make the distinct semantics clear. However, knapsack is technically a special case of integer programming, and LP is a relaxation of MIP, so boundaries overlap enough that a user might wonder which solver to pick.

Naming Consistency5/5

All tools follow a clean solve_<problem> verb_noun pattern: solve_linear_program, solve_integer_program, solve_knapsack. The convention is predictable and readable throughout.

Tool Count3/5

Three tools is thin for a general optimization server; it covers only LP, IP/MIP, and a single specialized problem. The count is borderline rather than well-scoped for the apparent breadth of the domain.

Completeness3/5

Core LP and MIP solving are covered, plus one special case, giving basic coverage with no dead ends for those tasks. However, common optimization operations such as constraint programming, quadratic/nonlinear programming, assignment/transportation, and scheduling are absent, leaving notable gaps.

Maintenance

ActivityInactive
ResponsivenessNo issues