Skip to main content
Glama

Evo2-7B Bioinformatics MCP Server

Ein Server, der die von NVIDIA gehostete Evo2-7B Forward API als MCP (Model Context Protocol) Tools kapselt, sodass Agents wie Claude Code, Cursor, Codex Evo2 über natürliche Sprache steuern können:

Agent
  ↓
MCP Tool
  ↓
Evo2 MCP Server(本项目)
  ↓
NVIDIA Evo2-7B Forward API
  ↓
forward outputs → likelihood / variant scores
  ↓
Agent
POST https://health.api.nvidia.com/v1/biology/arc/evo2-7b/forward
Authorization: Bearer $NVIDIA_API_KEY

1. Projektübersicht

Stellt 5 MCP-Tools bereit:

Tool

Funktion

evo2_forward

Führt Evo2-7B-Forward-Inferenz auf einer DNA-Sequenz aus und gibt Statistiken der Ausgabe der angegebenen Layer zurück (oder speichert den rohen Tensor)

evo2_score

Berechnet die modellbasierte Likelihood des Evo2-Modells für eine DNA-Sequenz (total / mean / per-position)

evo2_variant_score

Vergleicht den Effekt einer einzelnen Nukleotidvariante auf die Evo2-Sequenz-Likelihood (Δ log-likelihood)

evo2_batch_score

Vergleicht mehrere Nukleotidvarianten im Stapel (nutzt einen einzigen WT-Forward, begrenzte Parallelität, automatische Deduplizierung)

evo2_score_fasta

Bewertet jeden Datensatz in einer FASTA-Datei (lokale Pfade durch die EVO2_MCP_ALLOWED_DIRS-Sandbox eingeschränkt)

Dieses Projekt ist ein Bioinformatics MCP Tool Server, kein einfacher HTTP-API-Wrapper:

  • Automatische Validierung/Normalisierung von DNA-Sequenzen (Großschreibung, Entfernen von Leerzeichen, klare Fehlermeldung bei ungültigen Zeichen)

  • Berechnung der Likelihood basierend auf der offiziellen Semantik (Byte-Level-Tokenizer + Causal Shift, siehe §17)

  • Mehrstufiges Ausgabedesign (summary / raw / save), um eine Explosion des MCP-Kontexts zu verhindern

  • Vollständige Fehlerklassifizierung (400/401/403/404/408/413/422/429/5xx/Timeout) + Retry/Backoff

  • API-Key wird nur aus Umgebungsvariablen gelesen, niemals hartkodiert, niemals in Logs

  • Begleitende Batch-Skripte: scripts/score_fasta.py (Batch-FASTA-Scoring + Embedding-Extraktion, siehe §18) und scripts/analyze_run.py (Cluster-/Klassifikations-/Regressions-Nachanalyse, siehe §19)

Related MCP server: Evo2 MCP Server

2. Einführung in die Evo2-API

Evo2 (Arc Institute / NVIDIA) ist ein DNA-Basismodell (StripedHyena2-Architektur); die 7B-Version hat 32 Layer, ist Apache-2.0-lizenziert und hat einen Trainingskontext von bis zu 1M bp. NVIDIA bietet einen gehosteten NIM-Dienst an:

  • Forward-Endpunkt: POST https://health.api.nvidia.com/v1/biology/arc/evo2-7b/forward

  • Anfragekörper (offizielles OpenAPI ForwardInputs):

    { "sequence": "ACGTACGT...", "output_layers": ["output_layer"] }

    output_layers unterstützt 1–100 Layernamen (z. B. output_layer, decoder.layers.24.mlp.linear_fc2, decoder.layers.3.self_attention, embedding, decoder.final_norm).

  • Antwortkörper (offizielles OpenAPI ForwardOutputs): {"data": "<base64 编码的 NPZ>", "elapsed_ms": <int>}; sehr große Antworten können mit Content-Type: application/zip (rohe NPZ-Bytes) zurückgegeben werden.

  • output_layer = finale Logits, Shape [seq_len, batch_size, 512] (512 ist die gepaddete Vocabulary-Größe des Byte-Level-Tokenizers).

⚠️ Deprecation-Hinweis (am 2026-08-24 verifiziert): Der auf build.nvidia.com gehostete arc/evo2-7b-Endpunkt wurde als Deprecated markiert (Seite zeigt „This NIM Endpoint has been deprecated"). Die offizielle NIM-Dokumentation (docs.nvidia.com/nim/bionemo/evo2/latest/) beschreibt eine API, die mit dem gehosteten Endpunkt völlig übereinstimmt; falls der gehostete Endpunkt nicht verfügbar ist, kann stattdessen ein selbst gehosteter NIM-Container verwendet werden, wobei EVO2_MCP_BASE_URL auf http://localhost:8000/biology/arc/evo2 zeigt.

Verifizierte offizielle Fakten (Implementierungsbasis, 2026-08-24)

Aspekt

Ergebnis

Quelle

Antwortformat

JSON {"data": base64-NPZ, "elapsed_ms"}; oder application/zip rohe NPZ

NVIDIA-NIM-Endpunktdokumentation + gehostetes OpenAPI-Schema (ForwardOutputs)

output_layer shape

[seq_len, batch_size, 512], float, also Logits

Ebenda („Final output/logits")

Vocabulary-Größe

512 (gepaddet); Byte-Level-Tokenizer, 1 bp = 1 Token

NVIDIA-Dokumentation + Arc/vortex CharLevelTokenizer(512)

A/C/G/T → logits index

A=65, C=67, T=84, G=71 (ASCII-Bytewerte)

Originaltext der NVIDIA-Dokumentation + np.frombuffer(text.encode(), np.uint8)

BOS/EOS/offset

Standardmäßig kein BOS (Arc score_sequences prepend_bos=False); eod_id=0, pad_id=1

Arc evo2/models.py + evo2/scoring.py

Likelihood-Berechnung

log_softmax(logits, -1) danach Causal Shift: logits[:, :-1] vs input_ids[:, 1:]; Position 0 geht nicht in die Bewertung ein; eine Sequenz der Länge N erhält N-1 Scores

Arc evo2/scoring.py logits_to_logprobs

Spezielle Tokens

Im Output sind nur die 4 Tokens A/C/G/T bedeutungsvoll (Originaltext der NIM-Dokumentation)

NVIDIA-Dokumentation

Unterschiede zwischen Live-Test und Dokumentation (Live-Verifizierung am 2026-08-24; die Aufgabe verlangt die Erfassung der tatsächlichen API)

Beim Testen des gehosteten health.api.nvidia.com-Endpunkts mit einem echten Key wurde festgestellt, dass die in der Dokumentation genannten Layernamen auf dem gehosteten Endpunkt nicht gelten:

Angefragter Layername

Tatsächliches Verhalten der gehosteten API

output_layer (Dokumentationsname)

422 {"error":"StripedHyena has no attribute 'output_layer'"}

decoder.layers.N.* / embedding / final_norm

❌ 422 has no attribute

unembed (Modellattributname)

finale Logits: NPZ-Key unembed.output, Shape (1, seq_len, 512), dtype float64

embedding_layer

embedding_layer.output, (1, seq, 4096)

norm

norm.output, (1, seq, 4096)

blocks.N.mlp / blocks.N

blocks.N.mlp.output, (1, seq, 4096)

Gegenmaßnahmen (implementiert und live bestanden):

  • Neue Konfiguration EVO2_MCP_LOGITS_LAYER (Standard auto): Die Scoring-Tools versuchen zuerst den Dokumentationsnamen output_layer; bei 422 has no attribute (gehosteter Endpunkt) wechseln sie automatisch zu unembed und cachen die Wahl, sodass keine weitere Erkundung nötig ist. Bei selbst gehosteten NIM-2.x-Containern gelingt der Aufruf sofort, ohne zusätzliche Anfragen.

  • Der NPZ-Parser unterstützt sowohl nackte Keys (output_layer) als auch <name>.output (unembed.output) und greift als Fallback auf die Heuristik „letzte Dimension = 512" zurück.

  • 422-Fehlermeldungen weisen jetzt auf die auf dem gehosteten Endpunkt verfügbaren Attributnamen hin.

Wenn das zurückgegebene seq_len nicht mit der Länge der Eingabesequenz übereinstimmt (z. B. weil der Server Padding/BOS hinzugefügt hat), verweigert dieser Server die Berechnung der Likelihood und gibt rohe Statistiken + eine klare Erklärung zurück; eine Ausrichtung wird nie erraten.

3. NVIDIA-API-Key erhalten

  1. Öffnen Sie https://build.nvidia.com/, oben rechts Get API Key (Anmeldung mit NVIDIA-Konto erforderlich).

  2. Erstellen Sie einen Key (in der Form nvapi-xxxxxxxx...).

  3. Setzen Sie ihn als Umgebungsvariable, nicht in Code / Konfiguration / Git:

    export NVIDIA_API_KEY="nvapi-xxxxxxxx"

    Oder kopieren Sie .env.example zu .env und füllen Sie es aus (.env wird von .gitignore ignoriert).

4. Installation

# 推荐:pip / uv
pip install -e ".[dev]"
# 或
uv sync --extra dev

# 推荐(本项目自带):pixi 项目本地环境
pixi install
pixi run test

Erfordert Python >= 3.10 (empfohlen 3.11+). Kernabhängigkeiten: mcp>=2.0, httpx>=0.27, numpy>=1.26, pydantic>=2.6, python-dotenv>=1.0. Das AnalysesSkript (scripts/analyze_run.py) benötigt zusätzlich Dev-Abhängigkeiten: scikit-learn, pandas, matplotlib.

5. Umgebungsvariablen

Variable

Standard

Beschreibung

NVIDIA_API_KEY

Keiner (erforderlich)

API-Key, wird nur von hier gelesen

EVO2_MCP_BASE_URL

https://health.api.nvidia.com/v1/biology/arc/evo2-7b

Dienstadresse (bei selbst gehostetem NIM ändern)

EVO2_MCP_TIMEOUT

120

HTTP-Lese-Timeout (Sekunden)

EVO2_MCP_MAX_RETRIES

4

Maximale Anzahl Wiederholungen bei 408/429/5xx

EVO2_MCP_MAX_CONCURRENCY

2

Maximale Parallelität für Batch/FASTA

EVO2_MCP_ALLOWED_DIRS

leer

Verzeichnisse, aus denen FASTA-Dateien gelesen werden dürfen (:-getrennt)

EVO2_MCP_OUTPUT_DIR

./output

Ausgabeverzeichnis für mode="save" (auch der einzige erlaubte Ort für save_path)

EVO2_MCP_ALLOW_AMBIGUOUS

0

Auf 1 setzen, um N-Basen durchzureichen (siehe §15)

EVO2_MCP_MAX_SEQUENCE_LENGTH

1000000

Harte Obergrenze für Sequenzlänge

EVO2_MCP_RAW_INLINE_MAX

4096

Maximale Gesamtzahl der Tensor-Elemente, die bei mode="raw" inline zurückgegeben werden dürfen

EVO2_MCP_MAX_PER_POSITION

5000

Obergrenze für zurückgegebene Per-Position-Listen (bei Überschreitung werden Anfang und Ende genommen)

EVO2_MCP_LOGITS_LAYER

auto

Layername für Logits beim Scoring: auto erkennt automatisch (bei Fehlschlag des Dokumentationsnamens output_layer Wechsel zu unembed auf dem gehosteten Endpunkt); auch explizit angebbar

6. CLI-Start

# 三种方式等价
python -m evo2_mcp
evo2-mcp
uv run evo2-mcp      # 用 uv 管理的项目环境
# pixi 环境:
pixi run evo2-mcp

Der Server kommuniziert über stdio mit MCP-Clients; nach erfolgreichem Start gibt es keine Ausgabe (wartet auf den MCP-Handshake).

7. MCP-Konfiguration

Claude Code (.mcp.json)

{
  "mcpServers": {
    "evo2": {
      "command": "uv",
      "args": ["run", "evo2-mcp"],
      "env": {
        "NVIDIA_API_KEY": "${NVIDIA_API_KEY}"
      }
    }
  }
}

Hinweis: Ob ${NVIDIA_API_KEY} vom Client expandiert wird, hängt von der Client-Implementierung ab. Die sicherste Methode ist, den echten Key direkt einzutragen:

{
  "mcpServers": {
    "evo2": {
      "command": "uv",
      "args": ["run", "evo2-mcp"],
      "env": {
        "NVIDIA_API_KEY": "YOUR_API_KEY"
      }
    }
  }
}

Aber committen Sie niemals eine .mcp.json mit einem echten Key nach Git (fügen Sie die Datei zu .gitignore hinzu oder injizieren Sie den Key über Umgebungsvariablen/Secret-Management-Tools). Alternativ kann env weggelassen werden; der Server-Prozess liest NVIDIA_API_KEY selbst aus der Umgebung oder .env:

{
  "mcpServers": {
    "evo2": {
      "command": "uv",
      "args": ["run", "evo2-mcp"]
    }
  }
}

Cursor (~/.cursor/mcp.json oder Projekt-.cursor/mcp.json)

{
  "mcpServers": {
    "evo2": {
      "command": "uv",
      "args": ["run", "evo2-mcp"],
      "env": { "NVIDIA_API_KEY": "YOUR_API_KEY" }
    }
  }
}

Codex (~/.codex/config.toml)

[mcp_servers.evo2]
command = "uv"
args = ["run", "evo2-mcp"]
env = { "NVIDIA_API_KEY" = "YOUR_API_KEY" }

Selbst gehostetes NIM

{
  "mcpServers": {
    "evo2": {
      "command": "uv",
      "args": ["run", "evo2-mcp"],
      "env": {
        "EVO2_MCP_BASE_URL": "http://localhost:8000/biology/arc/evo2"
      }
    }
  }
}

8. Tool-Liste

evo2_forward(sequence, output_layers=["output_layer"], mode="summary", save_path=None)

Führt Evo2-7B-Forward-Inferenz auf einer DNA-Sequenz aus. mode:

  • "summary" (Standard): gibt für jeden Layer shape / dtype / min / max / mean / std zurück, kontextsicher;

  • "save": speichert den rohen Tensor als .npz (output/evo2_forward_<时间戳>.npz) und gibt den Pfad zurück;

  • "raw": gibt den vollständigen Tensor inline zurück (nur wenn die Gesamtzahl der Elemente ≤ EVO2_MCP_RAW_INLINE_MAX, Standard 4096, um eine Kontextexplosion zu verhindern).

Hinweis zu Layernamen: Der gehostete Endpunkt health.api.nvidia.com akzeptiert Modellattributnamen (für Logits unembed, außerdem embedding_layer, norm, blocks.N.mlp); die Dokumentationsnamen output_layer/decoder.layers.N.* gelten nur für selbst gehostete NIM-2.x-Container. evo2_score/evo2_variant_score/evo2_batch_score/evo2_score_fasta erkennen dies automatisch, keine manuelle Angabe nötig; nur beim direkten Aufruf von evo2_forward muss der Name passend zum tatsächlichen Endpunkt gewählt werden.

evo2_score(sequence, include_per_position=False)

Berechnet die Likelihood von Evo2 für die Sequenz:

{
  "sequence_length": 123,
  "total_log_likelihood": -123.45,
  "mean_log_likelihood": -1.2345,
  "scored_positions": 122,
  "per_position_log_likelihood": null,
  "method_notes": "...",
  "disclaimer": "..."
}

Semantik (übereinstimmend mit der offiziellen Arc-Implementierung): logits[i] sagt die Base an Position i+1 voraus; nach Log-Softmax über den vollständigen 512-Vocab wird der Byte-Index der Zielbase genommen; Position 0 geht nicht in die Bewertung ein, daher gilt scored_positions = length - 1, und mean ist der Durchschnitt dieser N-1 Werte. per_position_log_likelihood[k] entspricht der 0-basierten Position k+1 (also der 1-basierten Position k+2). Wenn das von der API zurückgegebene seq_len nicht zur Sequenz ausgerichtet werden kann, werden keine Ergebnisse erfunden; es werden rohe Statistiken und eine klare Erklärung zurückgegeben:

Likelihood calculation is not supported until the API output format is verified.

evo2_variant_score(sequence, position, ref, alt, coordinate="1-based", include_per_position=False)

{
  "position": 100,
  "ref": "A",
  "alt": "G",
  "wildtype_log_likelihood": -500.1,
  "mutant_log_likelihood": -500.5,
  "delta_log_likelihood": -0.4,
  "interpretation": "The mutant sequence is less likely than the wildtype under Evo2-7B ... (NOT a clinical pathogenicity call)"
}

Validierungskette: Positionsbereich → Koordinatenumrechnung → ref muss mit der Base an dieser Position der Sequenz übereinstimmen → refalt → 1-basierte Position 1 (0-basiert 0) kann nicht bewertet werden (ein kausales LM kann dem ersten Token keine Wahrscheinlichkeit zuweisen) → klare Fehlermeldung.

evo2_batch_score(sequence, variants, coordinate="1-based")

{
  "sequence_length": 300,
  "wildtype_log_likelihood": -1200.0,
  "variants": [
    { "position": 100, "ref": "A", "alt": "G", "delta_log_likelihood": -0.42 },
    { "position": 200, "ref": "C", "alt": "T", "delta_log_likelihood": 0.13 }
  ]
}
  • Der WT-Forward wird nur einmal berechnet und für alle Varianten wiederverwendet;

  • Mutanten mit gleichem (position, alt) werden nur einmal ge-forewarded (Memoization);

  • Die Parallelität ist durch EVO2_MCP_MAX_CONCURRENCY begrenzt (Standard 2, respektiert das NVIDIA-Rate-Limit);

  • Ein einzelner Variantenfehler beeinträchtigt nicht den gesamten Batch (pro Eintrag wird error zurückgegeben).

evo2_score_fasta(fasta_path=None, fasta_text=None)

>sequence_1
ACGTACGT...
>sequence_2
TTGGCCAA...
  • fasta_text: Inline-FASTA (standardmäßig verfügbar, mit Größen-/Datensatz-Obergrenzen);

  • fasta_path: Lesen nur erlaubt, wenn die Datei innerhalb von EVO2_MCP_ALLOWED_DIRS liegt; andernfalls klare Ablehnung;

  • Gibt pro Eintrag total_log_likelihood / mean_log_likelihood zurück; ein einzelner Fehler wirkt sich nicht auf die übrigen aus.

9. Anwendungsbeispiele

{
  "sequence": "acgtACGT acgt",           // 小写 + 空白自动处理
  "output_layers": ["output_layer"],
  "mode": "summary"
}

Rückgabe:

{
  "sequence_length": 12,
  "requested_output_layers": ["output_layer"],
  "returned_layers": ["output_layer"],
  "layer_stats": [
    { "name": "output_layer", "shape": [12, 1, 512], "dtype": "float32",
      "size": 6144, "min": -3.21, "max": 4.02, "mean": 0.01, "std": 0.98 }
  ],
  "api": { "elapsed_ms": 87 }
}

Wenn der Agent die vollständigen Logits möchte:

{ "sequence": "ACGT...", "mode": "save" }
{
  "saved": true,
  "path": "/abs/path/output/evo2_forward_20260824_153000.npz",
  "bytes_on_disk": 24576,
  "layer_stats": [...]
}

10. FASTA-Beispiel

{
  "fasta_text": ">geneA\nACGTACGTACGT\n>geneB\nTTGGCCAATTGG"
}

(oder "fasta_path": "/data/genomes/genes.fa"; dafür muss EVO2_MCP_ALLOWED_DIRS=/data/genomes konfiguriert sein)

Für großes FASTA-Scoring (z. B. ganze Verzeichnisse mit Enhancern/Promotern) plus Embedding-Extraktion verwenden Sie scripts/score_fasta.py (siehe §18) – jeder Lauf erzeugt einen eigenen Run-Ordner (scores.csv + embeddings.npz).

11. Beispiel für Varianten-Scoring

{
  "sequence": "ACGTACGTACGTACGTACGT",
  "position": 10,
  "ref": "A",
  "alt": "G"
}

12. Beispiel für Batch-Scoring

{
  "sequence": "ACGTACGTACGTACGTACGT",
  "variants": [
    { "position": 10, "ref": "A", "alt": "G" },
    { "position": 12, "ref": "T", "alt": "C" },
    { "position": 14, "ref": "A", "alt": "T" }
  ]
}

Typischer Agent-Workflow (entspricht „Analysiere alle SNPs auf der Sequenz und finde die 20 mit der größten Änderung des Evo2-Scores"):

读取输入 → 解析 DNA / VCF → 生成 WT / mutant → evo2_batch_score
→ 按 |delta_log_likelihood| 排序 → 取前 20 → 保存 CSV → 解释结果

13. Fehlerbehandlung

HTTP

Bedeutung

Verhalten dieses Servers

400

Bad Request (einschließlich ungültiger Sequenzen usw.)

Gibt sofort einen Fehler aus, mit Antwortzusammenfassung

401

API-Key ungültig

Gibt sofort einen Fehler aus und weist darauf hin, NVIDIA_API_KEY zu prüfen

403

Keine Berechtigung (verwalteter Endpunkt veraltet usw.)

Gibt sofort einen Fehler aus und nennt mögliche Ursachen

404

Pfad existiert nicht

Gibt sofort einen Fehler aus und weist darauf hin, EVO2_MCP_BASE_URL zu prüfen

408

Server-Timeout

Fehler nach begrenzten Wiederholungen (backoff)

413

Payload zu groß

Gibt sofort einen Fehler aus und empfiehlt, die Sequenz oder die Anzahl der Layer zu reduzieren

422

Parametervalidierung fehlgeschlagen

Gibt sofort einen Fehler mit Details aus

429

Rate limit

Wiederholung + exponentieller Backoff (beachtet Retry-After, Obergrenze 60s), Obergrenze EVO2_MCP_MAX_RETRIES

5xx

NVIDIA-Serverfehler

Fehler nach begrenzten Wiederholungen

timeout

Anfrage-Timeout (EVO2_MCP_TIMEOUT Sekunden)

Eindeutige Fehlermeldung: NVIDIA Evo2 API request timed out., kein nackter traceback

Alle Fehler werden über MCP als strukturiertes JSON zurückgegeben: {"error": "Evo2APIError", "message": "..."}. Ein einzelner Fehlschlag in evo2_batch_score liefert {"error": ..., "status": ...} zurück und unterbricht den gesamten Batch nicht.

14. Rate limit

Das von NVIDIA gehostete NIM hat ein Rate Limit. Design-Gegenmaßnahmen:

  • EVO2_MCP_MAX_CONCURRENCY (Standard 2) begrenzt die Parallelität;

  • 429 → exponentieller Backoff (1s, 2s, 4s, 8s, 16s…, Deckelung bei 30s + Jitter; falls Retry-After vorhanden, wird dieses bevorzugt befolgt, aber mit Obergrenze 60s);

  • Wiederholungsobergrenze EVO2_MCP_MAX_RETRIES (Standard 4), keine unendlichen Wiederholungen;

  • Innerhalb eines Batches wird der WT nur einmal berechnet, identische Mutanten werden dedupliziert, um die Anzahl der Anfragen zu reduzieren.

15. Sicherheitshinweise

  • API-Key: Wird nur aus der Umgebungsvariable NVIDIA_API_KEY (oder .env) gelesen; es gibt keinen hartkodierten Key im Code; Logs erfassen nur URL, Sequenzlänge und Layer-Namen, keine Sequenzinhalte oder Keys; Fehlermeldungen enthalten nur eine Zusammenfassung der ersten 500 Zeichen der Antwort.

  • Sequenz-Privatsphäre: Alle Logs/Fehler enthalten nur preview (z. B. ACGT...GCTA (len=12345)).

  • Pfad-Sandbox:

    • FASTA-Lesen ausschließlich innerhalb von EVO2_MCP_ALLOWED_DIRS; wenn nicht konfiguriert, werden alle lokalen Pfade abgelehnt;

    • Der save_path bei mode="save" muss innerhalb von EVO2_MCP_OUTPUT_DIR liegen;

  • .gitignore enthält bereits .env, *.env, output/, *.npz.

  • N-Basen: Standardmäßig abgelehnt mit eindeutiger Fehlermeldung (das Evo2-Modell wurde nicht auf mehrdeutigen Basen evaluiert; die Dokumentation garantiert nur, dass A/C/G/T aussagekräftig sind). Falls N tatsächlich durchgereicht werden muss, mit EVO2_MCP_ALLOW_AMBIGUOUS=1 starten – das ist eine explizite Entscheidung, kein stilles Verwerfen.

  • Don't execute: Dieser Server führt keinerlei Shell-Ausführungen aus; über FASTA-/Sequenzeingaben kann der Agent nur eingeschränkte HTTP-Anfragen auslösen.

16. Grenzen der biologischen Interpretation

  • Der Evo2-Score ist eine model-based sequence likelihood change, keine experimentelle Evidenz und schon gar keine klinische Pathogenitätsdiagnose.

  • delta_log_likelihood < 0 darf nur als „die Mutantensequenz ist unter dem Modell unwahrscheinlicher" interpretiert werden, nicht als „pathogen".

  • Erst mit Downstream-Validierung (Experimente, Populationsfrequenzen, ClinVar-Annotationen, Auswirkungen auf die Proteinstruktur usw.) kann über Pathogenität gesprochen werden.

  • Die Beschreibung jedes Tools enthält den folgenden Hinweis (für MCP-Clients sichtbar):

This is a DNA foundation model inference tool. It does not provide clinical
diagnosis. Model scores should not be interpreted as pathogenicity labels
without additional validation.

17. Implementierungsgrundlagen und Validierungsquellen (2026-08-24)

  • NVIDIA NIM for Evo 2 – Endpoints: https://docs.nvidia.com/nim/bionemo/evo2/latest/endpoints.html

  • NVIDIA NIM for Evo 2 – Quickstart: https://docs.nvidia.com/nim/bionemo/evo2/latest/quickstart-guide.html

  • Referenz der von NVIDIA gehosteten API (arc/evo2-7b-forward OpenAPI-Schema): https://docs.api.nvidia.com/nim/reference/arc-evo2-7b-infer

  • Praxistest des verwalteten Endpunkts (2026-08-24, echter Key): output_layer liefert 422 StripedHyena has no attribute 'output_layer'; unembed liefert die Logits (NPZ-Key unembed.output, Shape (1, seq, 512), float64) – daher erkennt das Scoring-Tool den Layer standardmäßig automatisch über EVO2_MCP_LOGITS_LAYER=auto.

  • Praxistest im Batch (2026-08-25, echter Key, 3800+ K562-Enhancer/Promotoren):

    • Bei Sequenzen > ~100 kb liefert der verwaltete Endpunkt 422 (PyTorch-canUse32BitIndexMath-Limit) – für Batch-Läufe --skip-longer-than 100000 verwenden;

    • Der Race Condition bei der automatischen Erkennung des Layer-Namens unter Parallelität wurde behoben (forward_logits verwendet lokale Variablen, um die Versuchsnamen zu erfassen) und mit einem Regressionstest abgesichert;

    • Embedding-Extraktion: norm/embedding_layer/blocks.N sind alle verfügbar, Shape (1, seq, 4096) float64 (nach Mean-Pooling 4096-dimensional).

  • Arc-Institute-Evo2-Repository (scoring.py, models.py): https://github.com/ArcInstitute/evo2

  • vortex CharLevelTokenizer (offizielle Evo2-Tokenizer-Implementierung): PyPI-vtx-1.1.0-Quellcode vortex/model/tokenizer.py

  • Evo2-Modellkarte: https://huggingface.co/ArcInstitute/evo2_7b

Falls NVIDIA die API anpasst, gilt die offizielle aktuelle Dokumentation; EVO2_MCP_BASE_URL kann jederzeit umgestellt werden.

18. Batch-Scoring und Embedding-Extraktion (scripts/score_fasta.py)

MCP-Tools eignen sich für interaktive Agent-Aufrufe; für Batch-Scoring großer FASTA-Mengen dient das zugehörige Skript scripts/score_fasta.py (mit der echten API anhand von 3800+ K562-Enhancer/Promotoren validiert).

Jeder Lauf erstellt automatisch einen eigenen Ordner mit Zeitstempel:

output/run_20260825_104403/
├── scores.csv            # 每序列一行:id, header, length, total/mean LL, ...
│                         #   + embedding_key(与 embeddings.npz 的 record_ids 对齐)
└── embeddings.npz        # embeddings: (n, 4096) float32 mean-pooled 矩阵
                          # record_ids: 与矩阵行一一对应的键(来源__序列id)
# 小样本(指定 id)
.pixi/envs/dev/bin/python scripts/score_fasta.py \
  --fasta /path/cis/enhancers.fa /path/cis/promoters.fa \
  --ids K562_TE_629,K562_MPT_6842 --allow-ambiguous

# 全量(跳过 >100kb —— 托管端对该长度返回 422;保留原始 embedding)
.pixi/envs/dev/bin/python scripts/score_fasta.py \
  --fasta /path/cis/enhancers.fa /path/cis/promoters.fa \
         /path/trans/enhancers.fa /path/trans/promoters.fa \
  --skip-longer-than 100000 --allow-ambiguous \
  --embedding-layer norm --keep-raw-embeddings

Wichtige Parameter:

Parameter

Beschreibung

--embedding-layer norm|blocks.31|embedding_layer|none

Von welchem Layer das Embedding extrahiert wird (Standard norm); none nur Scoring

--keep-raw-embeddings

Zusätzlich jedes rohe positionsweise Embedding (1, seq, 4096) in embeddings_raw/ speichern (großer Speicherplatzbedarf: 10-kb-Sequenz ≈ 328 MB; Standard: nicht speichern)

--skip-longer-than 100000

Sequenzen überspringen, die länger als dieser Wert sind (Limit der verwalteten API, siehe §17)

--allow-ambiguous

N-Basen-Durchreichung erlauben (5 N-haltige Sequenzen laufen normal mit Caveat-Warnung)

--max-concurrency 2

Parallelität (Standard 2, respektiert das Rate Limit)

--out / --embeddings-out / --embedding-raw-dir

Überschreibt das Standard-Layout des Run-Ordners

Effizienzdesign: Pro Sequenz wird nur eine Anfrage gesendet (output_layers=["unembed","norm"], Logits und Embedding werden zusammen abgerufen); der Logits-Layer-Name wird pro Lauf nur einmal erkannt; die Parallelität wird über ein Semaphor begrenzt.

19. Embedding-Verknüpfung und Downstream-Analyse (scripts/analyze_run.py)

embeddings.npz ist die mean-gepoolte Sequenzrepräsentation (ein 4096-dimensionaler Vektor pro Sequenz) und eignet sich direkt für Clusterung, Klassifikation und Regression. Laden und Verknüpfen:

import csv, numpy as np

run = "output/run_20260825_104403"
rows = list(csv.DictReader(open(f"{run}/scores.csv")))
d = np.load(f"{run}/embeddings.npz", allow_pickle=True)
X = d["embeddings"]                        # (n, 4096) float32
ids = [str(x) for x in d["record_ids"]]    # 与 X 行一一对应
key_to_row = {r["embedding_key"]: r for r in rows if r.get("embedding_key")}
scores = [key_to_row[k] for k in ids]      # scores[i] ↔ X[i]

Gesamte Analyse mit einem Befehl ausführen (KMeans-Clusterung, Enhancer-vs-Promoter-Klassifikation, Embedding→Likelihood-Regression, PCA-Diagramm):

.pixi/envs/dev/bin/python scripts/analyze_run.py output/run_20260825_104403 --k 3

Ausgabe analysis_<run>.npz (zusammengeführtes X + keys) und analysis_<run>.png. Analyse-Hinweise:

  • Vor Ähnlichkeits-/Clusterungsberechnungen die 4096-dimensionalen Vektoren zuerst auf Einheitslänge normalisieren (im Skript bereits erledigt);

  • Bei kleinen Stichproben werden Klassifikation/Regression automatisch übersprungen (Schutzschwelle ≥6 Einträge); erst nach dem vollständigen Lauf mit allen 3806 Einträgen sind diese Analysen statistisch aussagekräftig;

  • Schlüssel cis_enhancers__xxx → Kategorie enhancers, Region cis; trans_* analog (parse_source kann die Label-Dimension für eine cis-vs-trans-Klassifikation ändern).

Entwicklung und Tests

pixi install          # 或 pip install -e ".[dev]"
pixi run test         # 运行 pytest(全部 mock,不调用真实 API)

Offline-Tests 91 passed / 4 skipped (skip = Live-Gating). Abgedeckt: Sequenzvalidierung, Normalisierung von Groß-/Kleinschreibung und Leerzeichen, ungültige Zeichen, fehlender API-Key, Konstruktion der Forward-Anfrage, 401/408/429/5xx/timeout, automatische Erkennung des Layer-Namens (inklusive Regressionstest für Race Conditions), Variantenvalidierung, mathematische Korrektheit des Varianten-/Batch-Scorings (unabhängig gegen die Arc-Semantik nachgerechnet), NPZ-Dekodierung (JSON base64 / zip / alte JSON-Tensoren / <layer>.output-Key), FASTA-Sandbox, MCP-Session-Integration, reine Skriptfunktionen (Pooling/Schlüsselnamen) usw.

Live-API-Smoke-Test (erfordert einen echten Key; standardmäßig übersprungen). Der Key wird automatisch aus .env gelesen (Settings.from_env() bereits geladen):

EVO2_MCP_RUN_LIVE=1 .pixi/envs/dev/bin/python -m pytest tests/test_live_api.py -v -s

Der Live-Test sendet echte Anfragen an den NVIDIA-Endpunkt und verifiziert: automatische Erkennung des Logits-Layers (unembed), echte NPZ-Parsung ((1, seq, 512) float64), Übereinstimmung von evo2_score mit der manuellen Neuberechnung aus den rohen Logits, Varianten-Score.

Projektstruktur

.
├── pyproject.toml
├── README.md
├── .env.example
├── .gitignore
├── src/evo2_mcp/
│   ├── __main__.py      # python -m evo2_mcp 入口
│   ├── config.py        # 环境变量配置
│   ├── sequence.py      # DNA 校验/归一化
│   ├── api_client.py    # HTTP 客户端(retry/backoff/错误分类/响应解码 + layer 自动探测)
│   ├── forward_output.py# NPZ 解码 + likelihood 计算 + embedding 提取
│   ├── fasta.py         # FASTA 解析 + 读取沙箱
│   ├── tools.py         # 5 个 Tool 的实现
│   └── server.py        # MCP server(stdio)
├── scripts/
│   ├── score_fasta.py   # 批量 FASTA 评分 + embedding 提取(每次运行独立 run 文件夹)
│   └── analyze_run.py   # 下游分析:加载/关联 → 聚类/分类/回归 + PCA 图
├── tests/               # pytest(全 mock,91 用例)+ 可选 live test
└── output/              # mode="save" 的 .npz 输出 + run_*/ 运行结果(git 忽略)
Install Server
A
license - permissive license
A
quality
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    Enables AI-powered genomic variant analysis including variant impact prediction, regulatory element discovery, and batch variant scoring. Currently operates in mock mode as a proof-of-concept awaiting the public release of Google DeepMind's AlphaGenome API.
    20
    14
    2
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    An MCP server that enables AI assistants to generate, score, and analyze DNA sequences using the evo2 genomic foundation model. It supports multiple execution modes including local GPU, SLURM clusters, and the Nvidia NIM cloud API for tasks like variant effect prediction and sequence embedding.
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables protein sequence analysis and structure prediction by extracting ESM-2 embeddings and batch processing FASTA files via Docker. It provides tools for large-scale embedding extraction, job monitoring, and model management within an MCP-compatible environment.

View all related MCP servers

Related MCP Connectors

  • AI-powered bioprotocol optimization — generate, search, and manage lab protocols via MCP

  • Free OpenAI-compatible inference with signed provenance receipts and 3 focused MCP tools.

  • Multimodal video analysis MCP — transcription, vision, and OCR for any video URL.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Shiroko114514/evo2-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server