Atlas / MCP servers / michaelzelbel / menerio

menerioBLOCK

mcp/michaelzelbel/menerio

One brain for all your AI tools. Capture your thoughts once, and every AI can understand, use, and build on them.

Verdict
BLOCK
Grade
F
Trust score
41 /100
Exposed tools
86 61r · 24w · 1d
Transport
streamable-http
License
AGPL-3.0
Stars
2
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

What it is

Menerio is a central event store for personal data.

Project status: Alpha Menerio is usable but still evolving. APIs, data structures, and UI may change without notice. Some features are partially implemented or experimental. We recommend it for early adopters and contributors who are comfortable with rough edges.

It connects multiple apps into a single system by capturing and distributing events. Instead of isolated tools with their own data silos, Menerio acts as the backbone that keeps everything in sync.

Each connected app remains the owner of its data, while Menerio ensures that relevant changes are shared across the system.

Why it exists

Most apps today operate in isolation. Data is fragmented, duplicated, and quickly becomes inconsistent.

Menerio solves this by introducing a simple principle:

  • Every record has one clear owner
  • All changes are emitted as events
  • All connected apps stay in sync through a central event bus

This enables a system where:

  • Data remains consistent across apps
  • Ownership is always clear
  • Integrations become simple and scalable

The goal is not to replace apps, but to connect them into a coherent system.

Core Concepts

Single Source of Truth

Each piece of data belongs to exactly one app. Other apps receive synchronized copies but never become the source of truth.

Event-Based Architecture

All changes are emitted as events (e.g. event.created, event.updated). Menerio stores and distributes these events to subscribed apps.

Star Model (one center, many spokes)

Apps do not communicate directly with each other. All communication flows through Menerio as the center.

Synchronization with Ownership

Changes made in one app propagate back to the owning app through Menerio, ensuring consistency without conflicts.

Features (Current State)

  • Central event ingestion and storage
  • Event distribution to connected applications
  • Basic data synchronization model
  • Supabase-bac
Read from source at commit 4261e76bd2c6OBSERVED · 2026-10-11
Advertisement
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add vite_react_shadcn_ts --env SUPABASE_ACCESS_TOKEN=${SUPABASE_ACCESS_TOKEN} --env SUPABASE_ANON_KEY=${SUPABASE_ANON_KEY} --env SUPABASE_SERVICE_ROLE_KEY=${SUPABASE_SERVICE_ROLE_KEY} -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "vite_react_shadcn_ts": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ],
      "env": {
        "SUPABASE_ACCESS_TOKEN": "${SUPABASE_ACCESS_TOKEN}",
        "SUPABASE_ANON_KEY": "${SUPABASE_ANON_KEY}",
        "SUPABASE_SERVICE_ROLE_KEY": "${SUPABASE_SERVICE_ROLE_KEY}"
      }
    }
  }
}
03

Exposed tools (86)

61 read · 24 write · 1 destructive. Blast radius: 1 tool can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.

ToolRiskDescription
DiscordreadCapture notes via /capture slash command
QuerinoreadAI research assistant. Syncs artefacts as notes to ${BRAND.name}.
SlackwriteSend Slack messages straight to ${BRAND.name}
TelegramreadCapture notes via Telegram bot
add_claimwrite
add_collection_itemwrite
add_group_memberwrite
add_members_from_noteswrite
add_wikilinkwriteCreate a wikilink connection from the current note to another note by its ID.
append_to_notereadAppend markdown text to the END of the current note. Existing content is never touched. If the same text is already in the note, nothing is written.
capturereadCapture a thought to your Menerio brain
capture_noteread
capture_thoughtread
classify_contentreadClassify whether content violates community guidelines
create_collection_itemwriteCreate a new item in the current collection.
create_entitywrite
create_groupwrite
create_group_next_stepwrite
create_momentwrite
create_moment_rawwrite
create_moment_with_aiwrite
create_notewriteCreate a NEW note in the user
delete_collection_itemdestructiveDelete a collection item by id. Use sparingly and confirm intent with the user first.
draft_momentreadReturn a structured timeline moment draft based on the user
extract_eventreadExtract a timeline event from the note content for use in a timeline app.
extract_item_from_urlreadFetch a URL and use it to draft a new collection item that matches the current collection
find_pathread
generate_group_briefingread
get_action_itemsread
get_claimsread
get_clustersread
get_collection_itemreadFetch one item by its id. Returns the full data object.
get_collection_schemaread
get_connected_notesread
get_contact_contextread
get_contact_profileread
get_entity_contextread
get_groupread
get_noteread
get_note_mediaread
get_person_notesread
get_person_profilereadLook up a person from the user
get_statsread
get_user_profileread
import_group_members_from_notewrite
insert_into_notewriteInsert markdown text at a precise location in the current note without removing anything. Either give
lexicon_create_pagewrite
lexicon_get_pageread
lexicon_run_lintwrite
lexicon_searchread
lexicon_update_pagewrite
list_collection_itemsreadList items in the current collection. Returns up to 30 rows with id, title, and data.
list_collectionsread
list_groupsread
list_momentsread
list_note_foldersreadList the folders that already exist in the user
list_peopleread
list_recentread
list_recent_notesread
log_group_interactionread
log_interactionread
preview_group_members_from_noteread
read_urlreadFetch one public web page and return its readable text. Use this when the user gives you a link and wants it read, summarized, or saved as a note. For a general question with no specific link, use web_search instead. Cannot read pages that need a login, and cannot read YouTube captions.
replace_in_notereadReplace an exact snippet of the current note with new text.
review_group_member_suggestionread
search_all_collectionsread
search_brainread
search_claimsreadSearch the user
search_contactsread
search_entitiesread
search_imagesread
search_media_textreadSearch across OCR-extracted text and descriptions from images and PDFs in ALL of the user
search_momentsread
search_notesread
search_notes_semanticreadSearch the user
search_notes_textreadSearch the user
search_thoughtsread
suggest_group_next_stepread
thoughtreadThe thought or note to capture
trash_noteread
update_collection_itemwriteUpdate fields on an existing item. Only the keys in
update_group_membershipwrite
update_notewrite
update_note_metadatawriteUpdate metadata fields on the current note (topics, type, sentiment, people, summary, etc.).
update_note_tagswriteSet the tags on the current note (replaces existing tags).
web_searchreadSearch the live web for current information the user
04

Trust audit

BLOCKgrade F · trust 41/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryWARN
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)WARN
L3Class-specific surfaceWARN
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (1 observation(s))
Network
declared (11 observation(s))
Shell
declared (1 observation(s))
Dependencies
not all pinned
Secrets in source
found

Findings (25)

HIGHNetwork egress · net.metadata_ip · CWE-200, CWE-319
src/components/settings/AppIntegrations.tsx:98
if (h === "metadata.google.internal" || h === "instance-data") return false;
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
MEDIUMInventory / provenance · inv.binary · CWE-1104
src-tauri/icons/icon.icns
icon.icns
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMNetwork egress · net.beacon_words · CWE-200, CWE-319
supabase/functions/send-patch/index.ts:108
callback_url: callbackUrl,
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
scripts/contact-topics-browser.mjs:12
await server.listen();console.log('Synthetic PersonDetail browser harness http://127.0.0.1:5179');
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
scripts/contact-topics-test-server.mjs:26
globalThis.Deno = { env: { get: key => ({ SUPABASE_URL: `http://127.0.0.1:${port}`, SUPABASE_SERVICE_ROLE_KEY: 'synthetic-service', OPENROUTER_API_KEY: 'unused-synthetic' })[key] }, serve: fn => { edg
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
.github/workflows/ci.yml:57
MERGE_TEST_DATABASE_URL: postgresql://postgres:postgres@localhost/merge_review_test
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
.github/workflows/ci.yml:58
GODSPEED_RATE_LIMIT_TEST_DATABASE_URL: postgresql://postgres:postgres@localhost/godspeed_rate_limit_test
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
.github/workflows/ci.yml:59
GODSPEED_CONNECT_TEST_DATABASE_URL: postgresql://postgres:postgres@localhost/godspeed_connect_test
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
.github/workflows/ci.yml:60
NOTE_AI_NORMALIZE_TEST_DATABASE_URL: postgresql://postgres:postgres@localhost/note_ai_normalize_test
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
supabase/functions/_shared/__tests__/fact-store.test.ts:159
const secret = "Top-secret-diagnosis";
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
supabase/functions/telegram-capture/__tests__/handler.test.ts:14
const SECRET = "0123456789abcdef0123456789abcdef";
MEDIUMPrompt injection · prompt.hidden_style · CWE-94, CWE-1427
docs/auth-email-templates.md:64
<table width="100%" cellpadding="0" cellspacing="0" style="max-width:480px;background-color:#ffffff;border-radius:16px;overflow:hidden;box-shadow:0 1px 3px rgba(226,54,112,0.12);">
MEDIUMPrompt injection · prompt.hidden_style · CWE-94, CWE-1427
docs/auth-email-templates.md:81
<a href="{{ .ConfirmationURL }}" target="_blank" style="display:inline-block;padding:12px 32px;background-color:#e23670;color:#ffffff;font-size:15px;font-weight:600;text-decoration:none;border-radius:
MEDIUMPrompt injection · prompt.hidden_style · CWE-94, CWE-1427
docs/auth-email-templates.md:119
<table width="100%" cellpadding="0" cellspacing="0" style="max-width:480px;background-color:#ffffff;border-radius:12px;overflow:hidden;box-shadow:0 1px 3px rgba(0,0,0,0.08);">
MEDIUMPrompt injection · prompt.hidden_style · CWE-94, CWE-1427
docs/auth-email-templates.md:136
<a href="{{ .ConfirmationURL }}" target="_blank" style="display:inline-block;padding:12px 32px;background-color:#18181b;color:#ffffff;font-size:15px;font-weight:600;text-decoration:none;border-radius:
MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
delete_collection_item
Why it matters. 1 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
supabase/functions/_shared/__tests__/connections-and-group-ai.test.ts:12
return new Function("exports", ...Object.keys(bindings), code)({}, ...Object.values(bindings));
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
supabase/functions/_shared/__tests__/contact-topics-lifecycle.test.ts:14
new Function('Deno','createClient','console',compiled)(
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
supabase/functions/_shared/__tests__/edge-harness.ts:31
new Function("require", "Deno", "EdgeRuntime", "exports", output)(
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
supabase/functions/_shared/__tests__/enrich-person-lexicon-facts.test.ts:19
return new Function(...Object.keys(bindings), code)(...Object.values(bindings)) as {
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
supabase/functions/_shared/__tests__/note-ai-entrypoints.test.ts:7
return new Function('exports',...Object.keys(bindings),ts.transpileModule(source+'\n'+suffix,{compilerOptions:{target:ts.ScriptTarget.ES2022,module:ts.ModuleKind.None}}).outputText)({},...Object.value
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/lib/__tests__/golive-functions-to-deploy.test.ts:2
import { functionsToDeploy } from "../../../scripts/golive/functions-to-deploy.mjs";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/lib/__tests__/mc-ranking.test.ts:3
import * as edge from "../../../supabase/functions/_shared/mc-ranking";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/lib/__tests__/mc-ranking.test.ts:4
import { GODSPEED_SOURCE_APP, isGodspeedMirror } from "../../../supabase/functions/_shared/mc-source";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/lib/__tests__/people-import.test.ts:6
} from "../../../supabase/functions/_shared/people-import";

Gates applied: no_behavioural_pass.

Audited 2026-10-11 · audit v0.4.1 · source sha 4261e76bd2c6full audit observations/trust-audit/mcp-server/michaelzelbel__menerio.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-114261e76bd2c6BLOCKF41first audit
06

Questions

What is the menerio MCP server?

One brain for all your AI tools. Capture your thoughts once, and every AI can understand, use, and build on them.

What tools does menerio expose?

86 in total: 61 read-only, 24 that write, and 1 that can delete or overwrite (delete_collection_item). Every one is listed on this page with its risk.

Is menerio safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (41/100) and found 1 critical or high issue in the source. Each one is listed on this page with the file and line it is on. Separately from the audit: 1 of its tools can destroy data, so scope the token you give it to what you actually need.

What credentials does menerio need?

It reads SUPABASE_ACCESS_TOKEN, SUPABASE_ANON_KEY and SUPABASE_SERVICE_ROLE_KEY from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does menerio run?

It speaks streamable-http, so it runs as a service you connect to over the network. It is published on npm as vite_react_shadcn_ts at 0.0.0.

How current is this page?

The grade is for one exact copy of the source (4261e76bd2c6), read on 2026-10-11. The repository is watched and re-audited when it changes.

Advertisement