One governed MCP endpoint for every app your agents touch. Local-first MCP aggregator with a BYO-keys encrypted vault, read/write/full scopes, approval gates, audit log, and a dashboard. Apache-2.0.
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
transport stdio · streamable-http · http counts 0 tools · 0 res
· 0 prompts
permission surface via code analysis
No tools enumerated yet for this server.
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed commit ce8cb00 · analyzer v33 · 3w ago
danger signals3
- suspicious endpoint abcd.ngrok.app Mas-AI-Official-mcp-switchboard-ce8cb00/scripts/verify-expose.mjs :81
assert("ngrok regex matches ngrok.app", TUNNELS.ngrok.urlRegex.test("https://abcd.ngrok.app")); - suspicious endpoint abcd.ngrok.io Mas-AI-Official-mcp-switchboard-ce8cb00/scripts/verify-expose.mjs :83
assert("ngrok regex matches ngrok.io", TUNNELS.ngrok.urlRegex.test("https://abcd.ngrok.io")); - over-broad OAuth scope delete_repo Mas-AI-Official-mcp-switchboard-ce8cb00/scripts/verify-config.mjs :85
assert("a destructive tool is hard-blocked (enabled:false)", gh?.tools?.delete_repo?.enabled === false);
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 64
filesystem 32
- fs (weak) Mas-AI-Official-mcp-switchboard-ce8cb00/scripts/smoke-codex-switchboard.mjs :13
import { mkdtempSync, writeFileSync, readFileSync } from "node:fs"; - fs (weak) Mas-AI-Official-mcp-switchboard-ce8cb00/scripts/verify-audit.mjs :23
import { mkdtempSync } from "node:fs"; - fs (weak) Mas-AI-Official-mcp-switchboard-ce8cb00/scripts/verify-breaker.mjs :27
import { mkdtempSync, rmSync } from "node:fs"; - fs (weak) Mas-AI-Official-mcp-switchboard-ce8cb00/scripts/verify-config.mjs :25
import { mkdtempSync, writeFileSync, readFileSync, rmSync } from "node:fs"; - fs (weak) Mas-AI-Official-mcp-switchboard-ce8cb00/scripts/verify-dashboard.mjs :32
import { readFileSync } from "node:fs"; - fs (weak) Mas-AI-Official-mcp-switchboard-ce8cb00/scripts/verify-doctor.mjs :21
import { readFileSync } from "node:fs"; - fs (weak) Mas-AI-Official-mcp-switchboard-ce8cb00/scripts/verify-expose.mjs :21
import { readFileSync } from "node:fs"; - fs (weak) Mas-AI-Official-mcp-switchboard-ce8cb00/scripts/verify-health.mjs :25
import { readFileSync } from "node:fs"; - fs (weak) Mas-AI-Official-mcp-switchboard-ce8cb00/scripts/verify-install.mjs :10
import { mkdtempSync, mkdirSync, readFileSync, writeFileSync, rmSync } from "node:fs"; - fs (weak) Mas-AI-Official-mcp-switchboard-ce8cb00/scripts/verify-limits.mjs :25
import { mkdtempSync, rmSync } from "node:fs"; - fs (weak) Mas-AI-Official-mcp-switchboard-ce8cb00/scripts/verify-local-llm.mjs :15
import { mkdtempSync, writeFileSync, rmSync } from "node:fs"; - fs (weak) Mas-AI-Official-mcp-switchboard-ce8cb00/scripts/verify-oauth.mjs :7
import { mkdtempSync } from "node:fs";
show 20 more
- fs (weak) Mas-AI-Official-mcp-switchboard-ce8cb00/scripts/verify-openapi.mjs :25
import { mkdtempSync, writeFileSync } from "node:fs"; - fs (weak) Mas-AI-Official-mcp-switchboard-ce8cb00/scripts/verify-profiles.mjs :23
import { mkdtempSync, writeFileSync, rmSync } from "node:fs"; - fs (weak) Mas-AI-Official-mcp-switchboard-ce8cb00/scripts/verify-registry-metadata.mjs :8
import { readFileSync } from "node:fs"; - fs (weak) Mas-AI-Official-mcp-switchboard-ce8cb00/scripts/verify-resources-prompts.mjs :30
import { mkdtempSync } from "node:fs"; - fs (weak) Mas-AI-Official-mcp-switchboard-ce8cb00/scripts/verify-retry.mjs :18
import { readFileSync } from "node:fs"; - fs (weak) Mas-AI-Official-mcp-switchboard-ce8cb00/scripts/verify-router.mjs :31
import { mkdtempSync, existsSync } from "node:fs"; - fs (weak) Mas-AI-Official-mcp-switchboard-ce8cb00/scripts/verify-triggers.mjs :17
import { mkdtempSync } from "node:fs"; - fs (weak) Mas-AI-Official-mcp-switchboard-ce8cb00/scripts/verify-vault.mjs :27
import { mkdtempSync, readFileSync } from "node:fs"; - fs (weak) Mas-AI-Official-mcp-switchboard-ce8cb00/scripts/verify-webhook.mjs :9
import { mkdtempSync } from "node:fs"; - fs Mas-AI-Official-mcp-switchboard-ce8cb00/src/apikeys.ts :15
import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs"; - fs Mas-AI-Official-mcp-switchboard-ce8cb00/src/audit.ts :6
import { appendFileSync, existsSync, mkdirSync, readFileSync } from "node:fs"; - fs Mas-AI-Official-mcp-switchboard-ce8cb00/src/authserver.ts :30
import { chmodSync, existsSync, readFileSync, writeFileSync } from "node:fs"; - fs Mas-AI-Official-mcp-switchboard-ce8cb00/src/catalog.ts :20
import { readFileSync, writeFileSync, existsSync, mkdirSync } from "node:fs"; - fs Mas-AI-Official-mcp-switchboard-ce8cb00/src/cli.ts :23
import { existsSync } from "node:fs"; - fs Mas-AI-Official-mcp-switchboard-ce8cb00/src/clients.ts :27
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs"; - fs Mas-AI-Official-mcp-switchboard-ce8cb00/src/config.ts :10
import { existsSync, readFileSync, writeFileSync } from "node:fs"; - fs Mas-AI-Official-mcp-switchboard-ce8cb00/src/oauth.ts :25
import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs"; - fs Mas-AI-Official-mcp-switchboard-ce8cb00/src/openapi.ts :19
import { readFileSync } from "node:fs"; - fs Mas-AI-Official-mcp-switchboard-ce8cb00/src/triggers.ts :35
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs"; - fs Mas-AI-Official-mcp-switchboard-ce8cb00/src/vault.ts :17
import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
shell / exec 2
- shell (weak) Mas-AI-Official-mcp-switchboard-ce8cb00/scripts/verify-expose.mjs :154
assert("tunnel spawned shell-lessly via spawn(spec.bin, spec.args(...))", has("spawn(spec.bin, spec.args(")); - shell Mas-AI-Official-mcp-switchboard-ce8cb00/src/expose.ts :20
import { spawn, type ChildProcess } from "node:child_process";
network 15
- net Mas-AI-Official-mcp-switchboard-ce8cb00/public/app.js :25
const res = await fetch(path, { - net (weak) Mas-AI-Official-mcp-switchboard-ce8cb00/scripts/smoke-codex-switchboard.mjs :12
import { createServer } from "node:http"; - net (weak) Mas-AI-Official-mcp-switchboard-ce8cb00/scripts/verify-httptool.mjs :18
// failure returns an isError result and NEVER calls fetch (fail closed). - net (weak) Mas-AI-Official-mcp-switchboard-ce8cb00/scripts/verify-oauth.mjs :39
const asMeta = await (await fetch(`${PUBLIC}/.well-known/oauth-authorization-server`)).json(); - net (weak) Mas-AI-Official-mcp-switchboard-ce8cb00/scripts/verify-triggers.mjs :21
import { createServer } from "node:http"; - net (weak) Mas-AI-Official-mcp-switchboard-ce8cb00/scripts/verify-webhook.mjs :13
import { createServer } from "node:http"; - net Mas-AI-Official-mcp-switchboard-ce8cb00/src/catalog.ts :131
const res = await fetch(url, { headers: { "user-agent": USER_AGENT, accept: "application/json" } }); - net Mas-AI-Official-mcp-switchboard-ce8cb00/src/cli.ts :24
import { createServer } from "node:http"; - net Mas-AI-Official-mcp-switchboard-ce8cb00/src/council.ts :104
const res = await fetch(`${baseUrl("anthropic", cfg)}/v1/messages`, { - net Mas-AI-Official-mcp-switchboard-ce8cb00/src/dashboard.ts :710
const r = await fetch(wh.url, { method: "POST", headers, body: payload, signal: ctrl.signal }); - net Mas-AI-Official-mcp-switchboard-ce8cb00/src/httptool.ts :105
resp = await fetch(url, init); - net Mas-AI-Official-mcp-switchboard-ce8cb00/src/localllm.ts :206
const res = await fetch(runtime.modelsUrl, { signal: ac.signal, headers: { accept: "application/json" } });
show 3 more
- net Mas-AI-Official-mcp-switchboard-ce8cb00/src/oauth.ts :391
const res = await fetch(provider.tokenUrl, { method: "POST", headers, body }); - net Mas-AI-Official-mcp-switchboard-ce8cb00/src/openapi.ts :132
const resp = await fetch(source); - net Mas-AI-Official-mcp-switchboard-ce8cb00/src/webhook.ts :174
await fetch(url, { method: "POST", headers, body: payload, signal: ctrl.signal });
secrets 1
- secrets (weak) Mas-AI-Official-mcp-switchboard-ce8cb00/scripts/verify-council.mjs :143
process.env.LOCAL_TOKEN = "tok-abc-123";
install hooks 1
- prepublishOnly Mas-AI-Official-mcp-switchboard-ce8cb00/package.json :91
npm run verify
declared dependencies 8
- @modelcontextprotocol/sdk@1.29.0
- commander@15.0.0
- express@5.2.1
- yaml@2.9.0
- zod@4.4.3
- @types/express@5.0.5
- @types/node@22.10.5
- typescript@5.7.3
perm:untrusted 2
- untrusted (weak) Mas-AI-Official-mcp-switchboard-ce8cb00/scripts/smoke-codex-switchboard.mjs :148
const health = await (await fetch(`${handle.url}/api/health`)).json(); - untrusted (weak) Mas-AI-Official-mcp-switchboard-ce8cb00/scripts/verify-oauth.mjs :39
const asMeta = await (await fetch(`${PUBLIC}/.well-known/oauth-authorization-server`)).json();
transport_posture 1
- binds all interfaces (0.0.0.0) Mas-AI-Official-mcp-switchboard-ce8cb00/scripts/verify-install.mjs :77
assert("mcpUrl 0.0.0.0 → 127.0.0.1", mcpUrl({ host: "0.0.0.0", port: 9000 }) === "http://127.0.0.1:9000/mcp");