Skip to main content
Glama
smeet666

mcp-stashbox

Search performers

search_performers
Read-only

Search performers across all configured stash-box catalogues using text queries or structured filters, with paginated results from each catalogue.

Instructions

Search performers across every configured stash-box catalogue. Two exclusive paths: 'query' runs each catalogue's own text index, which reads the words as a union, and the typed arguments narrow as an intersection. Writing both is refused. The answer says per catalogue which of three it met: a failure, a catalogue nobody asked, and an emptiness it established. Counts are never added across them.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
nameNo
pageNoWhich page of its own order every catalogue asked is read at, counted from 1. A search written with words alone reads the first rows each text index answers with, since those routes take no page.
sortNo
aliasNoNo catalogue's faceted route applies it, though every faceted input declares it: a request carrying it answers as wide as one carrying none, so it is never sent and the answer names it as a narrowing nobody received.
limitNoHow many rows one page of one catalogue carries. An answer holding several carries up to this many from each: their pages are their own and nothing here interleaves them into one.
queryNoWords for the catalogue's own text index, which reads them as a union. It is exclusive with the typed arguments, which narrow as an intersection.
genderNo
countryNo
sourcesNo
directionNo
ethnicityNo
studio_idNo
birth_yearNo
disambiguationNo
performed_withNo
career_end_yearNoNo catalogue's faceted route applies it, though every faceted input declares it: a request carrying it answers as wide as one carrying none, so it is never sent and the answer names it as a narrowing nobody received.
career_start_yearNoNo catalogue's faceted route applies it, though every faceted input declares it: a request carrying it answers as wide as one carrying none, so it is never sent and the answer names it as a narrowing nobody received.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
notesYes
cachedNoReplayed from this client's store.
windowNoThe page and the row limit this answer was read at, absent where no catalogue answered.
resultsYes
orderingYesHow the rows were laid out, which a reader needs before reading the first.
per_sourceYes
result_countYesHow many rows this page carries.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed32 schema fields changedv1.0.0
    • addedInput schema / properties / alias / description
      Added value: +"No catalogue's faceted route applies it, though every faceted input declares it: a request carrying it answers as wide as one carrying none, so it is never sent and the answer names it as a narrowing nobody received."
    • addedInput schema / properties / career_end_year / description
      Added value: +"No catalogue's faceted route applies it, though every faceted input declares it: a request carrying it answers as wide as one carrying none, so it is never sent and the answer names it as a narrowing nobody received."
    • addedInput schema / properties / career_start_year / description
      Added value: +"No catalogue's faceted route applies it, though every faceted input declares it: a request carrying it answers as wide as one carrying none, so it is never sent and the answer names it as a narrowing nobody received."
    • changedInput schema / properties / limit / description
      Previous value: -"How many rows one page of one catalogue carries. An answer holding several catalogues carries up to this many from each of them, since their pages are their own and nothing here interleaves them into one."New value: +"How many rows one page of one catalogue carries. An answer holding several carries up to this many from each: their pages are their own and nothing here interleaves them into one."
    • changedInput schema / properties / page / description
      Previous value: -"The page of each catalogue's own order. A route that reads words alone takes no page, and the answer reports it as one that catalogue did not receive."New value: +"Which page of its own order every catalogue asked is read at, counted from 1. A search written with words alone reads the first rows each text index answers with, since those routes take no page."
    • changedOutput schema / properties / per_source / items / properties / index_total / description
      Previous value: -"What its own index holds for this question, the rows on this page included."New value: +"What its own index holds for the question it received, the rows on this page included. A narrowing it could not receive, or received in part, leaves that question wider than the one written."
    • changedOutput schema / properties / per_source / items / properties / narrowings_not_received / description
      Previous value: -"Narrowings this catalogue cannot receive. This is the one field that says a catalogue cannot do something."New value: +"Narrowings that shaped no part of the request this catalogue received, whether its route declares no field for one or nothing written was left for one to decide."
    • addedOutput schema / properties / per_source / items / properties / narrowings_received_in_part / description
      Added value: +"Narrowings it received short of what was written, the rest of the list naming records another catalogue minted. It answered a wider question than the one asked."
    • addedOutput schema / properties / results / items / properties / aliases
      Added value: +{
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / results / items / properties / also_held_at
      Added value: +{
      +  "description": "The same record on another catalogue, read from a link this one publishes to it. A shared name is no join.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "id": {
      +        "type": "string"
      +      },
      +      "source": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "source",
      +      "id"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / results / items / properties / birth_date
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "precision": {
      +          "description": "How much of the date the catalogue holds: a month or a year can be all of it.",
      +          "enum": [
      +            "day",
      +            "month",
      +            "year"
      +          ],
      +          "type": "string"
      +        },
      +        "value": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "value",
      +        "precision"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / results / items / properties / birth_date_unreadable
      Added value: +{
      +  "description": "A birth date was published in a shape this client could not read, so the null above is a reading that failed rather than a date nobody entered.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / results / items / properties / career_end_year
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / results / items / properties / career_start_year
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / results / items / properties / country
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / results / items / properties / death_date
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "precision": {
      +          "description": "How much of the date the catalogue holds: a month or a year can be all of it.",
      +          "enum": [
      +            "day",
      +            "month",
      +            "year"
      +          ],
      +          "type": "string"
      +        },
      +        "value": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "value",
      +        "precision"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / results / items / properties / death_date_unreadable
      Added value: +{
      +  "description": "The same, for the date of death.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / results / items / properties / disambiguation
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "What its catalogue tells two people of one name apart by."
      +}
    • addedOutput schema / properties / results / items / properties / gender
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / results / items / properties / linked_unfollowed
      Added value: +{
      +  "description": "A link to another catalogue naming the record by something this client cannot address. The link is written, and following it is what failed.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "source": {
      +        "type": "string"
      +      },
      +      "url": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "source",
      +      "url"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / results / items / properties / merged_ids
      Added value: +{
      +  "description": "Identifiers folded into this record, each of which still addresses it.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / results / items / properties / merged_into
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "The record this one was folded into, where its catalogue publishes one."
      +}
    • addedOutput schema / properties / results / items / properties / name
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / results / items / properties / pending_edits
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Edits open against it, null where its catalogue publishes no such count."
      +}
    • addedOutput schema / properties / results / items / properties / pending_edits_unreadable
      Added value: +{
      +  "description": "The count of open edits came back in a shape this client could not read.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / results / items / properties / retrieved_at
      Added value: +{
      +  "description": "The moment this client read it there.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / results / items / properties / rows_skipped
      Added value: +{
      +  "description": "Entries of this record's own lists that could not be read and are left out.",
      +  "type": "number"
      +}
    • addedOutput schema / properties / results / items / properties / rows_skipped_in
      Added value: +{
      +  "description": "Which of its lists lost them.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / results / items / properties / scene_count
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Scenes this one catalogue indexes them on, which measures its coverage and no career. Never added to another catalogue's."
      +}
    • addedOutput schema / properties / results / items / properties / status / description
      Added value: +"What the identifier addresses on that catalogue now. A folded record answers with a marker, which describes the record and never what it once named."
    • changedOutput schema / properties / results / items / required
      Previous value: -[
      -  "id",
      -  "source",
      -  "source_url",
      -  "status"
      -]New value: +[
      +  "id",
      +  "source",
      +  "source_url",
      +  "retrieved_at",
      +  "status",
      +  "also_held_at",
      +  "linked_unfollowed",
      +  "name",
      +  "disambiguation",
      +  "aliases",
      +  "gender",
      +  "country",
      +  "birth_date",
      +  "death_date",
      +  "career_start_year",
      +  "career_end_year",
      +  "scene_count",
      +  "merged_into",
      +  "merged_ids"
      +]
    • changedOutput schema / properties / window / description
      Previous value: -"The page a catalogue paged through, absent where none was given one."New value: +"The page and the row limit this answer was read at, absent where no catalogue answered."
  2. Changed61 schema fields changedv0.9.0
    • addedInput schema / properties / alias
      Added value: +{
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedInput schema / properties / birth_year
      Added value: +{
      +  "maximum": 2200,
      +  "minimum": 1800,
      +  "type": "integer"
      +}
    • addedInput schema / properties / career_end_year
      Added value: +{
      +  "maximum": 2200,
      +  "minimum": 1800,
      +  "type": "integer"
      +}
    • addedInput schema / properties / career_start_year
      Added value: +{
      +  "maximum": 2200,
      +  "minimum": 1800,
      +  "type": "integer"
      +}
    • removedInput schema / properties / country / description
      Removed value: -"Two-letter country code."
    • addedInput schema / properties / country / pattern
      Added value: +"^[A-Za-z]{2}$"
    • removedInput schema / properties / disambiguation / description
      Removed value: -"Free text a catalogue uses to tell two people of one name apart."
    • addedInput schema / properties / disambiguation / minLength
      Added value: +1
    • addedInput schema / properties / ethnicity
      Added value: +{
      +  "enum": [
      +    "UNKNOWN",
      +    "CAUCASIAN",
      +    "BLACK",
      +    "ASIAN",
      +    "INDIAN",
      +    "LATIN",
      +    "MIDDLE_EASTERN",
      +    "MIXED",
      +    "OTHER"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / gender
      Added value: +{
      +  "enum": [
      +    "UNKNOWN",
      +    "MALE",
      +    "FEMALE",
      +    "TRANSGENDER_MALE",
      +    "TRANSGENDER_FEMALE",
      +    "INTERSEX",
      +    "NON_BINARY"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / limit / description
      Added value: +"How many rows one page of one catalogue carries. An answer holding several catalogues carries up to this many from each of them, since their pages are their own and nothing here interleaves them into one."
    • addedInput schema / properties / name / minLength
      Added value: +1
    • addedInput schema / properties / page / description
      Added value: +"The page of each catalogue's own order. A route that reads words alone takes no page, and the answer reports it as one that catalogue did not receive."
    • changedInput schema / properties / page / maximum
      Previous value: -10000New value: +1000
    • removedInput schema / properties / performed_with / description
      Removed value: -"Namespaced identifier of another performer."
    • addedInput schema / properties / performed_with / pattern
      Added value: +"^(?:(?:stashdb|tpdb|fansdb|pmv|javstash):)?[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"
    • changedInput schema / properties / query / description
      Previous value: -"Free text matched against names and aliases."New value: +"Words for the catalogue's own text index, which reads them as a union. It is exclusive with the typed arguments, which narrow as an intersection."
    • addedInput schema / properties / query / minLength
      Added value: +1
    • changedInput schema / properties / sort / enum
      Previous value: -[
      -  "name",
      -  "birthdate",
      -  "scene_count",
      -  "created",
      -  "updated"
      -]New value: +[
      +  "name",
      +  "birthdate",
      +  "deathdate",
      +  "scene_count",
      +  "career_start_year",
      +  "debut",
      +  "last_scene",
      +  "popularity",
      +  "created_at",
      +  "updated_at"
      +]
    • addedInput schema / properties / sources / items / enum
      Added value: +[
      +  "stashdb",
      +  "tpdb",
      +  "fansdb",
      +  "pmv",
      +  "javstash"
      +]
    • addedInput schema / properties / sources / maxItems
      Added value: +5
    • addedInput schema / properties / sources / minItems
      Added value: +1
    • removedInput schema / properties / studio_id / description
      Removed value: -"Namespaced studio identifier."
    • addedInput schema / properties / studio_id / pattern
      Added value: +"^(?:(?:stashdb|tpdb|fansdb|pmv|javstash):)?[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"
    • changedOutput schema / properties / cached / description
      Previous value: -"Present when the answer came from the in-memory store."New value: +"Replayed from this client's store."
    • changedOutput schema / properties / ordering / description
      Previous value: -"How the order was built. The catalogues publish no score in common, so rows interleave and nothing is ranked across them."New value: +"How the rows were laid out, which a reader needs before reading the first."
    • addedOutput schema / properties / per_source / items / properties / algorithms_not_searched
      Added value: +{
      +  "description": "Fingerprint algorithms its lookup does not search, so they were never put to it.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / properties / per_source / items / properties / count / description
      Previous value: -"Rows this catalogue contributed to this page."New value: +"Rows it contributed. Never added to another catalogue's: they index corpora that overlap by an amount none of them publishes."
    • addedOutput schema / properties / per_source / items / properties / error / enum
      Added value: +[
      +  "not_found",
      +  "invalid_input",
      +  "rate_limited",
      +  "parse_failure",
      +  "network_error",
      +  "timeout"
      +]
    • removedOutput schema / properties / per_source / items / properties / fields_searched
      Removed value: -{
      -  "description": "The fields the text index read. Absent where no text index was consulted.",
      -  "items": {
      -    "type": "string"
      -  },
      -  "type": "array"
      -}
    • changedOutput schema / properties / per_source / items / properties / index_total / description
      Previous value: -"What this catalogue's index holds for the question, beyond the page returned."New value: +"What its own index holds for this question, the rows on this page included."
    • addedOutput schema / properties / per_source / items / properties / index_total_over_any_word
      Added value: +{
      +  "description": "The total counts rows carrying any word of the query, its text index reading them apart.",
      +  "type": "boolean"
      +}
    • changedOutput schema / properties / per_source / items / properties / moment / description
      Previous value: -"Which step failed, for a catalogue that failed."New value: +"Which moment failed."
    • addedOutput schema / properties / per_source / items / properties / name / description
      Added value: +"The name that catalogue calls itself."
    • addedOutput schema / properties / per_source / items / properties / narrowings_naming_no_record
      Added value: +{
      +  "description": "Narrowings written only with identifiers another catalogue minted.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / properties / per_source / items / properties / narrowings_not_received / description
      Previous value: -"Narrowings this catalogue could not receive. A row of its satisfying one of them does so by chance."New value: +"Narrowings this catalogue cannot receive. This is the one field that says a catalogue cannot do something."
    • addedOutput schema / properties / per_source / items / properties / narrowings_received_in_part
      Added value: +{
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / per_source / items / properties / reason / description
      Added value: +"Why it was not asked, or what went wrong."
    • addedOutput schema / properties / per_source / items / properties / records
      Added value: +{
      +  "description": "Distinct records behind its rows.",
      +  "type": "number"
      +}
    • addedOutput schema / properties / per_source / items / properties / skipped / description
      Added value: +"Rows it answered with that this client could not read and left out."
    • addedOutput schema / properties / per_source / items / properties / source / description
      Added value: +"The catalogue this row is about."
    • changedOutput schema / properties / per_source / items / properties / state / description
      Previous value: -"'answered' is a catalogue that looked, and a count of zero there means it found nothing. 'failed' could not answer. 'absent' was never asked. An answer holding rows from some catalogues is no evidence about the others."New value: +"'answered' looked, and a count of zero means it found nothing. 'failed' could not answer, and states nothing about what it holds. 'absent' was never asked. Only the first is evidence about the world."
    • addedOutput schema / properties / per_source / items / properties / unattributed / description
      Added value: +"Records it answered with while carrying none of what was asked about."
    • removedOutput schema / properties / query
      Removed value: -{
      -  "type": "string"
      -}
    • addedOutput schema / properties / result_count / description
      Added value: +"How many rows this page carries."
    • changedOutput schema / properties / results / items / additionalProperties
      Previous value: -falseNew value: +{}
    • removedOutput schema / properties / results / items / properties / aliases
      Removed value: -{
      -  "items": {
      -    "type": "string"
      -  },
      -  "type": "array"
      -}
    • removedOutput schema / properties / results / items / properties / birth_date
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "additionalProperties": false,
      -      "properties": {
      -        "precision": {
      -          "description": "How much of the date a cataloguer entered. A value recorded to the year carries no month and no day, and reading it as one would claim a precision nobody entered.",
      -          "enum": [
      -            "day",
      -            "month",
      -            "year"
      -          ],
      -          "type": "string"
      -        },
      -        "value": {
      -          "description": "The date exactly as the catalogue publishes it.",
      -          "type": "string"
      -        }
      -      },
      -      "required": [
      -        "value",
      -        "precision"
      -      ],
      -      "type": "object"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ]
      -}
    • removedOutput schema / properties / results / items / properties / career_end_year
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "type": "number"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ]
      -}
    • removedOutput schema / properties / results / items / properties / career_start_year
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "type": "number"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ]
      -}
    • removedOutput schema / properties / results / items / properties / country
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "type": "string"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ]
      -}
    • removedOutput schema / properties / results / items / properties / disambiguation
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "type": "string"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ]
      -}
    • addedOutput schema / properties / results / items / properties / id / description
      Added value: +"Written instance:uuid. The catalogue travels with the uuid."
    • removedOutput schema / properties / results / items / properties / name
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "type": "string"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ]
      -}
    • removedOutput schema / properties / results / items / properties / scene_count
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "type": "number"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ],
      -  "description": "Scenes that catalogue has indexed crediting this performer."
      -}
    • addedOutput schema / properties / results / items / properties / source_url / description
      Added value: +"The address it was read from. Credit the catalogue and link it."
    • removedOutput schema / properties / results / items / properties / status / description
      Removed value: -"'established' is a record the catalogue holds. 'merged' and 'deleted' are markers: the identifier resolves, and what comes back describes the record rather than the thing it once named."
    • changedOutput schema / properties / results / items / properties / status / enum
      Previous value: -[
      -  "established",
      -  "deleted",
      -  "merged"
      -]New value: +[
      +  "established",
      +  "merged",
      +  "deleted"
      +]
    • changedOutput schema / properties / results / items / required
      Previous value: -[
      -  "id",
      -  "source",
      -  "name",
      -  "disambiguation",
      -  "aliases",
      -  "country",
      -  "birth_date",
      -  "career_start_year",
      -  "career_end_year",
      -  "scene_count",
      -  "status",
      -  "source_url"
      -]New value: +[
      +  "id",
      +  "source",
      +  "source_url",
      +  "status"
      +]
    • changedOutput schema / properties / window / description
      Previous value: -"The window this answer covers, per catalogue. An emptiness here is an emptiness inside that window."New value: +"The page a catalogue paged through, absent where none was given one."
    • changedOutput schema / required
      Previous value: -[
      -  "results",
      -  "result_count",
      -  "ordering",
      -  "per_source",
      -  "notes"
      -]New value: +[
      +  "results",
      +  "result_count",
      +  "per_source",
      +  "ordering",
      +  "notes"
      +]
  3. Changed9 schema fields changedv0.2.1
    • removedInput schema / properties / career_end_year
      Removed value: -{
      -  "maximum": 9007199254740991,
      -  "minimum": -9007199254740991,
      -  "type": "integer"
      -}
    • removedInput schema / properties / career_start_year
      Removed value: -{
      -  "maximum": 9007199254740991,
      -  "minimum": -9007199254740991,
      -  "type": "integer"
      -}
    • changedInput schema / properties / page / maximum
      Previous value: -9007199254740991New value: +10000
    • addedOutput schema / properties / cached
      Added value: +{
      +  "description": "Present when the answer came from the in-memory store.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / per_source / items / properties / skipped
      Added value: +{
      +  "type": "number"
      +}
    • addedOutput schema / properties / per_source / items / properties / unattributed
      Added value: +{
      +  "type": "number"
      +}
    • removedOutput schema / properties / query / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / query / type
      Added value: +"string"
    • changedOutput schema / required
      Previous value: -[
      -  "query",
      -  "results",
      -  "result_count",
      -  "ordering",
      -  "per_source",
      -  "notes"
      -]New value: +[
      +  "results",
      +  "result_count",
      +  "ordering",
      +  "per_source",
      +  "notes"
      +]
  4. First observedv0.1.1

TDQS

A4.2/5.0
Behavior5/5

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

Annotations (readOnlyHint: true, openWorldHint: true) already establish safety and open-world semantics. The description goes well beyond, revealing exclusive paths, the refusal when both are written, per-catalogue response states ('a failure, a catalogue nobody asked, and an emptiness it established'), non-summation across catalogues, and the behavior of no-op parameters like alias.

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?

Remarkably compact for a description covering such conceptual terrain, front-loading purpose and then detailing behavior efficiently. The unusual phrasing 'a catalogue nobody asked, and an emptiness it established' is striking but slightly confusing without clearer syntax, and the description remains dense yet occasionally opaque, costing it a point.

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?

For a complex tool with 17 parameters, multi-catalogue fan-out, and exclusive query modes, the description captures the critical behaviors—union vs intersection semantics, exclusivity rules, per-catalogue response consistency—that an agent must understand to invoke it correctly. The output schema correctly handles return-value details.

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

Parameters3/5

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

Schema coverage is only 35%, so the description carries a heavy burden. It delivers an excellent conceptual framework explaining 'query' (union) vs typed args (intersection) and exclusivity, but with 10 of 17 parameters undocumented and uncovered by the main description, it cannot fully compensate. The framework elegantly covers the crucial conceptual model without resolving all gaps.

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?

'Search performers across every configured stash-box catalogue' precisely states verb, resource, and the distinguishing scope of multi-catalogue search. It clearly differentiates from sibling search tools by stressing 'across every configured stash-box catalogue,' something search_scenes, search_studios, and search_tags would not do.

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

Usage Guidelines3/5

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

The description gives strong internal guidance on when to use the 'query' path vs typed arguments (union vs intersection, mutually exclusive). It implicitly communicates when to use the tool but never explicitly names alternatives or states conditions for choosing it over get_performer or sibling search tools, leaving the exclusion logic unexplained.

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