Zephex
REMOTE · ZEPHEX.DEV · SCANNED SEP 20
MCP gateway with 10 tools for code analysis, architecture, package audit & security.
Available components
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
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation not fully verified: no authorisation is required to connect, but we couldn't read the tool list to see what that exposes. View diagnostics → Unverified
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
Transport & Reachability0
- Transport check failed: declared streamable-http, but the endpoint returned HTTP 404. See how to fix → View diagnostics → Fail
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.
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
claude mcp add --transport http tanbir404-zephex 'https://zephex.dev/mcp'
{
"mcpServers": {
"tanbir404-zephex": {
"url": "https://zephex.dev/mcp"
}
}
} {
"servers": {
"tanbir404-zephex": {
"type": "http",
"url": "https://zephex.dev/mcp"
}
}
} [mcp_servers.tanbir404-zephex] url = "https://zephex.dev/mcp"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"tanbir404-zephex": {
"type": "remote",
"url": "https://zephex.dev/mcp",
"enabled": true
}
}
} openclaw mcp add tanbir404-zephex --url 'https://zephex.dev/mcp' --transport streamable-http
mcp_servers:
tanbir404-zephex:
url: "https://zephex.dev/mcp" {
"McpServers": {
"tanbir404-zephex": {
"Transport": "http",
"Url": "https://zephex.dev/mcp"
}
}
} assistant mcp add tanbir404-zephex -t streamable-http -u 'https://zephex.dev/mcp'
{
"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.
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
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 |
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 →
audit_headers Audit HTTP 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.
| Name | Type | Req | Description |
|---|---|---|---|
| check_apis | boolean | – | Probe /api/health and common API paths — adds ~1-2s (default: false) |
| check_cookies | boolean | – | Check cookie Secure/HttpOnly/SameSite flags (default: true) |
| check_headers | boolean | – | Grade all security headers and return fix snippets when include_fix_snippets=true (default: true) |
| check_health | boolean | – | Site health: verdict, trust score, load time, page title (default: true) |
| check_network | boolean | – | HTTP network timing table — slow requests, API probes (default: true) |
| check_redirects | boolean | – | Follow and audit the full redirect chain (default: true) |
| check_secrets | boolean | – | Secret scan: HTML/JS keys, exposed .env/.git, GraphQL (default: true; depth via scan_depth) |
| check_ssl | boolean | – | Check SSL certificate validity, expiry, and protocol (default: true) |
| check_tech | boolean | – | Tech stack: framework, hosting, CDN, third-party (default: true) |
| focus | string | – | Trim output layers (default: all) |
| include_fix_snippets | boolean | – | Include Nginx/Vercel/Next fix snippets — token-heavy (default: false) |
| path | string | – | Optional subpath (e.g. /checkout) — appended to url |
| probe_engine | string | – | fetch=HTTP only (default); browser=headless Chrome on Zephex servers for console errors + browser network (falls back to fetch with warning if unavailable) |
| scan_depth | string | – | quick=light scan, 3 bundles (default); deep=full supply URL phase with JWT decode, source maps, verification (~8-12s) |
| scan_mode | string | – | quick=~1-3s (default); thorough=DNS+APIs+secrets ~5-12s |
| security_depth | string | – | basic=fast (default); full adds DNS SPF/DMARC/DKIM + HSTS preload lookup |
| timeout_ms | number | – | Max scan time in ms (default: 8000, max: 15000) |
| url | string | yes | Public https:// URL to audit — e.g. https://myapp.vercel.app or https://zephex.dev |
No output schema declared.
No examples provided.
check_package 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.
| Name | Type | Req | Description |
|---|---|---|---|
| channel | string | – | INTERNAL: Zephex terminal CLI only. Agents must omit — returns richer fields than agent-safe JSON. |
| cli_depth | string | – | INTERNAL: CLI terminal depth. Agents must omit. |
| ecosystem | string | – | Registry (default npm, auto-detected). Omit for next/stripe/prisma. |
| from_version | string | – | Version being changed from. Pass for task=upgrade|migrate|debug so release notes and advisories are version-specific. |
| package | string | yes | Package name on the public registry — e.g. next, stripe, prisma, express, @supabase/supabase-js. |
| source | string | – | Optional. local = read pinned version from disk (stdio only). Prefer passing version/from_version directly. |
| task | string | – | One goal per call: check=safe to add; security=CVEs for version; upgrade=version bump plan; migrate=major-version migration; debug=version-specific release clues. |
| version | string | – | Installed 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 Test Pulse ~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: "" }).
| Name | Type | Req | Description |
|---|---|---|---|
| area | string | – | Scope to module/area name derived from test paths (e.g. proxy, auth, handlers) |
| command | string | – | Override auto-detected test command |
| coverage_top | number | – | Max files in coverage slice |
| detail_level | string | – | Token budget: brief <500 tokens on PASS; agent default; full=all slices |
| diff_base | string | – | Git branch for patch coverage and failures_in_diff (e.g. main) — use after edits |
| failed_only | boolean | – | Re-run only tests that failed in the prior session |
| file_filter | string | – | Substring or glob fragment to filter test_files (e.g. auth, handlers) |
| include_flaky | boolean | – | Include flaky test hints from local history |
| include_missing | boolean | – | Git-diff scan for source files without matching tests (default true on detect and when diff_base set) |
| inline_files | object | – | Hosted 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. |
| limit | number | – | Max rows for task:history (1–20) |
| path | string | – | Project 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/… |
| question | string | – | Natural-language follow-up for task:why (e.g. "what failed in proxy?") |
| session_id | string | – | From 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. |
| task | string | – | run = 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_ms | number | – | Max run time ms (default 1800000 stdio, capped 600000 hosted) |
| with_coverage | boolean | – | Collect lcov coverage (default true) |
No output schema declared.
No examples provided.
explain_architecture 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" }).
| Name | Type | Req | Description |
|---|---|---|---|
| concern | string | – | Any 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_level | string | – | Legacy alias for verbosity |
| exclude | array | – | Optional glob patterns to exclude from ripgrep (vendor, build, etc.). |
| focus | string | – | Wiring slice. Default: api. auth=validation chain, integrations=external SDK touchpoints, database=ORM, security=auth+errors, full=all analyzers. |
| force | boolean | – | Bypass architecture result cache. Default false. |
| inline_files | object | – | Fallback for remote transports. Shape: { "": "" }. Include 10-50 SOURCE files (entry points, routes, middleware, auth, DB setup) plus package.json. For local stdio, prefer 'path'. |
| mode | string | – | overview=fast wiring map (no AST flow trace), deep=request_flows + sequenceDiagram, audit=anti_patterns + health_score. Default: overview |
| path | string | – | The 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_path | string | – | Alias for 'path' (some clients pass this name). Accepts the same values. |
| seed_files | array | – | 1–20 paths from find_code — graph expands to related modules. Use with or without concern. |
| subpath | string | – | Monorepo scope — analyze only this subdirectory (e.g. apps/api). Faster than whole repo. |
| verbosity | string | – | Output size. minimal=core only, standard=default, full=adds constraints + state_management. Alias: detail_level |
No output schema declared.
No examples provided.
find_code 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.
| Name | Type | Req | Description |
|---|---|---|---|
| also_try | array | – | Extra keywords merged in parallel. concept=topic synonyms. everywhere=rename variants (crystal, CRYSTAL, crystal-app). |
| case_sensitive | boolean | – | true = match exact casing (Crystal vs crystal). Default false. |
| file_pattern | string | – | Custom glob; overrides include. Examples: src/**/*.ts, **/*.md. |
| include | string | – | Limit file types. code=src. docs=md/readme. config=json/yaml. data=sql/prisma. all=default. |
| inline_files | object | – | Hosted MCP only: {"path/to/file.ts": "file contents"}. Use when path disk is unavailable. |
| intent | string | – | Search mode. snippet=paste exact line. symbol=find definition. concept=topic hunt. everywhere=all hits before rename. |
| path | string | – | The user's project folder. Local/stdio: omit to use editor cwd, or pass the absolute folder. Hosted: public GitHub URL or inline_files. |
| query | string | yes | Required. Text to find: pasted editor line, symbol name (validateToken), or topic keyword (encrypt). |
| response_format | string | – | concise=line preview per hit. detailed=full function/class block when AST available. |
| whole_word | boolean | – | With intent everywhere. true = whole word only (Crystal not Crystalline). Use before renames. |
No output schema declared.
No examples provided.
get_project_context Project Stack & Scripts ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| detail_level | string | – | Output tier: "brief" (default, ≤500 tokens), "standard" (full fields), "full" (all fields + file tree) |
| focus_on | string | – | Subdirectory to focus the file tree scan on (e.g. 'src/tools') |
| force | boolean | – | Set true to re-detect even if cached (use when project changed) |
| include_structure | boolean | – | When true, includes file tree in response (also triggered by detail_level: full) |
| inline_files | object | – | Primary 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\":{...}… |
| path | string | – | The 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_depth | number | – | Max folder depth for file tree scan (default: 3, max: 6) |
| topic | string | – | Which 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 Structured Reasoning ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| actionReady | boolean | – | true when done planning and about to execute edits. |
| area | string | – | Subsystem (auth, billing, api) — scopes project_memory recall. |
| assumptions | array | – | Up to 5 assumptions; set invalidated:true when contradicted. |
| confidence | number | yes | 0–1. Below 0.5 forces revision. Above 0.85 safe to proceed. |
| goalAnchor | string | – | One sentence restating the task — required after thought 2. |
| lastActions | array | – | Last 2–5 tool calls as name(arg=val) — identical pair triggers boredLoopDetected. |
| nextThoughtNeeded | boolean | yes | false ends session and writes checkpoint. |
| projectPath | string | – | Local project root (stdio defaults to cwd) for projectBrief. |
| revises | integer | – | Thought number this revision replaces. |
| sessionId | string | – | Resume prior session; restores checkpoint on thought 1. |
| thought | string | yes | Reasoning (20–2000 chars) — file names, symbols, error messages. |
| thoughtNumber | integer | yes | 1-based thought index in this session. |
| thoughtType | string | yes | hypothesis|debug for investigation; plan|conclusion before acting. |
| toolOutputRelevance | string | – | Classify last tool result — 3+ noise/error in last 5 triggers loop. |
| totalThoughts | integer | yes | Estimated thoughts needed (revise upward if needed). |
No output schema declared.
No examples provided.
project_memory 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 }).
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | remember=save a note, recall=search notes and return full content, list=recent notes with preview, forget=delete by id |
| area | string | – | Subsystem label (auth, billing, deploy) — included in search index for scoped recall. Max 64 chars. |
| content | string | – | Required for remember. Up to 12000 characters (~2000 words). Write the why and the trap — not a one-liner. |
| id | string | – | Required for forget. Memory uuid. |
| limit | number | – | recall/list cap. Default 10, max 20. |
| path | string | – | Folder 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). |
| query | string | – | Required for recall. Short keywords from the title or topic (e.g. auth middleware stripe). |
| scope | string | – | project=this folder only (default). personal=notes that apply everywhere. all=every project — only when they ask to search everything. |
| tags | array | – | Optional lowercase tags. Max 10. |
| title | string | – | Required for remember. Max 80 chars. |
| type | string | – | Required 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_by | string | – | Who authored this memory. |
No output schema declared.
No examples provided.
read_code 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.
| Name | Type | Req | Description |
|---|---|---|---|
| compact | boolean | – | With mode:file|symbol. true = omit line numbers to save tokens. |
| confidence_threshold | number | – | With mode:symbol. Min match confidence 0–1 (default 0.5). Raise 0.8 for exact; lower 0.3 to explore. |
| context_path | string | – | With mode:symbol. File path hint for ranking (e.g. src/auth.ts when repo has many auth symbols). |
| detail_level | string | – | With mode:symbol. signature=~100 tokens. body=full implementation (default). context=body+imports. |
| files | array | – | With 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_files | object | – | When path disk is unavailable: {"src/auth.ts": ""}. Hosted/private transport fallback. |
| kind | string | – | With mode:symbol. Filter to one symbol kind — disambiguate class vs method with same name. |
| limit_lines | number | – | With mode:file. Max lines per file. Default: budget-based; set for pagination slices. |
| max_results | number | – | mode:symbol — max symbols (default 3, max 10). mode:scan|smell — max hits returned (default 30, max 100). |
| max_tokens | number | – | Response size cap (default 2000, max 8000). File batch auto-shares across paths. Lower only if context is tight. |
| mode | string | – | symbol=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_line | number | – | With mode:file. Start line (1-indexed). Use after batch read when data.hint says truncated. |
| path | string | – | The 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_id | string | – | Dedup across turns — symbols already returned get a stub with symbol_id instead of full body. |
| symbol_id | string | – | With mode:symbol. Direct lookup ID from a prior hit (e.g. src/auth.ts::validateUser#function). Skips fuzzy search. |
| target | string | – | mode:symbol|callers|blast_radius — symbol name (fuzzy). mode:scan — keyword or regex to find across files[]. |
| targets | array | – | mode: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 Zephex Developer Knowledge Base ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| category | string | – | Optional search filter — payments, auth, security, databases, etc. |
| operation | string | – | search=find by query (first step); get=full entry by slug from search. |
| query | string | – | Required for search — e.g. 'Supabase RLS for multi-tenant' or 'Next.js middleware auth'. |
| slug | string | – | Required for get — exact slug from a search hit. |
No output schema declared.
No examples provided.
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.