github TypeScript analyzed 0f11d05

lolxl/safespace-mcp

github

The AI safety gateway for an agent's external surface — a provider-agnostic safety envelope (input sanitize + untrusted-content tagging, tier/scope/burst/recipient egress gates, autonomy hardening, run_id forensics, tokens behind a SecretBackend, full audit trail) between an AI agent and any source it touches. MIT.

maintainer
lolxl
licence
Apache-2.0
first seen
2026-06-11
last seen
2026-07-30
releases · 30d
0
short id

Drift inferred · capture-to-capture

No drift recorded — single capability capture; advisories appear once its surface changes.

capabilities 0 tools
transport stdio · streamable-http · http counts 0 tools · 0 res · 0 prompts permission surface via code analysis

No tools enumerated yet for this server.

skills & danger signals github-tarball
prompt-surface shipped agent-instruction files + hidden-content / dangerous-code findings — quoted from the analyzed source

analyzed commit 0f11d05 · analyzer v33 · 2w ago

skills & prompt files 1

danger signals38

code evidence vv1.127.0 · github-tarball
evidence-backed findings quoted directly from the published source artifact — not inferred

code files: 407

filesystem 103

  • fs (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/scripts/smoke-mcp.mjs :25 import { mkdtempSync, rmSync, existsSync } from "node:fs";
  • fs (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/audit-chain.test.ts :5 import * as fs from "node:fs/promises";
  • fs (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/audit.error-forensics.test.ts :4 import * as fs from "node:fs/promises";
  • fs (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/audit.operator.test.ts :14 import * as fs from "node:fs/promises";
  • fs (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/audit.roundtrip.test.ts :37 import * as fs from "node:fs/promises";
  • fs (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/audit.run-id.test.ts :12 import * as fs from "node:fs/promises";
  • fs (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/audit.source.test.ts :14 import * as fs from "node:fs/promises";
  • fs (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/audit.test.ts :2 import * as fs from "node:fs/promises";
  • fs lolxl-safespace-mcp-0f11d05/.claude-plugin/src/audit.ts :23 import * as fs from "node:fs/promises";
  • fs (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/active.test.ts :2 import * as fs from "node:fs/promises";
  • fs lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/active.ts :12 import * as fs from "node:fs/promises";
  • fs (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/agent-token-store.test.ts :6 import { promises as fs } from "node:fs";
show 28 more
  • fs lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/agent-token-store.ts :28 import * as fs from "node:fs/promises";
  • fs (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/consent.test.ts :2 import * as fs from "node:fs/promises";
  • fs lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/consent.ts :8 import * as fs from "node:fs/promises";
  • fs (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/file-backend.scrypt-memo.test.ts :10 import * as fs from "node:fs/promises";
  • fs (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/file-backend.test.ts :10 import * as fs from "node:fs/promises";
  • fs lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/file-backend.ts :31 import * as fs from "node:fs/promises";
  • fs (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/github/consent.test.ts :10 import * as fs from "node:fs/promises";
  • fs (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/github/store.test.ts :6 import * as fs from "node:fs/promises";
  • fs lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/github/store.ts :16 import * as fs from "node:fs/promises";
  • fs (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/keychain.test.ts :2 import * as fs from "node:fs/promises";
  • fs lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/keychain.ts :12 import * as fs from "node:fs/promises";
  • fs (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/notion/consent.test.ts :10 import * as fs from "node:fs/promises";
  • fs (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/notion/oauth.test.ts :8 import * as fs from "node:fs/promises";
  • fs lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/notion/oauth.ts :17 import * as fs from "node:fs/promises";
  • fs (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/send-approval-store.test.ts :6 import * as fs from "node:fs/promises";
  • fs lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/send-approval-store.ts :18 import * as fs from "node:fs/promises";
  • fs (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/service-token-store.test.ts :6 import * as fs from "node:fs/promises";
  • fs (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/token-store.test.ts :6 import * as fs from "node:fs/promises";
  • fs (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/webhook-secret-store.test.ts :6 import * as fs from "node:fs/promises";
  • fs (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/x/consent.test.ts :10 import * as fs from "node:fs/promises";
  • fs (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/x/oauth.test.ts :6 import * as fs from "node:fs/promises";
  • fs lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/x/oauth.ts :31 import * as fs from "node:fs/promises";
  • fs (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/cli.test.ts :2 import * as fs from "node:fs/promises";
  • fs (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/cli/agent-token.test.ts :5 import { promises as fs } from "node:fs";
  • fs (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/cli/atomic-env.test.ts :2 import { promises as fs } from "node:fs";
  • fs lolxl-safespace-mcp-0f11d05/.claude-plugin/src/cli/atomic-env.ts :21 import { promises as fs } from "node:fs";
  • fs (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/cli/audit/deletes.test.ts :2 import { promises as fs } from "node:fs";
  • fs (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/cli/audit/export.test.ts :12 import { promises as fs } from "node:fs";

63 more not shown — this panel samples each group; the count above is the real total.

shell / exec 5

  • shell (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/scripts/smoke-mcp.mjs :24 import { spawn } from "node:child_process";
  • shell (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/consent.test.ts :378 const proc = Bun.spawn(["sh", "-c", "exit 0"]);
  • shell lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/open-url.ts :2 // Replaces the Bun-only `Bun.spawn(["open", url])` so the CLI runs on Node, on macOS,
  • shell lolxl-safespace-mcp-0f11d05/.claude-plugin/src/status/shared.ts :9 import { execFile } from "node:child_process";
  • shell (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/tools/integration.test.ts :109 const proc = Bun.spawn(["bun", "-e", code], {

network 42

  • net (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/consent.test.ts :474 await fetch(`${redirectUri}?error=test_simulated_user_closed_browser`).catch(() => undefined);
  • net (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/github/client.test.ts :143 test("a host-escaping path (`@evil.com`) is BLOCKED before the fetch (-32047)", async () => {
  • net lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/github/client.ts :88 // fetch (throws -32047, echoing the host only). No-op on the normal api.github.com.
  • net (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/github/consent.test.ts :99 await fetch(`${redirectUri}?${q}`).catch(() => undefined);
  • net lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/notion/client.ts :83 // host BEFORE the fetch (catches a path-injection host escape; throws -32047,
  • net (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/notion/consent.test.ts :99 await fetch(`${redirectUri}?${q}`).catch(() => undefined);
  • net (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/oauth-callback.test.ts :30 const resp = await fetch(`${s.url}?code=abc123&state=st-ok`);
  • net lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/oauth-callback.ts :19 import * as http from "node:http";
  • net (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/x/client.test.ts :146 test("a host-escaping path (`@evil.com`) is BLOCKED before the fetch (-32047)", async () => {
  • net lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/x/client.ts :54 // fetch (catches a path-injection host escape; throws -32047, echoing the host only).
  • net (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/x/consent.test.ts :115 await fetch(`${redirectUri}?${q}`).catch(() => undefined);
  • net lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/x/consent.ts :21 // - every process-owned fetch (token exchange, users/me) calls assertEgressHost
show 28 more
  • net (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/x/http.test.ts :8 test("assertEgressHost runs BEFORE fetch (host-escape never dispatches)", async () => {
  • net lolxl-safespace-mcp-0f11d05/.claude-plugin/src/identity/tailscale-whois.ts :19 import { request as httpRequest } from "node:http";
  • net (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/policy/url-gate.transport.test.ts :7 import * as http from "node:http";
  • net lolxl-safespace-mcp-0f11d05/.claude-plugin/src/policy/url-gate.ts :25 import * as http from "node:http";
  • net lolxl-safespace-mcp-0f11d05/.claude-plugin/src/policy/youtube-video-targets.ts :28 // resolving the video's channelId via a videos.list pre-fetch (TOCTOU + extra
  • net lolxl-safespace-mcp-0f11d05/.claude-plugin/src/proxy.ts :11 import type { IncomingMessage } from "node:http";
  • net (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/status.test.ts :887 // ----- runPosture egress section (v1.87) — uses web-fetch (UNCACHED, reads env
  • net (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/tools/egress-pipeline.test.ts :452 test("A2b sec-rev: ctx.egress carries the WRONG kind → internal_routing_error, kinds never echoed, ZERO fetch (handler vehicle)", async () => {
  • net (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/tools/handlers.test.ts :12118 // Non-self entries — DEEP-EQUAL to pre-fetch (same keys + same values).
  • net lolxl-safespace-mcp-0f11d05/.claude-plugin/src/tools/handlers/calendar.ts :1005 * pre-fetch (hook #9 deep-equality).
  • net lolxl-safespace-mcp-0f11d05/.claude-plugin/src/tools/handlers/discord.ts :112 // before the fetch (channel_id is in the path; throws -32047 echoing the host only).
  • net lolxl-safespace-mcp-0f11d05/.claude-plugin/src/tools/handlers/line.ts :97 // Send via the shared service-token fetch (hard timeout + response-body cleanup +
  • net lolxl-safespace-mcp-0f11d05/.claude-plugin/src/tools/handlers/service-token-fetch.ts :1 // v1.69.1 — the shared class-B service-token egress fetch (LINE / Telegram / Discord).
  • net lolxl-safespace-mcp-0f11d05/.claude-plugin/src/tools/handlers/slack.ts :169 // fetch (throws -32047 echoing the host only).
  • net lolxl-safespace-mcp-0f11d05/.claude-plugin/src/tools/handlers/tasks.ts :472 * NO pre-fetch (TOCTOU + extra quota; mirror v1.17 youtube_comment_delete).
  • net lolxl-safespace-mcp-0f11d05/.claude-plugin/src/tools/handlers/telegram.ts :111 // Send via the shared service-token fetch (hard timeout + response-body cleanup +
  • net (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/tools/handlers/x.test.ts :269 test("ctx.egress ABSENT → internal_routing_error{invariant_violation} + ZERO fetch (pipeline-bypass backstop)", async () => {
  • net lolxl-safespace-mcp-0f11d05/.claude-plugin/src/tools/handlers/youtube.ts :766 * value — pass every field you want to keep. NO pre-fetch (avoids TOCTOU; read
  • net lolxl-safespace-mcp-0f11d05/.claude-plugin/src/tools/registry/tasks.ts :203 "PERMANENTLY DESTRUCTIVE — Google Tasks has NO trash recovery, unrecoverable from web UI / mobile / any Google surface. DELETE a Google Tasks task via tasks.delete (WRITE OPERATION). ALWAYS ask the us
  • net lolxl-safespace-mcp-0f11d05/.claude-plugin/src/tools/registry/web.ts :29 description: "Absolute http(s) URL to fetch (e.g. https://example.com/page).",
  • net lolxl-safespace-mcp-0f11d05/.claude-plugin/src/tools/registry/youtube.ts :306 omments (returns 403 otherwise). NO pre-fetch (`comments.list({id})`) to avoid TOCTOU resolution. Quota cost: 50 units / call. Audit records target_comment_id_hash (plain SHA-256) + policy_decision='d
  • net (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/transport/http.test.ts :2 import { request as httpRequest } from "node:http";
  • net lolxl-safespace-mcp-0f11d05/.claude-plugin/src/transport/http.ts :19 } from "node:http";
  • net (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/transport/webhook.test.ts :73 const res = await fetch(`${base}/webhook/slack`, { method: "POST", headers: slackHeaders(messageBody), body: messageBody });
  • net lolxl-safespace-mcp-0f11d05/.claude-plugin/src/transport/webhook.ts :22 } from "node:http";
  • net (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/webhook/verify/line.test.ts :6 import type { IncomingHttpHeaders } from "node:http";
  • net lolxl-safespace-mcp-0f11d05/.claude-plugin/src/webhook/verify/line.ts :18 import type { IncomingHttpHeaders } from "node:http";
  • net (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/webhook/verify/slack.test.ts :7 import type { IncomingHttpHeaders } from "node:http";

2 more not shown — this panel samples each group; the count above is the real total.

secrets 29

  • secrets (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/consent.test.ts :481 prevClientSecret = process.env.GOOGLE_CLIENT_SECRET;
  • secrets lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/consent.ts :273 const clientSecret = process.env.GOOGLE_CLIENT_SECRET;
  • secrets (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/github/consent.test.ts :45 process.env.GITHUB_CLIENT_SECRET = "fake-client-secret-must-never-leak";
  • secrets lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/github/consent.ts :180 const clientSecret = process.env.GITHUB_CLIENT_SECRET;
  • secrets (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/notion/consent.test.ts :48 process.env.NOTION_CLIENT_SECRET = CLIENT_SECRET;
  • secrets lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/notion/consent.ts :152 const clientSecret = process.env.NOTION_CLIENT_SECRET;
  • secrets (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/refresh.cache.test.ts :20 secret: process.env.GOOGLE_CLIENT_SECRET,
  • secrets (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/refresh.test.ts :7 secret: process.env.GOOGLE_CLIENT_SECRET,
  • secrets lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/refresh.ts :143 const clientSecret = process.env.GOOGLE_CLIENT_SECRET;
  • secrets (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/service-token-store.test.ts :39 delete process.env.SAFESPACE_LINE_CHANNEL_TOKEN;
  • secrets (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/webhook-secret-store.test.ts :30 delete process.env.SAFESPACE_SLACK_WEBHOOK_SECRET;
  • secrets (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/x/consent.test.ts :51 process.env.SAFESPACE_X_CLIENT_SECRET = CLIENT_SECRET;
show 17 more
  • secrets (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/auth/x/oauth.test.ts :55 process.env.SAFESPACE_X_CLIENT_SECRET = "x-fake-secret";
  • secrets (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/cli/notion.test.ts :46 delete process.env.NOTION_CLIENT_SECRET;
  • secrets (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/cli/x.test.ts :47 delete process.env.SAFESPACE_X_CLIENT_SECRET;
  • secrets (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/google-api/auth.test.ts :50 prevClientSecret = process.env.GOOGLE_CLIENT_SECRET;
  • secrets lolxl-safespace-mcp-0f11d05/.claude-plugin/src/google-api/auth.ts :54 const clientSecret = process.env.GOOGLE_CLIENT_SECRET;
  • secrets (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/google-api/client.test.ts :48 prevClientSecret = process.env.GOOGLE_CLIENT_SECRET;
  • secrets (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/tools/egress-pipeline.test.ts :287 process.env.SAFESPACE_LINE_CHANNEL_TOKEN = "chan-tok-xyz";
  • secrets (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/tools/egress-tripwire.test.ts :90 secret: process.env.GOOGLE_CLIENT_SECRET,
  • secrets (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/tools/envelope-integration.test.ts :52 delete process.env.SAFESPACE_TELEGRAM_BOT_TOKEN;
  • secrets (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/tools/handlers.test.ts :6908 process.env.GOOGLE_CLIENT_SECRET = "fake";
  • secrets (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/tools/integration.test.ts :31 secret: process.env.GOOGLE_CLIENT_SECRET,
  • secrets (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/tools/with-all-accounts.envelope-parity.test.ts :30 secret: process.env.GOOGLE_CLIENT_SECRET,
  • secrets (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/tools/with-all-accounts.test.ts :16 secret: process.env.GOOGLE_CLIENT_SECRET,
  • secrets (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/tools/with-context.mutex-contract.test.ts :35 secret: process.env.GOOGLE_CLIENT_SECRET,
  • secrets (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/tools/with-context.recorder-symmetry.test.ts :35 secret: process.env.GOOGLE_CLIENT_SECRET,
  • secrets (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/tools/with-context.test.ts :22 secret: process.env.GOOGLE_CLIENT_SECRET,
  • secrets (weak) lolxl-safespace-mcp-0f11d05/.claude-plugin/src/tools/with-nonoauth-context.test.ts :164 delete process.env.SAFESPACE_LINE_CHANNEL_TOKEN;

install hooks 1

  • prepublishOnly lolxl-safespace-mcp-0f11d05/.claude-plugin/package.json :44 npm run build

declared dependencies 6

  • @modelcontextprotocol/sdk@^1.29.0
  • @napi-rs/keyring@^1.1.0
  • googleapis@^144.0.0
  • @types/bun@latest
  • @types/node@^25.8.0
  • typescript@^5.6.0

clipboard 2

  • clipboard shell call lolxl-safespace-mcp-0f11d05/.claude-plugin/src/cli/service-token-cli.ts :81 ` (e.g. \`pbpaste | safespace ${cmd} set-token\`, or run it and paste then Ctrl-D).\n` +
  • clipboard shell call lolxl-safespace-mcp-0f11d05/.claude-plugin/src/cli/webhook.ts :69 " (e.g. `pbpaste | safespace webhook set-secret slack`).\n" +

obfuscation 1

  • dynamic require()/import() lolxl-safespace-mcp-0f11d05/.claude-plugin/src/cli.test.ts :640 (await import(`./policy/${m}`)).__internal.resetSingletons();