HiGHS MCP Server

Fornece capacidades de otimização de programação linear (LP) e programação inteira mista (MIP) utilizando o solver HiGHS.

Documentação

Servidor MCP HiGHS

Um servidor Model Context Protocol (MCP) que fornece capacidades de otimização de programação linear (LP) e programação inteira mista (MIP) usando o solucionador HiGHS.

Buy Me A Coffee

Visão Geral

Este servidor MCP expõe o solucionador de otimização HiGHS através de uma interface padronizada, permitindo que assistentes de IA e outros clientes MCP resolvam problemas complexos de otimização, incluindo:

  • Problemas de Programação Linear (LP)
  • Problemas de Programação Inteira Mista (MIP)
  • Problemas de Programação Quadrática (QP) para objetivos convexos
  • Restrições de variáveis binárias e inteiras
  • Otimização multiobjetivo

Requisitos

  • Node.js >= 16.0.0

Instalação

npm install highs-mcp

Ou clone e compile a partir do código-fonte:

git clone https://github.com/wspringer/highs-mcp.git
cd highs-mcp
npm install
npm run build

Uso

Como um Servidor MCP

O servidor pode ser executado diretamente:

npx highs-mcp

Ou se compilado a partir do código-fonte:

npm start

Integração com Claude

Para usar esta ferramenta com Claude, adicione-a ao seu arquivo de configuração do Claude:

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json Windows: %APPDATA%\Claude\claude_desktop_config.json Linux: ~/.config/Claude/claude_desktop_config.json

{
  "mcpServers": {
    "highs": {
      "command": "npx",
      "args": ["highs-mcp"]
    }
  }
}

Após adicionar a configuração, reinicie o Claude para carregar a ferramenta de otimização HiGHS.

Integração com Outros Clientes MCP

O servidor MCP HiGHS é compatível com qualquer cliente MCP. Algumas opções populares incluem:

  • Claude Desktop: Assistente de IA da Anthropic com suporte nativo a MCP
  • MCP CLI: Interface de linha de comando para testar servidores MCP
  • MCP Inspector: Ferramenta baseada na web para depurar servidores MCP
  • Aplicações Personalizadas: Qualquer aplicação que use o MCP SDK

API de Ferramentas

O servidor fornece uma única ferramenta: optimize-mip-lp-tool

Esquema de Entrada

{
  problem: {
    sense: 'minimize' | 'maximize',
    objective: {
      linear?: number[],  // Linear coefficients (optional if quadratic is provided)
      quadratic?: {       // Quadratic terms for convex QP (optional)
        // Dense format:
        dense?: number[][]  // Symmetric positive semidefinite matrix Q
        
        // OR Sparse format:
        sparse?: {
          rows: number[],     // Row indices (0-indexed)
          cols: number[],     // Column indices (0-indexed)
          values: number[],   // Values of Q matrix
          shape: [number, number]  // [num_variables, num_variables]
        }
      }
    },
    variables: Array<{
      name?: string,        // Variable name (optional, defaults to x1, x2, etc.)
      lb?: number,          // Lower bound (optional, defaults to 0)
      ub?: number,          // Upper bound (optional, defaults to +∞, except binary gets 1)
      type?: 'cont' | 'int' | 'bin'  // Variable type (optional, defaults to 'cont')
    }>,
    constraints: {
      // Dense format (for small problems):
      dense?: number[][],  // 2D array where each row is a constraint
      
      // OR Sparse format (for large problems with many zeros):
      sparse?: {
        rows: number[],    // Row indices of non-zero coefficients (0-indexed)
        cols: number[],    // Column indices of non-zero coefficients (0-indexed)
        values: number[],  // Non-zero coefficient values
        shape: [number, number]  // [num_constraints, num_variables]
      },
      
      sense: Array<'<=' | '>=' | '='>,  // Constraint directions
      rhs: number[]  // Right-hand side values
    }
  },
  options?: {
    // Solver Control
    time_limit?: number,              // Time limit in seconds
    presolve?: 'off' | 'choose' | 'on',
    solver?: 'simplex' | 'choose' | 'ipm' | 'pdlp',
    parallel?: 'off' | 'choose' | 'on',
    threads?: number,                 // Number of threads (0=automatic)
    random_seed?: number,             // Random seed for reproducibility
    
    // Tolerances
    primal_feasibility_tolerance?: number,  // Default: 1e-7
    dual_feasibility_tolerance?: number,    // Default: 1e-7
    ipm_optimality_tolerance?: number,      // Default: 1e-8
    infinite_cost?: number,                 // Default: 1e20
    infinite_bound?: number,                // Default: 1e20
    
    // Simplex Options
    simplex_strategy?: number,              // 0-4: algorithm strategy
    simplex_scale_strategy?: number,        // 0-5: scaling strategy
    simplex_dual_edge_weight_strategy?: number,  // -1 to 2: pricing
    simplex_iteration_limit?: number,       // Max iterations
    
    // MIP Options
    mip_detect_symmetry?: boolean,          // Detect symmetry
    mip_max_nodes?: number,                 // Max branch-and-bound nodes
    mip_rel_gap?: number,                   // Relative gap tolerance
    mip_abs_gap?: number,                   // Absolute gap tolerance
    mip_feasibility_tolerance?: number,     // MIP feasibility tolerance
    
    // Logging
    output_flag?: boolean,                  // Enable solver output
    log_to_console?: boolean,               // Console logging
    highs_debug_level?: number,             // 0-4: debug verbosity
    
    // Algorithm-specific
    ipm_iteration_limit?: number,           // IPM max iterations
    pdlp_scaling?: boolean,                 // PDLP scaling
    pdlp_iteration_limit?: number,          // PDLP max iterations
    
    // File I/O
    write_solution_to_file?: boolean,       // Write solution to file
    solution_file?: string,                 // Solution file path
    write_solution_style?: number           // Solution format style
  }
}

Esquema de Saída

{
  status: 'optimal' | 'infeasible' | 'unbounded' | string,
  objective_value: number,
  solution: number[],         // Solution values for each variable
  dual_solution: number[],    // Dual values for constraints
  variable_duals: number[]    // Reduced costs for variables
}

Notas sobre Programação Quadrática (QP)

  • Apenas QP convexo: A matriz quadrática Q deve ser semidefinida positiva
  • Apenas variáveis contínuas: Variáveis inteiras/binárias não são suportadas com objetivos quadráticos (sem MIQP)
  • Formato: A função objetivo é: minimizar c^T x + 0.5 x^T Q x
  • Especificação da matriz: Ao especificar Q, os valores devem ser dobrados para considerar o fator 0.5

Casos de Uso

1. Planejamento de Produção

Otimize cronogramas de produção para maximizar o lucro respeitando restrições de recursos:

{
  problem: {
    sense: 'maximize',
    objective: {
      linear: [25, 40]  // Profit per unit
    },
    variables: [
      { name: 'ProductA' },  // Product A (defaults: cont, [0, +∞))
      { name: 'ProductB' }   // Product B (defaults: cont, [0, +∞))
    ],
    constraints: {
      dense: [
        [2, 3],  // Machine hours per unit
        [1, 2]   // Labor hours per unit
      ],
      sense: ['<=', '<='],
      rhs: [100, 80]  // Available machine/labor hours
    }
  }
}

2. Transporte/Logística

Minimize custos de transporte em uma rede de cadeia de suprimentos:

{
  problem: {
    sense: 'minimize',
    objective: {
      linear: [12.5, 14.2, 13.8, 11.9, 8.4, 9.1, 10.5, 6.2]
    },
    variables: [
      { name: 'S1_W1' }, { name: 'S1_W2' }, { name: 'S2_W1' }, { name: 'S2_W2' },
      { name: 'W1_C1' }, { name: 'W1_C2' }, { name: 'W2_C1' }, { name: 'W2_C2' }
      // All default to: cont, [0, +∞)
    ],
    constraints: {
      // Supply, flow conservation, and demand constraints (dense format)
      dense: [
        [1, 1, 0, 0, 0, 0, 0, 0],
        [0, 0, 1, 1, 0, 0, 0, 0],
        [1, 0, 1, 0, -1, -1, 0, 0],
        [0, 1, 0, 1, 0, 0, -1, -1],
        [0, 0, 0, 0, 1, 0, 1, 0],
        [0, 0, 0, 0, 0, 1, 0, 1]
      ],
      sense: ['<=', '<=', '=', '=', '>=', '>='],
      rhs: [50, 40, 0, 0, 30, 25]  // Supply, conservation, demand
    }
  }
}

3. Otimização de Portfólio

Otimize a alocação de investimentos com restrições de risco:

{
  problem: {
    sense: 'maximize',
    objective: {
      linear: [0.08, 0.12, 0.10, 0.15]  // Expected returns
    },
    variables: [
      { name: 'Bonds', ub: 0.4 },         // Max 40% in bonds
      { name: 'Stocks', ub: 0.6 },        // Max 60% in stocks
      { name: 'RealEstate', ub: 0.3 },    // Max 30% in real estate
      { name: 'Commodities', ub: 0.2 }    // Max 20% in commodities
      // All default to: cont, lb=0
    ],
    constraints: {
      dense: [
        [1, 1, 1, 1],           // Total allocation = 100%
        [0.02, 0.15, 0.08, 0.20]  // Risk constraint
      ],
      sense: ['=', '<='],
      rhs: [1, 0.10]  // Exactly 100% allocated, max 10% risk
    }
  }
}

4. Otimização de Portfólio com Risco (Programação Quadrática)

Minimize o risco do portfólio (variância) enquanto atinge o retorno alvo:

{
  problem: {
    sense: 'minimize',
    objective: {
      // Quadratic: minimize portfolio variance (risk)
      quadratic: {
        dense: [  // Covariance matrix (×2 for 0.5 factor)
          [0.2, 0.04, 0.02],
          [0.04, 0.1, 0.04], 
          [0.02, 0.04, 0.16]
        ]
      }
    },
    variables: [
      { name: 'Stock_A', lb: 0 },
      { name: 'Stock_B', lb: 0 },
      { name: 'Stock_C', lb: 0 }
    ],
    constraints: {
      dense: [
        [1, 1, 1],              // Sum of weights = 1
        [0.1, 0.12, 0.08]       // Expected return >= target
      ],
      sense: ['=', '>='],
      rhs: [1, 0.1]  // 100% allocation, min 10% return
    }
  }
}

5. Alocação de Recursos

Otimize a alocação de recursos entre projetos com restrições inteiras:

{
  problem: {
    sense: 'maximize',
    objective: {
      linear: [100, 150, 80]  // Value per project
    },
    variables: [
      { name: 'ProjectA', type: 'bin' },  // Binary: select or not
      { name: 'ProjectB', type: 'bin' },  // Binary: select or not
      { name: 'ProjectC', type: 'bin' }   // Binary: select or not
      // Binary defaults to [0, 1] bounds
    ],
    constraints: {
      dense: [
        [5, 8, 3],   // Resource requirements
        [2, 3, 1]    // Time requirements
      ],
      sense: ['<=', '<='],
      rhs: [10, 5]  // Available resources/time
    }
  }
}

5. Problemas Grandes e Esparsos

Para problemas de otimização grandes com coeficientes majoritariamente zero, use o formato esparso para melhor eficiência de memória:

{
  problem: {
    sense: 'minimize',
    objective: {
      linear: [1, 2, 3, 4]  // Minimize x1 + 2x2 + 3x3 + 4x4
    },
    variables: [
      {}, {}, {}, {}  // All default to: cont, [0, +∞)
    ],
    constraints: {
      // Sparse format: only specify non-zero coefficients
      sparse: {
        rows: [0, 0, 1, 1],    // Row indices
        cols: [0, 2, 1, 3],    // Column indices  
        values: [1, 1, 1, 1],  // Non-zero values
        shape: [2, 4]          // 2 constraints, 4 variables
      },
      // Represents: x1 + x3 >= 2, x2 + x4 >= 3
      sense: ['>=', '>='],
      rhs: [2, 3]
    }
  }
}

Use o formato esparso quando:

  • O problema tiver > 1000 variáveis ou restrições
  • A matriz tiver < 10% de coeficientes não nulos
  • A eficiência de memória for importante

6. Opções Aprimoradas do Solucionador

Ajuste fino do comportamento do solucionador com opções abrangentes do HiGHS:

{
  problem: {
    sense: 'minimize',
    objective: { linear: [1, 1] },
    variables: [{}, {}],
    constraints: {
      dense: [[1, 1]],
      sense: ['>='],
      rhs: [1]
    }
  },
  options: {
    // Algorithm Control
    solver: 'simplex',
    simplex_strategy: 1,                    // Dual simplex
    simplex_dual_edge_weight_strategy: 1,   // Devex pricing
    simplex_scale_strategy: 2,              // Equilibration scaling
    
    // Performance Tuning
    parallel: 'on',
    threads: 4,
    simplex_iteration_limit: 10000,
    
    // Tolerances
    primal_feasibility_tolerance: 1e-8,
    dual_feasibility_tolerance: 1e-8,
    
    // Debugging
    output_flag: true,
    log_to_console: true,
    highs_debug_level: 1,
    
    // MIP Control (for integer problems)
    mip_detect_symmetry: true,
    mip_max_nodes: 5000,
    mip_rel_gap: 0.001
  }
}

Categorias Principais de Opções:

  • Controle do Solucionador: Seleção de algoritmo, paralelização, limites de tempo
  • Tolerâncias: Controle de precisão para viabilidade e otimalidade
  • Opções Simplex: Estratégia, escalonamento, precificação, limites de iteração
  • Opções MIP: Detecção de simetria, limites de nós, tolerâncias de gap
  • Registro: Controle de saída, níveis de depuração, saída de arquivo
  • Específicas do Algoritmo: Opções especializadas IPM e PDLP

Recursos

  • Alto Desempenho: Construído sobre o solucionador HiGHS, um dos solucionadores de otimização open-source mais rápidos
  • Suporte a Matriz Esparsa: Manipulação eficiente de problemas de grande escala com matrizes de restrição esparsas
  • Segurança de Tipos: Suporte completo a TypeScript com validação Zod para tratamento robusto de erros
  • Formato Compacto de Variáveis: Especificações de variáveis autocontidas com padrões inteligentes
  • Tipos Flexíveis de Problemas: Suporta variáveis contínuas, inteiras e binárias
  • Múltiplos Métodos de Solução: Escolha entre simplex, ponto interior e outros algoritmos
  • Saída Abrangente: Retorna solução primal, valores duais e custos reduzidos

Desenvolvimento

Compilação

npm run build

Testes

npm test        # Run tests once
npm run test:watch  # Run tests in watch mode
npm run test:ui     # Run tests with UI

Verificação de Tipos

npx tsc --noEmit

Contribuição

Contribuições são bem-vindas! Sinta-se à vontade para enviar um Pull Request.

Licença

Licença MIT - Copyright (c) 2024 Wilfred Springer

Projetos Relacionados