Atlas / MCP servers / arcadesys / bunch

bunchBLOCK

mcp/arcadesys/bunch
Verdict
BLOCK
Grade
F
Trust score
43 /100
Exposed tools
93 62r · 23w · 8d
Transport
streamable-http
License
—
Stars
0
01

Overview

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

A private companion for people who keep shared records: who is present, who was present, and what the next person needs to know.

Bunch is built around one idea — nothing is inferred. It records what someone explicitly says, and a gap in the record means nothing was written down, never that nobody was there.

It has two front doors onto the same records:

  • a web app for browsing, editing, and account control
  • an MCP server so an AI assistant can read and write the same records under

the same rules

Working Monkeys is the engine underneath — the MCP server, the record services, and the database. Bunch is what you see; Working Monkeys is what runs.

Getting started

SETUP.md walks through running it locally. The short version:

npm install
cp .env.example .env.local     # set DATABASE_URL and SYSTEM_DEMO_MODE=true
psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f db/baseline.sql
npm run db:migrate
npm run dev

Demo mode removes the sign-in and cloud-storage requirements. It does not remove the database requirement — there is no database-free mode.

Documentation

What it records

Hosting is responsibility for the body; one profile holds it at a time. Fronting is presence in the moment, and episodes may overlap. The two are tracked independently, and neither implies the other.

Around that: profiles, notes, todos, decisions, important threads, a private image gallery with shareable links, and a catch-up view that shows an arriving profile what changed since they were last around.

Personalized sticker studio

Bunch can keep one ten-reaction cr

Read from source at commit 2df28da5c936OBSERVED · 2026-10-12
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 bunch --env AUTH0_CLIENT_ID=${AUTH0_CLIENT_ID} --env AUTH0_CLIENT_SECRET=${AUTH0_CLIENT_SECRET} --env AUTH0_DOMAIN=${AUTH0_DOMAIN} --env AUTH0_SECRET=${AUTH0_SECRET} -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "bunch": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ],
      "env": {
        "AUTH0_CLIENT_ID": "${AUTH0_CLIENT_ID}",
        "AUTH0_CLIENT_SECRET": "${AUTH0_CLIENT_SECRET}",
        "AUTH0_DOMAIN": "${AUTH0_DOMAIN}",
        "AUTH0_SECRET": "${AUTH0_SECRET}"
      }
    }
  }
}
03

Exposed tools (93)

62 read · 23 write · 8 destructive. Blast radius: 8 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.

ToolRiskDescription
BennyreadBenny and Fenton tease each other, but really love each other. Benny handles emotional writing because Fenton hates it.
BunchreadYour private catch-up, people, notes, and todos.
DotreadA kid in the Demo system. Dot is no relation to Fenton or Benny.
FentonreadFenton and Benny tease each other, but really love each other. Fenton handles household scheduling because Benny hates scheduling.
add_todo_checklist_itemwrite
archive_alterread
archive_todoread
confirm_important_threadread
connect_private_systemread
connect_telegram_accountread
create_alterwrite
create_system_notewrite
create_todowrite
delete_conversation_catch_updestructive
delete_private_imagedestructive
end_fronting_episoderead
erase_alterdestructive
erase_coverage_recorddestructive
erase_system_notedestructive
erase_tododestructive
erase_todo_checklist_itemdestructive
generate_sceneread
get_alterread
get_catch_upread
get_companion_stateread
get_conversation_catch_upread
get_current_frontread
get_current_presenceread
get_demo_catch_upread
get_demo_personread
get_demo_presenceread
get_demo_systemread
get_episode_recordsread
get_episode_reviewread
get_image_allowanceread
get_recorded_coverageread
get_scene_generationread
get_sticker_packread
get_sticker_pack_draftread
get_system_hostread
get_system_noteread
get_todoread
get_usage_statsread
list_altersread
list_conversation_catch_upsread
list_demo_historyread
list_demo_notesread
list_demo_peopleread
list_demo_tasksread
list_fronting_historyread
list_scene_generationsread
list_sticker_packsread
list_system_notesread
list_todosread
open_private_photo_galleryread
prepare_alter_image_promptread
prepare_chatgpt_alter_imageread
prepare_codex_alter_imageread
prepare_conversation_catch_upread
prepare_furry_sceneread
prepare_group_photo_renderread
prepare_private_image_uploadwrite
prepare_telegram_sticker_packread
preview_erase_alterdestructive
publish_telegram_sticker_packwrite
reassign_coverageread
render_alter_lineupread
render_system_companionread
repair_imageread
resolve_coverage_draftread
restore_alterread
restore_todoread
save_conversation_catch_upwrite
save_episode_review_v1write
save_sticker_packwrite
save_sticker_pack_draftwrite
save_system_notewrite
save_system_preferencewrite
set_alter_appearancewrite
set_catch_up_item_statewrite
set_note_alterwrite
set_system_hostwrite
start_fronting_episodewrite
suggest_coverage_draftread
suggest_important_threadread
switch_current_frontread
system-companionreadUse the private System MCP companion for explicit current-front switches, catch-up, notes, todos, decisions, important threads, and private media.
update_alterwrite
update_system_notewrite
update_todowrite
update_todo_checklist_itemwrite
upload-telegram-stickerswritePrepare and publish selected private Bunch PNG stickers to Telegram through the hosted MCP server.
upload_private_imagewrite
04

Trust audit

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

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

What the source does

Filesystem
declared (7 observation(s))
Network
declared (6 observation(s))
Shell
declared (3 observation(s))
Dependencies
not all pinned
Secrets in source
found

Findings (25)

HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
scripts/pilot-backup.ts:95
await exec(
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
scripts/pilot-backup.ts:236
await exec(
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHPrompt injection · prompt.hide_from_user · CWE-94, CWE-1427
.agents/skills/auth0/references/tooling-mcp/index.md:34
When a task needs one of the "No" rows, do not fabricate a tool — tell the user the MCP server does
Why it matters. asks the agent to act without the user's knowledge
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
playwright.config.ts:26
baseURL: `http://127.0.0.1:${port}`,
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
.github/workflows/ci.yml:26
TEST_DATABASE_URL: postgres://bunch_test:[email protected]:5432/bunch_test
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
.github/workflows/ci.yml:27
DATABASE_URL_UNPOOLED: postgres://bunch_test:[email protected]:5432/bunch_test
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
.github/workflows/ci.yml:31
BUNCH_REFERENCE_TEST_DATABASE_URL: postgres://bunch_test:[email protected]:5432/bunch_test
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
SETUP.md:58
DATABASE_URL=postgres://bunch:[email protected]:5432/bunch_dev
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
SETUP.md:59
DATABASE_URL_UNPOOLED=postgres://bunch:[email protected]:5432/bunch_dev
MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
delete_conversation_catch_up, delete_private_image, erase_alter, erase_coverage_record, erase_system_note, erase_todo, erase_todo_checklist_item, preview_erase_alter
Why it matters. 8 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
LOWInventory / provenance · inv.no_license · CWE-1104
Why it matters. no LICENSE file and no repo licence
Fix. add a licence
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
src/server/lineup-widget.test.ts:9
assert.doesNotThrow(() => new Function(script));
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
.agents/skills/auth0/scripts/validate-skill.sh:6
REPO_ROOT="$(cd "$SCRIPT_DIR/../../../../.." && pwd)"
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/app/home/catch-up/page.tsx:1
import { CatchUpCommandCenter } from "../../catch-up-command-center";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/app/home/quiet/page.tsx:1
import { CatchUpCommandCenter } from "../../catch-up-command-center";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/app/landing-page.tsx:3
import beach from "../../public/landing/bunch-beach.png";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/app/landing-page.tsx:4
import tally from "../../public/landing/tally-portrait.png";
LOWNetwork egress · net.beacon_words · CWE-200, CWE-319
src/server/system-service.integration.test.ts:94
const second = await service.createAlter(ownerA, { requestId: requestId(), name: "Beacon" }, "WEB");
LOWNetwork egress · net.beacon_words · CWE-200, CWE-319
src/server/system-service.integration.test.ts:162
assert.equal(switched.data.current.alterName, "Beacon");
LOWNetwork egress · net.beacon_words · CWE-200, CWE-319
src/server/system-service.integration.test.ts:185
assert.equal(note.data.alterName, "Beacon");
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
.agents/skills/auth0/references/framework-laravel/index.md:190
**Important:** Always access the app via `http://localhost:8000` (not `http://127.0.0.1:8000`). The callback URL uses `localhost`, so the session cookie must be set for `localhost` to persist across t
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
.agents/skills/auth0/references/framework-laravel/index.md:210
| Visiting `http://127.0.0.1:8000` instead of `http://localhost:8000` | Session cookies set for `127.0.0.1` won't be sent to the `localhost` callback - causes "Invalid state" error |
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
.github/workflows/ci.yml:32
SYSTEM_PUBLIC_ORIGIN: http://127.0.0.1:3000
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
docs/verification/interactive-public-demo.md:17
Try locally: npm run dev -- --webpack --hostname 127.0.0.1 --port 3126, then open http://127.0.0.1:3126 and choose Try the interactive demo.
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
package.json
@auth0/nextjs-auth0, @neondatabase/serverless, @vercel/blob, @vercel/functions, dotenv, drizzle-orm, jose, pg
Why it matters. 11 dependency range(s) float
Fix. pin exact versions or ship a lockfile

Gates applied: instruction_override, no_behavioural_pass, no_license.

Audited 2026-10-12 · audit v0.4.1 · source sha 2df28da5c936full audit observations/trust-audit/mcp-server/arcadesys__bunch.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-122df28da5c936BLOCKF43first audit
06

Questions

What tools does bunch expose?

93 in total: 62 read-only, 23 that write, and 8 that can delete or overwrite (delete_conversation_catch_up, delete_private_image, erase_alter, erase_coverage_record, erase_system_note). Every one is listed on this page with its risk.

Is bunch safe to connect to an agent?

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

What credentials does bunch need?

It reads AUTH0_CLIENT_ID, AUTH0_CLIENT_SECRET, AUTH0_DOMAIN, AUTH0_SECRET, BLOB_READ_WRITE_TOKEN, CRON_SECRET, ERASURE_TOKEN_SIGNING_SECRET, HOSTED_MCP_ACCESS_TOKEN, MCP_TOKEN_SIGNING_SECRET, OPENAI_API_KEY, PILOT_BACKUP_KEY and TELEGRAM_BOT_TOKEN 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 bunch run?

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

How current is this page?

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

Advertisement