Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Zephex

REMOTE · ZEPHEX.DEV · SCANNED SEP 20

MCP gateway with 10 tools for code analysis, architecture, package audit & security.

Available components

0 this week 25 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →

Endpoint Security63
Transport & Reachability0
Schema Quality & AI Usability0
  • Schema not yet verified: we couldn't read the endpoint's schema.Unverified
Stability & Change Management0
  • Stability not yet verified: not enough scan history yet (needs a 30-day window).Unverified
Tool Coverage0
  • Tool coverage not yet verified: we couldn't read the endpoint's tools.Unverified
Tool Safety0
  • Tool safety not yet verified: we couldn't read the endpoint's tools.Unverified
Capabilities0
  • Capabilities not yet verified: we couldn't read the endpoint's capabilities.Unverified

Unverified: 5 categories

Categories scored 0 because we could not verify them: authentication we do not have, an unreachable endpoint, or not enough scan history. We only credit what we can confirm.

Install

How do I install the Zephex MCP server?

Zephex is a hosted endpoint at https://zephex.dev/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

remote · zephex.dev

# add to Claude Code
claude mcp add --transport http tanbir404-zephex 'https://zephex.dev/mcp'
// .cursor/mcp.json
{
  "mcpServers": {
    "tanbir404-zephex": {
      "url": "https://zephex.dev/mcp"
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "tanbir404-zephex": {
      "type": "http",
      "url": "https://zephex.dev/mcp"
    }
  }
}
# ~/.codex/config.toml
[mcp_servers.tanbir404-zephex]
url = "https://zephex.dev/mcp"
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "tanbir404-zephex": {
      "type": "remote",
      "url": "https://zephex.dev/mcp",
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add tanbir404-zephex --url 'https://zephex.dev/mcp' --transport streamable-http
# ~/.hermes/config.yaml
mcp_servers:
  tanbir404-zephex:
    url: "https://zephex.dev/mcp"
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "tanbir404-zephex": {
      "Transport": "http",
      "Url": "https://zephex.dev/mcp"
    }
  }
}
# add to Vellum
assistant mcp add tanbir404-zephex -t streamable-http -u 'https://zephex.dev/mcp'
// mcp.json
{
  "mcpServers": {
    "tanbir404-zephex": {
      "type": "http",
      "url": "https://zephex.dev/mcp"
    }
  }
}

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 13 Sept 26 −67
    • Endpoint reachability: reachable → not serving MCP security
    • Authorization: pass → unverified security
    • Stability: pass → unverified security
    • Tool safety: pass → unverified security
    • Transport: pass → fail security
    • Capabilities: pass → unverified functional
    • Tool coverage: 100 → unverified functional
  • 12 Sept 26 +1
    • Stability: 0.97 → pass security
  • 10 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 90 to 93. That category is still filling its 30-day observation window: 27 days of observed history at the previous scan, 28 at this one. The score rises as the window fills, whether or not the server changes.

  • 9 Sept 26 −2
    • Stability: pass → 0.90 functional
  • 26 Aug 26 +1
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 25 Aug 26 +1
    • Stability: 0.97 → pass security
  • 24 Aug 26 0
    • The server rewrote its instructions, which are the text every model session reads security
    • Tool “check_package” rewrote its description, which is the text the model reads security
    • Tool “check_test” rewrote its description, which is the text the model reads security
    • Tool “explain_architecture” rewrote its description, which is the text the model reads security
    • Tool “project_memory” rewrote its description, which is the text the model reads security
    • Schema quality: 672 → 763 functional
    • “check_package” reworded the description of “from_version” cosmetic
    • “check_package” reworded the description of “task” cosmetic
    • “check_package” reworded the description of “version” cosmetic
    • “check_test” reworded the description of “path” cosmetic
    • “check_test” reworded the description of “session_id” cosmetic
    • “check_test” reworded the description of “task” cosmetic
    • “explain_architecture” reworded the description of “path” cosmetic
    • “project_memory” reworded the description of “action” cosmetic
    • “project_memory” reworded the description of “content” cosmetic
    • “project_memory” reworded the description of “limit” cosmetic
    • “project_memory” reworded the description of “path” cosmetic
    • “project_memory” reworded the description of “scope” cosmetic
  • 18 Aug 26 0
    • The server rewrote its instructions, which are the text every model session reads security
    • Tool “find_code” rewrote its description, which is the text the model reads security
    • Tool “get_project_context” rewrote its description, which is the text the model reads security
    • Tool “read_code” rewrote its description, which is the text the model reads security
    • “find_code” reworded the description of “path” cosmetic
    • “get_project_context” reworded the description of “path” cosmetic
    • “read_code” reworded the description of “path” cosmetic
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 20 Sept 2026 · Probed https://zephex.dev/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=zephex.dev CN=YR1,O=Let's Encrypt,C=US 12 Sept 2026 11 Dec 2026 RSA 2048 SHA256-RSA 6526defc8489c497a8d2163342a6c7437d6
SANs: zephex.dev
CN=YR1,O=Let's Encrypt,C=US (CA) CN=Root YR,O=ISRG,C=US 3 Sept 2025 2 Sept 2028 RSA 2048 SHA256-RSA a20253f15f2691c05dc1ce13b9bcca4e
CN=Root YR,O=ISRG,C=US (CA) CN=ISRG Root X1,O=Internet Security Research Group,C=US 13 May 2026 2 Sept 2032 RSA 4096 SHA256-RSA f24b6d17f9d9ad7cb1c9fea78782699f

Background: What to check on a remote MCP endpoint →

DNSSEC insecure

Validation of zephex.dev. Not signed

Zone DS Keys Algorithms Outcome
. trust_anchor 20326, 38696 8, 8 Verified
dev. present 60074 8 Verified
zephex.dev. absent Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation
Authentication No authorisation required

The endpoint answered without asking for a token. Anyone who knows the URL can reach it.

Result No authorisation required
HTTP status 404
Header Value
strict-transport-security max-age=31536000; includeSubDomains; preload
content-security-policy default-src 'self'; base-uri 'self'; frame-ancestors 'none'; object-src 'none'; script-src 'self' 'nonce-hGc9FfCfbQ2IEU5vhga79w==' https://www.google.com/recaptcha/ https://www.gstatic.com/recaptcha/ https://accounts.google.com https://js.stripe.com https://us.i.posthog.com https://*.posthog.com https://v8.js-dos.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self' data: https://r2cdn.perplexity.ai; frame-src 'self' http://localhost:5173 https://desktop.zephex.dev https://infinitemac.org https://www.google.com https://www.gstatic.com https://recaptcha.google.com https://accounts.google.com https://js.stripe.com https://checkout.stripe.com https://billing.stripe.com https://www.youtube.com https://www.youtube-nocookie.com https://youtube.com https://open.spotify.com https://embed.spotify.com https://embed-cdn.spotifycdn.com; connect-src 'self' https://api.stripe.com https://*.supabase.co wss://*.supabase.co https://www.google.com/recaptcha/ https://www.gstatic.com/recaptcha/ http
x-content-type-options nosniff
x-frame-options DENY
referrer-policy strict-origin-when-cross-origin
permissions-policy camera=(), microphone=(), geolocation=(), interest-cohort=(), payment=(self), identity-credentials-get=(self "https://accounts.google.com"), usb=(), magnetometer=(), gyroscope=(), accelerometer=()

Background: How OAuth 2.1 works in the 2026 MCP spec →

Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://zephex.dev/mcp HTTP error 404
http (plaintext) http://zephex.dev/mcp HTTPS enforced 308 https://zephex.dev/mcp
MCP tools · 10 exposed · ~6,994 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
audit_headers ~646

Audit a public HTTPS URL the user deployed — security grade A–F, SSL, headers, cookies, health (ALIVE/DEGRADED/BROKEN), exposed secrets, tech stack. Read plain_summary first; only drill into security_headers or secrets if grade is poor. quick ~1–3s; scan_depth=deep for secret scan (~8–12s). 6 credits hosted. Call when user pastes a live URL — post-deploy check, is it secure, what framework, exposed keys. Blocks localhost/private IPs. NOT for repo code (find_code), packages (check_package), tests (check_test), or project layout (get_project_context). Example: audit_headers({ url: 'https://myapp.vercel.app' }). Read-only.

NameTypeReqDescription
check_apisbooleanProbe /api/health and common API paths — adds ~1-2s (default: false)
check_cookiesbooleanCheck cookie Secure/HttpOnly/SameSite flags (default: true)
check_headersbooleanGrade all security headers and return fix snippets when include_fix_snippets=true (default: true)
check_healthbooleanSite health: verdict, trust score, load time, page title (default: true)
check_networkbooleanHTTP network timing table — slow requests, API probes (default: true)
check_redirectsbooleanFollow and audit the full redirect chain (default: true)
check_secretsbooleanSecret scan: HTML/JS keys, exposed .env/.git, GraphQL (default: true; depth via scan_depth)
check_sslbooleanCheck SSL certificate validity, expiry, and protocol (default: true)
check_techbooleanTech stack: framework, hosting, CDN, third-party (default: true)
focusstringTrim output layers (default: all)
include_fix_snippetsbooleanInclude Nginx/Vercel/Next fix snippets — token-heavy (default: false)
pathstringOptional subpath (e.g. /checkout) — appended to url
probe_enginestringfetch=HTTP only (default); browser=headless Chrome on Zephex servers for console errors + browser network (falls back to fetch with warning if unavailable)
scan_depthstringquick=light scan, 3 bundles (default); deep=full supply URL phase with JWT decode, source maps, verification (~8-12s)
scan_modestringquick=~1-3s (default); thorough=DNS+APIs+secrets ~5-12s
security_depthstringbasic=fast (default); full adds DNS SPF/DMARC/DKIM + HSTS preload lookup
timeout_msnumberMax scan time in ms (default: 8000, max: 15000)
urlstringyesPublic https:// URL to audit — e.g. https://myapp.vercel.app or https://zephex.dev

No output schema declared.

No examples provided.

check_package ~578

Verify a public registry package before the agent recommends, installs, or changes a dependency. ALWAYS call when the user says install, add a package, add a dependency, upgrade, bump, migrate, is this package safe, is this name real, check CVEs, vulnerability, deprecation, slopsquatting, supply-chain risk, or breaking changes. Call it before npm/pnpm/yarn/bun/pip/cargo/gem or another package-manager install command; do not install first and inspect later. PREFER this over web search or raw registry metadata for package safety and version-change decisions. Choose one task: check for existence, typo/slopsquat risk, deprecation, and basic safety; security for advisories affecting a pinned version; upgrade for changes from one version to the latest; migrate for a major-version plan; debug for version-specific advisories and release-note clues. Pass the public registry package name, not an import path or repository path. The ecosystem is auto-detected when possible; set ecosystem for non-npm names that are ambiguous. Pass version with check/security and from_version with upgrade/migrate/debug so the result is specific to the user's install. Read summary and hint first, then inspect only the relevant data fields. Follow next_calls when another package check or a project lookup is needed. Examples: check_package({ package: 'express', task: 'check', version: '5.1.0' }); check_package({ package: 'next', task: 'upgrade', from_version: '14.2.0' }). Not for locating imports in the user's code (find_code) or discovering installed dependencies from their project (get_project_context). Read-only.

NameTypeReqDescription
channelstringINTERNAL: Zephex terminal CLI only. Agents must omit — returns richer fields than agent-safe JSON.
cli_depthstringINTERNAL: CLI terminal depth. Agents must omit.
ecosystemstringRegistry (default npm, auto-detected). Omit for next/stripe/prisma.
from_versionstringVersion being changed from. Pass for task=upgrade|migrate|debug so release notes and advisories are version-specific.
packagestringyesPackage name on the public registry — e.g. next, stripe, prisma, express, @supabase/supabase-js.
sourcestringOptional. local = read pinned version from disk (stdio only). Prefer passing version/from_version directly.
taskstringOne goal per call: check=safe to add; security=CVEs for version; upgrade=version bump plan; migrate=major-version migration; debug=version-specific release clues.
versionstringInstalled or pinned version. Pass for task=check|security so advisories are evaluated against the user's actual version.

No output schema declared.

No examples provided.

check_test ~936

Run the project's real test suite and return structured health — the same engine as the terminal command zephex check test. Detects bun, vitest, jest, pytest, go test, and cargo. Parses JUnit plus lcov (not a regex over stdout). Returns summary, a plain card (what broke, why clusters, coverage, warnings), fix_first, broken_areas, failure_clusters, coverage_by_area, and session_id. Not a file picker for what to edit. ALWAYS call after you edited source, when they ask if tests pass, what is failing, why tests failed, are we green, before commit, before push, or to re-run only the failed tests. PREFER this over running bun test, npm test, or pytest yourself and dumping logs. This already ran the suite, clustered the failures, and named the first file to fix. Workflow: task=detect sees the runner without executing (framework, command, test file count). task=run executes once and stores a session. Then task=failures, status, list, coverage, missing, why, or fix_prompt using session_id (or omit session_id to read the last run on this machine). Do not re-run the whole suite just to read failures. Read summary and fix_first first. On FAIL, call task=failures, then fix those files. task=why with a question explains clusters. task=missing finds changed source without tests. task=fix_prompt is a paste-ready brief. Pass diff_base: main after edits for failures_in_diff. area or file_filter scopes a later run. Local stdio: omit path (the editor cwd — their machine) or pass that project folder. Hosted: public GitHub URL or inline_files — not a local disk path. Does not modify source. Does not invent a runner if none exists. Does not choose product files to edit. Does not check npm packages. Does not scan a live URL. Example: check_test({ task: "run" }) then check_test({ task: "failures", session_id: "" }).

NameTypeReqDescription
areastringScope to module/area name derived from test paths (e.g. proxy, auth, handlers)
commandstringOverride auto-detected test command
coverage_topnumberMax files in coverage slice
detail_levelstringToken budget: brief <500 tokens on PASS; agent default; full=all slices
diff_basestringGit branch for patch coverage and failures_in_diff (e.g. main) — use after edits
failed_onlybooleanRe-run only tests that failed in the prior session
file_filterstringSubstring or glob fragment to filter test_files (e.g. auth, handlers)
include_flakybooleanInclude flaky test hints from local history
include_missingbooleanGit-diff scan for source files without matching tests (default true on detect and when diff_base set)
inline_filesobjectHosted fallback when github is unavailable: { "package.json": "...", "src/foo.test.ts": "..." }. Supports task detect and task run (temp dir on Railway). Include package.json with scripts.test.
limitnumberMax rows for task:history (1–20)
pathstringProject folder. Local/stdio: omit to use the editor cwd (tests run on their machine), or pass the absolute folder. Hosted: public GitHub URL or inline_files — not a local disk path. Required for run/…
questionstringNatural-language follow-up for task:why (e.g. "what failed in proxy?")
session_idstringFrom a prior task=run (ts_*). Reuse for failures/status/list/why/fix_prompt so you do not re-run. Omit on stdio to read the last run on this machine.
taskstringrun = execute the suite (stores a session). detect = see runner, do not execute. failures|status|list|coverage|fix_prompt|why = read the last session (no re-run). missing = git-diff sources without t…
timeout_msnumberMax run time ms (default 1800000 stdio, capped 600000 hosted)
with_coveragebooleanCollect lcov coverage (default true)

No output schema declared.

No examples provided.

explain_architecture ~756

Map how files in the user's project connect — which files are hubs, what imports what, where auth/API/database live. Not file bodies. ALWAYS call when they ask how auth works, where login is checked, what's the database, how the API is wired, give me an overview of these files, or where do I patch this feature. If they named Zephex or MCP and want a wiring map, you MUST call this before opening a pile of files. Prefer this over native Read on 10–20 files. Any language on their machine: Python CLI, Node, Go, a monorepo, an unsaved folder. Local/stdio: omit path (editor cwd) or pass their folder. No disk: inline_files or a public GitHub URL (https://github.com/owner/repo). concern = the word they used (auth, gateway, billing, users) — any label, not a fixed list. focus=auth|api|database|integrations when they named that slice. mode=overview first; mode=deep only if you need request_flows. subpath = one package in a monorepo. Read summary + data.entry_points + data.auth_flow + data.concern_cluster + next_calls. Then read_code outline on those hubs — do not open 20 files yourself. Empty cluster means that label is not in this repo. Outbound provider keys (OPENAI_API_KEY) are not inbound login. Not for stack/scripts (get_project_context). Not for 'where is this symbol' (find_code). Not for a function body (read_code). Example: explain_architecture({ concern: "auth", mode: "overview" }). Public repo: explain_architecture({ path: "https://github.com/owner/repo", focus: "api" }).

NameTypeReqDescription
concernstringAny subsystem label (folder name, feature codename, module). Uses find_code concept search + import graph — not a fixed keyword list. Returns roles, edges, symbols (no file bodies).
detail_levelstringLegacy alias for verbosity
excludearrayOptional glob patterns to exclude from ripgrep (vendor, build, etc.).
focusstringWiring slice. Default: api. auth=validation chain, integrations=external SDK touchpoints, database=ORM, security=auth+errors, full=all analyzers.
forcebooleanBypass architecture result cache. Default false.
inline_filesobjectFallback for remote transports. Shape: { "": "" }. Include 10-50 SOURCE files (entry points, routes, middleware, auth, DB setup) plus package.json. For local stdio, prefer 'path'.
modestringoverview=fast wiring map (no AST flow trace), deep=request_flows + sequenceDiagram, audit=anti_patterns + health_score. Default: overview
pathstringThe user's project folder. Local/stdio: omit to use editor cwd, or pass the absolute folder. Hosted with no disk: omit and use inline_files, or a public GitHub URL.
project_pathstringAlias for 'path' (some clients pass this name). Accepts the same values.
seed_filesarray1–20 paths from find_code — graph expands to related modules. Use with or without concern.
subpathstringMonorepo scope — analyze only this subdirectory (e.g. apps/api). Faster than whole repo.
verbositystringOutput size. minimal=core only, standard=default, full=adds constraints + state_management. Alias: detail_level

No output schema declared.

No examples provided.

find_code ~654

Search the user's project when you do not know which file holds something. Ranked hits; the definition of that name comes first, not a call site like const user = await name(). ALWAYS call instead of guessing a path. ALWAYS call when the user says where is, find, who uses, usages, or rename X everywhere. If they named Zephex or MCP and asked to find something in their code, this is the tool. Prefer this over native Grep when location is unknown — results are ranked and hand off to read_code. intent=symbol — they named a function/class/type. intent=concept — a topic; pass also_try synonyms (rate limit + throttle). intent=snippet — they pasted a line from the editor. intent=everywhere — every occurrence before a rename (whole_word:true). Works on any local project on their machine, any language. Local/stdio: omit path to search the editor cwd, or pass path as their project folder. No disk: inline_files, or a public GitHub URL. Returns summary, data.matches, files_hit, next_calls. Then call read_code with target set to that symbol name, or mode=file/outline with files=[path]. Not for stack/scripts (get_project_context). Not when you already have the exact file and symbol (read_code). Example: find_code({ query: "validateToken", intent: "symbol" }). Rename: find_code({ query: "OldName", intent: "everywhere", whole_word: true }). Topic: find_code({ query: "encrypt", intent: "concept", also_try: ["cipher", "AES"] }). If the first hit is the wrong file, follow next_calls or tighten with file_pattern / include=code. Do not fall back to guessing a path.

NameTypeReqDescription
also_tryarrayExtra keywords merged in parallel. concept=topic synonyms. everywhere=rename variants (crystal, CRYSTAL, crystal-app).
case_sensitivebooleantrue = match exact casing (Crystal vs crystal). Default false.
file_patternstringCustom glob; overrides include. Examples: src/**/*.ts, **/*.md.
includestringLimit file types. code=src. docs=md/readme. config=json/yaml. data=sql/prisma. all=default.
inline_filesobjectHosted MCP only: {"path/to/file.ts": "file contents"}. Use when path disk is unavailable.
intentstringSearch mode. snippet=paste exact line. symbol=find definition. concept=topic hunt. everywhere=all hits before rename.
pathstringThe user's project folder. Local/stdio: omit to use editor cwd, or pass the absolute folder. Hosted: public GitHub URL or inline_files.
querystringyesRequired. Text to find: pasted editor line, symbol name (validateToken), or topic keyword (encrypt).
response_formatstringconcise=line preview per hit. detailed=full function/class block when AST available.
whole_wordbooleanWith intent everywhere. true = whole word only (Crystal not Crystalline). Use before renames.

No output schema declared.

No examples provided.

get_project_context ~791

Answer what the user's project is — name, stack, how to run/test/build, auth, database, deploy, folder layout — from their files on disk, not from training data. ALWAYS call this before you invent npm/pip/cargo commands or read package.json yourself. ALWAYS call when the user says: what is this app, what's the stack, how do I run it, how do I test, is this a monorepo, where is auth, what database, how do we deploy. If they named Zephex or MCP, call this first on their project. One topic per call. Start with topic=identity on a new folder, then follow next_calls (usually run or framework). Other topics: backend, frontend, database, auth, deploy, structure, integrations, security. This is the user's machine, any project: Node, Python, Go, Rust, Java, PHP, a monorepo, an unsaved folder. Local/stdio: omit path to use the editor cwd, or pass path as their project folder. No disk on this transport: inline_files with package.json or pyproject.toml/go.mod/Cargo.toml plus 2–4 source files. Returns topic, summary, data (identity, commands, key_paths), hint, next_calls. Copy dev/test/build from data — do not guess bun vs npm vs uv. Not for finding a function name (find_code) or reading a file body (read_code). Those come after you know what the project is. Example: get_project_context({ topic: "identity" }) then get_project_context({ topic: "run" }). Also call topic=auth before touching login, topic=database before schema work, topic=structure when you need the folder map. force:true if the project just changed. Brief is enough for orientation; do not skip this tool to save a round-trip — one identity call replaces reading several manifests.

NameTypeReqDescription
detail_levelstringOutput tier: "brief" (default, ≤500 tokens), "standard" (full fields), "full" (all fields + file tree)
focus_onstringSubdirectory to focus the file tree scan on (e.g. 'src/tools')
forcebooleanSet true to re-detect even if cached (use when project changed)
include_structurebooleanWhen true, includes file tree in response (also triggered by detail_level: full)
inline_filesobjectPrimary way to supply code. Shape: { "": "", ... }. The VALUE is the actual file body — never a filename, path, or placeholder. Example: { "package.json": "{\"name\":\"my-app\",\"dependencies\":{...}…
pathstringThe user's project folder. Local/stdio: omit to use editor cwd, or pass the absolute folder (any OS). Hosted with no disk: omit and use inline_files.
structure_depthnumberMax folder depth for file tree scan (default: 3, max: 6)
topicstringWhich slice to return (one per call). identity=project name/type + which topics apply; run=dev/test/build/lint commands; framework=language/runtime/package manager; backend=API routes and server entr…

No output schema declared.

No examples provided.

keep_thinking ~588

Structure multi-step debugging and planning across tool calls — not a one-shot think. Tracks hypotheses, observations, plans; detects loops via lastActions; riskLevel high/critical blocks dangerous edits (drop table, prod deploy). Loads projectBrief (stack, key_paths, project_memory recall) on local project. On close, suggestedRemember → call project_memory remember. 4 credits hosted. Hard cap 10 thoughts/session. Call when: stuck after 2+ failed debug attempts, auth/billing/schema change spans 3+ files, flaky test you cannot explain, or you need a plan before editing. Pass lastActions (2–5 recent tool calls), goalAnchor after thought 2, sessionId to resume, area for subsystem. NOT when fix is known, single typo, repeating without new evidence, or session ended (nextThoughtNeeded:false). Read thoughtConfirmed and shouldContinue first. Legacy alias: thinking. Example: keep_thinking({ thought: 'Hypothesis: refresh token not rotated in middleware', thoughtType: 'hypothesis', thoughtNumber: 1, totalThoughts: 5, nextThoughtNeeded: true, confidence: 0.6, goalAnchor: 'Fix auth logout loop', lastActions: ['find_code(query=refreshToken)', 'read_code(target=authMiddleware)'], area: 'auth' }). Read-only.

NameTypeReqDescription
actionReadybooleantrue when done planning and about to execute edits.
areastringSubsystem (auth, billing, api) — scopes project_memory recall.
assumptionsarrayUp to 5 assumptions; set invalidated:true when contradicted.
confidencenumberyes0–1. Below 0.5 forces revision. Above 0.85 safe to proceed.
goalAnchorstringOne sentence restating the task — required after thought 2.
lastActionsarrayLast 2–5 tool calls as name(arg=val) — identical pair triggers boredLoopDetected.
nextThoughtNeededbooleanyesfalse ends session and writes checkpoint.
projectPathstringLocal project root (stdio defaults to cwd) for projectBrief.
revisesintegerThought number this revision replaces.
sessionIdstringResume prior session; restores checkpoint on thought 1.
thoughtstringyesReasoning (20–2000 chars) — file names, symbols, error messages.
thoughtNumberintegeryes1-based thought index in this session.
thoughtTypestringyeshypothesis|debug for investigation; plan|conclusion before acting.
toolOutputRelevancestringClassify last tool result — 3+ noise/error in last 5 triggers loop.
totalThoughtsintegeryesEstimated thoughts needed (revise upward if needed).

No output schema declared.

No examples provided.

project_memory ~809

Save project notes that must survive this chat — rules, conventions, decisions, gotchas, preferences. Writes notes. Does not read source files. ALWAYS call when they say remember, save this, don't forget, write this down, keep this, my rule, our convention, I always want, last time, what did we decide, what did we save, show me what we stored, or you just learned something that will be gone when this session ends. PREFER this over hoping the next chat still has it. Chat memory dies when the session ends. This does not. One folder can hold many notes (up to 200). Each note is title + content (up to ~2000 words) + type. Write the rule and the why — not a one-liner. type=decision|gotcha|goal|preference|area_fact|convention. area= the topic (auth, billing, deploy). tags= keywords that make it findable later (jwt, cookie). action=remember saves the note. action=recall searches title, body, area, and tags and returns matches[].content — read that text and use it. action=list shows recent notes (title, type, area, tags, preview of the body) so you can see what is stored. action=forget deletes by id. Pass limit up to 20 when they want more than a handful. One folder is one set of notes. Different folders never mix unless they ask (scope=all). Omit path on stdio (this folder) or pass that folder. Hosted: pass the same folder string every time. Stdio stores on their machine (~/.zephex/memory). Hosted stores in their cloud account. Empty matches means nothing was saved for that query — do not invent a past note. If they ask what we saved, call list or recall. Example: project_memory({ action: "remember", title: "Auth is cookie JWT", content: "Session in httpOnly cookie; refresh on /api/auth/refresh. Do not store access tokens in localStorage.", type: "gotcha", area: "auth", tags: ["jwt","cookie"] }). Find it later: project_memory({ action: "recall", query: "auth cookies" }). See what is stored: project_memory({ action: "list", limit: 10 }).

NameTypeReqDescription
actionstringyesremember=save a note, recall=search notes and return full content, list=recent notes with preview, forget=delete by id
areastringSubsystem label (auth, billing, deploy) — included in search index for scoped recall. Max 64 chars.
contentstringRequired for remember. Up to 12000 characters (~2000 words). Write the why and the trap — not a one-liner.
idstringRequired for forget. Memory uuid.
limitnumberrecall/list cap. Default 10, max 20.
pathstringFolder these notes belong to. Same string on remember, recall, and list. Stdio: optional (editor cwd). Hosted: reuse that folder string (or normalized_path from remember).
querystringRequired for recall. Short keywords from the title or topic (e.g. auth middleware stripe).
scopestringproject=this folder only (default). personal=notes that apply everywhere. all=every project — only when they ask to search everything.
tagsarrayOptional lowercase tags. Max 10.
titlestringRequired for remember. Max 80 chars.
typestringRequired for remember. decision=chose an approach; gotcha=non-obvious bug; goal=what we are building toward; preference=user style; area_fact=fact about a subsystem; convention=naming or process rule.
written_bystringWho authored this memory.

No output schema declared.

No examples provided.

read_code ~947

Read a known symbol or file from the user's project without dumping the whole tree. AST extract — signature plus body — cheaper than opening a 2,000-line file. ALWAYS call when find_code just returned a name or path, when the user named a function to inspect, or before you edit a large file. If they named Zephex or MCP and asked you to open or explain a function, this is the tool. Prefer this over native Read on files over ~50 lines. mode=symbol — extract by name (target or targets[]). mode=file — batch 1–20 paths. mode=outline — table of contents + plain-English overview before drilling a 300+ line file. mode=scan/smell — keywords or bug smells across files[] you already have. Works on any local project on their machine. Local/stdio: omit path to use editor cwd, or pass path as their project folder. No disk: inline_files. Call-graph modes (callers, blast_radius, dead_code) need local disk only. Returns summary, data.symbols or data.files, next_calls. Follow next_calls if truncated. Not for unknown location (find_code first). Not for stack/scripts (get_project_context). Example: read_code({ mode: "symbol", target: "validateToken" }) or read_code({ mode: "outline", files: ["src/auth.ts"] }). After find_code, do not re-search — pass the symbol as target or the path in files[]. detail_level=signature is enough to decide; body when you will edit. compact:true drops line numbers. Batch files[] instead of opening one path at a time.

NameTypeReqDescription
compactbooleanWith mode:file|symbol. true = omit line numbers to save tokens.
confidence_thresholdnumberWith mode:symbol. Min match confidence 0–1 (default 0.5). Raise 0.8 for exact; lower 0.3 to explore.
context_pathstringWith mode:symbol. File path hint for ranking (e.g. src/auth.ts when repo has many auth symbols).
detail_levelstringWith mode:symbol. signature=~100 tokens. body=full implementation (default). context=body+imports.
filesarrayWith mode:file|outline. Relative paths — from find_code hits. File mode: every path returns in one call (truncated per file if large, never dropped).
inline_filesobjectWhen path disk is unavailable: {"src/auth.ts": ""}. Hosted/private transport fallback.
kindstringWith mode:symbol. Filter to one symbol kind — disambiguate class vs method with same name.
limit_linesnumberWith mode:file. Max lines per file. Default: budget-based; set for pagination slices.
max_resultsnumbermode:symbol — max symbols (default 3, max 10). mode:scan|smell — max hits returned (default 30, max 100).
max_tokensnumberResponse size cap (default 2000, max 8000). File batch auto-shares across paths. Lower only if context is tight.
modestringsymbol=AST extract by name (default). file=batch read files[] (all paths return). outline=file TOC. scan=keyword/pattern hits across files[] (use target or targets). smell=bug-pattern pass on files[]…
offset_linenumberWith mode:file. Start line (1-indexed). Use after batch read when data.hint says truncated.
pathstringThe user's project folder. Local/stdio: omit to use editor cwd, or pass the absolute folder. Hosted with no disk: use inline_files. Pair files[] from find_code.
session_idstringDedup across turns — symbols already returned get a stub with symbol_id instead of full body.
symbol_idstringWith mode:symbol. Direct lookup ID from a prior hit (e.g. src/auth.ts::validateUser#function). Skips fuzzy search.
targetstringmode:symbol|callers|blast_radius — symbol name (fuzzy). mode:scan — keyword or regex to find across files[].
targetsarraymode:symbol — batch symbol names (max 8, set max_results:10). mode:scan — multiple keywords in one pass across files[].

No output schema declared.

No examples provided.

Zephex_dev_info ~289

Expert developer playbooks — not your repo. Stripe webhooks & checkout, Supabase RLS, Next.js auth (clerk, next-auth), payment flows, CSP/HSTS, deploy patterns. operation=search finds entries by question; operation=get returns full guidance by slug from search. Read summary and checklist first. 2 credits hosted. No project path. Call when standard patterns beat guessing — wiring stripe checkout, fixing auth middleware, Supabase RLS policies, hardening after audit_headers. Use AFTER repo tools if code context is still thin. NOT for user's codebase (get_project_context, find_code, read_code), registry packages (check_package), tests (check_test), live URL (audit_headers), or saving decisions (project_memory). Example: Zephex_dev_info({ operation: 'search', query: 'Stripe webhook raw body verification', category: 'payments' }) then get with returned slug. Read-only.

NameTypeReqDescription
categorystringOptional search filter — payments, auth, security, databases, etc.
operationstringsearch=find by query (first step); get=full entry by slug from search.
querystringRequired for search — e.g. 'Supabase RLS for multi-tenant' or 'Next.js middleware auth'.
slugstringRequired for get — exact slug from a search hit.

No output schema declared.

No examples provided.

Common questions

What is the Zephex MCP server?

Zephex is an MCP server listed in the public MCP registry as io.github.Tanbir404/zephex. MCP gateway with 10 tools for code analysis, architecture, package audit & security. This page covers its hosted endpoint (https://zephex.dev/mcp).

Is the Zephex MCP server safe to use?

Zephex scores 25 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the Zephex MCP server expose?

Zephex exposes 10 tools: audit_headers, check_package, check_test, explain_architecture, find_code, and 5 more. Their descriptions and schemas cost roughly 6,994 tokens of context every time the server is loaded.

Does the Zephex MCP server require authentication?

No. We connected to Zephex without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

Is the Zephex MCP server still maintained?

Zephex is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.