Jarvis LifeOS MCP Server
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., "@Jarvis LifeOS MCP ServerPlan two hours of graph algorithms and one hour of dynamic programming for tomorrow"
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.
Jarvis LifeOS
A voice-first AI study and productivity assistant, built for the Amazon Developer "Build, Ship, Shape" hackathon (Alexa+ track). It has two surfaces over one set of tools:
A self-hosted MCP server at
/mcp(MCP spec 2025-11-25, Streamable HTTP). Any MCP client can manage the user's tasks and study plans through it. MCP is the open standard behind Alexa+ integrations.A simulated Alexa+-style web experience. Talk or type to Jarvis. It picks a backend tool, the server validates the arguments and runs the operation against persistent storage, and the dashboard shows the real result: which tool ran, with which arguments, and whether it succeeded, failed or needs your confirmation.
We have not connected this to Alexa+ itself (that requires Amazon's Alexa+ preview onboarding) and it does not run on Alexa devices. The MCP server is real and spec-compliant, and we tested it with the official MCP SDK client. The voice web app is a simulation.
Features
Conversation with voice and text. Browser speech recognition for input (where supported), speech synthesis for replies, and a text box that always works.
Real tool calling.
createTask,listTasks,updateTask,completeTask,deleteTask,generateStudyPlan,updateStudyPlanandgetDailySummary. Each one validates its arguments with zod and changes persisted data. No result is hard-coded.Task management. Create, list (pending/completed/all), edit title, due date and priority, complete, and delete, from chat or from the Tasks page.
Study planner. "Create a study plan for tomorrow with two hours of graph algorithms and one hour of dynamic programming" becomes a timed schedule: focus blocks of at most 60 minutes with breaks between them. The plan is saved, and you can change it ("add 30 minutes of recursion to tomorrow's plan", "remove dynamic programming", "start the plan at 2pm").
Tool transparency. Each assistant reply lists the tool calls it made, with status, the real result, any error, and expandable arguments. The Activity page shows the full log.
Confirmation for destructive actions. Deleting a task, or replacing an existing study plan, waits for an explicit Confirm or Cancel.
Two AI engines:
Claude (Anthropic API, tool use) when
ANTHROPIC_API_KEYis set.Offline intent engine when no key is set. It is a deterministic rule-based parser that calls the same tools. It understands fewer phrasings, and the UI labels its replies "offline engine". If a Claude call fails, Jarvis falls back to it and shows the API error.
Related MCP server: notion-mcp
MCP server
Endpoint:
POST/GET/DELETE http://localhost:8787/mcp, Streamable HTTP with sessions (Mcp-Session-Id)Protocol: negotiates
2025-11-25, the latest version, and falls back to older versions for older clients. Built with@modelcontextprotocol/sdk1.32.Tools: the same eight tools, with JSON Schemas, titles and annotations (
readOnlyHint,destructiveHint,idempotentHint). Results include readablecontentandstructuredContent(actionId,status,result).Human confirmation:
deleteTask, andgenerateStudyPlanwhen it would replace a plan, use MCP elicitation to ask the user if the client supports it. Otherwise the action stays pending until someone confirms it in the dashboard.Shared state: MCP calls write to the same store and appear in the dashboard's Activity log, tagged "MCP client".
Security:
Host-header and Origin validation protect against DNS rebinding.
Set
MCP_AUTH_TOKENto requireAuthorization: Bearer <token>. Do this before exposing the server beyond localhost, and add your tunnel hostname toMCP_ALLOWED_HOSTS.
Connect a client. Run npm run dev, then point any Streamable HTTP MCP client at http://localhost:8787/mcp. For example, the MCP Inspector:
npx @modelcontextprotocol/inspectorChoose transport "Streamable HTTP" and URL http://localhost:8787/mcp.
Setup and running
1. Requirements
Node.js 22.9 or newer with npm. The scripts use
node --env-file-if-existsandnode --testglob patterns, which older versions lack. We tested on Node 25.9 and npm 11.12 on Windows 10.Git.
For voice input: Chrome or Edge. Typing works in every browser.
Check your versions:
node -v2. Install
From the repository root (an npm workspace with client/ and server/):
npm installFor a clean, reproducible install from the lockfile, use npm ci instead.
3. Configure the environment (optional)
The app runs with no configuration: it uses the offline intent engine and stores data in server/data/db.json. To enable Claude, create .env in the repository root.
macOS/Linux/Git Bash:
cp .env.example .envWindows PowerShell:
Copy-Item .env.example .envThen edit .env and set ANTHROPIC_API_KEY=.... The server reads .env at startup, so restart it after editing. The dashboard footer and GET /api/health show the active engine.
4. Start (development)
npm run devThis starts both processes:
Web app: http://localhost:5173. Vite proxies
/apito the API.API and MCP server: http://localhost:8787. MCP endpoint: http://localhost:8787/mcp
5. Start (production build)
npm run buildnpm startThis serves the built web app, the API and /mcp together on http://localhost:8787.
6. Test
npm testRuns 29 tests: REST, the assistant scenarios, the Claude agent loop (against a local mock of the Messages API) and the MCP protocol. Each test uses a temporary data file and its own server on a random port, so it never touches your data and doesn't need a running server, network access or an API key.
7. Check the MCP endpoint by hand
With the server running:
curl -i http://localhost:8787/mcp -H "content-type: application/json" -H "accept: application/json, text/event-stream" -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"curl","version":"1"}}}'The response carries an mcp-session-id header and "protocolVersion":"2025-11-25". Send that header (and mcp-protocol-version: 2025-11-25) on later requests such as tools/list and tools/call.
Environment variables
Variable | Default | Purpose |
| none | Enables Claude tool calling. Server-side only, never sent to the browser. |
|
| Claude model id |
| auto | Set to |
|
| API port. If you change it, set it in your shell too so the Vite proxy uses it. |
|
| JSON database path, relative to |
| none | When set, |
| none | Extra Host names allowed on |
| none | Extra browser origins allowed to call the API. Local origins are always allowed. |
Architecture
browser (React + Vite) server (Node + Express)
┌──────────────────────────┐ /api/chat ┌─────────────────────────────────────┐
│ Chat + voice orb │ ────────────▶ │ agent/index.js picks the engine │
│ SpeechRecognition (in) │ │ ├─ agent/claude.js Claude tool use │
│ speechSynthesis (out) │ │ └─ agent/local.js offline parser │
│ Tasks / Study plan views │ REST /api/* │ │ tool calls │
│ Activity log + confirm │ ◀──────────▶ │ executor.js validate → confirm? → │
└──────────────────────────┘ │ run → log action │
any MCP client ──── /mcp (Streamable HTTP) ▶│ mcp.js tools/list, tools/call ──┘ │
│ tools.js 8 tools (zod schemas) │
│ store.js JSON file, atomic write│
└─────────────────────────────────────┘One tool catalogue (
server/src/tools.js) serves Claude, the offline engine and the REST endpoints. The JSON Schemas sent to Claude are generated from the same zod schemas the server validates with, so the two can't drift apart.The executor (
server/src/executor.js) normalizes relative dates, validates arguments, asks for confirmation when a tool requires it, runs the tool, and writes an action record for every attempt, including failures.Storage (
server/src/store.js) is a JSON file written atomically (temp file, then rename) with serialized writes. We chose it because neither MongoDB nor Firebase was available in the build environment. Everything goes through a smallStoreclass, so it can be swapped for MongoDB or Firestore.Dates. The browser sends its local date with each request, so "tomorrow" means the user's tomorrow, not the server's.
API
Method | Path | Description |
GET |
| Active AI engine and storage |
POST |
|
|
GET |
| List tasks |
POST |
| Create |
PATCH |
| Edit |
POST |
| Complete a task |
DELETE |
| Delete (the UI confirms first) |
GET |
| Study plans |
GET |
| Daily summary |
GET |
| Tool execution log |
POST |
| Resolve an action awaiting confirmation |
POST/GET/DELETE |
| MCP server (Streamable HTTP, protocol 2025-11-25) |
Mutating endpoints return { action }. An action is { id, tool, args, status: success|error|awaiting_confirmation|cancelled, result, message, error, source, provider, request, createdAt }. Validation failures return 400, unknown tasks return 404, and actions awaiting confirmation return 202.
Testing
npm test starts the real Express app on a random port with a temporary data file and the offline engine. The tests cover:
"Create a task to revise binary trees tomorrow":
createTaskruns, the task is saved with tomorrow's date, and it shows up in/api/tasks"Show my pending tasks":
listTasksreturns the stored records"Create a study plan for tomorrow with two hours of graph algorithms and one hour of dynamic programming": the plan is scheduled (09:00–12:20, 2h topic split into 2 blocks) and saved
"Mark graph revision complete": the right task is completed and leaves the pending list
The tests also cover changing a plan by request, the confirmation and cancel flow, task edits, the daily summary, argument validation (empty title, bad enum, impossible date), ambiguous task references (Jarvis returns the candidates instead of guessing), the action log, persistence across a restart, and generation of the tool JSON Schemas.
The MCP tests (server/test/mcp.test.js) drive /mcp with the official MCP SDK client over Streamable HTTP. They cover:
initializenegotiating2025-11-25tools/listschemas and annotationsreal
tools/calloperations that are visible through the REST API and the action logtool errors for invalid arguments and unknown tools
confirmation, both pending without elicitation and declined or accepted through elicitation
session rules (400 without a session, 404 for an unknown session, DELETE ending a session)
Host and Origin rejection
bearer-token auth
The Claude agent tests (server/test/claude-agent.test.js) point the real Anthropic SDK at a local mock of the Messages API (ANTHROPIC_BASE_URL) that returns scripted responses. They check:
the request we send: model, system prompt with today's date, all 8 tool JSON Schemas,
output_config.effortthe tool loop:
tool_useis executed and itstool_resultreturned, with several tool calls in one turn sharing one user messageerrors and confirmations reported back to the model
history normalization
refusal handling and the fallback to the offline engine on API errors
They do not test which tools the real Claude model chooses. That needs a real API key.
All 29 tests pass.
We also ran the four scenarios by hand in the browser, plus confirm/cancel, inline task editing, page reload persistence, and desktop and mobile layouts.
Verification status (2026-10-22, Windows 10, Node 25.9)
Tested and working:
npm test: all pass, both in the working copy and in a freshgit clone+npm ci(23/23 at that point; 29/29 after the Claude agent tests were added).npm run build+npm startfrom a fresh clone. The built web app,/apiand/mcpare all served together./mcpover raw HTTP (curl):initializereturns protocol2025-11-25and anmcp-session-idnotifications/initializedreturns 202tools/listreturns all 8 toolstools/callwrites real records to the data file, and invalid arguments returnisError: true
MCP persistence across a server restart: a task and plan created over MCP before the restart could be listed, changed and completed after it, and the REST API showed the same records.
Web app against the production build: the four scenarios, a plan change, and a delete confirmed through the UI, all reflected in the API, with no browser console errors.
Dev mode: the Vite proxy forwards
/apicorrectly. Cross-site browser origins get 403.
Not verified:
Real Claude tool selection (blocked: no API key on the build machine). Our side of the integration is covered by the mock-API tests above. With an invalid key, the SDK call reaches the Anthropic API, the 401 is handled, and the offline engine takes over with a visible notice.
Voice input with a real microphone. Speech output was observed working.
Third-party MCP clients (MCP Inspector, Claude Desktop) and any connection to Alexa+ itself. MCP was tested with the official
@modelcontextprotocol/sdkclient and with raw HTTP.Node versions below 25.9, macOS and Linux.
Limitations
On Windows, stopping
npm startfrom a parent process (not a terminal Ctrl+C) can leave the childnodeprocess holding port 8787. Stop it from Task Manager, or runnode src/index.jsinserver/directly.The offline engine only understands the phrasings it was written for. Use Claude for open-ended language.
Speech recognition depends on the browser: Chrome and Edge support it, Firefox does not. Typing always works.
Single user and no authentication. The JSON file store suits a demo, not a multi-user deployment.
Task completion dates use the server's local timezone.
Project structure
client/ React + Vite dashboard
src/App.jsx layout, state, data refresh
src/components/ Chat, ActionCard, Tasks, Plans
src/useSpeech.js speech recognition + synthesis hooks
src/api.js API client
server/
src/index.js entry point
src/app.js Express routes
src/tools.js tool catalogue + scheduling
src/executor.js validation, confirmation, action log
src/store.js JSON-file persistence
src/dates.js date helpers
src/agent/ claude.js, local.js, index.js
src/mcp.js MCP server (Streamable HTTP, 2025-11-25)
test/api.test.js end-to-end REST + agent tests
test/mcp.test.js MCP protocol tests
test/claude-agent.test.js Claude agent loop vs. a local mock API
docs/SUBMISSION.md Devpost text, demo script, feedback draftsBuilt with
React 19, Vite 7, Node.js, Express 5, zod 4, the Model Context Protocol TypeScript SDK (@modelcontextprotocol/sdk), the Anthropic TypeScript/JavaScript SDK (@anthropic-ai/sdk) with Claude tool use, and the Web Speech API.
License
MIT. See LICENSE.
This server cannot be deployed
Maintenance
Related MCP Connectors
Local-first task manager: create, edit, and complete tasks, projects, and checklists via MCP.
ADHD-friendly tasks, notes & projects for LucidNest - 18 tools, scoped tokens, Streamable HTTP.
ADHD-friendly task management MCP server for ChaTodo: organize tasks, lists, and priorities.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Related MCP Servers
- AlicenseAqualityDmaintenanceA TypeScript-based MCP server that enables users to manage tasks through natural conversation with Claude. Features complete CRUD operations, priority management, tagging, search functionality, and intelligent productivity insights with robust Zod validation.645MIT
- FlicenseNot gradedqualityCmaintenancePersonal Notion MCP server with tools for task management, wrapping the Notion REST API to create, query, and update tasks in a kanban board.-
- FlicenseNot gradedqualityDmaintenanceA task manager MCP server that demonstrates all three MCP primitives (tools, resources, prompts). Enables users to manage tasks, read task summaries and details, and run structured planning/review prompts through natural language.-
- AlicenseNot gradedqualityBmaintenanceExposes 13 typed MCP tools that let an AI agent manage a self-hosted, Hebrew-first task board — filing tasks across work, personal and home contexts, booking schedule slots with WhatsApp reminders, and maintaining shared shopping lists — with server-side Hebrew date resolution, per-item batch results, and undoable changes.MIT