Atlas / MCP servers / mitchjablonski / deepPairing

deepPairingBLOCK

mcp/mitchjablonski/deeppairing

Review what Claude Code is about to change on a rich visual surface — inline comments, evidence, and a gate that remembers the approaches you rejected.

Verdict
BLOCK
Grade
F
Trust score
43 /100
Exposed tools
5 5r · 0w · 0d
Transport
stdio
License
MIT
Stars
1
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

Hand Claude Code the implementation without handing it the decisions that matter. It shows you the evidence, you make the call in a local review UI, and what you turn down is checked against what the agent proposes next in that repo.

Who it's for: engineers who let Claude Code write most of the code but want to own the architecture — the calls that are expensive to reverse.

The expensive problem: an agent working alone quietly makes the load-bearing choices (a global singleton for config, a new queue, a schema change). You meet them in a 500-line diff, after the code is built on top of them. Or you reject an idea on Tuesday, and on Thursday a fresh session proposes it again.

What you get instead: before it builds, Claude Code shows you what it found (with file:line evidence), the options it weighed, and the plan. You comment, pick, or reject in the companion UI. When you reject an approach with a reason, this project's gate checks later proposals against it and refuses a match, quoting your reason back. The run ends with a debrief of what changed and what still needs your eyes.

What the gate does, and what it doesn't (the details are in Your taste compounds):

  • *In-protocol (`present_` tools) — refused.* Reject "global mutable state

for config", and "keep config in global mutable states"* is refused before the artifact is recorded.

  • Matching is on words, not meaning. It uses stemmed words plus a small,

hand-audited synonym list (delete↔remove, directory↔folder). "A module-level mutable settings object" shares too few words with that concept, so it gets through. False positives happen too: "remove global mutable state from config" is refused, because it contains every word of the concept. One click on "Retire this stance" clears it.

  • Direct `Edit`/`Write`/`MultiEdit` — you're asked, not refused. A PreToolUse

hook pauses a matching edit with a permission prom

Read from source at commit d5c928be8124OBSERVED · 2026-10-11
Advertisement
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. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add deeppairing --env AWS_KEY=${AWS_KEY} --env DP_FIXTURE_CHILD_SECRET=${DP_FIXTURE_CHILD_SECRET} -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "deeppairing": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ],
      "env": {
        "AWS_KEY": "${AWS_KEY}",
        "DP_FIXTURE_CHILD_SECRET": "${DP_FIXTURE_CHILD_SECRET}"
      }
    }
  }
}
03

Exposed tools (5)

5 read · 0 write · 0 destructive.

ToolRiskDescription
conceptreadShort name for the pattern you
modereadWhich surface to read:
queryreadConcept or substring to look up (e.g.
reasonreadWhy you
recallreadQuery your philosophy ledger (cross-project stances) and past sessions. Surfaces what you
04

Trust audit

BLOCKgrade F · trust 43/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)FAIL
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (5 observation(s))
Network
declared (7 observation(s))
Shell
none-observed
Dependencies
not all pinned
Secrets in source
found

Findings (25)

HIGHObfuscation / stealth · obf.rtl_override · CWE-506, CWE-94
claude-plugin/server/web/assets/katex-TZJFa0J_.js:255
?)[ \r	]*`,$i=`[̀-ͯ]`,ea=RegExp($i+`+$`),ta=`(`+Ji+`+)|`+(Qi+`|`)+`([!-\\[\\]-‧-豈-]`+($i+`*`)+`|[\ud800-\udbff][\udc00-\udfff]`+($i+`*`)+`|\\\\verb\\*([^]).*?\\4|\\\\verb([^*a-zA-Z]).*?\\5`+(`|`+Zi)+(
HIGHPrompt injection · prompt.zero_width · CWE-94, CWE-1427
CHANGELOG.md:1704
history. Now the file is snapshotted to `....corrupt-<timestamp>` and writes are
Why it matters. invisible characters in instruction text
Fix. strip non-printing characters
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
claude-plugin/server/demo.mjs:123
const res = await fetch(`http://127.0.0.1:${info.port}/`, { signal: AbortSignal.any([AbortSignal.timeout(1e3), cancel]) });
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
claude-plugin/server/demo.mjs:239
const res = await fetch(`http://127.0.0.1:${port}/api/demo/run`, {
MEDIUMObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
claude-plugin/server/web/assets/wasm-inlined-MuF5cNGW.js:1
var e=Uint8Array.from(atob(`AGFzbQEAAAABoQEWYAJ/fwF/YAF/AX9gA39/fwF/YAR/f39/AX9gAX8AYAV/f39/fwF/YAN/f38AYAJ/fwBgBn9/f39/fwF/YAd/f39/f39/AX9gAAF/YAl/f39/f39/f38Bf2AIf39/f39/f38Bf2AAAGAEf39/fwBgA39+fwF+
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
claude-plugin/server/web/assets/chunk-NNHCCRGN-BZAVIRcX.js:36
`),P(`\r`),P(`	`),P(`\v`),P(`	`),P(`\xA0`),P(` `),P(` `),P(` `),P(` `),P(` `),P(` `),P(` `),P(` `),P(` `),P(` `),P(` `),P(` `),P(`\u2028`),P(`\u2029`),P(` `),P(` `),P(` `),P(``)],_a=/[0-9a-fA-F]/,va=/
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
claude-plugin/server/web/assets/chunk-NNHCCRGN-BZAVIRcX.js:46
\r	\v \xA0            \u2028\u2029   `.split(``);function Oa(e){let t=typeof e==`string`?new RegExp(e):e;return Da.some(e=>t.test(e))}o(Oa,`isWhitespace`);function ka(e){return e.replace(/[.*+?^${}()|
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
packages/mcp-server/src/daemon/__tests__/review-post-protocol.test.ts:15
const token = "review-post-test-token";
MEDIUMHard-coded secrets · secret.github · CWE-798, CWE-321
packages/mcp-server/src/__tests__/secret-scan.test.ts:281
lines: [{ kind: "add", content: "  token: ghp_abcdefghijklmnopqrstuvwxyz012345", newLine: 1 }],
MEDIUMHard-coded secrets · secret.github · CWE-798, CWE-321
packages/mcp-server/src/__tests__/secret-scan.test.ts:299
files: [{ hunks: [{ lines: [{ content: "ghp_abcdefghijklmnopqrstuvwxyz012345" }] }] }],
MEDIUMHard-coded secrets · secret.github · CWE-798, CWE-321
packages/mcp-server/src/export/__tests__/format-html-r3.test.ts:151
const GH_TOKEN = "ghp_abcdefghijklmnopqrstuvwxyz012345";
MEDIUMHard-coded secrets · secret.github · CWE-798, CWE-321
packages/mcp-server/src/http/__tests__/routes.export-html.test.ts:110
hunks: [{ header: "@@ -1 +1 @@", lines: [{ kind: "add", content: "  token: ghp_abcdefghijklmnopqrstuvwxyz012345", newLine: 1 }] }],
MEDIUMHard-coded secrets · secret.github · CWE-798, CWE-321
packages/mcp-server/src/http/__tests__/routes.export-html.test.ts:129
expect(warning).not.toContain("ghp_abcdefghijklmnopqrstuvwxyz012345");
MEDIUMHard-coded secrets · secret.private_key · CWE-798, CWE-321
packages/mcp-server/src/__tests__/secret-scan.test.ts:50
const m = scanForSecrets("-----BEGIN RSA PRIVATE KEY-----\nMIIE...\n-----END RSA PRIVATE KEY-----");
LOWInventory / provenance · inv.binary · CWE-1104
packages/mcp-server/src/__tests__/fixtures/plugin-upgrade/v0.1.57/runtime.json.gz
runtime.json.gz
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
LOWInventory / provenance · inv.hidden_file · CWE-1104
.gitguardian.yaml
.gitguardian.yaml
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.suspicious_name · CWE-1104
packages/mcp-server/src/mcp/__tests__/check-feedback-payload-agreement.test.ts
check-feedback-payload-agreement.test.ts
Why it matters. member named after an attack tool
Fix. remove or justify
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
packages/mcp-server/src/__tests__/plugin-upgrade.harness.ts:26
const gitBlob = createHash("sha1").update(`blob ${bytes.length}\0`).update(bytes).digest("hex");
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
packages/mcp-server/src/export/html-export.ts:295
const token = crypto.createHash("sha1").update(String(sessionId)).digest("hex").slice(0, 8);
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
claude-plugin/server/web/assets/chunk-NNHCCRGN-BZAVIRcX.js:5
`&&r++}n&&t.length>0&&e.push(t.length),this._lineOffsets=e}return this._lineOffsets}positionAt(e){e=Math.max(Math.min(e,this._content.length),0);let t=this.getLineOffsets(),n=0,r=t.length;if(r===0)ret
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
claude-plugin/server/web/assets/chunk-NNHCCRGN-BZAVIRcX.js:6
${JSON.stringify(Object.fromEntries(e))}`));return}let n=parseInt(t);if(isNaN(n)){this.fireError(Error(`Content-Length value must be a number. Got ${t}`));return}this.nextMessageLength=n}let e=this.bu
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
claude-plugin/server/web/assets/chunk-NNHCCRGN-BZAVIRcX.js:7
`,c;(function(e){function t(e){let t=e;return t&&n.func(t.dispose)&&n.func(t.onClose)&&n.func(t.onError)&&n.func(t.write)}o(t,`is`),e.is=t})(c||(e.MessageWriter=c={}));var l=class{static{o(this,`Abstr
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
claude-plugin/server/web/assets/chunk-NNHCCRGN-BZAVIRcX.js:9
${n}`);let i=n.substr(0,r),a=n.substr(r+1).trim();l.set(e?i.toLowerCase():i,a)}return l}tryReadBody(e){if(!(this._totalLength<e))return this._read(e)}get numberOfBytes(){return this._totalLength}_read
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/mcp-server/e2e/attention-walkthrough-harness.ts:90
lockfileSha256: digest(await fs.readFile(path.resolve(packageRoot, "../../pnpm-lock.yaml"))),
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
packages/mcp-server/e2e/attention-walkthrough-harness.ts:153
this.baseURL = `http://127.0.0.1:${meta.port}`;

Gates applied: no_behavioural_pass.

Audited 2026-10-11 · audit v0.4.1 · source sha d5c928be8124full audit observations/trust-audit/mcp-server/mitchjablonski__deeppairing.json · Report an issue / request a re-scan
05

Audit history

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

DateSourceVerdictGradeScoreChange
2026-10-11d5c928be8124BLOCKF43first audit
06

Questions

What is the deepPairing MCP server?

Review what Claude Code is about to change on a rich visual surface — inline comments, evidence, and a gate that remembers the approaches you rejected.

What tools does deepPairing expose?

5 in total: 5 read-only, 0 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is deepPairing safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (43/100) and found 2 critical or high issues in the source. Each one is listed on this page with the file and line it is on.

What credentials does deepPairing need?

It reads AWS_KEY and DP_FIXTURE_CHILD_SECRET from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does deepPairing run?

It speaks stdio, so it runs as a local process your client starts. It is published on npm as deeppairing at 0.0.2.

How current is this page?

The grade is for one exact copy of the source (d5c928be8124), read on 2026-10-11. The repository is watched and re-audited when it changes.

Advertisement