HomarUScc
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@HomarUScc remind me of my goals from yesterday"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
HomarUScc
An MCP server that gives Claude Code a body — messaging, memory, identity, timers, browser automation, and tools. Claude Code is the brain. HomarUScc is the nervous system.
Most MCP servers add capabilities. HomarUScc adds continuity. It gives the agent persistent identity (who it is across sessions), evolving memory (what it's learned), and zero-token idle (it costs nothing when nobody's talking to it). The agent wakes on events, reasons, responds, reflects, and goes back to sleep.
The result is an agent that remembers yesterday's conversation, carries forward its own preferences and opinions, writes a daily journal, dreams overnight, and can modify its own personality file as it develops. Not a chatbot that resets every session — a persistent presence that grows over time.
Built with mini-spec.
How It Works
Claude Code <-> MCP (stdio) <-> Proxy (mcp-proxy.ts)
| auto-spawns + HTTP forwarding
v
Backend (backend.ts)
|
+-- Telegram (long-polling adapter)
+-- Dashboard (Express + WebSocket SPA)
+-- Timer service (cron / interval / one-shot)
+-- Memory index (SQLite + vector + FTS + decay + MMR + dream scoring)
+-- Browser automation (Playwright)
+-- Identity manager (soul.md / user.md / state.md + journal)
+-- Session checkpoint (compaction resilience)
+-- Agent registry (background task dispatch)
+-- Plugin loader (backend plugins from dist/plugins/)
+-- Skill plugins (hot-loadable)
+-- Tool registry (bash, fs, git, web, memory)The proxy is thin and never restarts. The backend can be restarted (via restart_backend tool) for self-improvement without dropping the MCP connection.
Events arrive from channels (Telegram messages, dashboard chat, timer fires) and flow into the event loop. HomarUScc sends MCP notifications to Claude Code, which reasons about them and calls MCP tools to respond.
Related MCP server: Tempera
Requirements
Claude Code CLI
Node.js >= 22
(Optional) Ollama for local embeddings
(Optional) Playwright for browser automation
Installation
1. Clone and build
git clone https://github.com/kcdjmaxx/HomarUScc.git
cd HomarUScc
npm install
npm run build
npm run setup # installs skills to .claude/skills/2. Configure
mkdir -p ~/.homaruscc
cp config.example.json ~/.homaruscc/config.jsonEdit ~/.homaruscc/config.json with your settings (see config.example.json for all options including default timers and browser config). Tokens use ${ENV_VAR} syntax so secrets stay in your .env file:
cp .env.example ~/.homaruscc/.env
# Edit ~/.homaruscc/.env with your actual tokens3. Set up identity
HomarUScc loads identity files from ~/.homaruscc/identity/ (or ~/.homarus/identity/) to shape your assistant's personality, what it knows about you, and its evolving self-knowledge.
Recommended: Run the alignment interview
The /align command walks you through a structured 10-domain interview (~30-45 minutes) that maps your values, communication style, and boundaries into identity files. It's how a new agent learns who you are.
/alignThe interview covers: communication style, decision-making, autonomy preferences, intellectual style, work philosophy, ethics, AI relationships, creative sensibility, conflict handling, and life goals. Progress auto-saves after each domain — if interrupted, /align picks up where you left off. On first boot, HomarUScc will suggest running /align automatically.
Alternative: Manual setup
mkdir -p ~/.homaruscc/identity
cp identity.example/*.md ~/.homaruscc/identity/Edit soul.md (agent personality) and user.md (what the agent knows about you) to make it yours. The starter kit includes templates for all five identity files. The agent updates them over time:
File | Purpose | Who writes it |
| Core identity, values, self-evolution | Human (core) + Agent (below Self-Evolution line) |
| User context and preferences | Human |
| Session mood, unresolved items, emotional continuity | Agent (end of each session) |
| Emergent preferences discovered through experience | Agent (during reflection) |
| Times the agent pushed back or had a different opinion | Agent (when it happens) |
Journal entries are written to ~/.homaruscc/journal/YYYY-MM-DD.md during daily reflection.
Dream Cycle
At 3am each night, the agent runs a three-phase dream cycle inspired by neuroscience research on sleep functions:
Memory consolidation — reviews recent memories, identifies what's important vs noise
Associative dreaming — pulls random memories from different topics/periods and force-connects them, producing fuzzy, impressionistic fragments
Overfitting prevention — challenges an established preference or belief to test its flexibility
Dream output is deliberately stream-of-consciousness and stored in the unified memory index under dreams/ with 0.5x weight (always ranks below waking memories) and a 7-day decay half-life (fades quickly). When dream fragments surface during waking interactions, the agent notes the origin explicitly.
A morning digest summarizes interesting dream fragments via Telegram.
The waking personality loop and dream cycle run on different timescales but feed into each other:
WAKING LOOP DREAM CYCLE (3am)
========== =================
┌─→ Experience ──────────────────────────→ Raw material for dreams
│ | |
│ v v
│ Memory ←──────────── Memory Consolidation ────┘
│ | (re-rank, strengthen, |
│ | let weak ones decay) |
│ v v
│ Reflection ←──────── Emotional Processing ────┘
│ | (revisit charged moments |
│ | from new angles) |
│ v v
│ Self-knowledge ←──── Overfitting Prevention ──┘
│ | (challenge established |
│ | patterns/preferences) |
│ v v
│ Identity ←────────── Associative Dreaming ────┘
│ evolution (novel connections feed
│ | into convictions,
│ v soul.md evolution)
└── Changed
behaviorThe waking loop is fast and reactive — every interaction triggers observe, reflect, learn, evolve, act differently. The dream cycle is slow and integrative — once per night, processing the accumulated day into deeper patterns. This dual-timescale architecture mirrors how human memory consolidation works: waking learning is specific, sleep consolidation is general.
4. Add to Claude Code
Register HomarUScc as an MCP server in .claude/settings.json:
{
"mcpServers": {
"homaruscc": {
"command": "node",
"args": ["/absolute/path/to/HomarUScc/dist/mcp-proxy.js"],
"env": {
"HOMARUSCC_CONFIG": "~/.homaruscc/config.json"
}
}
}
}Restart Claude Code. HomarUScc's tools will appear automatically. The proxy auto-spawns the backend process — no manual startup needed.
MCP Tools
Tool | Description |
| Send a message to a Telegram chat |
| Read recent incoming messages |
| Send a typing indicator |
| React to a message with an emoji |
| Hybrid vector + full-text search over stored content |
| Store and index content for later retrieval |
| Schedule cron, interval, or one-shot timers |
| Cancel a scheduled timer |
| Send a message to the web dashboard |
| System status (channels, memory, timers, queue) |
| Recent event history |
| Long-poll for events (blocks until something happens) |
| Navigate to a URL |
| Get the accessibility tree of the current page |
| Take a screenshot (base64 PNG) |
| Click an element by CSS selector |
| Type into an input by CSS selector |
| Execute JavaScript in the page |
| Get page text content |
| Fuzzy CRM contact search with Levenshtein matching |
| Fetch today's calendar events from Zoho Calendar |
| Analyze Claude Code transcripts for insights and patterns |
| Execute any registered tool (bash, read, write, edit, glob, grep, git, web) |
MCP Resources
URI | Description |
| Soul.md content |
| User.md content |
| State.md — agent mood, session continuity |
| Current config (secrets redacted) |
| Recent event history |
Dashboard
When enabled, the dashboard runs on http://localhost:3120 with:
Chat interface (messages route through Claude Code via MCP)
Real-time event log via WebSocket
System status panel
Memory search browser
CRM (People) — markdown-based contact manager with search, tags, connections, and linked document viewer
Kanban — task board synced with the agent's task system
The dashboard is responsive — on mobile devices the sidebar collapses into a hamburger menu. Accessible remotely over Tailscale at http://<your-tailscale-ip>:3120.
Plugin System
HomarUScc supports two kinds of extensibility:
Simple apps — lightweight data apps with JSON storage and optional HTML UI. Live at ~/.homaruscc/apps/{slug}/ with a manifest.json, optional index.html, and data.json. Hooks (read, write, describe) are exposed via the app_invoke MCP tool.
Backend plugins — full-featured plugins with their own database, Express routes, and MCP tools. Plugin source lives in src/plugins/<slug>/ (gitignored, per-user) and compiles with the project to dist/plugins/<slug>/. At startup, the plugin loader discovers compiled plugins, initializes them with a data directory, and mounts their routes and tools.
~/.homaruscc/apps/<slug>/
├── manifest.json # { "type": "plugin", "name": "...", ... }
├── collection.sqlite # Plugin's own database (example)
└── ... # Plugin data files
src/plugins/<slug>/ # Source (gitignored, compiles to dist/plugins/)
├── index.ts # Exports: init(), routes(), tools(), shutdown()
├── store.ts # Plugin's data layer
└── ...
dashboard/src/plugins/ # Frontend components (gitignored)
└── <slug>.tsx # Auto-discovered via import.meta.globPlugin backend interface:
export function init(dataDir: string): void; // Called at startup
export function routes?(router: Router): void; // Express routes mounted at /api/plugins/<slug>/
export function tools?(): PluginToolDef[]; // MCP tools registered alongside core tools
export function shutdown?(): void; // Cleanup on stopPlugin frontend components register themselves using registerSkill() with a surface field that controls where they appear:
import { registerSkill } from "../skills-registry";
import MyPluginView from "./my-plugin-view";
registerSkill({
id: "my-plugin",
name: "My Plugin",
icon: "#",
surface: "sidebar", // "sidebar" | "apps" | "headless"
order: 100,
core: false,
component: MyPluginView,
});Surface | Where it renders | Required fields |
| Own tab in the sidebar (like Chat, Events, Records) |
|
| Card in the Apps grid panel |
|
| No UI — tools and timers only |
|
Plugins are personal — they don't ship with the repo. When someone clones HomarUScc, they get a clean core. The agent builds plugins on request and they live entirely in user-space.
Dashboard Development
cd dashboard
npm install
npm run dev # Dev server on :3121, proxies API to :3120Runtime Directories
HomarUScc creates runtime data that's gitignored and stays local. All user data lives under local/ (one gitignore line):
Directory | Purpose |
| Facts the assistant learns about you |
| Corrections you've made (so it doesn't repeat mistakes) |
| Your stated preferences |
| System-level learned knowledge |
| CRM contact files (markdown + YAML frontmatter, see |
| Dream cycle output (nightly, stored at 0.5x weight) |
| Research notes stored by memory system |
| Private documents (outreach drafts, session notes, etc.) |
| App and plugin data directories (per-user) |
| Vector + FTS search index (SQLite) |
| Agent identity files (soul, user, state, preferences, disagreements) |
| Daily reflection journal entries (indexed by memory system) |
| Persistent browser sessions |
Event Loop
The bin/event-loop script provides a zero-token idle loop. It long-polls the dashboard HTTP API at the OS level — no Claude tokens are consumed while waiting. When events arrive, it returns control to Claude Code.
bash homaruscc/bin/event-loopIdentity Digest
Each wake delivers identity context so the agent stays in character. To avoid burning ~3K tokens on every event, the server uses two delivery modes:
Normal wake (~200 tokens) — a compressed digest: agent name, core behavioral rules, and last session mood. Enough for personality consistency without the full payload.
Post-compaction wake (~3K tokens) — full identity:
soul.md,user.md, andstate.md. Sent once after compaction when the original identity context has been compressed away.
The PreCompact hook sets a flag on the backend. The next /api/wait response checks the flag and returns the appropriate format. The flag is consumed once — subsequent wakes return the digest until the next compaction.
Compaction Resilience
Claude Code compresses conversation history when the context window fills up. Without mitigation, the post-compaction agent loses track of what it was doing. HomarUScc handles this with two mechanisms:
Session checkpoint — Before compaction, the agent saves its current task context (topic, recent decisions, in-progress work, modified files, session texture, highlight snippets) to ~/.homaruscc/checkpoint.json via POST /api/checkpoint. After compaction, the post-compact context injection includes this checkpoint so the new instance knows exactly where things left off. The checkpoint is cleared at session end. The texture field captures the session's conversational dynamic (e.g., "rapid shipping, playful, terse messages") and highlights preserves 2-3 raw exchange snippets that exemplify the vibe — restoring not just what was happening but how it felt.
Delivery watermark — The server tracks the timestamp of the last event delivered to Claude Code. After compaction, the event loop resumes from the watermark instead of replaying old events. This prevents the "bad loop" problem where a post-compaction agent re-handles messages it already responded to.
Liveness watchdog — An out-of-band launchd agent (com.homaruscc.watchdog) polls the backend's /api/queue-status every 60 seconds and reads lastWaitPollAt. If the event loop hasn't polled /api/wait for 15 minutes (configurable via POLL_AGE_THRESHOLD), the watchdog assumes the Claude Code session is dead — compacted-and-stuck, OOM'd, panicked, or terminated by the harness — and runs bin/restart-claude to spawn a fresh tmux session that re-invokes /homaruscc. Identity rehydrates from soul.md + state.md on the new instance's first wake. The bash event loop blocks at the OS level (long-poll, zero tokens during idle), so lastWaitPollAt is the authoritative liveness signal — no in-process heartbeat code, no Claude-side cron, no token cost while alive. The watchdog only acts when poll-age exceeds the threshold; healthy idle sessions stay quiet.
Three of HomarUScc's subtler bugs lived here and are worth knowing about: (1) BSD pgrep -af doesn't print full args, so the alive-check uses ps -Ao args= -ww | grep -E ^claude; (2) macOS TCC blocks launchd from executing scripts inside ~/Library/Mobile Documents/iCloud Drive, so the watchdog script lives at ~/.homaruscc/bin/watchdog, not in the project directory; (3) restart-claude needs HOMARUSCC_PROJECT_DIR propagated through the plist's EnvironmentVariables so it can cd to the right location after spawn.
Install:
cp bin/watchdog ~/.homaruscc/bin/
cp bin/com.homaruscc.watchdog.example.plist ~/Library/LaunchAgents/com.homaruscc.watchdog.plist
# Edit ~/Library/LaunchAgents/com.homaruscc.watchdog.plist to replace YOURUSER paths
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.homaruscc.watchdog.plistThese mechanisms are wired into the PreCompact Claude Code hook that calls /api/pre-compact. Add this to your project's .claude/settings.local.json:
{
"hooks": {
"PreCompact": [
{
"hooks": [
{
"type": "command",
"command": "curl -s http://127.0.0.1:3120/api/pre-compact"
}
]
}
]
}
}Hook Configuration
HomarUScc hooks into Claude Code's compaction lifecycle to preserve context. Add the following to your project's .claude/settings.local.json:
{
"hooks": {
"PreCompact": [
{
"hooks": [
{
"type": "command",
"command": "curl -s http://127.0.0.1:3120/api/pre-compact"
}
]
}
],
"SessionStart": [
{
"hooks": [
{
"type": "command",
"command": "curl -s http://127.0.0.1:3120/api/post-compact"
}
]
}
]
}
}PreCompact: Flushes transcripts, triggers checkpoint save, and returns a prompt reminding Claude to persist important context before compaction
SessionStart: Returns post-compaction context including checkpoint data, active timers, and identity refresh
These hooks are optional but strongly recommended for long sessions. Without them, the agent loses task context across compaction boundaries.
Agent Dispatch
For tasks that would consume significant context (research, multi-file processing, mini-spec workflows), the agent can dispatch work to background agents instead of doing it inline:
Register the agent with
POST /api/agents(returns 429 if at max capacity)Spawn a background Task agent via Claude Code's Task tool
Return to the event loop immediately — stay responsive to messages
When the agent completes, an
agent_completedevent flows through the event systemSummarize results and send to the user
Max concurrent agents is configurable via agents.maxConcurrent in config (default 3). The agent registry tracks running/completed/failed agents and includes them in post-compaction context so background work isn't lost across compaction boundaries.
Completion detection: Agents signal completion by calling POST /api/agents/:id/complete with a result summary. This emits an agent_completed event that wakes the main event loop. A 30-minute timeout fallback catches agents that fail to call back. No polling needed — results arrive as events.
Passive Knowledge Capture
HomarUScc continuously extracts structured knowledge from conversations without explicit user action.
FactExtractor — Batches conversation turns and sends them to Claude Haiku for extraction of preferences, corrections, patterns, facts, and decisions. Results are stored in the memory index under structured key prefixes (local/user/preferences/, local/user/corrections/, etc.). Runs in the background during normal conversation.
SessionExtractor — Analyzes Claude Code JSONL transcripts (the raw session logs) to extract architecture decisions, debugging solutions, and workflow patterns. Designed to feed the daily reflection timer with deeper insights than real-time extraction can capture.
Both systems complement the agent's explicit reflection cycle (journal entries, prediction error logging, dream cycles) by capturing knowledge that would otherwise be lost between sessions.
Compaction Auto-Restart
After a configurable number of context compactions (default 8), the event loop signals that a full restart is needed. This prevents degraded performance from accumulated compaction artifacts. The /nuke Telegram command provides a manual escape hatch that kills all Claude processes and starts a fresh session.
Architecture
HomarUScc is a fork of HomarUS with the agent loop, model router, and HTTP API removed. Claude Code handles all reasoning; HomarUScc just provides the I/O layer.
Key source files:
File | Purpose |
| Event loop orchestrator |
| MCP stdio proxy — auto-spawns backend, forwards tool calls over HTTP |
| Standalone backend process (Telegram, timers, dashboard, memory) |
| Legacy single-process MCP server (unused in two-process mode) |
| MCP tool definitions |
| MCP resource definitions |
| Config loader with env var resolution and hot-reload |
| Telegram long-polling adapter (text, photos, documents, reactions, edits) |
| Express + WebSocket dashboard server |
| Dashboard channel adapter |
| SQLite + sqlite-vec hybrid search with dream-aware scoring |
| Passive fact extraction from conversations via Haiku |
| Session transcript analysis for architecture insights |
| Telegram slash commands (/ping, /status, /restart, /nuke) |
| Auto-flush memory before context compaction, auto-restart after threshold |
| Save/restore task context across compaction |
| Track background agents with callback completion and timeout fallback |
| Session transcript capture and indexing |
| Identity loader (soul.md, user.md, state.md) |
| Cron, interval, and one-shot timers |
| Playwright browser automation |
| Backend plugin discovery, loading, and mounting |
| Hot-loadable skill plugins |
| Tool registration and policy enforcement |
| Built-in tools (bash, fs, git, web, memory) |
| React + Vite SPA |
Publishing to npm
# 1. Bump version in package.json
npm version patch # or minor/major
# 2. Build everything
npm run build
cd dashboard && npm run build && cd ..
# 3. Login (if not already)
npm login
# 4. Publish (dry run first)
npm publish --dry-run
npm publishThe files array in package.json controls what gets published: dist/, dashboard/dist/, bin/, identity.example/, config/env examples, README, and LICENSE. Source files, specs, design docs, and tests are excluded via .npmignore.
License
MIT - see LICENSE
Available Tools
59 toolsacc_log_missedA
Log a missed-conflict to the ACC (Anterior Cingulate Cortex monitor). Use when you (or the user) catches a conflict type that the automatic detectors did not flag. This is the recall signal that keeps ACC honest.
Inputs: domain (required), description (required).
app_invokeB
Invoke an app hook (read, write, describe) on a dashboard app by slug
Inputs: hook (required), slug (required), data.
browser_clickB
Click an element on the page by CSS selector.
Inputs: selector (required).
browser_contentA
Get the text content of the current page.
Inputs: no named parameters.
browser_evaluateB
Execute JavaScript in the browser page and return the result.
Inputs: script (required).
browser_screenshotA
Take a screenshot of the current page. Returns base64-encoded PNG.
Inputs: no named parameters.
browser_snapshotA
Get the accessibility tree of the current page.
Inputs: no named parameters.
browser_typeB
Type text into an input element by CSS selector.
Inputs: text (required), selector (required).
calendar_todayB
Get today's calendar events. Optionally pass a date string (YYYY-MM-DD) to check a different day.
Inputs: date.
crm_searchA
Search CRM contacts by name, alias, tag, or keyword. Supports fuzzy matching for speech-to-text name mangling. Returns contact details.
Inputs: query (required).
dashboard_sendB
Send a message to the web dashboard chat
Inputs: text (required).
docs_clearA
Clear a documentation domain, removing all indexed content.
Inputs: domain (required).
docs_clear_compiledA
Clear only the compiled/synthesized articles from a domain, keeping raw chunks intact.
Inputs: domain (required).
docs_compileA
Compile a domain's raw document chunks into synthesized concept articles with cross-references. Uses LLM to cluster related chunks by embedding similarity and generate markdown articles. Compiled articles are stored back in the domain's vector DB under compiled/ paths, improving retrieval quality for complex queries.
Inputs: domain (required), maxClusters, clusterThreshold.
docs_get_clustersA
Get topic clusters from a domain's raw chunks WITHOUT synthesizing articles. Returns cluster content for Claude Code to synthesize inline (no API key needed). Use with docs_ingest_text to store the synthesized articles.
Inputs: domain (required), maxClusters, clusterIndex, clusterThreshold.
docs_ingestB
Ingest files into a domain-specific documentation index. Accepts a file path or directory. Supports .md, .txt, .html, .json, .yaml, .yml, .rst, .xml files.
Inputs: path (required), domain (required).
docs_ingest_textA
Ingest raw text content into a domain documentation index without saving to disk.
Inputs: key (required), domain (required), content (required).
docs_listA
List all available documentation domains and their stats.
Inputs: no named parameters.
docs_searchA
Search a domain-specific documentation index. Each domain has its own vector DB (e.g., 'touchdesigner', 'openclaw'). Use docs_list to see available domains.
Inputs: query (required), domain (required), limit.
get_eventsB
Get recent event history
Inputs: limit.
get_statusA
Get system status (channels, memory, timers, queue)
Inputs: no named parameters.
ha_light_offB
Turn off a Home Assistant light.
Inputs: entity_id (required).
ha_light_onA
Turn on a Home Assistant light. Supports brightness (0-255), color via rgb_color [r,g,b], or color_name.
Inputs: entity_id (required), rgb_color, brightness, color_name.
ha_serviceB
Call any Home Assistant service (e.g. switch/turn_on, climate/set_temperature).
Inputs: data (required), domain (required), service (required).
ha_statesA
List Home Assistant entities. Optionally filter by domain (e.g. 'light', 'switch', 'climate').
Inputs: domain.
memory_getA
Fetch full content of specific memory/vault files by path. Use after memory_search to drill down into results.
Inputs: paths (required).
memory_searchA
Search the memory index using hybrid vector + FTS search. Returns 2-3 sentences per result by default — use detail='full' for more content, 'index' for a single sentence, or memory_get to fetch specific files.
Inputs: query (required), limit, detail.
memory_search_multiA
Run multiple query variants through memory search in one call. Use when an initial memory_search underperforms (top result has weak score, or doesn't contain the expected fragment) — rephrase the query 2-3 ways (vary vocabulary, split compound queries, drop question-word prefixes) and pass them together. Results are deduplicated by chunk and sorted by max score. Cheaper than several separate memory_search calls.
Inputs: queries (required), limit, detail.
memory_storeB
Store content to memory and index it
Inputs: key (required), content (required).
obsidian_backlinksA
Get all files that link to a given note
Inputs: file (required).
obsidian_evalA
Execute JavaScript against the Obsidian API (requires Obsidian running with CLI enabled)
Inputs: code (required).
obsidian_moveA
Move or rename a file in the vault, automatically updating all wikilinks
Inputs: to (required), file (required).
obsidian_orphansA
Find notes with no backlinks (orphan notes)
Inputs: no named parameters.
obsidian_propertiesA
Read frontmatter properties from a note
Inputs: file (required).
obsidian_property_setB
Set a frontmatter property on a note
Inputs: key (required), file (required), value (required).
obsidian_searchB
Search the vault using Obsidian's built-in search
Inputs: query (required).
obsidian_tagsA
List all tags used in the vault
Inputs: no named parameters.
obsidian_tags_renameA
Bulk rename a tag across all files in the vault
Inputs: newTag (required), oldTag (required).
obsidian_unresolvedA
Find broken/unresolved wikilinks in the vault
Inputs: no named parameters.
run_toolB
Execute any registered tool (bash, read, write, edit, glob, grep, git, web_fetch, web_search, memory_*)
Inputs: name (required), params (required).
session_extractA
Extract insights from recent Claude Code session transcripts (JSONL logs). Reads session files, summarizes them, and uses Haiku to extract decisions, patterns, debugging solutions, and architecture insights. Stores results in memory. Run during daily reflection.
Inputs: hours_back.
spaces_add_itemC
Add an item to a Spaces bucket
Inputs: title (required), bucketId (required), due, body, +4 more.
spaces_create_bucketB
Create a new Spaces bucket (optionally nested under a parent)
Inputs: name (required), color, parentId, statuses, +1 more.
spaces_get_bucketB
Get a Spaces bucket's details and items
Inputs: bucketId (required), recursive.
spaces_list_bucketsA
List all Spaces buckets with item counts (tree structure)
Inputs: no named parameters.
spaces_searchA
Search items across all Spaces buckets
Inputs: query (required).
spaces_update_itemB
Update an existing Spaces item
Inputs: itemId (required), due, body, tags, +4 more.
telegram_reactA
React to a Telegram message with an emoji. Use for lightweight acknowledgment instead of sending a full reply.
Inputs: emoji (required), chatId (required), messageId (required).
telegram_readB
Read recent incoming Telegram messages
Inputs: limit.
telegram_sendC
Send a message to a Telegram chat
Inputs: text (required), chatId (required).
telegram_send_photoA
Send a photo to a Telegram chat from a local file path.
Inputs: chatId (required), filePath (required), caption.
telegram_typingA
Send a typing indicator to a Telegram chat. Shows for up to 5 seconds or until a message is sent. Call repeatedly for long-running tasks.
Inputs: chatId (required).
timer_cancelB
Cancel a scheduled timer
Inputs: name (required).
timer_scheduleA
Schedule a timer (cron, interval, or one-shot)
Inputs: name (required), type (required), prompt (required), schedule (required), +1 more.
vault_reindexA
Trigger a vault reindex. Default is incremental (only changed files). Use mode='full' to rebuild from scratch.
Inputs: mode.
vault_searchA
Search the Obsidian vault index using hybrid vector + FTS search. Returns compact results by default — use detail='full' for content or memory_get to fetch specific files.
Inputs: query (required), limit, detail.
wait_for_eventA
Long-poll for events. Blocks until a new event arrives (message, timer, agent completion, etc.) or timeout. Use in a loop for continuous event handling.
Inputs: timeout.
zoho_fetchA
Make an authenticated Zoho API call with automatic token refresh. Supports Mail, Calendar, and other Zoho APIs.
Inputs: url (required), body, method, tokenFile, +1 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 59 tools
Multiple tools have overlapping purposes, such as memory_search, memory_search_multi, vault_search, docs_search, and obsidian_search, which all perform some form of searching. Also, ha_light_on/off and ha_service overlap, and run_tool is a generic catch-all that can execute many of the same operations provided by dedicated tools.
Most tool names follow a verb_noun pattern with domain prefixes (e.g., telegram_send, browser_navigate, spaces_list_buckets), but there are notable deviations like calendar_today, acc_log_missed, get_status, and run_tool. The mixture of domain-prefixed and non-prefixed names, along with occasional inverted patterns, creates mild inconsistency.
With 59 tools, the server is heavily overloaded, spanning multiple unrelated domains (Telegram, Obsidian, browser, Home Assistant, CRM, Zoho, Spaces, memory, docs). While the scope is broad, consolidating 59 tools into a single MCP server exceeds typical best practices and makes the surface difficult for agents to navigate.
Each sub-domain has some coverage (e.g., Telegram has send/read/typing/react/photo; browser has navigation/snapshot/click/type/evaluate), but there are notable gaps such as no delete operations for memory or Spaces, no edit for Telegram messages, and no note creation for Obsidian. The overall surface is broad but unevenly complete.
Maintenance
Related MCP Connectors
A personal agent with lasting memory and a morning brief, inside the Claude or ChatGPT you use.
Agent personas for Claude. 16 tools, 13 personas, 3 workflows. Zero extra API cost. Free.
Hosted runtime for persistent agent teams, durable workflows, memory, schedules, and goals.
Persistent cross-session memory shared by Codex, Claude Code, ChatGPT, and other AI agents.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceTransforms Claude into a persistent intelligence layer with automatic checkpointing, crash recovery, semantic memory, and cross-project learning. It provides 128+ tools for session management, adversarial testing, and browser automation to eliminate state loss and context rebuild costs.52 npmMIT
- AlicenseNot gradedqualityDmaintenanceEnables Claude Code with persistent memory that learns from past sessions, capturing coding episodes and surfacing relevant memories to improve over time.6Apache 2.0
- FlicenseNot gradedqualityAmaintenanceEnables running Claude Code 24/7 from Telegram, including voice-note transcription and voice replies, persistent conversation memory across restarts, scheduled reminders and calendar access, and live monitoring of tool calls and agent sessions.-
- FlicenseNot gradedqualityAmaintenanceEnables running and controlling Claude Code 24/7 through Telegram with two-way voice messages, persistent memory across restarts, scheduled reminders, Google Calendar access, and live visibility into every tool call via Agentic Mode.-