# Robert Blust (remote · mcp.blust.ch)

Robert Blust: One model, true everywhere

- Trust score: 86/100 (high trust)
- Change this week: +12
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-10-16

## Components

- remote · `mcp.blust.ch`: 86/100 (this document), [markdown](https://verifymcp.io/servers/ch-blust-mental-model/mcp.md), [page](https://verifymcp.io/servers/ch-blust-mental-model/mcp)

## Channel facts

- Endpoint: `https://mcp.blust.ch/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `1.0.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-10-16.

- **Endpoint Security**: 83/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - No authorisation is required to call this server. Every tool declares its destructiveHint and none is destructive, so open access doesn't expose one.
  - HTTPS is enforced; there's no plaintext access path.
  - The HSTS (Strict-Transport-Security) header is present.
  - DNSSEC is configured correctly; the domain's records validate against the full chain to the root.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 67/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 2553 tokens (~182/item across 14 items; 14 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 97/100
  - Stability observed for 29 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 90/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 66% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 14 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 15 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### How do I install the Robert Blust MCP server?

Robert Blust is a hosted endpoint at https://mcp.blust.ch/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add --transport http ch-blust-mental-model 'https://mcp.blust.ch/mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "ch-blust-mental-model": {
      "url": "https://mcp.blust.ch/mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "ch-blust-mental-model": {
      "type": "http",
      "url": "https://mcp.blust.ch/mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.ch-blust-mental-model]
url = "https://mcp.blust.ch/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "ch-blust-mental-model": {
      "type": "remote",
      "url": "https://mcp.blust.ch/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add ch-blust-mental-model --url 'https://mcp.blust.ch/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  ch-blust-mental-model:
    url: "https://mcp.blust.ch/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "ch-blust-mental-model": {
      "Transport": "http",
      "Url": "https://mcp.blust.ch/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add ch-blust-mental-model -t streamable-http -u 'https://mcp.blust.ch/mcp'
```

### Other

```json
{
  "mcpServers": {
    "ch-blust-mental-model": {
      "type": "http",
      "url": "https://mcp.blust.ch/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-10-16 (score 86, +1)

No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-13 (score 85, +1)

- [security] Tool “diagram” rewrote its description, which is the text the model reads
- [functional] Server version: 0.66.1 → 0.69.0
- [cosmetic] “diagram” added an optional parameter “unit”
- [cosmetic] “diagram” reworded the description of “id”

### 2026-10-12 (score 84, +1)

- [security] Tool “diagram” rewrote its description, which is the text the model reads
- [functional] Server version: 0.62.0 → 0.66.1
- [cosmetic] “diagram” reworded the description of “id”

### 2026-10-10 (score 83, +9)

- [security improvement] Authorization: unverified → partial
- [security] Tool “diagram” rewrote its description, which is the text the model reads
- [functional] Server version: 0.58.0 → 0.62.0
- [cosmetic] “diagram” reworded the description of “id”

### 2026-10-04 (score 74, 0)

- [functional] Server version: 0.52.0 → 0.54.0

### 2026-10-03 (score 74, +1)

- [security] Tool “describe_rule” rewrote its description, which is the text the model reads
- [security] Tool “list_entities” rewrote its description, which is the text the model reads
- [security] Tool “list_rules” rewrote its description, which is the text the model reads
- [functional improvement] Tool coverage: 56% → 61%
- [functional] Server version: 0.47.0 → 0.52.0
- [cosmetic] “list_entities” added an optional parameter “order”
- [cosmetic] “describe_rule” reworded the description of “rule”
- [cosmetic] “list_entities” reworded the description of “type”
- [cosmetic] “list_entities” made “type” optional

### 2026-10-01 (score 73, 0)

- [security] The server rewrote its instructions, which are the text every model session reads
- [security] Tool “fetch” rewrote its description, which is the text the model reads
- [security] Tool “find_evidence” rewrote its description, which is the text the model reads
- [security] Tool “get_entity” rewrote its description, which is the text the model reads
- [security] Tool “list_entities” rewrote its description, which is the text the model reads
- [security] Tool “list_references” rewrote its description, which is the text the model reads
- [functional] Server version: 0.45.0 → 0.47.0
- [cosmetic] “diagram” reworded the description of “domain”
- [cosmetic] “find_evidence” reworded the description of “skill”
- [cosmetic] “get_entity” reworded the description of “id”
- [cosmetic] “list_entities” reworded the description of “owner”
- [cosmetic] “search” reworded the description of “owner”

### 2026-09-30 (score 73, +1)

- [functional] Server version: 0.44.1 → 0.45.0

## MCP tools (14)

### `list_types` (~71 tokens)

Every type the model's schemas declare. Use first, to learn which types exist before listing or describing one. No input. Returns `types`, each with `type`, `name`, `tagline`, `owner` (the type it nests under, or null) and `count`, the entities it holds.

Output parameters:

- `model` (object)
- `types` (array)

### `describe_schema` (~98 tokens)

One type's schema: its sections as written and its declared relations as data. Use to learn what an entity of the type may hold; for the whole vocabulary use describe_relations. Input: `type`. Returns `url`, the schema's own file, `sections`, and `relations`: owner, owns, references both ways, enums, joins and lists.

Input parameters:

- `type` (string, required): A type name from list_types, such as skill

Output parameters:

- `model` (object)
- `name` (string)
- `relations` (object)
- `sections` (array)
- `tagline` (string)
- `type` (string)
- `url` (string|null)

### `describe_relations` (~127 tokens)

What the schemas declare between types: references with form and cardinality, ownership, enums, joins, list kinds. Use for a diagram or audit; for one type's full schema use describe_schema. Optional `type` narrows every list, `direction` (declares, declared-to, both; needs `type`) one side of relations, `via` relations and enums. Returns those lists, with `forms` and `reading` explaining every term. Not paged.

Input parameters:

- `direction` (string)
- `type` (string)
- `via` (string)

Output parameters:

- `enums` (array)
- `forms` (object)
- `joins` (array)
- `lists` (array)
- `model` (object)
- `ownership` (array)
- `reading` (object)
- `relations` (array)

### `list_rules` (~102 tokens)

The vocabulary's conventions the model is held to, R0 onwards, from its core's CONVENTIONS.md. Use to resolve a number a schema or refusal cites, such as R9. A company's own rules are entities of type `rule`: list_entities and get_entity. No input. Returns `tagline`, the file's `url`, and `rules`, each with `rule`, `title` and `part`; describe_rule gives one rule's text.

Output parameters:

- `model` (object)
- `rules` (array)
- `tagline` (string)
- `url` (string|null)

### `describe_rule` (~104 tokens)

One convention of the vocabulary as written, not a company's own rule (an entity of type `rule`: list_entities, get_entity). Input: `rule`, a number from list_rules such as R9, in either case. Returns `rule`, `title`, `part`, `text` and the file's `url`. An unknown number is refused with the known ones listed.

Input parameters:

- `rule` (string, required): A convention's number from list_rules, such as R9

Output parameters:

- `model` (object)
- `part` (string|null)
- `rule` (string)
- `text` (string)
- `title` (string)
- `url` (string|null)

### `list_checks` (~93 tokens)

The checks the model's own gate runs, from the checker release this server was built with. Use to see which rules a script enforces and which are left to a reader. No input. Returns `checks`, each with `name`, `rule`, `title` and what it `reports`, a `failure` or a `note` that fails nothing, and `ranBy`. This server runs none of them.

Output parameters:

- `checks` (array)
- `model` (object)
- `ranBy` (string)

### `describe_errors` (~98 tokens)

What a refused call looks like. A tool's output schema covers its answers only, so use this once, to branch on refusals or validate them. No input. Returns `errors`, every `code` with `when` it is raised and the JSON Schema of its `details`, and `schema`, the JSON Schema of a whole refusal: `error` with `code`, `message`, `rule`, `details`, beside `model`.

Output parameters:

- `errors` (array)
- `model` (object)
- `schema` (object)

### `list_entities` (~362 tokens)

Entities with their frontmatter's short facts, in address order or newest first. Use to browse, or for what runs on a date, came last or has a value; to find by words use search. Input: optional `type`, `owner`, `order`, `on`, `by`, `where`, `fields`, `limit`, `cursor`. Returns `entities` with `fields`, and `page`; follow `page.nextCursor` while `page.hasMore`.

Input parameters:

- `by` (string): A date field, such as start or decided, to order by in the direction order names
- `cursor` (string): `page.nextCursor` from the previous answer, sent with the same arguments; omit it for the first page.
- `fields` (array): Fields to add by name beside the short ones every entity carries, such as an array
- `limit` (integer): Entries per page: 50 by default, clamped to 1–200, so 0 returns one entry and 1000 returns 200.
- `on` (string): A date, YYYY, YYYY-MM or YYYY-MM-DD: keep the entities whose period, start to end, holds it; an absent end is still running
- `order` (string): address, where the pages sit, by default; newest or oldest, by when each entity came into the model, or by the date `by` names
- `owner` (string): An owner's id or address, to keep its entities
- `type` (string): A type, to keep its entities; leave it out to list every type
- `where` (object): Field values to keep, ignoring case, by field name; a reference matches by the name its page writes

Output parameters:

- `entities` (array)
- `model` (object)
- `page` (object)
- `type` (string|null)

### `get_entity` (~149 tokens)

One entity as structured data: fields, sections, tables, references both ways. Use to reason over one; for its page as written use fetch. Input: `id` or address, where its page sits, or `type` and `name`; an ambiguous name is refused with candidate ids. Returns `entity`, by id. Reference lists hold at most 50 edges; `referenceCounts` gives totals, list_references the rest.

Input parameters:

- `id` (string): The entity's id, as any answer gives it, or its address, where its page sits
- `name` (string): The canonical name, the entity's H1; needs type
- `type` (string)

Output parameters:

- `entity` (object)
- `model` (object)

### `list_references` (~204 tokens)

The model's edges, filtered and paged. Use to inspect one entity's relations or one kind of reference without taking whole entities. Optional `entity` (an id or address), `direction` (out, in, both; needs `entity`), `via`, `type` (the far end's type, or either end's without `entity`), `limit`, `cursor`. Returns `edges`, each `from`, `via`, `to`, `attrs`, and `page`.

Input parameters:

- `cursor` (string): `page.nextCursor` from the previous answer, sent with the same arguments; omit it for the first page.
- `direction` (string)
- `entity` (string)
- `limit` (integer): Entries per page: 50 by default, clamped to 1–200, so 0 returns one entry and 1000 returns 200.
- `type` (string)
- `via` (string)

Output parameters:

- `edges` (array)
- `model` (object)
- `page` (object)

### `find_evidence` (~174 tokens)

Every edge into one skill, grouped by the type of the page that drew it. Use to check a claimed skill against its evidence. Input: `skill`, an id, canonical name or address; optional `limit`, `cursor`. Returns `skill`, `evidence` and `page`; a profile's claim arrives via Skills.Skill with its level, an evidence row via Evidence.Skill. Attributes are verbatim.

Input parameters:

- `cursor` (string): `page.nextCursor` from the previous answer, sent with the same arguments; omit it for the first page.
- `limit` (integer): Entries per page: 50 by default, clamped to 1–200, so 0 returns one entry and 1000 returns 200.
- `skill` (string, required): The skill's id, canonical name or address

Output parameters:

- `evidence` (object)
- `model` (object)
- `page` (object)
- `skill` (object)

### `search` (~217 tokens)

Find entities by words, substring or exact name. `match: "words"` needs every query word's stem in name, tagline, fields, sections or cells; `"text"` (default) is a case-insensitive substring over the same; `"name"` the exact canonical name. Optional `type`, `owner`, `limit`, `cursor`. Returns `results` with `id`, `title`, `type`, `matched`, `words` in words mode, and `page`: name matches first, then a listing.

Input parameters:

- `cursor` (string): `page.nextCursor` from the previous answer, sent with the same arguments; omit it for the first page.
- `limit` (integer): Entries per page: 50 by default, clamped to 1–200, so 0 returns one entry and 1000 returns 200.
- `match` (string)
- `owner` (string): An owner's id or address, to keep its entities
- `query` (string, required)
- `type` (string)

Output parameters:

- `match` (string)
- `model` (object)
- `page` (object)
- `query` (string)
- `results` (array)
- `words` (array)

### `fetch` (~90 tokens)

One entity's page as written. Use to quote or display the source; for structured fields and references use get_entity. Input: `id` or address, from search, list_entities or any reference. Returns `id`, `title`, `type`, `url` and `text`, the Markdown source. Takes no name: search with match "name" finds the id.

Input parameters:

- `id` (string, required)

Output parameters:

- `id` (string)
- `model` (object)
- `text` (string)
- `title` (string)
- `type` (string)
- `url` (string|null)

### `diagram` (~304 tokens)

A picture of the model as Mermaid; edge data: list_references. Input: `shape`; `id`, `domain`, `type` or `unit` narrow it. aggregate, flow, lifecycle take a context's `id`; organization without `id` draws the company; system a landscape, holds its data; usecase, scenario a use case's; requirements a feature's, product's, use case's or requirement's. Returns `mermaid`, `nodes`, `links`, `units`, counts. Max 50 nodes.

Input parameters:

- `domain` (string): A domain's id or address, to draw its concepts
- `id` (string): The process, the entity at a neighborhood's middle, the bounded context of a context map, or the aggregate or bounded context of an aggregate, flow or lifecycle picture, the group an organization is…
- `shape` (string, required)
- `type` (string): A type, to draw its schema and the types it is declared with
- `unit` (string): core or a pack, to draw that unit's types and what they declare; a meta-model too large to draw whole is drawn as core, and `units` in the answer names every unit

Output parameters:

- `actor` (string)
- `edges` (integer)
- `everyType` (array)
- `extensions` (array)
- `links` (array)
- `mermaid` (string)
- `model` (object)
- `nodes` (array)
- `omitted` (integer)
- `shape` (string)
- `steps` (array)
- `title` (string|null)
- `transitions` (array)
- `unit` (string)
- `units` (array)

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/ch-blust-mental-model/mcp#diagnostics

## Score history

- 2026-10-16: 86
- 2026-10-15: 85
- 2026-10-14: 85
- 2026-10-13: 85
- 2026-10-12: 84
- 2026-10-10: 83
- 2026-10-04: 74
- 2026-10-03: 74
- 2026-10-02: 73
- 2026-10-01: 73
- 2026-09-30: 73
- 2026-09-29: 72
- 2026-09-28: 72
- 2026-09-27: 71
- 2026-09-26: 71
- 2026-09-25: 70
- 2026-09-24: 70
- 2026-09-23: 69
- 2026-09-22: 69
- 2026-09-21: 69
- 2026-09-20: 68
- 2026-09-19: 67
- 2026-09-18: 67
- 2026-09-17: 66

## Common questions

### What is the Robert Blust MCP server?

Robert Blust is an MCP server listed in the public MCP registry as ch.blust/mental-model. Robert Blust: One model, true everywhere. This page covers its hosted endpoint (https://mcp.blust.ch/mcp).

### Is the Robert Blust MCP server safe to use?

Robert Blust scores 86 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Robert Blust MCP server expose?

Robert Blust exposes 14 tools: list_types, describe_schema, describe_relations, list_rules, describe_rule, and 9 more. Their descriptions and schemas cost roughly 2,193 tokens of context every time the server is loaded.

### Does the Robert Blust MCP server require authentication?

No. We connected to Robert Blust without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

### Is the Robert Blust MCP server still maintained?

Robert Blust is still listed as active in the MCP registry. We last reached this channel on 16 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- Remote endpoint: https://mcp.blust.ch/mcp
- Changelog RSS feed: https://verifymcp.io/servers/ch-blust-mental-model/mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/ch-blust-mental-model/mcp.json
- HTML version of this page: https://verifymcp.io/servers/ch-blust-mental-model/mcp
