mcpField
O
Ottorev — Review MCP Server

Ottorev — Review MCP Server

Local
github.comMemory & Knowledge0Updated 2w ago

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

  1. 01Store named features, notes, and tags
  2. 02Record decisions with requirement evidence and verdicts
  3. 03Recall records by artifact, entity, text, or tags
  4. 04Mark records and decisions stale across revisions
  5. 05Persist records in a local SQLite database

Use cases

  1. 01Keep annotations for CAD entities between assistant sessions
  2. 02Record the basis and disposition of a revision review
  3. 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.

mcp.json · Universal config
{
"mcpServers": {
"ottonic-review": {
"command": "npx",
"args": [
"-y",
"review-mcp-server"
]
}
}
}
Run commandnpx -y review-mcp-server

Local servers need a runtime on your machine (e.g. Node.js 18+). Config file locations differ by client; see your client’s docs.

Packages
npmreview-mcp-server0.3.0

Tools

5

Saved tool list · updated 1w ago

ParameterTypeRequiredDescription
namestringNoOptional 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.
notestringNoProse about the geometry. What does it do, what did we decide, what should we remember?
tagsarrayNoSearchable tags (without '#'), e.g. ['holes','mount'].
artifactobjectYes
artifact.uristringNoArtifact 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.unitsstringNoSpatial unit of the source file, echoed from inspect.
artifact.formatstringYesAlways 'step'.
artifact.revisionstringYessha256 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.
entitiesarrayYesGeometry 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_schemestringYesID 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 README

Ottorev — 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

ToolBehavior
rememberSave 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.
recallRetrieve by artifact, entity, free text, or tags; marks each record stale against a supplied current revision. Follow pagination for complete retrieval.
remember_decisionSave 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_decisionsReturn decisions newest-first, each marked stale when it belongs to another revision. An entity_id filter matches only the supplied revision.
forgetDelete 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:

fieldwhat it carries
requirementwhat has to hold, stated so it can be checked
sourcewhere the requirement came from: model-pmi, drawing, shop-spec, supplier-cert, standard, prior-decision, engineer-stated, or assistant-proposed
sourceDetailthe clause, note number, or document a reader can follow
evidencethe value as it was reported, quoted with its provenance
statesatisfied, violated, unresolved, conflicting, or not-applicable
questionrequired for unresolved and conflicting: what would settle it
facesthe geometry the item is about, in this revision; always present, empty when the item is about the part
verdictthe 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_id filter matches only the revision that produced the ID.
  • Verdicts are what make a requirement agreed. Recording a verdict turns 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.

RecipePurpose
just setupInstall dependencies.
just devRun TypeScript over stdio.
just buildCompile into dist/.
just testRun unit tests.
just lintRun oxlint.
just fmtRewrite formatting with Prettier.
just fmt-checkVerify formatting.
just typecheckRun tsc --noEmit.
just checkfmt-check + lint + typecheck + test.
just cleanRemove 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

Markdown supported

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.