rapier-htmlCAUTION
Stuff that doesn't belong in the main Rapier repo including letter sets, the Claude plugin, the OpenAI app package, the MCP server, and the npm packages rapier-html, rapier-markdown-kit and rapier-embed.
Overview
From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.
Plugins, npm packages and plug-in files for Rapier, a fast Markdown editor for notes, diagrams, drawing and watercolor painting in one HTML file. Android, Web and Windows. Phone-first and offline, with MCP and WebMCP for live work with agents. Optional encrypted sync uses your own Cloudflare account.
Start
- Work live with a person. Connect an MCP client to
https://mcp.rapier.website/mcpover streamable HTTP, then
call open. Open the returned editor_url for the person. Read rapier://guide for editing, drawing, painting, comments, review and export. No account or key is required.
- Hand over an offline document.
npx rapier-html notes.mdwritesnotes.rapier.html: the editor and its
document in one file. Package.
- Put Rapier in your app.
npm install rapier-embedembeds the editor or the lightweight reader. Enable
agent: true on the editor for your app's own agent over WebMCP. Your app owns storage; the reader is read-only. Embedding.
- Keep rich documents in Markdown.
npm install rapier-markdown-kitreads and writes pictures, editable
drawings and layout in one .md file. Respect Will/1 regions: edit, append and keep. Self-contained Markdown.
- Encode JPEG XL in JavaScript.
npm install rapier-jxladds the encoder that Rapier uses, in browsers,
Node.js and other JavaScript runtimes. Encoder.
- Run your own door. rapier-server serves
Markdown from your folder or S3-compatible bucket through the same MCP tools. Supply Node.js and Chromium; start with rapier-server serve and the documented browser settings.
The agent edits live, beside the person or while they are away. Rap
52408f4bc411OBSERVED · 2026-10-13Connect
Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control.
claude mcp add rapier-markdown-kit -- npx -y [email protected]
{
"mcpServers": {
"rapier-markdown-kit": {
"command": "npx",
"args": [
"-y",
"[email protected]"
]
}
}
}Trust audit
CAUTIONgrade C · trust 75/100 Install with care. The audit found things worth knowing before you trust its output.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | WARN |
| L1 | Static analysis of the code | WARN |
| L2 | Instruction surface (what it tells the agent) | PASS |
| L3 | Class-specific surface | WARN |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- declared (2 observation(s))
- Network
- declared (5 observation(s))
- Shell
- none-observed
- Dependencies
- pinned
- Secrets in source
- none-found
Findings (25)
measurer.mjs
const e=[0,0,0,0,10,10,11,11,10,10,10,10,10,9,9,8,7,7,8,7,7,6,6,5,5],t=new Uint32Array(25);for(let n=4;n<24;n++)t[n+1]=t[n]+n*2**e[n];let n,r;return{brotliDictionary:function(i,a){if(!Number.isIntegerconst e=[0,0,0,0,10,10,11,11,10,10,10,10,10,9,9,8,7,7,8,7,7,6,6,5,5],t=new Uint32Array(25);for(let n=4;n<24;n++)t[n+1]=t[n]+n*2**e[n];let n,r;return{brotliDictionary:function(i,a){if(!Number.isIntegerconst e=[0,0,0,0,10,10,11,11,10,10,10,10,10,9,9,8,7,7,8,7,7,6,6,5,5],t=new Uint32Array(25);for(let n=4;n<24;n++)t[n+1]=t[n]+n*2**e[n];let n,r;return{brotliDictionary:function(i,a){if(!Number.isIntegerconst e=[0,0,0,0,10,10,11,11,10,10,10,10,10,9,9,8,7,7,8,7,7,6,6,5,5],t=new Uint32Array(25);for(let n=4;n<24;n++)t[n+1]=t[n]+n*2**e[n];let n,r;return{brotliDictionary:function(i,a){if(!Number.isIntegerconst e=[0,0,0,0,10,10,11,11,10,10,10,10,10,9,9,8,7,7,8,7,7,6,6,5,5],t=new Uint32Array(25);for(let n=4;n<24;n++)t[n+1]=t[n]+n*2**e[n];let n,r;return{brotliDictionary:function(i,a){if(!Number.isInteger['CRLF BOM Unicode', '\ufeffπ 🐈\r\n\r\n$$\r\nx+1\r\n$$\r\n', 1],
['CRLF BOM Unicode', '\ufeffπ 🐈\r\n\r\n$$\r\nx+1\r\n$$\r\n', 1],
console.log('document'.padEnd(width) + ' verdict lines(exp/got) maxΔleft maxΔright measurer(hits/misses)');streamable-http
import {diff} from '../../packages/rapier-diff/index.mjs';import {parseWill} from '../../agent/will.mjs';`security/csp.mjs` owns the policy checked by the build. The web shell's meta has default-src none, inline/wasm/blob scripts, inline styles, data fonts, self/blob workers, no base URL override or form
`security/csp.mjs` owns the policy checked by the build. The web shell's meta has default-src none, inline/wasm/blob scripts, inline styles, data fonts, self/blob workers, no base URL override or form
`security/csp.mjs` owns the policy checked by the build. The web shell's meta has default-src none, inline/wasm/blob scripts, inline styles, data fonts, self/blob workers, no base URL override or form
`security/csp.mjs` owns the policy checked by the build. The web shell's meta has default-src none, inline/wasm/blob scripts, inline styles, data fonts, self/blob workers, no base URL override or form
const{sha256:e}=n["kit/ledger/hash.mjs"],{inspectRaster:t}=n["images/raster.mjs"],{inspectJPEGXL:r,JPEG_XL_LIMITS:i}=n["images/header.mjs"],a=(e,t)=>{const n=e.slice(e.indexOf(",")+1),r=n.endsWith("==const{sha256:e}=n["kit/ledger/hash.mjs"],{inspectRaster:t}=n["images/raster.mjs"],{inspectJPEGXL:r,JPEG_XL_LIMITS:i}=n["images/header.mjs"],a=(e,t)=>{const n=e.slice(e.indexOf(",")+1),r=n.endsWith("==const{sha256:e}=n["kit/ledger/hash.mjs"],{inspectRaster:t}=n["images/raster.mjs"],{inspectJPEGXL:r,JPEG_XL_LIMITS:i}=n["images/header.mjs"],a=(e,t)=>{const n=e.slice(e.indexOf(",")+1),r=n.endsWith("==const{sha256:e}=n["kit/ledger/hash.mjs"],{inspectRaster:t}=n["images/raster.mjs"],{inspectJPEGXL:r,JPEG_XL_LIMITS:i}=n["images/header.mjs"],a=(e,t)=>{const n=e.slice(e.indexOf(",")+1),r=n.endsWith("==const{sha256:e}=n["kit/ledger/hash.mjs"],{inspectRaster:t}=n["images/raster.mjs"],{inspectJPEGXL:r,JPEG_XL_LIMITS:i}=n["images/header.mjs"],a=(e,t)=>{const n=e.slice(e.indexOf(",")+1),r=n.endsWith("==npm/rapier-html/dist/rapier.html
npm/rapier-html/rapier.html
documents and imports, unauthorized access or edits, exposed credentials, unintended network requests, and changes
Gates applied: no_behavioural_pass.
52408f4bc411full audit observations/trust-audit/mcp-server/jackskip22__rapier-plugins.json · Report an issue / request a re-scanAudit history
Every audit this server has had. A grade with a past is a grade somebody is still checking.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-13 | 52408f4bc411 | CAUTION | C | 75 | first audit |
Questions
What is the rapier-html MCP server?
Stuff that doesn't belong in the main Rapier repo including letter sets, the Claude plugin, the OpenAI app package, the MCP server, and the npm packages rapier-html, rapier-markdown-kit and rapier-embed.
Is rapier-html safe to connect to an agent?
With care. The audit graded it C (75/100) and found 25 things worth knowing before you trust this server, listed below with the exact line each was found on.
What credentials does rapier-html need?
No credential environment variables were found in its source, so it appears to need none.
How does rapier-html run?
It speaks streamable-http, so it runs as a service you connect to over the network. It is published on npm as rapier-markdown-kit at 1.1.104.
How current is this page?
The grade is for one exact copy of the source (52408f4bc411), read on 2026-10-13. The repository is watched and re-audited when it changes.