models.list
Every declared vendor and model, optionally narrowed by vendor, capability word, or one id or alias. Vendors carry whether their named credential variable is set — presence only, never a value. The order is the declaration's, which is also routing's preference order; the catalogue's own findings (a duplicate alias, an undeclared vendor) ride along.
Every declared vendor and model, optionally narrowed by vendor, capability word, or one id or alias. Vendors carry whether their named credential variable is set — presence only, never a value. The order is the declaration's, which is also routing's preference order; the catalogue's own findings (a duplicate alias, an undeclared vendor) ride along.
- query
- experimental
- module models
- #models
- #catalogue
Exposure
Where this one definition is reachable. Absence is explicit: a surface not listed does not carry it.
| surface | as |
|---|---|
| MCP | tool majordomus_models resource majordomus://models |
| HTTP | GET /api/v1/models operationId models.list |
| command line | majordomus models list |
Schemas
The canonical input and output, from the Rust types; the MCP tool schema and the OpenAPI parameters and responses are derived from these.
input · ModelsFilter
models.list: optional narrowing. Everything empty lists everything.| property | type | required | description |
|---|---|---|---|
| capability | string | null | no | Only models declaring this capability word. |
| id | string | null | no | One model, by canonical id or alias. |
| vendor | string | null | no | Only this vendor. |
JSON Schema
{
"additionalProperties": false,
"description": "The input of `models.list`: optional narrowing. Everything empty lists everything.",
"properties": {
"capability": {
"description": "Only models declaring this capability word.",
"type": [
"string",
"null"
]
},
"id": {
"description": "One model, by canonical id or alias.",
"type": [
"string",
"null"
]
},
"vendor": {
"description": "Only this vendor.",
"type": [
"string",
"null"
]
}
},
"title": "ModelsFilter",
"type": "object"
}output · ModelsReport
models.list.| property | type | required | description |
|---|---|---|---|
| count | integer | yes | How many models matched. |
| diagnostics | array | no | The catalogue's own findings: duplicate names, undeclared vendors. Empty is the ordinary case. |
| models | array | yes | The matching models, declaration order — which is routing's preference order. |
| vendors | array | yes | The vendors, declaration order. |
JSON Schema
{
"$defs": {
"Inference": {
"description": "Where a vendor's inference runs.",
"oneOf": [
{
"const": "remote",
"description": "An API over the network.",
"type": "string"
},
{
"const": "local",
"description": "A runtime on this machine.",
"type": "string"
}
]
},
"ModelEntry": {
"additionalProperties": false,
"description": "One model: the canonical reference this repository uses, the vendor's own name for\nit, and its typed capabilities. Capability words are data the catalogue declares —\nconsumers compare against a requirement list, never against a hardcoded name.",
"properties": {
"aliases": {
"description": "Other names that resolve to this model. Aliases live here and nowhere else.",
"items": {
"type": "string"
},
"type": "array"
},
"capabilities": {
"default": [],
"description": "Typed capability words: `text`, `vision`, `tools`, `structured_output`,\n`reasoning`, `streaming`, `embeddings` — the declared vocabulary, open for a\ncatalogue to extend without a code change.",
"items": {
"type": "string"
},
"type": "array"
},
"context_window": {
"description": "The context window, tokens.",
"format": "uint64",
"minimum": 0,
"type": [
"integer",
"null"
]
},
"id": {
"description": "The canonical id, unique in the catalogue: what sessions, configuration and\nrouting name. Stable even when a vendor renames.",
"type": "string"
},
"native_id": {
"description": "The vendor's own identifier, verbatim.",
"type": "string"
},
"note": {
"description": "One line a person needs when choosing; never pricing — a price the tool cannot\nverify is a fact it must not state (nothing here fabricates cost data).",
"type": [
"string",
"null"
]
},
"status": {
"anyOf": [
{
"$ref": "#/$defs/ModelStatus"
},
{
"type": "null"
}
],
"description": "The lifecycle standing, when the catalogue declares one. Absent is undeclared: the\ncatalogue admits only facts with provenance, and routing still considers the model,\nbut nothing may say it is available on the catalogue's behalf."
},
"vendor": {
"description": "The vendor that serves it.",
"type": "string"
}
},
"required": [
"id",
"vendor",
"native_id"
],
"type": "object"
},
"ModelStatus": {
"description": "A model's lifecycle standing, as the catalogue declares it. There is no default: a\ncatalogue entry that declares none has an undeclared standing, which is not the same\nfact as \"available\", and no reader may render it as one.",
"oneOf": [
{
"const": "available",
"description": "Generally available.",
"type": "string"
},
{
"const": "preview",
"description": "Usable, expected to change.",
"type": "string"
},
{
"const": "deprecated",
"description": "Still served, no longer chosen by routing unless named explicitly.",
"type": "string"
},
{
"const": "retired",
"description": "Gone; kept so an old record's reference still resolves to a row with a story.",
"type": "string"
}
]
},
"VendorView": {
"description": "One vendor with whether its credential is configured — presence of the named\nenvironment variable and nothing more. No value is read.",
"properties": {
"credential_configured": {
"description": "Whether the named credential variable is set in this process's environment.\n`None` when the vendor names no variable.",
"type": [
"boolean",
"null"
]
},
"credential_env": {
"description": "The environment variable whose *presence* means a credential is configured.\nOnly the name lives here, and only presence is ever reported — no code in this\ncrate reads the value, and the environment cache refuses to hold one.",
"type": [
"string",
"null"
]
},
"id": {
"description": "The vendor id, unique in the catalogue.",
"type": "string"
},
"inference": {
"$ref": "#/$defs/Inference",
"default": "remote",
"description": "Where inference runs: `remote` (an API over the network) or `local` (a runtime\non this machine). Typed here so routing's `local_only` is data, not a name test."
},
"title": {
"description": "The human name.",
"type": "string"
}
},
"required": [
"id",
"title"
],
"type": "object"
}
},
"description": "The answer of `models.list`.",
"properties": {
"count": {
"description": "How many models matched.",
"format": "uint",
"minimum": 0,
"type": "integer"
},
"diagnostics": {
"description": "The catalogue's own findings: duplicate names, undeclared vendors. Empty is\nthe ordinary case.",
"items": {
"type": "string"
},
"type": "array"
},
"models": {
"description": "The matching models, declaration order — which is routing's preference order.",
"items": {
"$ref": "#/$defs/ModelEntry"
},
"type": "array"
},
"vendors": {
"description": "The vendors, declaration order.",
"items": {
"$ref": "#/$defs/VendorView"
},
"type": "array"
}
},
"required": [
"count",
"vendors",
"models"
],
"title": "ModelsReport",
"type": "object"
}Policies
- benchmark
- required — a target on every transport the exposure declares; the cases are the input type's
- cache
- process — up to 4 entries in the process, 5s each, scoped by the registry fingerprint
Benchmark targets
Derived from the registry for this repository: one requirement per transport, and the cases the input type provides. The whole matrix is on the benchmarks page.