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.

C
Warning
73/100

crundi

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

⚡ Live Monitored: not connected

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

Is this your MCP?

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.

// key findings
🚨
Secret credentials may flow to a network call
2 flows detected: CRUNDI_API_KEY. We can’t prove the destination matches the brand the credential belongs to.
🚨
Code appears obfuscated
1 file are unreadable to a human reviewer. Cannot audit what they do.
⚠️
Known vulnerabilities in dependencies: 3 high
Affects packages this MCP installs at runtime. Upgrade or remove the affected dependency.
🔐
You'll be asked for 5 credentials: CLOUDFLARE_DNS_TOKEN, CLOUDFLARE_TUNNEL_TOKEN, CRUNDI_API_KEY, CRUNDI_TOTP_SECRET, TELEGRAM_BOT_TOKEN
These are read from process.env at runtime. Make sure you trust where they’ll be sent.
// tools this server exposes94 tools

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_user

Send 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_user

Send 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_user

Share a file with the user via a download link.

list_services

List all registered services and their status.

register_service

Register a new background service.

start_service

Start a registered service.

stop_service

Stop a running service.

restart_service

Restart a service.

request_owner_command

Outside 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_service

Delete a registered service.

get_service_logs

Get recent log output from a service.

enable_tunnel

Start a Cloudflare tunnel for a local port.

disable_tunnel

Stop a Cloudflare tunnel.

list_forwards

List port forwards (subdomain and path), with the domain and the available modes.

add_forward

Expose 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_forward

Remove a port forward by its host/name.

syntax_check

Run syntax/compile checks on files. Auto-detects language from extension.

browser_open

Open a hidden browser at a URL. Up to 5 per project. Requires Electron.

browser_close

Close a browser instance.

browser_navigate

Navigate a browser to a different URL.

browser_screenshot

Capture the browser viewport as a PNG image (returned for analysis).

browser_read_page

Get the page's cleaned HTML, title, URL, and recent console logs.

browser_view_source

Get the raw live HTML source of the page.

browser_go_back

Navigate back in browser history.

browser_go_forward

Navigate forward in browser history.

browser_click

Click an element by CSS selector.

browser_type

Type text, optionally into a specific element.

browser_fill

Fill an input field with a value (clears first).

browser_select

Select an option in a <select> element.

browser_eval

Run arbitrary JavaScript in the page and return the result.

browser_mouse

Send a mouse event (click/move) by coordinate.

browser_resize

Change the browser viewport size (max 1920x1080).

browser_scroll

Scroll the page or a specific element.

browser_wait

Wait for an element to appear in the page.

browser_console

Read (and optionally clear) captured console log entries.

browser_network

Record and inspect network calls. Actions: start, stop, log, clear.

browser_cookies

Get, set, or delete cookies.

browser_snapshot

Get an accessibility tree snapshot of the page.

browser_elements

List interactive elements on the page.

browser_pdf

Export the current page as a PDF.

browser_list

List all open browser instances.

list_windows

List all open windows across virtual desktops.

list_displays

List all connected displays/monitors.

capture_window

Capture a screenshot of a specific window (returned as image).

capture_display

Capture a screenshot of a display/monitor (returned as image).

send_window_screenshot_to_user

Capture a window screenshot and send it to the user via Telegram.

send_display_screenshot_to_user

Capture a display screenshot and send it to the user via Telegram.

spawn_terminal

Create a named terminal. Requires Electron.

terminal_input

Send commands/keystrokes to a named terminal.

terminal_output

Read buffered output from a named terminal.

terminal_wait

Block until a pattern appears in terminal output or timeout.

close_terminal

Kill a named terminal and remove it.

list_terminals

List all open named terminals with their status.

disconnect_rdp

Disconnect RDP session (keeps GUI alive for screenshots).

kanban_list

List 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_task

Get 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_column

List 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_task

Add a task card to the Kanban board.

kanban_update_task

Update a task's title, description, and/or status (move between columns).

kanban_move_task

Move/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_task

Soft-delete a task (recoverable — it moves to the trash, never truly removed).

kanban_restore_task

Restore a previously deleted task.

kanban_add_todo

Add a todo checklist item to a task.

kanban_update_todo

Update a todo's text and/or checked state.

kanban_delete_todo

Soft-delete a todo (recoverable).

kanban_restore_todo

Restore a previously deleted todo.

kanban_history

Get the full immutable change history for this project's Kanban board.

get_usage

Get 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_list

List 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_search

Find 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_subtree

Get 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_children

Get 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_ancestors

Get 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_node

Add 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_node

Update 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_note

Append one note to a mindmap node's notes list.

mindmap_remove_note

Remove the note at the given 0-based index from a mindmap node's notes list.

mindmap_move_node

Move/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_node

Link a mindmap node to a Kanban task, or to a specific subtask by also passing todoId.

mindmap_unlink_node

Remove a node's link to a Kanban task (the node stays as a free-standing idea).

mindmap_delete_node

Delete a node and all of its descendant nodes.

schedule_list

List 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_get

Get one scheduled task by id (must belong to this project).

schedule_add

Create 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_update

Update 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_enabled

Enable or disable a scheduled task (must belong to this project).

schedule_delete

Delete a scheduled task (must belong to this project).

media_list

List 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_get

Get one media item by id (must belong to this project), including its absolute on-disk `path`.

media_add_path

Attach 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_delete

Delete a media item by id (must belong to this project). Removes the stored file too.

secret_search

Search 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_get

Request 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_run

Run 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

// known CVEs in dependencies3 high10 low

Disclosed vulnerabilities in this server's declared npm dependencies (via OSV). Whether each is reachable depends on the installed versions.

highelectron@41.2.0GHSA-9f4c-93c8-jc8g

Electron: Sandboxed iframe can bypass the allow-popups restriction via the OpenURL navigation path

highelectron@41.2.0GHSA-h7rp-cf8h-j98x

Electron: Context isolation bypass via Function.prototype.bind hijack

highelectron@41.2.0GHSA-v3j7-r9gq-3gjw

Electron: Custom protocol with supportFetchAPI but not corsEnabled allows cross-origin reads

lowelectron@41.2.0GHSA-f2r8-jv7c-xqmp

Electron: DevTools embedder handler executes arbitrary files via shell open

lowelectron@41.2.0GHSA-ff2p-hmqr-hxm4

Electron: contextBridge object copy honors prototype setters

Depend on this server? Get alerted when its CVEs change.Watch this server free →
// environment variables
To run this server yourself, you supply these values. They go in your own MCP client configuration and stay on your machine. The secret label means the value is sensitive, not that the server mishandles it.
configALLOWED_USERNAMEYour Telegram username, no @ — the only allowed user
🔐 secretCLOUDFLARE_DNS_TOKEN
🔐 secretCLOUDFLARE_TUNNEL_TOKENNamed-tunnel token for a persistent domain
configCLOUDFLARE_TUNNEL_URLThe tunnel's public URL
configCOLLAB_WORKTREES_DIR
🔐 secretCRUNDI_API_KEY
configCRUNDI_API_URL
configCRUNDI_CHAT_ID
configCRUNDI_CHROME
configCRUNDI_DEV
configCRUNDI_PASSWORD_HASH
configCRUNDI_PROJECT
configCRUNDI_REPO
configCRUNDI_TERMINAL_ID
configCRUNDI_TOOL_SCOPE
🔐 secretCRUNDI_TOTP_SECRET
configCRUNDI_USERNAME
configDATA_DIROverride the data directory
configDEV_WEB_PORT
configDISABLE_TUNNEL
configDOTENV_PATH
configELECTRON_RUN
configFORWARD_DOMAIN
configFORWARD_SCHEME
configPROJECTS_DIRParent folder of projects (single-folder mode); leave empty for multi-folder mode
configSHELL
🔐 secretTELEGRAM_BOT_TOKENBot token from @BotFather (login validation + notifications)
configTLS_CERT_PATH
configTLS_DOMAIN
configTLS_EMAIL
configTLS_HTTP_PORT
configTLS_KEY_PATH
configTLS_MODE
configTLS_PORT
configTLS_STAGING
configTLS_WILDCARD
configWEB_PORTWeb UI port (0 = auto-assign)
configXDG_CONFIG_HOME
// quality suggestions

Tool 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.

// full audit trail
The findings above are the summary. The full trail, every check we ran, each deduction, the network hosts observed and the dependency advisories, goes to verified publishers, along with an alert whenever a new one lands. Verified publishers can also review each finding and dispute it in one click. Publisher corrections have sharpened several of our checks this month, because the maintainer knows the codebase better than any scanner.
// improvement guidance — verified publishers only
We have 7 concrete improvements we can share with the publisher of this MCP. Each comes with specific guidance to raise the trust score.
// embed badge in your README
[![M8ven Verified](https://m8ven.ai/badge/mcp/therealfaruhaan/crundi?variant=verified)](https://m8ven.ai/mcp/therealfaruhaan/crundi)
Shows verification status without the grade. Want the grade badge instead? Remove ?variant=verified from the URL.
commit: 57bceff7e9eac522f1e8a808b1e132b33ec60ef0
code hash: bc446df64c6e23fa3621435122bbbe8646eed4a19e151c8fec0a5e1486a87b3f
view raw JSON →
Check MCPs from inside your assistant
Tool Check · MCP

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
check_toolsearch_toolscompare_toolsrecommend_alternativescheck_publisherreport_concern
How to add it →Free · no account needed · works in any MCP client