Tamarind Bio
Tamarind Bio は、構造予測、タンパク質・抗体設計、ドッキング、結合親和性、MSA 生成、分子動力学といった計算生物学ツールをマネージド GPU 上で実行するクラウドプラットフォームです。ユーザーは配列や構造を送信するだけで、予測された構造、設計、生物物理学的スコアを得ることができ、自身でハードウェアを用意する必要はありません。AlphaFold、Boltz-2、Chai-1、RFdiffusion、ProteinMPNN、BoltzGen、ESMFold2、DiffDock、Autodock Vina など、数百ものツールを1つの統一されたジョブ API で公開しています。
公式ドキュメント: app.tamarind.bio/api-docs · プラットフォーム UI は app.tamarind.bio
正規ソース — これらを取得し、古いコピーに依存しないでください
Tamarind は機械可読なライブソースを公開しています。ハードコードされたリストを信頼するよりも、実行時にこれらを取得することを推奨します。ツール名、スキーマ、エンドポイントは頻繁に変更されます。
https://app.tamarind.bio/llms.txt— LLM インデックス: 仕様、API ドキュメント、MCP ガイドへのリンク。https://app.tamarind.bio/openapi.yaml— 8つのコアジョブエンドポイント(submit-job/-batch, jobs, result, upload, files, delete-job/-file; 認証はApiKeyAuth)の OpenAPI 3.0 仕様。正確な形状についてはこれを取得してください。ディスカバリー/管理エンドポイント(/tools、/usage-statistics、パイプライン…)はこれに含まれていません — それらには MCP/REST のディスカバリーツールを使用してください。https://docs.tamarind.bio/llms.txt— ドキュメントインデックス; すべてのページに.md形式があります(例:docs.tamarind.bio/tamarind/batch.md、/tamarind/api.md、/tamarind/pipelines.md)。- ライブツールディスカバリー —
GET /tools(REST)または MCP のgetAvailableTools+getJobSchema(jobType)が、存在するツールとそのパラメータの信頼できる情報源です。
このスキルでは、これらのソースには明記されていない表面と非自明な動作を教えます(リファレンスファイルを参照)。形状に疑問がある場合は、openapi.yaml を取得してください。
このスキルを使用するタイミング
ユーザーが以下を希望する場合に Tamarind を使用します:
- タンパク質、複合体、またはタンパク質-リガンド系の構造予測(AlphaFold、Boltz-2、Chai-1、ESMFold2、Chai/Boltz コフォールディング)
- タンパク質またはバインダーの設計(RFdiffusion、BoltzGen、BindCraft、ProteinMPNN/LigandMPNN インバースフォールディング)
- 抗体/ナノボディの設計または特性評価(配列生成、ヒト化、デベロッパビリティ、免疫原性)
- 低分子のドッキング(DiffDock、Autodock Vina)または結合親和性の予測
- ダウンストリームフォールディングのための MSA 生成
- マネージド GPU 上での分子動力学またはその他の生物物理学ワークフローの実行
- 多くの配列や設計のバッチスクリーニングを同じツールで実行
- パイプラインへのツール連鎖(例: 設計 → フォールド → スコアリング)1つのジョブの出力を次のジョブの入力として使用
このスキルは、ローカルインストールではなく Tamarind のマネージドクラウドで実行する場合に適しています。純粋にローカルな cheminformatics や1回限りの配列 I/O には、代わりにローカルライブラリ(RDKit、BioPython)を使用してください。
アクセスと認証
- app.tamarind.bio にサインインし、アカウント/API 設定から API キーを作成します。
- すべての REST リクエストを
x-api-keyヘッダーで認証します。 - キーをハードコードしないでください。
TAMARIND_API_KEY環境変数または.envファイルから読み取ります(python-dotenvを使用)。キーをソースコントロールにコミットしないでください。
料金: すべてのユーザーに 10回の無料ジョブが与えられます。大規模な使用については、[email protected] までお問い合わせの上、サブスクリプションを購入してください。
export TAMARIND_API_KEY="your_api_key"
# 利用可能なツールを一覧表示
curl https://app.tamarind.bio/api/tools \
-H "x-api-key: $TAMARIND_API_KEY"
ベース URL: https://app.tamarind.bio/api/
公式の Python SDK はありません — PyPI パッケージ名 tamarind は無関係な Neo4j ツールです。uv pip install tamarind を実行しないでください。REST API に対してプレーンな requests 呼び出しを記述するか(エンドポイントの形状は openapi.yaml にあります)、エージェントホストには MCP サーバーを使用してください。
Tamarind を呼び出す2つの方法
MCP サーバー(AI エージェントに最適)
Tamarind は https://mcp.tamarind.bio/mcp で MCP サーバーをホストしています(API キー認証は X-API-Key ヘッダー経由)。エージェントホストが MCP をサポートしている場合は、そちらを推奨します — ツールは REST API をエージェントフレンドリーなスキーマでミラーリングしています:
listModalities()/listTags()— ライブフィルター語彙(分子タイプ/機能)にラベルとツールカウントを付けて返します。ハードコードする代わりに、これらを呼び出して有効なmodality/functionの値を学習してください。getAvailableTools(modality?, function?, search?, custom?)— ツールを発見します(category/tagは非推奨のエイリアスですが、まだ有効です)。getJobSchema(jobType)— ツールの正確なパラメータスキーマと、exampleJob開始ペイロードを返します(送信前に検証してください)。validateJob(jobName, type, settings)— 送信前のドライランバリデーション。submitJob(jobName, type, settings)/submitBatch(batchName, type, settings[], jobNames[])getJobs(jobName?, batch?, limit?, includeSequences?)— ジョブとステータスの一覧表示/検査(デフォルトで大きなジョブごとの入力ブロブは省略されます。保持するにはincludeSequences=trueを渡します)。getJobLogs(jobName)— デバッグ用の出力ログを取得します。listJobFiles(jobName)— 出力ファイルを一覧表示します(連鎖用にs3Pathを返します)。getResult(jobName, fileName?)— 結果をダウンロードします。uploadFile(filename)— 署名付きアップロード URL; またはuploadFileContent(filename, content, encoding?)MCP 経由でファイルコンテンツを送信します(サンドボックス化されたエージェントが S3 に到達できない場合)。
スコープに関する注意: MCP クエリツール(getJobs、getResult、listJobFiles、…)は認証されたアカウントにスコープされます。
REST API(ユニバーサル)
プレーンな HTTP と requests を使用します — エンドポイントの形状は openapi.yaml にあります。コアループは以下にあります。references/workflows.md に完全なレシピがあります。
コアワークフロー
常に 発見 → スキーマ → 検証 → 送信 → ポーリング → 結果 の順序に従います。ツール名や設定をハードコードしないでください — カタログは頻繁に変更されます。
import os, time, requests
BASE = "https://app.tamarind.bio/api"
HEADERS = {"x-api-key": os.environ["TAMARIND_API_KEY"]}
# 1. ツールを発見。REST /tools は完全なリストを返します。クライアント側でフィルタリングします。
tools = requests.get(f"{BASE}/tools", headers=HEADERS).json()
alphafold = next(t for t in tools if t["name"] == "alphafold")
# 2. 選択したツールの正確なスキーマを取得。
# REST: /tools の各エントリにはすでにインラインの `settings` スキーマ(パラメータリスト)が含まれています —
# 名前がジョブタイプと一致するエントリを見つけてください。
# MCP: getJobSchema(jobType) は同じツールごとの詳細を返します。
# 3. ジョブを送信。`settings` はツール固有です — スキーマと正確に一致させてください。
payload = {
"jobName": "my-alphafold-run", # ^[a-zA-Z0-9_-]+$, <=100 文字、一意
"type": "alphafold",
"settings": {
"sequence": "MKTVRQERLKSIVRILERSKEPVSGAQLAEELSVSRQVIVQDIAYLRSLGYNIVATPRGYVLAGG",
"numRecycles": 3,
},
}
resp = requests.post(f"{BASE}/submit-job", headers=HEADERS, json=payload)
resp.raise_for_status() # 200 ok; 400 bad request; 403 budget exceeded; 401 unauthorized
# 4. 完了するまでポーリング。
# 注意: レスポンスの形状: GET /jobs?jobName=<name> はジョブの ROW を直接返します("jobs" ラッパーはありません);
# リストクエリ(jobName なし)は {"jobs": [...]} を返します。名前指定のレスポンスに対して ["jobs"][0] でインデックスしないでください。
while True:
job = requests.get(f"{BASE}/jobs", headers=HEADERS,
params={"jobName": "my-alphafold-run"}).json()
if job["JobStatus"] in ("Complete", "Stopped", "Deleted"):
break
time.sleep(30)
# 5. 結果を取得。POST /result は署名付き URL の*文字列*を返します;
# その URL に GET リクエストを送信して、実際の結果 zip をダウンロードします(2段階)。
url = requests.post(f"{BASE}/result", headers=HEADERS,
json={"jobName": "my-alphafold-run"}).text.strip('"')
open("my-alphafold-run.zip", "wb").write(requests.get(url).content)
MCP ツールを使用したこのループのエージェント版、およびより豊富な例については、references/workflows.md を参照してください。
ツールの発見
カタログには数百のツールがあります。必ず実行時に列挙してください — ハードコードされたリストに決して依存しないでください。
REST GET /tools は完全なリストを返します(サーバー側ではフィルタリングしません)。各項目は {name, displayName, github, paper, description, settings} で、settings はそのツールのインラインパラメータスキーマです。クライアント側でフィルタリング:
tools = requests.get(f"{BASE}/tools", headers=HEADERS).json() # リスト
boltz = [t for t in tools if "boltz" in t["name"].lower()]
注意: どちらのサーフェスもツール名ごとに1行を返します — REST /tools と MCP getAvailableTools は両方とも重複排除されています(MCP は最新のツールバージョンを保持するため)、名前の一致は1行を返します。
MCP getAvailableTools(search=..., modality=..., function=...) はサーバー側でフィルタリングし、ツールごとに categories / tags を追加します(category / tag は modality / function の非推奨エイリアスで、まだ有効です)。語彙をハードコードしないでください — それは変化します。listModalities() / listTags() からライブ値を取得するか(それぞれ value、label、description、toolCount を返します)、またはすべての getAvailableTools レスポンスで返される availableCategories / availableTags ファセット配列を読み取ってください。Modality は分子タイプ(protein、antibody、peptide、small-molecule、nucleic-acid、…)です。Function はツールが何をするか(structure-prediction、binder-design、protein-ligand-docking、…)です。
広く使用されているツールの代表的なセット(/tools で確認してください): alphafold、boltz (Boltz-2)、chai (Chai-1)、esmfold / esmfold2、rfdiffusion、proteinmpnn、ligandmpnn、boltzgen、bindcraft、diffdock。完全なカテゴリ/タグマップとツールメタデータの読み方については、references/tool_catalog.md を参照してください。
適切なツールの選択
カタログにはタスクごとに多くのツールがあります。お気に入りをハードコードしないでください — function(および modality)でフィルタリングし、各候補の description を読み、ユーザーの実際の目標(持っている入力、必要な出力、速度や「MSA なし」などの制約)に一致させてください。 description と tags フィールドは公開の「何のためのものか」というシグナルです。これらと validateJob に選択を任せてください。タスクごとの簡単な方向性:
- 単一タンパク質/複合体のフォールド (
function=structure-prediction): AlphaFold3 クラスの再現 —boltz/chai/openfold/protenix/intfold— はすべての場合において正確なデフォルトであり、タンパク質のみのシステムも含みます。また、核酸 + 低分子複合体も処理できるため、リガンド/RNA/DNA がシステムの一部である場合にこれらを使用してください(boltzは結合親和性も追加します)。alphafold(AF2) はモノマー + マルチマーに対して堅実な選択肢です(チェーンは:で結合)。esmfoldは単一配列(MSA なし)で高速です — 速度を重視し MSA がない場合に使用してください。esmfold2はより新しく、デフォルトで MSA を条件とします(model設定で高速な単一配列モードを提供します)。抗体(abodybuilder、immunebuilder)、環状ペプチド(highfold)、コンフォメーションアンサンブル(afcluster、alphaflow)用の特殊なフォルダーがあります — フィルタリングして説明を読んでください。 - バインダーの設計 (
function=binder-design):bindcraft(デノボミニプロテインバインダー)とboltzgen(タンパク質および低分子ターゲットに対するバインダー、ナノボディ/抗体/ペプチドを含む)が主要なデノボバインダーツールです。rfdiffusionもバインダー設計を行い、モチーフ足場 / 既存のバックボーンの多様化に適しています。抗体特異的なジェネレーターはfunction=antibody-design以下にあります。 - 既知のバックボーンの配列設計 (
function=inverse-folding):proteinmpnn(汎用)、ligandmpnn(リガンド認識)、および耐熱性/可溶性/抗体 MPNN バリアント。インバースフォールディングは構造を受け取り、配列を出力します — 検証のためにそれらをフォールドバックします(連鎖を参照)。 - 低分子のドッキング (
function=protein-ligand-docking):boltz/chaiを推奨します — これらはリガンドを複合体にコフォールドし、固定されたレセプターにドッキングするのではなく、結合構造を予測します。既知のポケットに対する高速な大規模スクリーニングが必要な場合はautodock-vinaを使用してください。 - 結合親和性の予測 (
function=binding-affinity) または MSA の生成(msaを検索) — フィルタリングして読んでください。
ユーザーが特定のツールを指定した場合、そのツールを評価し、その tag グループ内の代替案を健全性チェックしてください — より高速またはより適切な類似ツールが存在することがよくあります。不明な場合は、コミットする前に getJobSchema / validateJob を使用して、候補が実際に持っている入力を受け入れるかどうかを確認してください。
ジョブ設定、スキーマ、バリデーション
各ツールには独自の settings スキーマがあります。送信前に取得してください:
- REST
/toolsエントリ: 各settingsパラメータはトリミングされた辞書です。nameとrequiredは常に存在します。type、default、description、optionsは関連する場合にのみ表示されます(約60%にtypeがあります)— したがってparam.get("type")を使用し、param["type"]は使用しないでください。高度なゲーティングキー(exclude、conditionals)は REST レスポンスにはまったく含まれていません。 - MCP
getJobSchema(jobType): 完全なスキーマで、exclude、conditionals、境界を含みます。これらのゲーティングキーについて推論する必要がある場合は MCP を使用してください。(restrictOrgsは両方のサーフェスで削除されています — 使用できない組織ゲート付きパラメータは単に省略されます。references/api_reference.mdを参照してください。)
送信前に必ず validateJob(MCP)を実行してください — 信頼できるガードです。送信せずに /submit-job と同じバリデーションを実行し、最初の欠落または無効なフィールドを明らかにします。どのフィールドをスキーマキーから削除するかを手動で導き出そうとしないでください(REST ではそれらを見ることができません)— validateJob に任せてください。(レスポンスには source フィールドが含まれる場合があります。例: "static-fallback" — これはどのスキーマソースが検証したかに関する内部メモです。valid: true/false が行動の基準となるシグナルです。)
validateJob は、デフォルトが入力された設定の normalized ビューをエコーバックします。検証したのと同じクリーンな settings を送信してください。normalized は情報提供として扱ってください(設定しなかったデフォルトや、一部のツールではプラットフォーム管理フィールドが含まれる可能性があります)。そのため、正規化されたブロブではなく、独自の設定から送信を構築してください。
配列: アミノ酸文字列。マルチマーのチェーンは : または `
次に、sequences キー(文字列のリスト)を使用します。