Generated banner for Tamarind
Generated logo for Tamarind

Tamarind

K-DenseCommunityCreated by Tamarind BioDistributed by K-Dense

  • Skill
  • Tool integration
  • Science and research
  • MIT
  • No issues found

From the author

Provides access to a collection of open-source molecular design and structural biology tools on the Tamarind Bio platform, via its REST API or MCP server — no local GPUs required. Tamarind bundles popular open-source models for structure prediction (AlphaFold, Boltz, Chai, ESMFold), protein, binder, and de novo design (RFdiffusion, ProteinMPNN, BoltzGen), antibody and nanobody design and developability, protein-ligand docking (DiffDock, Autodock Vina), binding-affinity prediction, MSA generation, and molecular dynamics. Use when the user mentions Tamarind or tamarind.bio, wants to run any of these open-source tools in the cloud, references app.tamarind.bio/api or the x-api-key header, or needs to submit batches of sequences for structural or biophysical characterization.
— the description by Tamarind Bio

AutoGineer summary

Written by AutoGineer from the skill’s own files, not by the author

Tamarind provides a programmatic interface to a collection of open-source molecular design and structural biology tools. It allows users to run models for structure prediction, protein and antibody design, docking, binding-affinity prediction, MSA generation, and molecular dynamics in the cloud without requiring local GPU resources. The platform supports interaction via a REST API or an MCP server, enabling integration into automated scientific workflows.

What it does

  • Provides cloud-based execution for tools like AlphaFold, Boltz, Chai, ESMFold, RFdiffusion, and ProteinMPNN.
  • Supports protein-ligand docking using DiffDock and Autodock Vina.
  • Enables batch submission of sequences for structural or biophysical characterization.
  • Offers tools for antibody and nanobody design and developability assessment.
  • Facilitates file management for structural inputs and job result retrieval.
  • Includes validation endpoints to verify job settings before submission.

When to use it

  • When you need to run structural biology or molecular design tools in a cloud environment.
  • When integrating Tamarind Bio's platform into an AI agent or automated pipeline.
  • When you have a batch of sequences requiring structural prediction or design.
  • When you need to perform protein-ligand docking or binding-affinity analysis.

Advantages

  • Eliminates the need for local GPU hardware for compute-intensive biology models.
  • Provides a standardized REST API for interacting with diverse scientific tools.
  • Supports MCP for seamless integration with AI agent hosts.
  • Includes validation and discovery endpoints to ensure correct job configuration.

Usage examples

“Run an AlphaFold prediction for the sequence MQIFVKTLTGKTITLEVEPSDTIENVKAKIQDKEGIPPDQQRLIFAGKQLEDGRTLSDYNIQKESTLHLVLRLRGG”
The agent will validate the sequence against the AlphaFold schema, submit the job to the Tamarind API, and poll for the completion status to retrieve the result.
“Design a protein binder using RFdiffusion for the target structure target.pdb”
The agent will upload the PDB file, retrieve the RFdiffusion schema, configure the design settings, and submit the job for cloud processing.

Install

  1. Download the skill as a ZIP:

    https://autogineer.com/agent-skills/k-dense-ai/tamarind/download
  2. Unzip it into the cross-client skills folder of your project:

    mkdir -p .agents/skills && unzip tamarind.zip -d .agents/skills

Documentation by Tamarind Bio

Tamarind Bio

Tamarind runs molecular-design and structural-biology tools on managed compute: structure prediction, protein and antibody design, docking, binding-affinity prediction, MSA generation, and molecular dynamics. Use it when the user requests Tamarind, its REST API/MCP server, or cloud execution of these scientific tools. For local sequence processing or molecular descriptors, use a local library.

Sources and review scope

The REST contracts and public catalog were reviewed on 2026-09-30. Examples are illustrative until validated against the user's account; this review did not run authenticated jobs or establish scientific accuracy for any model.

  • API index and complete guide.

  • Current OpenAPI includes discovery, validation, jobs, files, and newer pipeline/custom-tool surfaces. openapi.yaml is also available. Check that needed paths exist: the merged spec can return HTTP 200 with only its classic surface when the backend spec cannot be fetched.

  • Public catalog needs no key; query ?type= or ?tag=. It documents public tools and conditional required settings, not every optional parameter or account entitlement.

  • Product documentation index links to Markdown pages, including the MCP guide.

Fetch the account's current schemas before composing a run. Where the prose guide and OpenAPI differ, prefer the operation/schema for field shapes, and record any unresolved difference rather than guessing.

Access

  1. Use the user's Tamarind deployment. The shared base is https://app.tamarind.bio/api; a dedicated organization deployment has its own host and account data. Every relative REST path below is under /api.

  2. Obtain a key from the deployment's API settings and read it from TAMARIND_API_KEY; send it as x-api-key. Keep keys out of files and logs.

  3. Check the account's current allowance and compute budget before scaling up. Free usage is a monthly allowance, not an unconditional promise of ten jobs forever; billing and entitlements can change.

# Public discovery requires no credential.
curl --fail-with-body 'https://app.tamarind.bio/tools.json?type=alphafold'
# Account-scoped discovery:
curl --fail-with-body 'https://app.tamarind.bio/api/tools' \
  -H "x-api-key: $TAMARIND_API_KEY"

For REST examples install requests in the execution environment. The official CLI distribution is tamarind-cli, and its Custom Tools Python client imports as from tamarind import Tamarind; the unrelated package named tamarind is not this client. See the SDK reference. Core job recipes below use HTTP directly.

Workflow

  1. Discover. Read GET /tools and match the user's scientific task to the tool description. Built-ins return an array; ?custom=true lists legacy custom tools only. Current custom deployments can be missing from this list: use the known deployed name and its schema before concluding that it is unavailable.

  2. Read the schema. GET /tools/{name}/schema returns a JSON Schema for the settings object. GET /tools also supplies a trimmed settings parameter list. Check task-dependent fields, file extensions, list values, and defaults.

  3. Validate. Send POST /validate-job with type, settings, and optional jobName. Check HTTP status first, then JSON valid. On success, inspect and use normalized as the settings to submit. Address unrecognized_settings if returned, even alongside valid: true: an optional-field typo can otherwise silently leave the default in effect. Validation checks fields, not all submit policies, queue limits, or deployment readiness.

  4. Submit once. POST /submit-job takes jobName, type, settings, optional version for a custom-tool build, and optional/organization-required projectTag. Persist the submitted name and settings. A successful response is plain text, not a JSON receipt. Use the returned stored name.

  5. Poll. GET /jobs?jobName=... returns a row directly. Single-job terminal states are Complete, Stopped, and Failed; handle legacy Deleted or an exact-lookup error without looping indefinitely. Poll batch parents using batchStatus, and poll newer pipelines on their own run endpoint.

  6. Download and inspect. POST /result returns a JSON string URL on 200, or 202 with status: "preparing". Retry result retrieval after 202, without resubmitting compute. GET the signed URL without the Tamarind API-key header. Download the archive only for successful runs; request fileName: "output.log" for stopped/failed jobs. Verify the scientific outputs after downloading.

Workflow recipes implement validation, stored names, bounded polling, 202 handling, batch validation, and pagination. They are locally smoke-tested with simulated responses; authenticated execution remains untested.

Picking tools and interpreting results

Select by inputs, intended output, and modeling assumptions, then confirm the candidate in the live catalog. These are anchors, not a guaranteed catalog:

TaskCandidates and decisions
Protein/complex structurealphafold for AF2 monomers/multimers; boltz, chai, or protenix for cofolding including ligands/nucleic acids; esmfold for fast single-sequence protein folding. Check esmfold2 separately: its current catalog includes protein, DNA, RNA, and ligand complexes.
Binder/motif designbindcraft, boltzgen, rfdiffusion; choose by target type, scaffold constraints, and required structure inputs.
Inverse foldingproteinmpnn/ligandmpnn consume structures and design sequences. Re-fold designs and compare to the intended backbone/interface.
Small-molecule dockingautodock-vina for a fixed receptor and search box; diffdock for diffusion docking; boltz/chai for cofolding. Choose the modeling approach for the task, not to avoid supplying a required input.
Antibody/developability/MSA/MDFilter descriptions and schemas for the specific task; availability and inputs differ by tool.

Confidence scores describe model confidence, not experimental binding, specificity, or affinity. Compare designed backbones, interfaces, clashes, chain/residue mapping, and developability. Check ligand chemistry and stereochemistry; docking scores are not interchangeable with measured binding free energies. Record tool/model, input provenance, chain mapping, seeds/samples, MSA/template choices, normalized settings, and any user-selected filtering thresholds.

Honor the user's selected tool and budget. Use authorized defaults for routine choices; surface unresolved choices that materially affect the scientific task or compute scope before a large campaign. Never silently substitute a different scientific task because its inputs are easier to supply.

File inputs and chaining

  • Upload a structure with PUT /upload/{filename} (binary body; follow the documented redirect), then reference the registered relative name, e.g. target.pdb or inputs/target.pdb when ?folder=inputs was used.

  • Confirm names using GET /files; it returns a non-paginated array for the selected folder, not a list of a job's outputs.

  • Prefer these paths over inline file content. The current guide says redundant account-email prefixes are stripped; there is no longer a universal double-prefix failure. Arbitrary strings are not necessarily file references.

  • Reuse a completed job's file as JobName/path/to/file.ext, matching the next parameter's supported extensions and list/scalar shape. Do not guess filenames.

  • ProteinMPNN designs must feed a folding tool's sequence field. A structural template field does not mean "fold this designed sequence". Read generated FASTA/CSV sequences and validate one folding settings object per sequence.

  • Do not author internal fields such as submit_method, msa, or monomer_msa.

Batches and pipelines

POST /submit-batch accepts one type, a nonempty settings array, batchName, and optional parallel jobNames. Validate every row using array-mode /validate-job (up to 1,000 rows per call), and use each row's normalized settings. Submission allows up to 30,000 expanded jobs, counting design fan-out, and has a separate approximately 4.5 MB request limit. Split on both constraints. Do not assume old weightedHoursBudget, maxRuntimeSeconds, or gpuType request fields enforce a cap: they are absent from the current batch schema. Use confirmed account controls and an agreed job/sample count.

Poll GET /jobs?jobName=<batchName> until batchStatus is Complete, Stopped, or AggregationFailed. Subjobs can finish before aggregation. Fetch the archive through /result and handle 202; resultUrl is optional and is not a reliable readiness signal. Page GET /jobs?batch=... using startKey to inspect children.

For new saved workflows use the template/run API under /pipelines: read the current pipeline graph contract, validate the proposed run with POST /pipelines/validate, submit with POST /pipelines/submit (required name, bindings, and one of templateId/pipeline), and poll GET /pipelines/runs/{run_id}. Its statuses are lowercase and separate from job statuses. The legacy /submit-pipeline and /run-pipeline remain documented; API reference gives their actual required fields.

MCP alternative

Connect to https://mcp.tamarind.bio/mcp with OAuth 2.1 or the x-api-key header. The official guide confirms submitJob, submitBatch, getJobs, getResult, uploadFile, and getFiles. Read the connected server's tools/list schemas before using signatures or interpreting result envelopes.

If the connection advertises discovery/validation helpers such as getAvailableTools, getJobSchema, or validateJob, use their current schemas. Extra helpers, filter vocabularies, submitBatch(fromJob=...), and upload-through- MCP variants are not guaranteed by the public guide. This review's anonymous tools/list request returned 401, so their current contracts were not verified. Use the documented REST equivalents when needed.

Recovery

HTTP auth failures differ by route: classic endpoints can answer 400, jobs can answer 401 or gateway 403, and usage can answer 401. A 403 is not proof of a budget error. Check status and the actual response body before changing settings. Submission errors may be JSON or plain text regardless of Content-Type.

A timeout/5xx on submit does not prove that nothing queued. Look up the persisted name before retrying; for campaigns use POST /jobs/search with up to 1,000 names per request. Respect rate limits and avoid one-request-per-job polling at scale. A 413 rejects the oversized request before creating jobs; split the body or upload file content separately. DELETE /delete-job is a soft delete: it hides the job and leaves stored result files intact.

Reference files

  • API reference: endpoint shapes, validation, pagination, authentication differences, and legacy/new pipeline boundaries.

  • Tool catalog: schema interpretation and discovery.

  • Examples: current catalog-backed settings examples and tool-specific caveats, explicitly bounded by verification scope.

  • Workflows: executable HTTP recipes with local mocked verification; no authenticated scientific jobs were run for this review.

Files

references/api_reference.md

Tamarind Bio REST API reference

Reviewed 2026-09-30 against the current OpenAPI, REST guide, and public catalog. These are documentation checks, not authenticated endpoint tests.

All paths below are relative to https://app.tamarind.bio/api, or the user's organization deployment's /api base. Requests use x-api-key except public catalog discovery. Do not send the key when downloading a signed storage URL.

Endpoint map

MethodPathRequest and response
GET/tools-catalogPublic catalog; also at host-level /tools.json. Optional type/tag filters; tools contains public types and conditional required settings.
GET/toolsAccount-scoped array with name, descriptions, trimmed settings, and optional output metadata. custom=true selects legacy custom tools only.
GET/tools/{name}/schemaJSON Schema for the settings object. Optional version pins a custom build. 404 covers missing, inaccessible, and mid-deploy tools.
POST/validate-jobtype, object/array settings; optional jobName (single), jobNames (array), version. HTTP 200 contains a valid verdict.
POST/submit-jobjobName, type, object settings; optional version, projectTag. 200 is a plain-text confirmation.
POST/submit-batchbatchName, type, array settings; optional parallel jobNames, version, projectTag. 200 schema has batchName, jobs, totalJobs.
GET/jobsExact lookup or cursor-paginated listing; shapes below.
POST/jobs/searchjobNames (up to 1,000), optional organization, includeSubjobs, jobEmail. Returns jobs, notFound, statuses.
POST/resultjobName; optional fileName, pdbsOnly, jobEmail, noAsync. 200 JSON string URL or 202 preparing object.
POST/stop-jobjobName; stops queued/running work, including stoppable batch children. Returns message, stoppedCount.
DELETE/delete-jobjobName; soft-deletes the job/batch children from listings. Result files remain. Unknown name: 400.
PUT/upload/{filename}Binary body; optional folder. This route redirects to the upload service; follow redirects.
GET/filesOptional folder, includeFolders=true; complete array of name strings for that folder, no pagination.
DELETE/delete-fileQuery filePath or folder. A folder request removes its files.
GET/usage-statisticsstatistic=hours|weighted_hours|jobs, scope=user|organization; details below.
POST/submit-pipelineLegacy inline execution: jobName, stages, conditional initialInputs, optional projectTag.
POST/run-pipelineLegacy saved execution: jobName, pipelineName, nonempty initialInputs array, optional version.

Discovery and validation

/tools is an array, not {"tools": [...]}. Each trimmed parameter has name and required; optional metadata includes type, description, default, options, extension, and list. Filter built-ins client-side; arbitrary search query parameters are not documented. /tools?custom=true does not discover current custom deployments: use the deployed name and /tools/{name}/schema.

The latter is a JSON Schema document, not the trimmed parameter array and not an MCP parameters envelope. Domain strings may carry x-tamarind-type. Numeric strings and sequence normalization are not fully checked by JSON Schema bounds; use /validate-job for domain validation and file existence. Keep version consistent across schema, validate, and submit for a pinned custom build.

For valid credentials, /validate-job returns 200 whether valid or invalid:

  • Single success: {"valid": true, "normalized": {...}}. Current normalized contains cleaned settings and defaults intended for submission. Inspect these defaults for model/sample-count changes, then submit that settings object.

  • Single failure: valid: false, error, possibly missing_fields and code. missing_fields may be empty despite failure. Do not interpret quota/policy codes as sequence-format errors.

  • job_name reflects name normalization when jobName was supplied; job_name_changed indicates a change. Persist this stored name.

  • The guide additionally documents unrecognized_settings: correct every typo, even if valid is true. Unknown settings sent directly to submit are carried through and may silently leave the intended optional field at its default.

  • For array input, inspect presence of results, not just valid. results holds one verdict per row, with its index, and top-level valid aggregates all rows. If results is absent, the whole request was rejected and top-level error explains why. Array validation supports at most 1,000 rows per call and approximately 4.5 MB; large normalized responses can also require smaller chunks. Validate all rows, not a representative sample.

Field validation does not reserve compute or re-check every organization policy, queue constraint, or custom-tool deployment state. A valid verdict can still be rejected at submission. Do not manually add internal routing settings.

Names, projects, and batches

Names are sanitized: whitespace becomes _ and characters outside [A-Za-z0-9_.-] are removed. Send an already-clean, nonempty name of at most 200 characters so exact job lookup works; this is a compatibility limit, not a 100-character submit validator. Parse the actual name from the successful <stored-name> submitted to queue. response. On a lost response, check that persisted clean name before retrying.

projectTag accepts an organization project ID or name. It is normally optional but required under an organization's project policy. A refusal may include availableProjects; absence does not establish that no projects exist.

Batch settings must be a nonempty array. If jobNames is supplied it must have the same length, with no duplicates or child name equal to the parent. Stored child names may be prefixed/rewritten; enumerate /jobs?batch=... rather than assuming names. The batch cap is 30,000 jobs after design fan-out, plus a separate approximately 4.5 MB request cap. The older {tool, jobs:[...]} alternative is not the current documented contract. Do not rely on undocumented weightedHoursBudget, maxRuntimeSeconds, or gpuType keys for limits.

Jobs, status, and pagination

GET /jobs query fields: jobName, batch, limit (1–1,000; default 1,000), startKey, batchOnly, includeSubjobs, includeSequences, organization, and jobEmail. Use lowercase string true for boolean query values.

  • Own-account exact jobName: row directly, without a jobs wrapper.

  • Listing or batch: {"jobs": [...], "statuses": {...}, "startKey": ...}. Follow nonempty startKey even when a page is short. Batch children paginate.

  • organization=true exact-name collisions have a legacy exceptional response shape; prefer a known owner with jobEmail. /jobs/search instead selects the newest visible match for each requested name, not every member's match.

  • includeSubjobs=true includes children in ordinary listings. batchOnly=true selects parents. includeSequences is retained for compatibility; do not assume it controls Settings presence.

  • Page statuses is generally page-local, but organization queries may return a collection-wide tally. Do not sum those tallies to infer batch completion.

Rows require JobName, JobStatus, Created. Other fields are optional: Type, Started, Completed, Batch, WeightedHours, Settings, Score, User, batchStatus, AggregationError, and result/aggregation metadata. Settings can be JSON text or a structured value; Score may be a string, number, or null. Do not assume every successful tool emits pLDDT or any score. /jobs/search omits large settings/scores/errors and result URLs; fetch individual details only when needed.

Single-job terminal states are Complete, Stopped, Failed. Handle legacy Deleted and lookup errors; a deleted/missing job need not remain pollable. A batch parent uses batchStatus: Running, Aggregating, Complete, Stopped, AggregationFailed. Discriminate by Type == "batch"/batchStatus, not statuses, which also appears for a single job.

The guide and schema disagree about whether compatibility rows expose a signed resultUrl; the schema makes it optional. Use /result for all downloads.

Results and uploads

Check HTTP status before decoding /result:

  • 200: response.json() is the signed URL string; download with a separate GET, no API key. File requests return that file instead of an archive.

  • 202: object with status: "preparing", jobName, and message; wait and repeat the same result call. Do not resubmit compute.

  • noAsync: true changes a not-yet-built archive to a 400 instead of 202.

  • A result request can wait up to approximately 290 seconds for archive assembly; use an adequate read timeout and persist the job name to resume later.

  • fileName: "output.log" is permitted for failed/stopped jobs before completion.

Upload uses Content-Type: application/octet-stream; curl -L --data-binary follows the documented upload redirect. The schema describes success fields message, fileUrl, signedUrl, but verify registered names with /files and pass the relative stored path (target.pdb or inputs/target.pdb) to a tool. The current guide says a redundant account-email prefix is stripped. Prefer the relative path; do not construct internal storage keys. Prior results use JobName/path/to/file.ext. Inline text can cause side effects/large bodies during validation; prefer uploaded paths.

Usage and pipeline boundaries

Usage defaults to statistic=hours, scope=organization. The response has users (each with email, total, per-tool tools), lastUpdated, and metadata.statistic/metadata.scope. Unauthorized organization scope can narrow to the user: read the applied scope. Weighted hours depend on compute resources; inspect the current account report rather than assuming a per-job price.

Legacy /submit-pipeline requires jobName and stages; every stage requires task and nonempty toolSettings keyed by tool name. initialInputs is required when the first stage uses the "pipe" placeholder; file/sequence inputs must match that stage. Filter names must be in the tool's published filterMetrics. /run-pipeline requires jobName, pipelineName, and initialInputs (array of uploaded PDB filenames or raw sequences with unique basenames), not an inputs alias. Both return plain-text submission confirmations.

For new integrations, consult the pipeline guide: POST /pipelines/templates creates a template; POST /pipelines/validate checks the same run body accepted by POST /pipelines/submit: required name, bindings, and exactly one of templateId or inline pipeline, plus optional version and permitted per-node overrides. idempotencyKey enables safe retries on this newer submit surface. Poll GET /pipelines/runs/{run_id} with its lowercase statuses: queued, running, finished, partial, stopped, failed. Terminal partial runs need per-step inspection. Pipeline runs are not visible through /jobs. Check the live spec for graph/binding shapes and account feature availability.

Errors and safe retries

Classic auth rejection is often 400 recovery JSON; jobs use 401 problem JSON or an earlier gateway 403; usage can return 401. A 403 can also mean policy, quota, or tool access. Parse the actual error; do not treat every 403 as a budget cap. Exact unknown job lookup is 400, not a guaranteed 404.

Submit 400 errors may be JSON or plain text, independent of Content-Type. Ordinary duplicate-name checks return 400; concurrent locks can return 409. A 413 means the request was rejected before jobs were created (body shape varies by deployment); split it or upload files. For timeout/5xx ambiguity, inspect the stored name before retrying a submit. Back off on rate limits, and use batched status/validation requests instead of flooding per-job calls.

Requirements and compatibility

Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta

“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.

Needs: Needs an MCP server, Needs network access, Needs an API key

The author says: Requires Python 3.10+, a Tamarind Bio account, and an API key from app.tamarind.bio. Uses the `requests` library against the public REST API (these recipes use HTTP directly). Network access required. Optional MCP server at mcp.tamarind.bio/mcp for agent hosts.

Security

No issues found by our static scan· No issues found

A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.

Attribution and licence

Created by
Tamarind Bio
Publisher
K-Dense (Community)
Distributed by
K-Dense
Source
K-Dense-AI/scientific-agent-skills · skills/tamarind · commit a25cf9e
Licence
MIT License (redistribution allowed)
  • LICENSE (added by AutoGineer from LICENSE.md)
  • ATTRIBUTION.md (written by AutoGineer)
Synced

AutoGineer is not affiliated with or endorsed by Tamarind Bio or K-Dense.

Download ZIP

The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download tamarind.zip