# Cratis Chronicle (oci · docker.io/cratis/chronicle-mcp)

Inspect Cratis Chronicle event stores read-only by default; opt-in, authorized job control.

- Trust score: 50/100 (low)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- oci · `docker.io/cratis/chronicle-mcp`: 50/100 (this document), [markdown](https://verifymcp.io/servers/cratis-chronicle-mcp/docker-io-cratis-chronicle-mcp.md), [page](https://verifymcp.io/servers/cratis-chronicle-mcp/docker-io-cratis-chronicle-mcp)

## Channel facts

- Registry: `oci`
- Package: `docker.io/cratis/chronicle-mcp`
- Version: `2.1.0`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, 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-11-05.

- **Supply Chain Security**: 0/100
  - No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.
  - Known CVEs could not be checked: this artifact ships no SBOM or dependency manifest, so there is no dependency list to read.
  - Install-script risk not yet assessed.
  - Dependency health could not be checked: this artifact ships no SBOM or dependency manifest, so there is no dependency list to read.
- **Provenance & Transparency**: 32/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - License check failed: no license is declared.
  - Actively maintained (last published 1 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 83/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 2872 tokens (~114/item across 25 items; 25 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 73/100
  - Stability observed for 22 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 25 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 25 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

**Unverified: 1 category.** A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

## Install

### How do I install the Cratis Chronicle MCP server?

Cratis Chronicle runs locally as a container image, launched with docker run --rm -i -e Cratis__Chronicle__Mcp__Profile -e Cratis__Chronicle__Mcp__ConnectionString -e Cratis__Chronicle__Mcp__ClientId -e Cratis__Chronicle__Mcp__ClientSecret -e Cratis__Chronicle__Mcp__ApiKey -e Cratis__Chronicle__Mcp__EventStore -e Cratis__Chronicle__Mcp__Namespace docker.io/cratis/chronicle-mcp:2.1.0. Ready-made configuration for Claude, Cursor, VS Code, Codex and 3 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add cratis-chronicle-mcp -- docker run --rm -i -e Cratis__Chronicle__Mcp__Profile -e Cratis__Chronicle__Mcp__ConnectionString -e Cratis__Chronicle__Mcp__ClientId -e Cratis__Chronicle__Mcp__ClientSecret -e Cratis__Chronicle__Mcp__ApiKey -e Cratis__Chronicle__Mcp__EventStore -e Cratis__Chronicle__Mcp__Namespace docker.io/cratis/chronicle-mcp:2.1.0
```

This image reads Cratis__Chronicle__Mcp__Profile, Cratis__Chronicle__Mcp__ConnectionString, Cratis__Chronicle__Mcp__ClientId, Cratis__Chronicle__Mcp__ClientSecret, Cratis__Chronicle__Mcp__ApiKey, Cratis__Chronicle__Mcp__EventStore and Cratis__Chronicle__Mcp__Namespace. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### Cursor

```json
{
  "mcpServers": {
    "cratis-chronicle-mcp": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-e",
        "Cratis__Chronicle__Mcp__Profile",
        "-e",
        "Cratis__Chronicle__Mcp__ConnectionString",
        "-e",
        "Cratis__Chronicle__Mcp__ClientId",
        "-e",
        "Cratis__Chronicle__Mcp__ClientSecret",
        "-e",
        "Cratis__Chronicle__Mcp__ApiKey",
        "-e",
        "Cratis__Chronicle__Mcp__EventStore",
        "-e",
        "Cratis__Chronicle__Mcp__Namespace",
        "docker.io/cratis/chronicle-mcp:2.1.0"
      ]
    }
  }
}
```

This image reads Cratis__Chronicle__Mcp__Profile, Cratis__Chronicle__Mcp__ConnectionString, Cratis__Chronicle__Mcp__ClientId, Cratis__Chronicle__Mcp__ClientSecret, Cratis__Chronicle__Mcp__ApiKey, Cratis__Chronicle__Mcp__EventStore and Cratis__Chronicle__Mcp__Namespace. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### VS Code

```json
{
  "servers": {
    "cratis-chronicle-mcp": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-e",
        "Cratis__Chronicle__Mcp__Profile",
        "-e",
        "Cratis__Chronicle__Mcp__ConnectionString",
        "-e",
        "Cratis__Chronicle__Mcp__ClientId",
        "-e",
        "Cratis__Chronicle__Mcp__ClientSecret",
        "-e",
        "Cratis__Chronicle__Mcp__ApiKey",
        "-e",
        "Cratis__Chronicle__Mcp__EventStore",
        "-e",
        "Cratis__Chronicle__Mcp__Namespace",
        "docker.io/cratis/chronicle-mcp:2.1.0"
      ]
    }
  }
}
```

This image reads Cratis__Chronicle__Mcp__Profile, Cratis__Chronicle__Mcp__ConnectionString, Cratis__Chronicle__Mcp__ClientId, Cratis__Chronicle__Mcp__ClientSecret, Cratis__Chronicle__Mcp__ApiKey, Cratis__Chronicle__Mcp__EventStore and Cratis__Chronicle__Mcp__Namespace. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### Codex

```bash
codex mcp add cratis-chronicle-mcp -- docker run --rm -i -e Cratis__Chronicle__Mcp__Profile -e Cratis__Chronicle__Mcp__ConnectionString -e Cratis__Chronicle__Mcp__ClientId -e Cratis__Chronicle__Mcp__ClientSecret -e Cratis__Chronicle__Mcp__ApiKey -e Cratis__Chronicle__Mcp__EventStore -e Cratis__Chronicle__Mcp__Namespace docker.io/cratis/chronicle-mcp:2.1.0
```

This image reads Cratis__Chronicle__Mcp__Profile, Cratis__Chronicle__Mcp__ConnectionString, Cratis__Chronicle__Mcp__ClientId, Cratis__Chronicle__Mcp__ClientSecret, Cratis__Chronicle__Mcp__ApiKey, Cratis__Chronicle__Mcp__EventStore and Cratis__Chronicle__Mcp__Namespace. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "cratis-chronicle-mcp": {
      "type": "local",
      "command": [
        "docker",
        "run",
        "--rm",
        "-i",
        "-e",
        "Cratis__Chronicle__Mcp__Profile",
        "-e",
        "Cratis__Chronicle__Mcp__ConnectionString",
        "-e",
        "Cratis__Chronicle__Mcp__ClientId",
        "-e",
        "Cratis__Chronicle__Mcp__ClientSecret",
        "-e",
        "Cratis__Chronicle__Mcp__ApiKey",
        "-e",
        "Cratis__Chronicle__Mcp__EventStore",
        "-e",
        "Cratis__Chronicle__Mcp__Namespace",
        "docker.io/cratis/chronicle-mcp:2.1.0"
      ],
      "enabled": true
    }
  }
}
```

This image reads Cratis__Chronicle__Mcp__Profile, Cratis__Chronicle__Mcp__ConnectionString, Cratis__Chronicle__Mcp__ClientId, Cratis__Chronicle__Mcp__ClientSecret, Cratis__Chronicle__Mcp__ApiKey, Cratis__Chronicle__Mcp__EventStore and Cratis__Chronicle__Mcp__Namespace. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### Hermes

```yaml
mcp_servers:
  cratis-chronicle-mcp:
    command: "docker"
    args: ["run", "--rm", "-i", "-e", "Cratis__Chronicle__Mcp__Profile", "-e", "Cratis__Chronicle__Mcp__ConnectionString", "-e", "Cratis__Chronicle__Mcp__ClientId", "-e", "Cratis__Chronicle__Mcp__ClientSecret", "-e", "Cratis__Chronicle__Mcp__ApiKey", "-e", "Cratis__Chronicle__Mcp__EventStore", "-e", "Cratis__Chronicle__Mcp__Namespace", "docker.io/cratis/chronicle-mcp:2.1.0"]
```

This image reads Cratis__Chronicle__Mcp__Profile, Cratis__Chronicle__Mcp__ConnectionString, Cratis__Chronicle__Mcp__ClientId, Cratis__Chronicle__Mcp__ClientSecret, Cratis__Chronicle__Mcp__ApiKey, Cratis__Chronicle__Mcp__EventStore and Cratis__Chronicle__Mcp__Namespace. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### Netclaw

```json
{
  "McpServers": {
    "cratis-chronicle-mcp": {
      "Transport": "stdio",
      "Command": "docker",
      "Arguments": [
        "run",
        "--rm",
        "-i",
        "-e",
        "Cratis__Chronicle__Mcp__Profile",
        "-e",
        "Cratis__Chronicle__Mcp__ConnectionString",
        "-e",
        "Cratis__Chronicle__Mcp__ClientId",
        "-e",
        "Cratis__Chronicle__Mcp__ClientSecret",
        "-e",
        "Cratis__Chronicle__Mcp__ApiKey",
        "-e",
        "Cratis__Chronicle__Mcp__EventStore",
        "-e",
        "Cratis__Chronicle__Mcp__Namespace",
        "docker.io/cratis/chronicle-mcp:2.1.0"
      ]
    }
  }
}
```

This image reads Cratis__Chronicle__Mcp__Profile, Cratis__Chronicle__Mcp__ConnectionString, Cratis__Chronicle__Mcp__ClientId, Cratis__Chronicle__Mcp__ClientSecret, Cratis__Chronicle__Mcp__ApiKey, Cratis__Chronicle__Mcp__EventStore and Cratis__Chronicle__Mcp__Namespace. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### Other

```json
{
  "mcpServers": {
    "cratis-chronicle-mcp": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-e",
        "Cratis__Chronicle__Mcp__Profile",
        "-e",
        "Cratis__Chronicle__Mcp__ConnectionString",
        "-e",
        "Cratis__Chronicle__Mcp__ClientId",
        "-e",
        "Cratis__Chronicle__Mcp__ClientSecret",
        "-e",
        "Cratis__Chronicle__Mcp__ApiKey",
        "-e",
        "Cratis__Chronicle__Mcp__EventStore",
        "-e",
        "Cratis__Chronicle__Mcp__Namespace",
        "docker.io/cratis/chronicle-mcp:2.1.0"
      ]
    }
  }
}
```

This image reads Cratis__Chronicle__Mcp__Profile, Cratis__Chronicle__Mcp__ConnectionString, Cratis__Chronicle__Mcp__ClientId, Cratis__Chronicle__Mcp__ClientSecret, Cratis__Chronicle__Mcp__ApiKey, Cratis__Chronicle__Mcp__EventStore and Cratis__Chronicle__Mcp__Namespace. Set them in your client's env block for this server; docker run -e passes each one through to the container.

## 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-11-05 (score 50, +1)

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

### 2026-11-04 (score 49, 0)

- [functional regression] Security disclosure: fail → unverified
- [functional] Package version: 2.0.0 → 2.1.0

### 2026-11-03 (score 49, +1)

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

### 2026-10-31 (score 48, +1)

- [security regression] Provenance: unverified → fail
- [functional regression] Security disclosure: unverified → fail

### 2026-10-30 (score 47, 0)

- [security regression] Provenance: fail → unverified
- [functional regression] Security disclosure: fail → unverified

### 2026-10-29 (score 47, +1)

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

### 2026-10-27 (score 46, +1)

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

### 2026-10-25 (score 45, +1)

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

## MCP tools (25)

### `list_event_stores` (~28 tokens)

Lists all event stores registered on the Chronicle server. Use to discover valid event store names.

### `list_namespaces` (~47 tokens)

Lists all namespaces within an event store. Use to discover valid namespace names.

Input parameters:

- `eventStore` (string|null): The event store to list namespaces for. Defaults to the configured event store.

### `get_events` (~167 tokens)

Retrieves events from an event sequence with optional filtering by sequence range, event source id, and event type. Returns event headers and JSON content.

Input parameters:

- `eventSequenceId` (string): The event sequence to read from. Defaults to event-log.
- `eventSourceId` (string|null): An optional event source id to filter by.
- `eventStore` (string|null): The event store. Defaults to the configured event store.
- `eventType` (string|null): An optional comma-separated event type filter (e.g. UserRegistered or UserRegistered+1).
- `from` (integer): The starting event sequence number. Defaults to 0.
- `namespace` (string|null): The namespace. Defaults to the configured namespace.
- `to` (integer|null): The optional ending event sequence number.

### `get_tail_sequence_number` (~135 tokens)

Returns the highest used sequence number (tail) in an event sequence. This is not a total count of events — gaps may exist. Use to gauge how far a sequence has progressed.

Input parameters:

- `eventSequenceId` (string): The event sequence to inspect. Defaults to event-log.
- `eventSourceId` (string|null): An optional event source id to filter by.
- `eventStore` (string|null): The event store. Defaults to the configured event store.
- `eventType` (string|null): An optional comma-separated event type filter.
- `namespace` (string|null): The namespace. Defaults to the configured namespace.

### `list_event_types` (~60 tokens)

Lists all registered event types in an event store, including their id, generation, owner and source. Use to explore the domain schema.

Input parameters:

- `eventStore` (string|null): The event store to get event types from. Defaults to the configured event store.

### `list_failed_partitions` (~92 tokens)

Lists observer partitions that have failed and are paused, including the failure reason and the sequence number where the failure occurred. Use to discover what needs investigation or recovery.

Input parameters:

- `eventStore` (string|null): The event store. Defaults to the configured event store.
- `namespace` (string|null): The namespace. Defaults to the configured namespace.
- `observerId` (string|null): Optional observer identifier to filter by.

### `list_observers` (~94 tokens)

Lists observers (projections, reactors, reducers, client observers) in a namespace, with health and replay status. Optionally filter by type.

Input parameters:

- `eventStore` (string|null): The event store. Defaults to the configured event store.
- `namespace` (string|null): The namespace. Defaults to the configured namespace.
- `type` (string): Observer type filter: reactor, reducer, projection, or all (default).

### `get_observer` (~102 tokens)

Shows detailed information about a specific observer including its type, running state, owner, handled sequence numbers and observed event types.

Input parameters:

- `eventSequenceId` (string): The event sequence to inspect. Defaults to event-log.
- `eventStore` (string|null): The event store. Defaults to the configured event store.
- `namespace` (string|null): The namespace. Defaults to the configured namespace.
- `observerId` (string, required): The identifier of the observer to show.

### `get_patterns` (~192 tokens)

Gets learned behavior patterns matching a grouping key and context, in the server's authoritative order. Returns full pattern details; an action is an ordinary facet, not a separate field.

Input parameters:

- `context` (object, required): Current facet values to match. Keys and values are forwarded unchanged; an action, if present, is an ordinary facet.
- `eventStore` (string|null): The event store. Defaults to the configured event store.
- `groupingKey` (string, required): The grouping key used when learning the patterns.
- `maximumResults` (integer): Maximum result count. Non-positive values let the backend resolve its configured default. Positive values are forwarded unchanged without a local cap.
- `minimumConfidence` (number): Minimum confidence, normally 0 to 1. Non-positive values let the backend resolve its configured default. Forwarded unchanged without local range validation.
- `namespace` (string|null): The namespace. Defaults to the configured namespace.

### `list_projections` (~56 tokens)

Lists all projection definitions registered in an event store, including the read model they project into and their activity state. Use to audit registered projections.

Input parameters:

- `eventStore` (string|null): The event store. Defaults to the configured event store.

### `list_read_models` (~72 tokens)

Lists all read model definitions registered in an event store. The 'queryable' field is false for client-owned read models whose state is stored by the client application rather than the Chronicle server; querying their instances will fail.

Input parameters:

- `eventStore` (string|null): The event store. Defaults to the configured event store.

### `get_read_model_instances` (~140 tokens)

Lists the current instances of a read model as JSON, with pagination. Use to inspect the projected state of entities. Fails for client-owned read models (see 'queryable' in list_read_models).

Input parameters:

- `eventStore` (string|null): The event store. Defaults to the configured event store.
- `namespace` (string|null): The namespace. Defaults to the configured namespace.
- `page` (integer): The 0-based page number. Defaults to 0.
- `pageSize` (integer): The number of items per page. Defaults to 20.
- `readModel` (string, required): The read model container name to list instances for.

### `list_recommendations` (~70 tokens)

Lists active recommendations from the Chronicle server. Recommendations are automated suggestions for maintenance tasks such as rerunning projections or handling schema migrations.

Input parameters:

- `eventStore` (string|null): The event store. Defaults to the configured event store.
- `namespace` (string|null): The namespace. Defaults to the configured namespace.

### `get_server_version` (~30 tokens)

Gets version information from the connected Chronicle server. Use to verify connectivity and check the server version and commit.

### `list_jobs` (~100 tokens)

Lists all jobs in a namespace, optionally filtered by status. Returns a collection of job descriptors with status, progress, and metadata.

Input parameters:

- `eventStore` (string|null): The event store. Defaults to the configured event store.
- `namespace` (string|null): The namespace. Defaults to the configured namespace.
- `status` (string|null): Optional filter by job status. Can be a comma-separated list of statuses (e.g. 'Running,PreparingJob').

### `get_job` (~83 tokens)

Gets a specific job by ID. Returns either a job descriptor with full details including status changes and progress, or a job error (NotFound).

Input parameters:

- `eventStore` (string|null): The event store. Defaults to the configured event store.
- `jobId` (string, required): The job identifier.
- `namespace` (string|null): The namespace. Defaults to the configured namespace.

### `get_job_steps` (~118 tokens)

Gets the job steps for a specific job. Returns a collection of job step descriptors with status, progress, and metadata. Optionally filtered by step status.

Input parameters:

- `eventStore` (string|null): The event store. Defaults to the configured event store.
- `jobId` (string, required): The job identifier.
- `namespace` (string|null): The namespace. Defaults to the configured namespace.
- `status` (string|null): Optional filter by job step status. Can be a comma-separated list of statuses (e.g. 'Running,CompletedSuccessfully').

### `run_ad_hoc_projection` (~251 tokens)

Answers ad-hoc queries by projecting events on demand: reads the given event types from the store and folds them into per-event-source instances with AutoMap semantics (later events overwrite earlier property values; removedWith event types drop the instance). Nothing is registered or written. First resolve which event types are involved (describe_system or generate_event_catalog), then call this with them. Use it for natural-language questions like 'show all employees with all details'.

Input parameters:

- `eventSequenceId` (string): The event sequence to read from. Defaults to event-log.
- `eventSourceId` (string|null): An optional event source id to scope to a single instance.
- `eventStore` (string|null): The event store. Defaults to the configured event store.
- `eventTypes` (string, required): Comma-separated event type ids to fold (e.g. EmployeeHired,EmployeeMoved,EmployeePromoted).
- `limit` (integer): The maximum number of instances to return. Defaults to 100.
- `namespace` (string|null): The namespace. Defaults to the configured namespace.
- `removedWith` (string|null): Optional comma-separated event type ids that remove an instance (e.g. EmployeeTerminated).

### `explain_causal_trace` (~162 tokens)

Reads the ordered event history for one event source together with each event's correlation id and causation chain, so an agent can narrate what happened and why instead of a support engineer reading raw JSON logs. Read-only. Follow correlation ids to relate an event to the wider flow that produced it.

Input parameters:

- `eventSequenceId` (string): The event sequence to read from. Defaults to event-log.
- `eventSourceId` (string, required): The event source id to trace (e.g. the order id).
- `eventStore` (string|null): The event store. Defaults to the configured event store.
- `eventType` (string|null): An optional comma-separated event type filter.
- `namespace` (string|null): The namespace. Defaults to the configured namespace.

### `generate_event_catalog` (~126 tokens)

Produces a living data dictionary from the event store: every event type with its fields (from the registered schema) and every projection, reducer, and reactor that consumes it. Ideal onboarding material and grounding for modeling questions. Read-only introspection. Optionally scope to a single event type.

Input parameters:

- `eventStore` (string|null): The event store. Defaults to the configured event store.
- `eventType` (string|null): An optional single event type id to scope the catalog to.
- `namespace` (string|null): The namespace to resolve observers in. Defaults to the configured namespace.

### `audit_unconsumed_event_types` (~129 tokens)

Cross-references every registered event type against all projections, reducers, and reactors, and reports the event types that nothing consumes (data being written that no read model or reactor reads) plus the inverse: consumers that reference an event type id which no longer exists. Use as a periodic data-debt health check. Read-only introspection — grounded entirely in the store's registry and observer definitions.

Input parameters:

- `eventStore` (string|null): The event store. Defaults to the configured event store.
- `namespace` (string|null): The namespace to resolve observers in. Defaults to the configured namespace.

### `scaffold_read_model` (~207 tokens)

Generates a reviewable read model + model-bound projection from one or more event types, grounded in the events' real schema (field names and types come from the store, never guesses). Resolve the event types from the user's request first — with list_event_types, describe_event_type, or generate_event_catalog — then pass them here. Surfaces existing projections that already read these events so a duplicate is not created. When none of the requested event types are registered it returns no code and says so rather than fabricating a shape.

Input parameters:

- `codeNamespace` (string): The C# namespace to generate the read model into. Defaults to ReadModels.
- `eventStore` (string|null): The event store. Defaults to the configured event store.
- `eventTypes` (string, required): A comma-separated list of event type ids to project from (e.g. UserRegistered,UserEmailVerified).
- `readModelName` (string, required): The name of the read model to generate (e.g. Users).

### `describe_event_type` (~136 tokens)

Describes a registered event type's real schema — every property with its JSON type and a suggested C# type — read from the store's event type registry. Use this to ground any generated projection, read model, or spec in the event's actual fields instead of guessing. Returns null when the event type is not registered.

Input parameters:

- `eventStore` (string|null): The event store. Defaults to the configured event store.
- `eventType` (string, required): The event type id/name to describe (e.g. UserRegistered).
- `generation` (integer|null): The optional specific generation to describe. The latest generation is used when omitted.

### `describe_system` (~135 tokens)

Deduces what the system in an event store is and is for. Clusters event types into entities by name, places every event in its entity's lifecycle (creation, mutation, activity, correction, termination), and maps read surfaces and automations. Use it to describe a system in domain language or to tell the story of how the system behaves — the result carries narrative guidance for doing exactly that. Read-only introspection.

Input parameters:

- `eventStore` (string|null): The event store to describe. Defaults to the configured event store.
- `namespace` (string|null): The namespace to resolve observers in. Defaults to the configured namespace.

### `suggest_next_event_types` (~140 tokens)

Suggests event types to introduce next for the system in an event store. Deduces entities and lifecycles from the registered event type names and schemas, then finds concrete gaps: entities without an explicit creation event, lifecycles with no termination, and creation-time properties no event can ever change. Each suggestion carries the gap it closes and candidate properties from the existing schema. Read-only introspection; refine the results with domain knowledge.

Input parameters:

- `entity` (string|null): An optional entity name to scope the suggestions to (case-insensitive).
- `eventStore` (string|null): The event store to analyze. Defaults to the configured event store.

## Diagnostics

Captured diagnostic sections: Provenance. The full working is on the page: https://verifymcp.io/servers/cratis-chronicle-mcp/docker-io-cratis-chronicle-mcp#diagnostics

## Score history

- 2026-11-05: 50
- 2026-11-04: 49
- 2026-11-03: 49
- 2026-11-02: 48
- 2026-11-01: 48
- 2026-10-31: 48
- 2026-10-30: 47
- 2026-10-29: 47
- 2026-10-28: 46
- 2026-10-27: 46
- 2026-10-26: 45
- 2026-10-25: 45
- 2026-10-24: 44
- 2026-10-23: 44
- 2026-10-22: 43
- 2026-10-21: 43
- 2026-10-20: 42
- 2026-10-19: 42
- 2026-10-18: 41
- 2026-10-17: 41
- 2026-10-16: 40
- 2026-10-15: 40
- 2026-10-14: 40
- 2026-10-13: 6
- 2026-10-12: 6
- 2026-10-11: 6

## Common questions

### What is the Cratis Chronicle MCP server?

Cratis Chronicle is an MCP server listed in the public MCP registry as io.github.Cratis/chronicle-mcp. Inspect Cratis Chronicle event stores read-only by default; opt-in, authorized job control. This page covers its container image (docker.io/cratis/chronicle-mcp).

### Is the Cratis Chronicle MCP server safe to use?

Cratis Chronicle scores 50 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 Cratis Chronicle MCP server expose?

Cratis Chronicle exposes 25 tools: list_event_stores, list_namespaces, get_events, get_tail_sequence_number, list_event_types, and 20 more. Their descriptions and schemas cost roughly 2,872 tokens of context every time the server is loaded.

### Is the Cratis Chronicle MCP server still maintained?

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

### What did VerifyMCP test on the Cratis Chronicle MCP server?

VerifyMCP ran 12 checks on Cratis Chronicle, covering Source repository, Provenance, License, Maintenance and 8 more. 4 items could not be completed, a gap on our side rather than a finding about Cratis Chronicle: Malware scan, Known CVEs, Install scripts and Dependency health. One category scores 0 for that reason, because we only credit what we can confirm. Endpoint Security and Transport & Reachability do not apply to a container image, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.

## Links

- Docker Hub: https://hub.docker.com/r/cratis/chronicle-mcp
- Repository: https://github.com/Cratis/Chronicle.Mcp
- Website: https://www.cratis.io/chronicle-mcp/
- Changelog RSS feed: https://verifymcp.io/servers/cratis-chronicle-mcp/docker-io-cratis-chronicle-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/cratis-chronicle-mcp/docker-io-cratis-chronicle-mcp/changelog.json
- Trust report (JSON): https://verifymcp.io/servers/cratis-chronicle-mcp/docker-io-cratis-chronicle-mcp.json
- HTML version of this page: https://verifymcp.io/servers/cratis-chronicle-mcp/docker-io-cratis-chronicle-mcp
