Skip to main content
Glama

align_sequences

Read-only

Multiple-sequence alignment over several sequences, under either of TWO engines that answer different questions and neither of which is a fallback for the other. poa (partial-order, poapy) aligns into a graph, keeps every path a read took and produces its own consensus row — what a pile of reads over one locus wants. progressive (biotite) computes Feng-Doolittle distances, clusters them into a guide tree and merges along it under "once a gap, always a gap" — the classic MSA algorithm, what a FAMILY of homologous genes wants, and what a reader coming from Clustal or MUSCLE expects. Wire many upstream record/sequence outputs into sequences, or name library documents.

Input Schema

NameRequiredDescriptionDefault
gapNo`poa` only: score for a gap column. Negative. Only applies when engine is poa. Advanced.
matchNo`poa` only: score for a pair of identical symbols. Only applies when engine is poa. Advanced.
_filesNoThe project: record references shaped like _subject. Their records become library documents a tool names in sequences/parts/document; a trace or alignment is found by file name.
engineNowhich aligner builds the alignment. They answer DIFFERENT questions: `poa` keeps every path through a pile of reads and emits its own consensus row, `progressive` merges a family along a guide tree the way Clustal and MUSCLE do. Each engine reads only its own parameters below. Values: poa (Partial-order (poapy) - reads over one locus), progressive (Progressive (biotite) - a family, guide-tree merged).poa
_subjectNoThe record to act on: exactly one of sequence, accession (+source), sample (an id from list_samples) or file ({name, text} or {name, base64}); record_index picks one record of several.
gap_openNo`progressive`, affine only: the penalty for STARTING a gap. Negative. Only applies when affine_gap is true.
mismatchNo`poa` only: score for a mismatching pair. Negative. Only applies when engine is poa. Advanced.
sequencesNothe sequences to align — wire several upstream outputs here, or list library document names/ids.
affine_gapNo`progressive` only: `false` charges one flat penalty per gap column; `true` charges separate opening and extension penalties, which is what keeps a real indel as ONE gap instead of many. Only applies when engine is progressive.
gap_extendNo`progressive`, affine only: the penalty for each column a gap is extended by. Negative, and gentler than `gap_open` - an extension harsher than the opening makes the aligner prefer many short gaps to one long indel. Only applies when affine_gap is true.
guide_treeNo`progressive` only: which tree the merge follows. The Feng-Doolittle distances are the aligner's either way; this chooses only how they are clustered into an order. UPGMA is biotite's own and the one the port reproduces byte-for-byte; neighbour-joining and BIONJ do not assume a molecular clock, so on sequences evolving at different rates they group by relatedness where UPGMA groups by raw similarity - which is exactly the case where the guide tree changes the alignment. Values: upgma (UPGMA (biotite's own)), nj (Neighbour-joining), bionj (BIONJ), wpgma (WPGMA). Only applies when engine is progressive.upgma
gap_penaltyNo`progressive` only: the flat penalty per gap column. Negative. Only applies when affine_gap is false.
align_matrixNo`progressive` only: the substitution matrix the ALIGNMENT itself is scored with - distinct from `score_matrix`, which only scores the quality report afterwards. `auto` reads the alphabet: EDNAFULL for nucleotides, BLOSUM62 for protein. Naming the wrong one is not an error the engine can raise - BLOSUM62 reads A, C, G and T as alanine, cysteine, glycine and threonine and returns a number. Values: auto (Auto - from the alignment's alphabet), EDNAFULL (EDNAFULL - nucleotides (EMBOSS NUC.4.4)), BLOSUM62 (BLOSUM62 - amino acids). Only applies when engine is progressive.auto
global_alignNoglobal alignment rather than local. Poapy's own default is LOCAL; both this tool and the MSA inspector open on global, which is the choice a full-length comparison wants - switch it off for reads over part of a locus. Only applies when engine is poa. Advanced.
score_matrixNosubstitution matrix for the pyMSA sum-of-pairs and star scores in the quality report. Both engines. Left unset only the matrix-free scores are computed (entropy, % non-gaps, % totally conserved columns) - an honest absence rather than a score under a matrix that does not match the alphabet. Values: PAM250 (PAM250 - amino acids, greater evolutionary distance), BLOSUM62 (BLOSUM62 - amino acids), EDNAFULL (EDNAFULL - nucleotides). Advanced.
include_subjectNoalso align the node's subject (the open or wired record).
terminal_penaltyNo`progressive` only: `true` charges overhanging ends like an internal gap - right for full-length homologues. `false` makes them free, which is right when a sequence covers only part of the region, e.g. a read against a gene. Only applies when engine is progressive.

Output Schema

NameRequiredDescriptionDefault
fitYesper row: its closest row in this alignment, their identity here, and the same pair's identity aligned on its own with free end gaps (biotite align_optimal) — the loss shows where the alignment holds a row out of register; `outliers` names the rows flagged. `{ ok: false, reason }` when the check could not run
rowsYesaligned rows (name + gapped sequence)
countYesnumber of aligned sequences (excluding the consensus row)
engineYeswhich aligner produced this alignment — `poa` or `progressive`
figureYesthe alignment's first 80 columns drawn as the MSA canvas opens on them: rows named, residues shaded by column identity, the conservation line under the block. draw_alignment draws any other window
lengthYesalignment width in columns
scoresYesthe pyMSA quality scores: summed entropy (nats, pyMSA's sign — negative), % non-gaps, % totally conserved columns, and the sum-of-pairs/star pair when a `score_matrix` was named
consensusYesthe per-column majority consensus (POA returns its own graph consensus row; the progressive engine has no graph, so the majority is the consensus for both)
conservationYesthe Clustal-style conservation line, one character per column — `*` where every row carries the same residue and the column is ungapped
guideTreeNewickYes`progressive` only: the guide tree the merge followed, in Newick, labelled with the row names. Branch lengths are deliberately omitted — a guide tree's heights are a clustering artifact, not divergence estimates
alignedSequencesYesthe aligned input rows only, excluding the generated consensus — wire this into build_tree

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • addedOutput schema / properties / figure
      Added value: +{
      +  "description": "the alignment's first 80 columns drawn as the MSA canvas opens on them: rows named, residues shaded by column identity, the conservation line under the block. draw_alignment draws any other window",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "rows",
      -  "length",
      -  "count",
      -  "consensus",
      -  "alignedSequences",
      -  "conservation",
      -  "engine",
      -  "scores",
      -  "guideTreeNewick",
      -  "fit"
      -]New value: +[
      +  "rows",
      +  "length",
      +  "count",
      +  "consensus",
      +  "alignedSequences",
      +  "conservation",
      +  "engine",
      +  "scores",
      +  "guideTreeNewick",
      +  "figure",
      +  "fit"
      +]
  2. First observed

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and destructiveHint=false, yet the description still adds high-value non-obvious behavior: poapy's own default is LOCAL but this tool opens on global, and 'naming the wrong one is not an error the engine can raise — BLOSUM62 reads A, C, G and T as alanine...' which flags a silent-corruption mode. It also explains the gap_open vs gap_extend asymmetry ('an extension harsher than the opening makes the aligner prefer many short gaps to one long indel') and marks which parameters are ignored by which engine.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the one fact that matters (two engines, neither a fallback), then engine-by-engine detail. For 17 parameters the length is defensible, though the embedded asides about biotite porting 'byte-for-byte' and Clustal/MUSCLE lineage are more flavor than triage value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and annotations cover the safety profile. Given the tool's complexity, the description does the remaining work: it disambiguates all four enum-bearing parameters (engine, guide_tree, align_matrix, score_matrix), warns about the silent wrong-matrix case, and routes input assembly. Only the required:[] surface (_subject + include_subject as an alternative to sequences) is left implicit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema baseline is 3; the description earns above that by supplying the conceptual frame the schema lacks — the two engines answer different questions, engine-scoped parameters are inert outside their engine, and the align_matrix/score_matrix split (alignment scoring vs quality-report scoring) is spelled out. It stops short of saying what the sequences parameter requires (it is not marked required anywhere) or how _subject/include_subject interact with sequences.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence names a specific verb and resource ('Multiple-sequence alignment over several sequences') and immediately frames the two-engine split, which is the tool's real identity. It distinguishes the two internal modes decisively but never names the sibling it competes with (align_read for pairwise, ebi_align for remote MSA), so the agent must infer sibling boundaries itself.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Engine selection guidance is unusually explicit: 'what a pile of reads over one locus wants' versus 'what a FAMILY of homologous genes wants, and what a reader coming from Clustal or MUSCLE expects' — plus the warning that neither is a fallback for the other. It also tells the agent how to feed inputs ('wire many upstream record/sequence outputs into sequences, or name library documents'). What's missing is any statement of when to prefer this over ebi_align or align_read, and no prerequisites/minimum sequence count.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources