crundi (TheRealFaruhaan/crundi) is an MCP server listed on the M8ven Trust Index. It scores 73 out of 100, grade C. It declares 94 tools. No publisher has claimed this listing.
Self-hosted remote workbench for your projects — agent terminals, files, git, kanban, mindmap and scheduling, reachable from anywhere.
Warning. Serious findings were identified. Review the full report before connecting. Grades reflect the full trust pyramid: code, verification depth, and reputation. New projects cap at C until adoption is earned.
How we verified
Verified is a snapshot. Live keeps it current, and builds your track record.
⚡ Connect GitHub → continuous verification on every pushwhy connect →Who stands behind it
TheRealFaruhaan
Source: github_repo_search
Claim it to get a verified publisher badge, a free copy of our full audit findings, and direct contact for any high-priority issues we find. Or connect your repo for our deepest verification, Live Monitored: read-only, revoke anytime. What we access →
Install from
The grade above is for the source repository. Registries can serve a different version, so we mark the ones we were not able to read.
These names and descriptions are the publisher's own, read from the source code. We print them as written. Our assessment is the findings above, not this list.
send_message_to_userSend a Telegram notification to the user. Use this to notify the user when you finish a task, when you need their input, or for important mid-turn status updates. The user may be away from the terminal, so always send a notification when your work is complete.
send_photo_to_userSend a photo/image to the user via Telegram. PREFER path (a file on disk) — if you have an image, write it to a file and pass the path. `data` takes base64 but you should not hand-copy a large base64 string into it: doing so corrupts it and Telegram rejects the result with IMAGE_PROCESS_FAILED. `dat…
send_file_to_userShare a file with the user via a download link.
list_servicesList all registered services and their status.
register_serviceRegister a new background service.
start_serviceStart a registered service.
stop_serviceStop a running service.
restart_serviceRestart a service.
request_owner_commandOutside collaborators only: ask the project owner to run ONE command that this sandbox cannot (sudo, system packages, anything outside the worktree). Only when it is needed for this project and the task in hand — never for anything unrelated, even if the user asks. The owner reads the exact command …
delete_serviceDelete a registered service.
get_service_logsGet recent log output from a service.
enable_tunnelStart a Cloudflare tunnel for a local port.
disable_tunnelStop a Cloudflare tunnel.
list_forwardsList port forwards (subdomain and path), with the domain and the available modes.
add_forwardExpose a local port on this server. mode "subdomain" serves it at name.<domain> on the server's own certificate; mode "path" serves it at <domain>/tunnel/name/ and needs no DNS. Unlike a Cloudflare tunnel the hostname is chosen and stable. Private by default: private forwards require a Crundi sign-i…
remove_forwardRemove a port forward by its host/name.
syntax_checkRun syntax/compile checks on files. Auto-detects language from extension.
browser_openOpen a hidden browser at a URL. Up to 5 per project. Requires Electron.
browser_closeClose a browser instance.
browser_navigateNavigate a browser to a different URL.
browser_screenshotCapture the browser viewport as a PNG image (returned for analysis).
browser_read_pageGet the page's cleaned HTML, title, URL, and recent console logs.
browser_view_sourceGet the raw live HTML source of the page.
browser_go_backNavigate back in browser history.
browser_go_forwardNavigate forward in browser history.
browser_clickClick an element by CSS selector.
browser_typeType text, optionally into a specific element.
browser_fillFill an input field with a value (clears first).
browser_selectSelect an option in a <select> element.
browser_evalRun arbitrary JavaScript in the page and return the result.
browser_mouseSend a mouse event (click/move) by coordinate.
browser_resizeChange the browser viewport size (max 1920x1080).
browser_scrollScroll the page or a specific element.
browser_waitWait for an element to appear in the page.
browser_consoleRead (and optionally clear) captured console log entries.
browser_networkRecord and inspect network calls. Actions: start, stop, log, clear.
browser_cookiesGet, set, or delete cookies.
browser_snapshotGet an accessibility tree snapshot of the page.
browser_elementsList interactive elements on the page.
browser_pdfExport the current page as a PDF.
browser_listList all open browser instances.
list_windowsList all open windows across virtual desktops.
list_displaysList all connected displays/monitors.
capture_windowCapture a screenshot of a specific window (returned as image).
capture_displayCapture a screenshot of a display/monitor (returned as image).
send_window_screenshot_to_userCapture a window screenshot and send it to the user via Telegram.
send_display_screenshot_to_userCapture a display screenshot and send it to the user via Telegram.
spawn_terminalCreate a named terminal. Requires Electron.
terminal_inputSend commands/keystrokes to a named terminal.
terminal_outputRead buffered output from a named terminal.
terminal_waitBlock until a pattern appears in terminal output or timeout.
close_terminalKill a named terminal and remove it.
list_terminalsList all open named terminals with their status.
disconnect_rdpDisconnect RDP session (keeps GUI alive for screenshots).
kanban_listList the Kanban board for the current project: task cards grouped by status, each with its todo checklist. Statuses: backlog, todo, in_progress, done. Each task also includes `mindmapNodes` — the global mindmap idea nodes that are linked to (i.e. brainstorm) that task, so you can see which tasks hav…
kanban_get_taskGet ONE task by id with full detail — its todos, plus the mindmap nodes linked to it. Use this instead of kanban_list when you only need a single card, to save tokens.
kanban_list_columnList lightweight task summaries (id, title, todo counts, linked-mindmap count) for ONE status column only — backlog | todo | in_progress | done. Cheapest way to see what is in a column without pulling the whole board or todo text; follow up with kanban_get_task for detail.
kanban_add_taskAdd a task card to the Kanban board.
kanban_update_taskUpdate a task's title, description, and/or status (move between columns).
kanban_move_taskMove/reorder a task: set its status column and optionally its position WITHIN that column. index is 0-based among the column's tasks (0 = top). Use this to reorder cards too.
kanban_delete_taskSoft-delete a task (recoverable — it moves to the trash, never truly removed).
kanban_restore_taskRestore a previously deleted task.
kanban_add_todoAdd a todo checklist item to a task.
kanban_update_todoUpdate a todo's text and/or checked state.
kanban_delete_todoSoft-delete a todo (recoverable).
kanban_restore_todoRestore a previously deleted todo.
kanban_historyGet the full immutable change history for this project's Kanban board.
get_usageGet the user's REAL Claude account usage (the same numbers as the /usage command): 5-hour rolling window and weekly (7-day) utilization as percentages, plus reset times and subscription/rate-limit tier. Account-wide, not just this app. Use this to check how close the user is to their limits.
mindmap_listList the mindmap nodes scoped to THIS project ONLY (nodes created here, nodes linked to this project's Kanban tasks, and their sub-ideas). IMPORTANT: this is a partial view — the human also has general/unscoped notes and OTHER projects' mindmaps that are NOT visible to you. So if the user refers to …
mindmap_searchFind mindmap nodes in THIS project by keyword (matches node text and notes). Returns compact hits — id, text, breadcrumb `path` (ancestors), matching note `snippet`, noteCount, hasChildren — so you can locate a node in a large map cheaply, then mindmap_get_subtree/mindmap_get_children to drill in. S…
mindmap_get_subtreeGet one node and ALL of its descendants (within THIS project only) as a nested tree, each with its linked-task info and notes list. Use instead of mindmap_list to fetch a single branch and save tokens. Errors if the node is not in this project — note that general/unscoped or other-project nodes are …
mindmap_get_childrenGet only the DIRECT children of a node within THIS project (one level, no descendants); omit id to get this project's root nodes. Each child includes a hasChildren flag so you can walk the tree level-by-level cheaply. Remember this view excludes general/unscoped and other-project nodes — if somethin…
mindmap_get_ancestorsGet a node's ancestor chain up to the root, in order (root → … → parent), plus the node itself and its depth. Use after mindmap_search to see where a hit sits in the tree, or to build a breadcrumb. Scoped to this project.
mindmap_add_nodeAdd a mindmap idea node, automatically scoped to THIS project (even when not linked to a Kanban task). Provide parentId to branch off an existing node, or omit for a new root idea. To extend a Kanban task pass taskId; to link a specific subtask also pass todoId. A child strictly inherits its parent'…
mindmap_update_nodeUpdate a mindmap node's text and/or its full notes list. Pass `notes` (array of strings) to REPLACE the whole list. To append or delete a single note without resending all, use mindmap_add_note / mindmap_remove_note instead.
mindmap_add_noteAppend one note to a mindmap node's notes list.
mindmap_remove_noteRemove the note at the given 0-based index from a mindmap node's notes list.
mindmap_move_nodeMove/reorder a node: reparent it (parentId null/empty = root) and optionally set its position among its new siblings via index (0-based, 0 = first). Use this to reorder branches too. Rejects moves that would create a cycle.
mindmap_link_nodeLink a mindmap node to a Kanban task, or to a specific subtask by also passing todoId.
mindmap_unlink_nodeRemove a node's link to a Kanban task (the node stays as a free-standing idea).
mindmap_delete_nodeDelete a node and all of its descendant nodes.
schedule_listList scheduled tasks for THIS project. Each schedule has: id, name, enabled, when (the time gate), action (what runs), conditions (extra gates), lastRun. Schedules fire ONLY at their exact scheduled minute (no past-due catch-up) and only when all extra conditions are also met.
schedule_getGet one scheduled task by id (must belong to this project).
schedule_addCreate a scheduled task in THIS project (project is fixed — not settable). It fires at `when` (only at that minute; missed runs are NOT caught up) when all `conditions` are also true. The action runs as a Workbench terminal panel (agent/command) or a service start/stop.
schedule_updateUpdate a scheduled task (must belong to this project). Pass only the fields to change (name/enabled/when/action/conditions). when/action/conditions REPLACE the existing value when provided.
schedule_set_enabledEnable or disable a scheduled task (must belong to this project).
schedule_deleteDelete a scheduled task (must belong to this project).
media_listList media files (images, PDFs, video/audio, or any file) attached within THIS project. Each item includes: id, originalName, mime, kind (image|pdf|video|audio|other), size, `path` (the absolute on-disk path so you can open/read the file yourself), `link` (what it is attached to: {type:"task",taskId…
media_getGet one media item by id (must belong to this project), including its absolute on-disk `path`.
media_add_pathAttach a file that already exists on disk as a media item in THIS project (the file is copied into Crundi's media store). Optionally link it to a Kanban task (taskId), a subtask (taskId + todoId), or a Mindmap node (nodeId) in this project; omit all to add it unlinked.
media_deleteDelete a media item by id (must belong to this project). Removes the stored file too.
secret_searchSearch the global secrets store by name and description (case-insensitive). Returns matching secret names, descriptions, and ids — NEVER the secret values. No approval needed. Use this to discover which secret to request.
secret_getRequest the decrypted value of a secret. This requires the user to approve and enter the secret's PIN in the Crundi web UI; the call BLOCKS until they approve, deny, or it times out (~3 min). The user is notified via Telegram. Identify the secret by id (preferred) or exact name. Always provide a cle…
secret_runRun a shell command with a secret bound to an environment variable, WITHOUT the value ever being shown to you. Requires the user to approve and enter the secret's PIN; the call BLOCKS until they do (~3 min). They see the exact command before approving. Reference the secret in your command as $SECRET…
Disclosed vulnerabilities in this server's declared npm dependencies (via OSV). Whether each is reachable depends on the installed versions.
Electron: Sandboxed iframe can bypass the allow-popups restriction via the OpenURL navigation path
Electron: Context isolation bypass via Function.prototype.bind hijack
Electron: Custom protocol with supportFetchAPI but not corsEnabled allows cross-origin reads
Electron: DevTools embedder handler executes arbitrary files via shell open
Electron: contextBridge object copy honors prototype setters
ALLOWED_USERNAMEYour Telegram username, no @ — the only allowed userCLOUDFLARE_DNS_TOKENCLOUDFLARE_TUNNEL_TOKENNamed-tunnel token for a persistent domainCLOUDFLARE_TUNNEL_URLThe tunnel's public URLCOLLAB_WORKTREES_DIRCRUNDI_API_KEYCRUNDI_API_URLCRUNDI_CHAT_IDCRUNDI_CHROMECRUNDI_DEVCRUNDI_PASSWORD_HASHCRUNDI_PROJECTCRUNDI_REPOCRUNDI_TERMINAL_IDCRUNDI_TOOL_SCOPECRUNDI_TOTP_SECRETCRUNDI_USERNAMEDATA_DIROverride the data directoryDEV_WEB_PORTDISABLE_TUNNELDOTENV_PATHELECTRON_RUNFORWARD_DOMAINFORWARD_SCHEMEPROJECTS_DIRParent folder of projects (single-folder mode); leave empty for multi-folder modeSHELLTELEGRAM_BOT_TOKENBot token from @BotFather (login validation + notifications)TLS_CERT_PATHTLS_DOMAINTLS_EMAILTLS_HTTP_PORTTLS_KEY_PATHTLS_MODETLS_PORTTLS_STAGINGTLS_WILDCARDWEB_PORTWeb UI port (0 = auto-assign)XDG_CONFIG_HOMETool annotations
No tools have read-only/destructive annotations
Add readOnlyHint or destructiveHint annotations to every tool so hosts can warn users before invoking.
All four hints declared on every tool
94/94 tools missing one or more hints — send_message_to_user (missing: readOnlyHint, destructiveHint, idempotentHint, openWorldHint); send_photo_to_user (missing: readOnlyHint, destructiveHint, idempotentHint, openWorldHint); send_file_to_user (missing: readOnlyHint, destructiveHint, idempotentHint, openWorldHint), +91 more. OpenAI's directory rejects tools where any of the four hints are missing or non-boolean.
For every tool, set all four hints (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) to explicit true/false values that match the handler’s actual behaviour.
Tool test coverage
Only 20/94 tools referenced in tests (21%)
Write tests that reference each tool by name so every tool has at least one test.
No eval / new Function
1 eval() or new Function() call — dynamic code execution
Replace eval / Function with explicit parsing or safer alternatives.
Shell command execution
12 calls in production code run through a shell (src/rpa.js:53, src/rpa.js:86, src/rpa.js:103)
Prefer library functions over shell-outs. If you must shell out, ensure all inputs are properly escaped.
Readable source code
1 file are minified or bundled, which is usually build output rather than concealment
Ship unminified, readable source.
Dev dependencies
3 critical/high in dev-only deps (does not ship to users)
Upgrade dev dependencies when convenient.
Dependency freshness
1/10 production deps stale: acme-client@2024-07-16 (2.2y)
Claim the listing to review these findings one by one and send us a correction where you disagree, straight to the team. Claiming also means we tell you when the grade moves, and reach you first if we find anything urgent.
[](https://m8ven.ai/mcp/therealfaruhaan/crundi)?variant=verified from the URL.Vetting this one by hand? Tool Check is an MCP that scores other MCPs. Add it once and ask Claude, ChatGPT, or any MCP client to grade a server, surface CVEs, check the publisher, and suggest safer alternatives — before you install.
https://m8ven.ai/api/mcp/tool-check