> ## 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.

# RFdiffusion3 + MPNN Binder Design

> De novo binder design: RFdiffusion3 backbones + ProteinMPNN/LigandMPNN sequences

<div class="page-hero">
  <img class="page-hero-banner" src="https://proto-bio.github.io/proto-assets/images/generator/rfdiffusion-mpnn-binder/hero.png" alt="RFdiffusion3 + MPNN Binder Design" />
</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-rfdiffusion-mpnn-binder" id="none-generator-rfdiffusion-mpnn-binder" class="tab-radio-input" />

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

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

<div class="tool-tab-bar"><span class="tool-tab-wrap"><label for="tools-generator-rfdiffusion-mpnn-binder" 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-rfdiffusion-mpnn-binder" 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-rfdiffusion-mpnn-binder" 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-rfdiffusion-mpnn-binder" 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-rfdiffusion-mpnn-binder">
  <div class="tools-used-grid">
    <a href="/docs/tools/structure-design/rfdiffusion3" class="tools-used-tile">
      <img noZoom src="https://proto-bio.github.io/proto-assets/images/tool/rfdiffusion3/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>

    <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>
  </div>
</div>

<a href="https://github.com/evo-design/proto-language/blob/d3b7822f74ea64747cc751a3b2ab1aa6b799ac47/proto_language/generator/rfdiffusion_mpnn_binder_generator.py#L185" target="_blank" class="tab-panel source-panel" data-tab="source-generator-rfdiffusion-mpnn-binder">
  <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/rfdiffusion\_mpnn\_binder\_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/dguo8412" target="_blank" rel="noopener" title="dguo8412: 1 commit"><img noZoom class="entity-contributor-avatar" src="https://avatars.githubusercontent.com/u/46211285?v=4&s=64" alt="" loading="lazy" /><span class="entity-contributor-login">dguo8412</span></a></span></div>
De-novo protein binder generator chaining RFdiffusion3 and an inverse-folding model.

For each `sample()` call the generator diffuses binder backbones docked to a fixed
target (RFdiffusion3), then designs each backbone's binder-chain sequence with the
selected inverse-folding model (`proteinmpnn` or `ligandmpnn`) while keeping the
target chains fixed as structural context. With `ligandmpnn` the binder conditions on
the target's ligand/nucleotide/metal atoms, so the target may be a protein, DNA, or RNA
chain (with ligand/metal cofactors as context). The designed binder sequence is written
to `proposal.sequence` and the RFdiffusion3 target+binder complex to
`proposal.structure` (its binder chain carries RFdiffusion3's co-designed sequence, so
downstream structure-prediction constraints should re-fold `proposal.sequence`).

The binder length is the assigned segment's length. The generator fills a length-only
segment, so its category is `"mutation"` despite being a de-novo designer (same
convention as `RandomProteinGenerator`).

## 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">RFdiffusionMPNNBinderGeneratorConfig</span><a href="https://github.com/evo-design/proto-language/blob/d3b7822f74ea64747cc751a3b2ab1aa6b799ac47/proto_language/generator/rfdiffusion_mpnn_binder_generator.py#L68" 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 object for RFdiffusionMPNNBinderGenerator.

  Top-level fields describe *what* binder to design (the target, its chains, the
  epitope hotspots, and which inverse-folding model designs the sequence); the
  per-tool knobs live in nested `rfdiffusion3_config` and an inverse-folding config
  (`proteinmpnn_config` or `ligandmpnn_config`), matching how constraints nest
  tool configs (e.g. `esmfold_config`). Only the config matching `inverse_folding`
  is used; it defaults to its tool default when omitted. The binder length is taken
  from the assigned segment's length, not from this config.

  The generator injects the fields it owns at sample time and respects everything else:
  on `rfdiffusion3_config` it sets `n_batches` (to produce enough backbones for the
  proposal count) and `seed`; on the inverse-folding config it sets `seed` and reads
  `num_sequences_per_structure` as the number of sequences designed per backbone.

  <ParamField path="target_structure" type="Structure | string" required>
    Target to bind (file path, PDB/CIF content, or Structure); may include DNA/RNA/ligand chains.
  </ParamField>

  <ParamField path="target_chains" type="List[string]">
    Target chain IDs kept fixed; the binder is emitted after these chains.
  </ParamField>

  <ParamField path="hotspots" type="array">
    Target hotspot residues as '\<chain>\<resnum>' (e.g. \['A37', 'A39']).
  </ParamField>

  <ParamField path="inverse_folding" type="enum" default="proteinmpnn">
    Sequence-design model: 'proteinmpnn' (protein only) or 'ligandmpnn' (ligand/DNA/RNA/metal-aware).

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

  <ParamField path="rfdiffusion3_config" type="RFdiffusion3Config">
    Advanced RFdiffusion3 backbone-generation configuration.
  </ParamField>

  <ParamField path="proteinmpnn_config" type="ProteinMPNNSampleConfig">
    Advanced ProteinMPNN settings; used when inverse\_folding='proteinmpnn'.
  </ParamField>

  <ParamField path="ligandmpnn_config" type="LigandMPNNSampleConfig">
    Advanced LigandMPNN settings; used when inverse\_folding='ligandmpnn'.
  </ParamField>
</div>

## Usage

Build a two-segment binder program: a length-only `binder` (designed) plus a fixed
`target` segment derived from the same structure, so a scoring constraint can fold
the complex via `inputs=[binder, target]`. The generator is assigned only to the
binder; the target reaches it through config. See
`examples/scripts/binder_design_rfdiffusion_mpnn.py` for the full program.

```python python icon="python" theme={null}
>>> from proto_tools import Structure
>>> from proto_language.core import Construct, Segment
>>> from proto_language.generator import (
...     RFdiffusionMPNNBinderGenerator,
...     RFdiffusionMPNNBinderGeneratorConfig,
... )
>>> target_structure = Structure.from_file("target.pdb")
>>> target_seq = target_structure.get_chain_sequence("A", remove_non_standard=True)
>>> binder = Segment(length=80, sequence_type="protein", label="binder")
>>> target = Segment(sequence=target_seq, sequence_type="protein", label="target")
>>> construct = Construct([binder, target])  # target is fixed: no generator
>>> gen = RFdiffusionMPNNBinderGenerator(
...     RFdiffusionMPNNBinderGeneratorConfig(
...         target_structure=target_structure, target_chains=["A"], hotspots=["A37"]
...     )
... )
>>> gen.assign(binder)  # generator touches only the binder
>>> gen.sample()  # fills num_proposals binders; a constraint scores [binder, target]
```

## Metadata

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