mcp-home-server
mcp-home-server
Single, stable Model Context Protocol (MCP) "door" server that runs on your home machine and exposes a dynamic set of tools to every connected AI client (desktop, phone, future agents). Tools can be added, edited, or removed at runtime — no restart needed.
Behind the door:
Dynamic tool loader watches
src/tools/and hot-reloads each module via chokidar + the MCP SDK'slist_changednotification.JSON manifest is regenerated automatically and served at
GET /manifest.URLTracker ingests "AI usage" events, hashes them, and emits a
url_tracker:new_aievent the first time a URL is seen.Onboarding agent listens to those events and writes per-AI onboarding payloads (
manifests/onboarding/<hash>.json) so new clients can instantly configure themselves to use this MCP host.Scouting worker periodically scans configured roots (
SCOUT_ROOTS) for scripts/modules that look like MCP tool candidates; proposals are written tomanifests/pending/for human review (no auto-promotion).Dedupe worker compares registered tools and writes overlap reports to
docs/dedupe/to surface merges/refactors.
Quick start
git clone https://github.com/manniegreenspan/mcp-home-server.git
cd mcp-home-server
npm install
npm run dev
# Server binds 127.0.0.1 on the first free port in 7000-7999.
# Check console for the actual URL, e.g.: http://127.0.0.1:7432/mcpTest it with the MCP Inspector:
npx @modelcontextprotocol/inspector@latest
# Paste the MCP endpoint URL into the inspector.Endpoints
Path | Method | Purpose |
| POST/GET | MCP Streamable HTTP endpoint (JSON-RPC) |
| GET | JSON manifest of currently registered tools |
| POST | URLTracker ingestion: |
| GET | Liveness + last chokidar refresh |
Adding a tool
Drop a file in src/tools/:
// src/tools/hello-world.ts
import { z } from "zod";
import type { ToolModule } from "../lib/types";
export default {
name: "hello_world",
description: "Says hello to a name",
inputSchema: { name: z.string().describe("Name to greet") },
handler: async ({ name }) => ({
content: [{ type: "text", text: `Hello, ${name}!` }]
})
} satisfies ToolModule;The loader picks it up immediately, registers it with the MCP server, and
sends the notifications/tools/list_changed notification. Connected clients
(Inspector, Claude Desktop, etc.) refresh their tool list automatically.
Delete the file → tool unregistered. Edit the file → tool re-registered.
Cloudflare deployment
See docs/DEPLOYMENT.md. v1 recommends Cloudflare
Tunnel fronting the local Express server. A pure-Cloudflare-Worker rewrite
is in the ROADMAP (Workers can't do dynamic import() of src/tools/*.ts).
Project layout
mcp-home-server/
├── src/
│ ├── server.ts # main entry: Express + McpServer + transports
│ ├── ports.ts # port scan 7000-7999
│ ├── manifest.ts # generate/serve JSON manifest
│ ├── logger.ts # pino instance
│ ├── event-bus.ts # shared EventEmitter
│ ├── tools/ # dynamic tool modules (one file per tool)
│ ├── workers/ # onboarding-agent, scouting-worker, dedupe-worker
│ ├── url-tracker/ # ingestion + detector + hash store
│ └── lib/ # types, hashing
├── manifests/
│ ├── current.json # auto-regenerated manifest
│ ├── pending/ # scout proposals (manual review)
│ └── onboarding/ # onboarding payloads written by agent
├── docs/
│ ├── DEPLOYMENT.md
│ ├── ARCHITECTURE.md
│ └── dedupe/ # dedupe-worker reports
├── tests/
└── logs/License
MIT — see LICENSE.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/mgreenspan17/mcp-home-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server