Skip to main content
Glama

Reachable Pairings for a Rack

reachable_pairings
Read-onlyIdempotent

Given a rack (a set of module ids the user owns), rank the modules NOT in the rack by how many rack members they pair with. The set-level companion to find_compatible_with: where that answers "what pairs with module X?", this answers "given my whole rack, what single module should I add — the one that pairs with the most of what I already have?".

The ranking signal is pair_count — the number of DISTINCT rack members a candidate pairs with. A module that modulates five of your modules ranks above one that modulates one. This aggregate is the point: you can't get it from per-module find_compatible_with calls without tallying distinct members by hand.

Use this for:

  • "What should I add to a rack with ?" / "what fills out this system?"

  • "Given these modules, what pairs well with the most of them?"

  • Inspecting a rack's own internal pairing structure (the internal edges).

Combination edges only. Ranking uses the seven patch-time relationships (clock-source-for, cv-source-for, modulator-for, audio-source-for, quantizer-for, trigger-source-for, envelope-target-for) — the "A and B work together in a patch" kinds. The substitution/catalog kinds (alternative-to, replaces, expander-for) are deliberately excluded: a pairing recommender shouldn't suggest replacing your modules with each other. For "what's an alternative to X?" use find_compatible_with.

Args:

  • rack (string[], required): module ids, e.g. ["make-noise/maths", "mutable-instruments/plaits"]. Ids that match no module are returned in unknown_ids (and in unresolved with did-you-mean suggestions) rather than failing the call. Surface those rather than proceeding on a partial rack: the server is stateless about your rack — it keeps no memory of it between calls, so pass the COMPLETE current set every call. Max 64.

  • relationship (string, optional): restrict ranking to one combination kind above. Omit to consider all seven.

  • limit (number): default 25, max 100.

Returns: { "rack": [{ id, name }], // the rack members that resolved "unknown_ids": [string], // rack ids that matched no module "internal": [{ from_module_id, to_module_id, relationship, source_id }], // edges within the rack "candidates": [{ id, name, manufacturer, pair_count, "pairings": [{ rack_member, relationship, direction, source_id }] // why it pairs, per member }] }

direction on each pairing is relative to the rack member: 'outbound' = the candidate is the role-bearer (it relationships the member, e.g. the candidate is a modulator-for the member); 'inbound' = the member is the role-bearer.

Coverage caveat: rankings are only as dense as module_relationships. A thin or empty result means the corpus hasn't recorded those edges yet, not that no good pairing exists — call report_gap if you expected matches.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
rackYes
limitNo
relationshipNo

TDQS

A5/5.0
Behavior5/5

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

The annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, but the description adds significant behavioral disclosure: it explains that unknown rack IDs are returned in unknown_ids rather than failing, that the server is stateless and requires the complete rack every call, that only combination edges are ranked (not substitution/catalog types), and the semantics of interrack 'direction'. It even notes that thin results indicate corpus gaps, not absence of pairings. These are non-obvious traits beyond the annotations.

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

Conciseness5/5

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

Though lengthy, the description is well-structured with clear sections (summary, ranking signal, use cases, args, returns, coverage caveat). Every sentence adds operational value: the opening sentence is a concise summary, and the rest elaborates with necessary detail. No fluff or redundancy. Front-loading the purpose makes it easy to grasp quickly.

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?

The tool has a complex return structure with nested objects (candidates, pairings), but no output schema. The description provides a full return outline with keys, types, and semantics for 'direction'. It also covers parameter constraints, relationship filtering, error handling (unknown_ids), and a coverage caveat. Given the tool's complexity, the description is complete and leaves no critical gap.

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

Parameters5/5

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

The schema provides no descriptions for any parameters (0% coverage), but the description compensates thoroughly. It explains the 'rack' parameter with a concrete example, states that unmatched ids are surfaced rather than causing failure, gives max 64, describes the optional 'relationship' parameter and its enum values as filtering to one combination kind, and clarifies 'limit' with defaults and max. This is far beyond what the schema offers.

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

Purpose5/5

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

The description states a specific verb and resource: 'rank the modules NOT in the rack by how many rack members they pair with.' It clearly distinguishes itself from the sibling tool find_compatible_with by framing it as the set-level companion, answering 'given my whole rack, what single module should I add?' This is a specific, unambiguous purpose.

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

Usage Guidelines5/5

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

There is an explicit 'Use this for' section with example user intents, and a direct exclusion: 'For "what's an alternative to X?" use find_compatible_with.' The coverage caveat also tells the user when to use report_gap instead, providing clear when-to-use and when-not-to-use guidance.

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.

TDQS

A4.6/5.0
Disambiguation4/5

Each tool targets a distinct resource/action: get_module(s) for specs, search_modules for filtered queries, resolve_modules for name mapping, find_compatible_with for per-module relations, reachable_pairings/techniques for rack-level analysis. Minor overlap between get_module/get_modules and the relationship tools (find_compatible_with vs reachable_pairings) could cause misselection, but descriptions clarify scope.

Naming Consistency3/5

Mostly verb_noun snake_case (get_, search_, find_, resolve_, visualize_, report_, lookup_), but three tools break the pattern: rack_redundancy, reachable_pairings, reachable_techniques use noun/adjective phrases without a verb. The get_* cluster is consistent but the overall set mixes conventions.

Tool Count4/5

17 tools is slightly above the ideal 3-15 range but justified by the server's broad scope: module specs, search, manuals, relationships, rack analysis, visualization, and feedback. Each tool has a clear role; the count is reasonable for the domain's complexity.

Completeness5/5

The surface covers the full read-only Eurorack knowledge workflow: module lookup (get_module, search_modules, resolve_modules), manual prose (get_manual_chunk, search_manual), concepts (lookup_concept), techniques (search_techniques, find_role_realizations), compatibility (find_compatible_with, reachable_pairings), rack analysis (reachable_techniques, rack_redundancy), visualization, and provenance (get_source). report_gap even enables self-improvement. No obvious missing operations.

Resources