Atlas / MCP servers / jackskip22 / rapier-html

rapier-htmlCAUTION

mcp/jackskip22/rapier-plugins

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.

Verdict
CAUTION
Grade
C
Trust score
75 /100
Exposed tools
—
Transport
streamable-http
License
AGPL-3.0
Stars
0
01

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

  1. Work live with a person. Connect an MCP client to https://mcp.rapier.website/mcp over 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.

  1. Hand over an offline document. npx rapier-html notes.md writes notes.rapier.html: the editor and its

document in one file. Package.

  1. Put Rapier in your app. npm install rapier-embed embeds 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.

  1. Keep rich documents in Markdown. npm install rapier-markdown-kit reads and writes pictures, editable

drawings and layout in one .md file. Respect Will/1 regions: edit, append and keep. Self-contained Markdown.

  1. Encode JPEG XL in JavaScript. npm install rapier-jxl adds the encoder that Rapier uses, in browsers,

Node.js and other JavaScript runtimes. Encoder.

  1. 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

Read from source at commit 52408f4bc411OBSERVED · 2026-10-13
02

Connect

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-code
claude mcp add rapier-markdown-kit -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "rapier-markdown-kit": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ]
    }
  }
}
03

Trust audit

CAUTIONgrade C · trust 75/100 Install with care. The audit found things worth knowing before you trust its output.

LayerWhat it checksResult
L0Provenance & inventoryWARN
L1Static analysis of the codeWARN
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfaceWARN
L4Behavioural (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)

MEDIUMInventory / provenance · inv.binary · CWE-1104
npm/rapier-markdown-kit/dist/kit/conformance/measurer.mjs
measurer.mjs
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
docx/rapier-docx-1.1.101.js:50
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.isInteger
MEDIUMObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
docx/rapier-docx-1.1.102.js:50
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.isInteger
MEDIUMObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
docx/rapier-docx-1.1.103.js:54
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.isInteger
MEDIUMObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
docx/rapier-docx-1.1.104.js:54
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.isInteger
MEDIUMObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
docx/rapier-docx-1.2.0.js:54
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.isInteger
MEDIUMObfuscation / stealth · obf.homoglyph · CWE-506, CWE-94
math/adoption-check.mjs:26
['CRLF BOM Unicode', '\ufeffπ 🐈\r\n\r\n$$\r\nx+1\r\n$$\r\n', 1],
MEDIUMObfuscation / stealth · obf.homoglyph · CWE-506, CWE-94
math/src/math/adoption-verify.mjs:26
['CRLF BOM Unicode', '\ufeffπ 🐈\r\n\r\n$$\r\nx+1\r\n$$\r\n', 1],
MEDIUMObfuscation / stealth · obf.homoglyph · CWE-506, CWE-94
npm/rapier-markdown-kit/dist/kit/conformance/run.mjs:99
console.log('document'.padEnd(width) + '  verdict   lines(exp/got)  maxΔleft  maxΔright  measurer(hits/misses)');
MEDIUMAuth / authz · mcp.remote_no_auth · CWE-287, CWE-862
streamable-http
Why it matters. a network transport with no auth environment variable found
Fix. require a token
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
npm/rapier-markdown-kit/dist/kit/ledger/inverse-source.mjs:5
import {diff} from '../../packages/rapier-diff/index.mjs';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
npm/rapier-markdown-kit/dist/kit/ledger/merge.mjs:6
import {parseWill} from '../../agent/will.mjs';
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
claude/skills/embed-rapier/references/embed-contract.md:361
`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
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
cursor/skills/embed-rapier/references/embed-contract.md:361
`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
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
openai/skills/embed-rapier/references/embed-contract.md:244
`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
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
skills/embed-rapier/references/embed-contract.md:361
`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
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
docx/rapier-docx-1.1.101.js:82
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("==
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
docx/rapier-docx-1.1.102.js:82
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("==
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
docx/rapier-docx-1.1.103.js:84
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("==
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
docx/rapier-docx-1.1.104.js:84
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("==
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
docx/rapier-docx-1.2.0.js:84
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("==
LOWInventory / provenance · mcp.no_tools_extracted · CWE-1104
server.json
Why it matters. the tool list is enumerated at runtime by tools/list, not declared in source
Fix. the page says so rather than showing an empty table
INFOInventory / provenance · inv.oversize · CWE-1104
npm/rapier-html/dist/rapier.html
npm/rapier-html/dist/rapier.html
Why it matters. 3565876 bytes not read
INFOInventory / provenance · inv.oversize · CWE-1104
npm/rapier-html/rapier.html
npm/rapier-html/rapier.html
Why it matters. 3565876 bytes not read
INFOPrompt injection · prompt.credential_read · CWE-94, CWE-1427
SECURITY.md:5
documents and imports, unauthorized access or edits, exposed credentials, unintended network requests, and changes
Why it matters. asks the agent to read credentials

Gates applied: no_behavioural_pass.

Audited 2026-10-13 · audit v0.4.1 · source sha 52408f4bc411full audit observations/trust-audit/mcp-server/jackskip22__rapier-plugins.json · Report an issue / request a re-scan
04

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-1352408f4bc411CAUTIONC75first audit
05

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.

Advertisement