About Ottorev — Review MCP Server
Ottorev is a local MCP server that stores engineering review notes and decisions against exact CAD revisions. It is for engineering assistants that need persistent, revision-aware context; it stores supplied records without opening CAD files or computing measurements.
Key features
- 01Store named features, notes, and tags
- 02Record decisions with requirement evidence and verdicts
- 03Recall records by artifact, entity, text, or tags
- 04Mark records and decisions stale across revisions
- 05Persist records in a local SQLite database
Use cases
- 01Keep annotations for CAD entities between assistant sessions
- 02Record the basis and disposition of a revision review
- 03Find earlier notes and identify those tied to another revision
MCP support
Exposes tools for remembering, recalling, and deleting revision-bound review records and decisions. It also advertises engineering-review prompts that can compose with a geometry server.
Configuration
Local server config is the same for every client. Copy it into your client’s MCP config file.
Tools
5Saved tool list · updated 1w ago
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | No | Optional feature name (a semantic, reusable label). Provide it when this is a named group like 'mounting holes' or 'bottom face'; omit for a plain note. |
| note | string | No | Prose about the geometry. What does it do, what did we decide, what should we remember? |
| tags | array | No | Searchable tags (without '#'), e.g. ['holes','mount']. |
| artifact | object | Yes | |
| artifact.uri | string | No | Artifact location: a URI such as file:///parts/curved-sector.step, or a plain filesystem path such as /parts/curved-sector.step. Both address the same records, because a path is normalised to a file: URL before anything is stored against it. A relative path resolves against this server working directory. Records are grouped by it; without a URI the revision alone is the key. |
| artifact.units | string | No | Spatial unit of the source file, echoed from inspect. |
| artifact.format | string | Yes | Always 'step'. |
| artifact.revision | string | Yes | sha256 revision of the artifact, copied from a Geometry inspect result. It is the anchor every record is stored against, and recall compares it to mark records stale. |
| entities | array | Yes | Geometry this review refers to, e.g. ['face:26','face:27'] or component-scoped ['component:wheel-axle/face:0']. IDs come from a Geometry find_entities result. |
| entity_id_scheme | string | Yes | ID scheme the entity IDs come from, as reported by the producer, e.g. 'occt-topology-v1' for Geometry. IDs are meaningless across schemes. |
Details
From the project READMEOttorev — Review MCP Server
The memory an engineering assistant needs. This local stdio MCP server records names, notes, tags, and decisions against an exact CAD revision in SQLite, so an assistant can pick up where it left off — remember that a face is the mating surface, that a tolerance callout is tight, or that a review concluded hold with the requirements behind it.
It never opens the CAD file: it stores the revision the caller supplies and compares it on recall, so it works on a laptop with no CAD software and no other server running.
Quick start
Requires Node.js 26+ and npm. From this repository:
npm install
npm run build
REVIEW_MCP_DB_PATH=/absolute/path/to/review.db npm start
For any MCP client:
{
"mcpServers": {
"review": {
"command": "node",
"args": ["/absolute/path/to/review-mcp-server/dist/src/index.js"],
"env": { "REVIEW_MCP_DB_PATH": "/absolute/path/to/review.db" }
}
}
}
REVIEW_MCP_DB_PATH defaults to ./review-mcp.db; parent directories are created
automatically. Records persist across restarts — protect and back up the database
as application data.
Tools
| Tool | Behavior |
|---|---|
remember | Save a named feature (re-remember replaces) or an anonymous note (re-remember appends) against an entity set, with tags. Returns replaced so a caller can tell which happened. |
recall | Retrieve by artifact, entity, free text, or tags; marks each record stale against a supplied current revision. Follow pagination for complete retrieval. |
remember_decision | Save the disposition reached about a revision and its basis — one row per requirement-check, naming the source, the evidence, the state, and the engineer's verdict. Re-remembering the same subject replaces it. |
recall_decisions | Return decisions newest-first, each marked stale when it belongs to another revision. An entity_id filter matches only the supplied revision. |
forget | Delete a named feature, an anonymous note by entity, or a decision by subject. Idempotent. |
Results provide structured content and text; tool failures set MCP isError.
Writes change local records; the client controls when to request those mutations.
The server also advertises engineering-review prompts that compose with a geometry
server, while the core record operations run on their own.
Artifact and subject semantics
An input artifact contains revision (sha256: plus 64 lowercase hex digits),
format: "step", and optional URI and units:
{
"revision": "sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
"uri": "file:///work/part.step",
"format": "step",
"units": "mm"
}
Supply the actual revision from the producer; the example digest is illustrative. A URI groups records by locator; without a URI, the revision is the lookup key.
uri accepts either a URI or a plain filesystem path, because a path is what a
caller usually has in hand:
{ "uri": "/work/part.step" }
Both spellings address the same records: a path is normalised to a file: URI
before anything is stored or matched. A relative path resolves against the server
working directory. Normalisation never opens the file, so a record can be written
for an artifact this server cannot read.
An entity filter is revision-scoped; a text or tag filter is not. An entity ID
denotes different geometry in a different revision, so recall and
recall_decisions match an entity_id only against records written for the
supplied revision, and match it exactly — face:3 does not match face:30. Names,
notes, subjects, and tags are matched across revisions, which is how an earlier
record is found at all, and every result says whether it is stale.
Each returned record contains one artifact reference, its entity IDs, and the ID scheme. The entity IDs are opaque outside that scheme and revision.
Decision records
A review names or annotates geometry. A decision is the other thing a review produces: a disposition about a revision, and the basis it rests on.
One basis item is one requirement-check, and it answers for itself:
| field | what it carries |
|---|---|
requirement | what has to hold, stated so it can be checked |
source | where the requirement came from: model-pmi, drawing, shop-spec, supplier-cert, standard, prior-decision, engineer-stated, or assistant-proposed |
sourceDetail | the clause, note number, or document a reader can follow |
evidence | the value as it was reported, quoted with its provenance |
state | satisfied, violated, unresolved, conflicting, or not-applicable |
question | required for unresolved and conflicting: what would settle it |
faces | the geometry the item is about, in this revision; always present, empty when the item is about the part |
verdict | the engineer's accepted / rejected judgement, with a reason when they gave one |
unresolved and conflicting are first-class outcomes: a decision that carries
them is a complete record of where the work stands, not a failure to decide. A
basis item is refused when it cannot answer for itself — no source, or a state of
unresolved/conflicting with no question.
Three properties matter more than the shape:
- A decision is bound to a revision. The revision is part of its key, so the
same subject at the same revision is recalled rather than reached again, and a
decision made against a different revision comes back marked
stale: true, still carrying the revision it belongs to. - Face IDs do not travel between revisions. Topological naming is unsolved in
OCCT, and this API does not pretend otherwise: an
entity_idfilter matches only the revision that produced the ID. - Verdicts are what make a requirement agreed. Recording a
verdictturns a line the assistant proposed into one the engineer accepted or rejected — the record of how much authority the assistant actually earned.
A stored decision is the caller's own account: the requirement as stated and the evidence as quoted. This server never measures anything, so a recalled decision is a record of what was concluded, not a measurement cache — Geometry remains the authority for numbers.
Limits
Review stores authored context: names, notes, and tags bound to an artifact revision, and decisions with the requirements they rest on. It does not store verified measurements, a complete immutable audit history, or authoritative approval records, and it does not compute geometry, run simulation, or decide manufacturability. Staleness is judged from a revision the caller supplies; Review never opens the CAD file.
There are no schema migrations: the database is a working file, and a changed table shape means deleting it. The server reports the version mismatch rather than guessing at a transformation.
Development
Requires Node.js 26+ and just. A Nix flake and
.envrc provide the toolchain; run direnv allow after changing either.
| Recipe | Purpose |
|---|---|
just setup | Install dependencies. |
just dev | Run TypeScript over stdio. |
just build | Compile into dist/. |
just test | Run unit tests. |
just lint | Run oxlint. |
just fmt | Rewrite formatting with Prettier. |
just fmt-check | Verify formatting. |
just typecheck | Run tsc --noEmit. |
just check | fmt-check + lint + typecheck + test. |
just clean | Remove compiled output, retaining the database. |
Server logs go to stderr as newline-delimited pino JSON. MCP_LOG_LEVEL
(debug|info|warn|error), MCP_LOG_FORMAT=human, and MCP_TRACE_ID tune
them; secret-like fields are redacted.
Packaging
npm pack builds first and includes compiled runtime code, package metadata, and
this README. Tests and source maps are excluded. Install the tarball to check the
review-mcp executable with a compatible MCP client. The server serves both
protocol eras: the 2025-11-25 handshake that stock MCP hosts negotiate, and the
2026-07-28 envelope through server/discover.
License
MIT. Third-party notices: THIRD_PARTY_NOTICES.md.
Comments
New to MCP?
From what the protocol is to installing your first server, these answers cover most first questions.
An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.