> ## Documentation Index
> Fetch the complete documentation index at: https://proto.evodesign.org/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# MPNN Structure-Conditioned Mutation

> LigandMPNN/ProteinMPNN-guided mutation of an existing protein sequence

<div class="page-hero">
  <img class="page-hero-banner" src="https://proto-bio.github.io/proto-assets/images/generator/mpnn-mutation/hero.png" alt="MPNN Structure-Conditioned Mutation" />
</div>

<Note>
  **License:** This generator can use multiple tools, each under its own license. See the **Tools Used** tab and each tool's page for license details.
</Note>

<p class="entity-disclaimer">This generator is open source. Any third-party models, product names, or trademarks referenced are the property of their respective owners, and Proto is not affiliated with them.</p>

<hr class="entity-rule" />

<input type="radio" name="tab-generator-mpnn-mutation" id="none-generator-mpnn-mutation" class="tab-radio-input" />

<input type="radio" name="tab-generator-mpnn-mutation" id="tools-generator-mpnn-mutation" class="tab-radio-input" defaultChecked />

<input type="radio" name="tab-generator-mpnn-mutation" id="source-generator-mpnn-mutation" class="tab-radio-input" />

<div class="tool-tab-bar"><span class="tool-tab-wrap"><label for="tools-generator-mpnn-mutation" class="tool-tab tab-open badge-tools"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="7" height="7" x="3" y="3" rx="1" /><rect width="7" height="7" x="14" y="3" rx="1" /><rect width="7" height="7" x="14" y="14" rx="1" /><rect width="7" height="7" x="3" y="14" rx="1" /></svg> Tools Used</label><label for="none-generator-mpnn-mutation" class="tool-tab tab-close badge-tools"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="7" height="7" x="3" y="3" rx="1" /><rect width="7" height="7" x="14" y="3" rx="1" /><rect width="7" height="7" x="14" y="14" rx="1" /><rect width="7" height="7" x="3" y="14" rx="1" /></svg> Tools Used</label></span> <span class="tool-tab-wrap"><label for="source-generator-mpnn-mutation" class="tool-tab tab-open badge-source"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="16 18 22 12 16 6" /><polyline points="8 6 2 12 8 18" /></svg> Source</label><label for="none-generator-mpnn-mutation" class="tool-tab tab-close badge-source"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="16 18 22 12 16 6" /><polyline points="8 6 2 12 8 18" /></svg> Source</label></span></div>

<div class="tab-panel tools-panel" data-tab="tools-generator-mpnn-mutation">
  <div class="tools-used-grid">
    <a href="/docs/tools/inverse-folding/ligandmpnn" class="tools-used-tile">
      <img noZoom src="https://proto-bio.github.io/proto-assets/images/tool/ligandmpnn/social.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/tools/inverse-folding/proteinmpnn" class="tools-used-tile">
      <img noZoom src="https://proto-bio.github.io/proto-assets/images/tool/proteinmpnn/social.png" alt="" loading="lazy" />
    </a>
  </div>
</div>

<a href="https://github.com/evo-design/proto-language/blob/d3b7822f74ea64747cc751a3b2ab1aa6b799ac47/proto_language/generator/mpnn_mutation_generator.py#L241" target="_blank" class="tab-panel source-panel" data-tab="source-generator-mpnn-mutation">
  <div class="source-info">
    <img noZoom src="https://github.com/evo-design.png?size=40" class="source-avatar" width="36" height="36" />

    <span class="source-path">evo-design/proto-language<span class="source-subpath">/proto\_language/generator/mpnn\_mutation\_generator.py</span></span>
  </div>

  <span class="panel-goto-btn source-goto-btn"><span><svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor"><path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z" /></svg> View source</span></span>
</a>

<div class="entity-contributors"><span class="entity-contributors-label">Generator contributors</span><span class="entity-contributors-people"><a class="entity-contributor" href="https://github.com/brianhie" target="_blank" rel="noopener" title="brianhie: 5 commits"><img noZoom class="entity-contributor-avatar" src="https://avatars.githubusercontent.com/u/6365340?v=4&s=64" alt="" loading="lazy" /><span class="entity-contributor-login">brianhie</span></a><a class="entity-contributor" href="https://github.com/bviggiano" target="_blank" rel="noopener" title="bviggiano: 4 commits"><img noZoom class="entity-contributor-avatar" src="https://avatars.githubusercontent.com/u/21143637?v=4&s=64" alt="" loading="lazy" /><span class="entity-contributor-login">bviggiano</span></a></span></div>
Mutate protein sequences using MPNN structure-conditioned probabilities.

## API Reference

<div class="api-model-section api-model-static api-config-section">
  <div class="api-model-header"><span class="api-model-badge api-config-badge">Config</span><span class="api-model-name">MPNNMutationGeneratorConfig</span><a href="https://github.com/evo-design/proto-language/blob/d3b7822f74ea64747cc751a3b2ab1aa6b799ac47/proto_language/generator/mpnn_mutation_generator.py#L51" target="_blank" class="func-table-btn func-source-btn api-model-source"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="16 18 22 12 16 6" /><polyline points="8 6 2 12 8 18" /></svg> Source</a></div>

  Configuration for structure-conditioned MPNN mutation.

  The generator scores the current sequence against a backbone, chooses
  mutable positions using the model's probability of the current residue,
  then replaces each chosen residue from the model's per-position amino-acid
  distribution.

  <ParamField path="model" type="enum" default="ligandmpnn">
    Structure-conditioned model used for mutation probabilities: ligandmpnn or proteinmpnn.

    Options: `ligandmpnn`, `proteinmpnn`
  </ParamField>

  <ParamField path="structure_source" type="enum" default="configured_structure_inputs">
    Use configured structure\_inputs or each proposal's attached structure for MPNN scoring.

    Options: `configured_structure_inputs`, `proposal_structure`
  </ParamField>

  <ParamField path="structure_inputs" type="array">
    Structures for MPNN scoring; templates when structure\_source='proposal\_structure'.
  </ParamField>

  <ParamField path="output_chain_id" type="string">
    Structure chain corresponding to the assigned sequence. Required for ambiguous multi-chain inputs.
  </ParamField>

  <ParamField path="num_mutations" type="integer" default="1">
    Number of positions to resample per sequence.
  </ParamField>

  <ParamField path="mutable_positions" type="ResidueSelection">
    Optional per-chain 1-indexed positions eligible for mutation. If unset, the output chain is mutable.
  </ParamField>

  <ParamField path="excluded_amino_acids" type="array">
    Single-letter amino acids to forbid as replacement residues.
  </ParamField>

  <ParamField path="replacement_strategy" type="enum" default="sample">
    'sample' draws from MPNN probabilities; 'argmax' chooses the highest-probability residue.

    Options: `sample`, `argmax`
  </ParamField>

  <ParamField path="replacement_temperature" type="number" default="1.0">
    Temperature applied to MPNN logits before replacement sampling.
  </ParamField>

  <ParamField path="proteinmpnn_model_choice" type="enum" default="proteinmpnn">
    ProteinMPNN weights used when model='proteinmpnn'.

    Options: `proteinmpnn`, `v_48_002`, `v_48_010`, `v_48_030`, `abmpnn`, `soluble`
  </ParamField>

  <ParamField path="use_side_chain_context" type="boolean" default="False">
    Whether LigandMPNN scoring conditions on fixed-residue sidechain atoms.
  </ParamField>

  <ParamField path="cutoff_for_score" type="number" default="8.0">
    Ligand-residue distance cutoff (Å) used by LigandMPNN scoring.
  </ParamField>

  <ParamField path="ligand_mpnn_model_type" type="enum" default="ligand_mpnn">
    LigandMPNN implementation used for scoring: Foundry-backed ligand\_mpnn or original LigandMPNN.

    Options: `ligand_mpnn`, `original`
  </ParamField>

  <ParamField path="ligand_mpnn_checkpoint_path" type="string">
    Optional explicit LigandMPNN checkpoint path.
  </ParamField>

  <ParamField path="ligand_mpnn_tool_seed" type="integer">
    Optional seed passed directly to LigandMPNN scoring; None uses Proto's derived seed stream.
  </ParamField>

  <ParamField path="rng_mode" type="enum" default="derived_seed">
    Use Proto's per-proposal derived seed or NumPy's global RNG stream for mutation sampling.

    Options: `derived_seed`, `global`
  </ParamField>

  <ParamField path="rng_seed" type="integer">
    Optional seed applied once when rng\_mode='global'.
  </ParamField>

  <ParamField path="post_mutation_score_mode" type="enum" default="disabled">
    Optional MPNN scoring mode used to refresh pmpnn after applying mutations.

    Options: `disabled`, `single_aa`, `autoregressive`
  </ParamField>

  <ParamField path="post_mutation_structure_preparation" type="StructurePreparationConfig">
    Optional structure preparation used to attach sequence-consistent structures after mutation.
  </ParamField>

  <ParamField path="device" type="string" default="cuda">
    Device for MPNN scoring.
  </ParamField>

  <ParamField path="verbose" type="boolean" default="False">
    Whether to print status messages during MPNN scoring.
  </ParamField>
</div>

## Usage

```python python icon="python" theme={null}
from proto_language.generator import MPNNMutationGenerator, MPNNMutationGeneratorConfig
from proto_language.core import Segment

config = MPNNMutationGeneratorConfig(
    # Configure parameters here
)

generator = MPNNMutationGenerator(config)

segment = Segment(length=100, sequence_type="protein")
generator.assign(segment)
generator.sample()
```

## Metadata

| Property                 | Value                   |
| ------------------------ | ----------------------- |
| Key                      | `mpnn-mutation`         |
| Class                    | `MPNNMutationGenerator` |
| Category                 | `mutation`              |
| Input Type               | `starting_sequence`     |
| Uses GPU                 | `True`                  |
| Supported Sequence Types | `protein`               |
| Allows Empty Start       | `False`                 |
