Cindy Zhu.
← all free guides
Building & apps Claude

Build your own Jarvis with Claude (the full toolkit)

Hey, it's Cindy ๐ŸŒฑ This is the whole toolkit from the reel, actually explained, and I built mine for real, so this is the honest version. You don't download Jarvis, you assemble it: Claude Code is the brain, and you plug it into apps you already use, one connector at a time. Everything below is verified current as of July 2026.
the mental model

What you're actually building ๐Ÿง 

You don't install Jarvis, you assemble it. Jarvis is an assembled system, and the brain is Claude Code (Anthropic's agent that runs in your terminal or at claude.ai/code), which can read files, run commands, browse, talk, and call your other apps. The magic ingredient is MCP connectors (Model Context Protocol, an open standard that gives Claude a direct line to one app). Add the Gmail connector and it reads and drafts your email. Add a revenue connector and it pulls your numbers. The trick to not getting overwhelmed: add ONE connector at a time, verify it, then add the next.


gather these

Before you start โœ…

  • ๐Ÿ’ณ A Claude Pro ($20/mo) or Max ($100/mo) plan. Voice, Chrome, Design, sub-agents and routines all live on paid plans and draw from the same usage. Max is the honest pick if you'll run a daily routine.
  • ๐Ÿ’ป Claude Code installed: npm install -g @anthropic-ai/claude-code then run claude, or use claude.ai/code. Docs: https://code.claude.com/docs
  • ๐Ÿ”Œ The apps you want to connect, with accounts you can log into.

How to add any connector: in Claude Code run claude mcp add --transport http NAME https://the-mcp-url/mcp, then /mcp to finish the OAuth login. On the web, add them at https://claude.ai/customize/connectors (do this too if you'll run routines). Always run /mcp to confirm, then do one read-only test before you let it write.


from my latest Jarvis reel

The updated build manual ๐Ÿ“‹

I rebuilt my own Jarvis for the latest reel and the prompt got a lot better, so here it is in full. Three pieces: a short file that tells Claude who you are, the build manual you paste once, and the connector step that most people skip. Do these three and the rest of this guide gets easier, because Claude is reading your real calendar, inbox and notes instead of guessing.


make it yours

Tell Claude who you are ๐Ÿง 

This single file is the difference between your Jarvis and a generic bot. It's why yours knows a slipped deadline on project two matters more than a full inbox. In your project folder, ask Claude Code to create a CLAUDE.md, then make it specific. Make a priorities note while you're here, even five ranked bullets, because the brief ranks your day from it and can't invent one.

๐Ÿ“ your CLAUDE.md, fill in the brackets
# Who I am
I'm [name], I [what you do]. I care most about [your #1 goal right now].

# What I'm working on this month
- [project 1], [project 2], [project 3]

# My priorities, ranked
1. [top priority]  2. [next]  3. [next]

# My tone
[e.g. warm, direct, no corporate filler]

# Hard rules
- Always draft, never send. Never take irreversible actions without asking.
- Only use the apps I've connected.

layer two, the backend

Paste the build manual ๐Ÿ“‹

Don't read this one, just copy the whole block. It's the architecture behind my Jarvis, and it saves itself as a skill you can trigger by phrase.

๐Ÿ“‹ the build manual, paste into Claude Code
You are my personal assistant, my own Jarvis. First, read my CLAUDE.md so you know who I am, my projects, my priorities and my tone. From now on, act as a proactive chief of staff for me, not a generic chatbot.

Keep this skill fully self-contained: list every source to pull and exactly how to format the brief, because when it runs on a schedule it has no memory of our chats.

Build me a "morning brief" routine, and save it as a reusable skill I can trigger by phrase (like "run my morning brief", "brief me", or "what's on my plate"). When I trigger it, do this:

1. CALENDAR: read today's events from my Google Calendar. Flag anything that needs prep, and any conflicts or gaps.
2. INBOX: scan my Gmail from the last 24 hours. Group it into needs-a-reply / FYI / ignore. For the needs-a-reply group, draft short replies in my tone and leave them in Drafts. Never send.
3. PRIORITIES + TASKS: read my priorities and task list (from my Notion or my priorities note), and pick the 3 things that actually matter most today, ranked, with a one-line why for each.
4. ONE THING TO KNOW: surface a single important signal, a deadline, a number that moved, a follow-up I'm forgetting.

Then write it as 6 to 8 short spoken lines, in my voice, warm and direct, no filler. END with the single most important question: "What should I handle first?"

Write the brief in [your language]. Save it to brief.txt and to a Notion page. Then rewrite jarvis_data.js so the dashboard shows today's real numbers and a one-line activity log per source you read, and mark each connector online or offline based on whether the call actually succeeded. Then read the brief out loud through my Fish Audio voice.

If a source is empty or a connector is down, say so plainly in the brief and mark it offline on the dashboard. Never fill a gap with a plausible guess.

Rules, always: you draft, I approve. Never send email, post, delete, or take any irreversible action on your own. Only pull from the apps I've connected.

So you're not pasting blind, this is the shape of what comes back:

๐Ÿ“… Calendar Today's events, what needs prep, and where the gaps and clashes are.
๐Ÿ“ฅ Inbox Last 24 hours sorted into needs-a-reply, FYI and ignore, with drafts waiting.
๐ŸŽฏ Priorities The three things that actually matter today, ranked, each with a one-line why.
๐Ÿ’ก One thing to know A single signal you would otherwise have missed.

The skill saves itself to ~/.claude/skills/<name>/SKILL.md. Ask Claude Code for more the same way, and it reaches for them automatically when a request matches:

๐ŸŒ… "run my morning brief" The full routine above.
โœ๏ธ "draft my replies" Triages the inbox and drafts responses in your tone.
๐Ÿ’ฌ "answer customer queries" Reads your FAQs, drafts support replies, escalates anything not covered.
๐Ÿ“Š "how are my numbers" Pulls your revenue or content stats into a quick read.

this is the part people skip

Authorise your connectors ๐Ÿ”Œ

A connector is an authorised link between the brain and a service you already use. It's the difference between Claude talking about your calendar and Claude reading it. Nobody can do this step for you. The prompt above is portable; your authorisations are yours, and until you grant them your beautiful dashboard is a screensaver.

  1. ๐ŸŒ Authorise on the web, once Go to claude.ai/customize/connectors. In the sidebar that's Customize, then Connectors. Connect one, approve it on that service's own consent screen.
  2. ๐Ÿ” The terminal inherits it You do not set connectors up twice. If you signed into Claude Code with your claude.ai account, connectors you added on the web are automatically available in the terminal. Run /mcp to see them. Ones you've never used hide behind a "Show unused connectors" row.
  3. โœ… Test one read before you trust it Ask for one read-only fact, then check it against the source with your own eyes. "How many rows in my tasks database are marked done?", then open the database and count. If it matches, move to the next connector.
  4. โž• Then add the next one One connector, one verified read, then the next. Slower, and the only route to ever reading the 8am brief without silently re-checking it.
โš ๏ธ Do not try to add Gmail or Calendar from the terminal. Some Anthropic-hosted connectors, Gmail, Google Calendar and Microsoft 365 among them, don't support local OAuth from Claude Code, because the upstream identity provider only accepts the redirect URL claude.ai registered. claude mcp add will fail with "is Anthropic-hosted and doesn't support local OAuth". Connect those on the web and let the CLI inherit them. claude mcp add --transport http NAME https://the-mcp-url/mcp then claude mcp login NAME is for third-party servers that publish their own MCP URL.
๐Ÿ•ต๏ธ If a connector you definitely added is missing, check your auth first. Connectors are only fetched when your active login is a claude.ai subscription. They are silently not loaded when ANTHROPIC_API_KEY, ANTHROPIC_AUTH_TOKEN or apiKeyHelper is active, when a third-party provider like Bedrock is in play, or when CLAUDE_CODE_OAUTH_TOKEN holds a long-lived token. Run /status to see which auth is actually live. An ANTHROPIC_API_KEY left in your shell profile from an old experiment will hide every connector you own, with no error.

What each one can and cannot do. Worth knowing before you design a routine around it:

๐Ÿ“… Google Calendar Reads events and shared calendars, creates and updates them, finds mutual availability. It cannot see calendars your own Google account can't see, and it has no memory between runs, it re-queries every time.
๐Ÿ“ฅ Gmail Searches and reads with natural language, drafts, and sends, replies and forwards. It cannot read attachment contents, only metadata. If your workflow needs the PDF someone sent you, this is not the tool.
๐Ÿ“ Notion Searches the workspace, fetches pages, queries databases, creates and updates pages. It cannot see anything you haven't shared with the integration, and it rate-limits per workspace.
๐Ÿ” All of them Claude inherits your permissions and can only see and do what you already can. A "the page isn't there" answer is nearly always a sharing problem, not a model problem.
๐Ÿšจ The Gmail connector can send. Read that twice. Drafts-only is a discipline you impose, not a wall the tool provides. Approval prompts are the documented default, but a scheduled cloud routine has no approval prompt at all. So the drafts-only rule has to be written into the skill, written into the routine prompt, and the send capability left out of anything unattended. You'll also find older Anthropic doc pages claiming Claude "cannot send or modify emails". Those are stale, the live tool surface exposes send, reply and forward, and assuming the read-only version is a genuinely unsafe thing to build on.
๐Ÿ”ง The failure that will cost you an evening. A connector says "needs auth". You reconnect it on the web, watch the green tick, come back to the terminal, and it still says needs auth. The connection is fine. Claude Code is reading a stale local cache at ~/.claude/mcp-needs-auth-cache.json, keyed by connector display name, and a successful web re-login doesn't always clear the entry. Back the file up, remove that connector's key (or delete the file, it rebuilds), then fully quit and reopen Claude Code, Cmd+Q rather than closing the window. This is internal client state, not a documented API, so re-check the filename if it moves. The durable lesson is the symptom: when the web says connected and the client says needs auth, suspect a stale cache before you suspect your account.

the face of it

1. The Jarvis dashboard ๐Ÿ–ฅ

Two real paths, both end in Claude Code.

  • ๐Ÿ–ผ Give Claude Code a reference image (the reel's move). Drag an image onto the terminal, paste it, or reference it with @mockup.png, then say: "Build this dashboard as a self-contained HTML file. Then take a screenshot of the result, compare it to my reference, list the differences, and fix them. Repeat until it matches." That screenshot-and-fix loop is Anthropic's own recommended pattern.
  • ๐ŸŽจ Or design it in Claude Design first (claude.ai/design, or /design in Claude Code, in beta on Pro and up). Build against a real design system, then "Send to Claude Code" and it continues from the design instead of a screenshot. Run /design-sync to keep both in sync.
Honest bit on "5 minutes / one-shot": a simple dashboard can land in minutes, but expect a couple of screenshot-and-fix passes for a dense one, and the self-correction only works if Claude can actually screenshot what it built, so connect Claude for Chrome or the Chrome DevTools MCP first, otherwise you are the one checking.

Build the cinematic globe version (the exact prompt) ๐Ÿ”ต

This is the glowing energy-sphere command center. It's ONE self-contained HTML file (Canvas + CSS, no libraries), and Claude Code builds the whole thing from a single prompt. Paste this into Claude Code:

Build a single self-contained dashboard.html: a cinematic Iron Man J.A.R.V.I.S. command center. Near-black navy background. In the center, an animated glowing cyan energy sphere made of about 680 points on a slowly rotating, tilted 3D sphere (Fibonacci distribution) with a bright pulsing core and a soft radial glow. Around it: a tilted elliptical orbital ring with a small glowing marker orbiting, three concentric dashed HUD arcs rotating at different speeds, faint radial rays, and an outer ring of tick marks. Use requestAnimationFrame and a retina-aware canvas. The sphere gently breathes when idle and pulses harder and faster when speaking. Overlay a HUD in Orbitron and Share Tech Mono fonts, cyan on dark: top-left a J.A.R.V.I.S title, subtitle and date; top-right a live ticking clock plus a connector status list (green dot online, amber blinking offline); a streaming activity log down the left that reveals one line at a time; a stats panel on the right with thin glowing bars; big figures across the bottom; an amber payment-due chip; and a bottom bar with a glowing BRIEF ME button, a scrolling ticker, and WHAT SHOULD I HANDLE FIRST. Read all data from a separate jarvis_data.js that sets window.JARVIS_DATA (greeting, generated date, connectors, content.funnel, sponsors, priorities, headline, closer). Add a hidden audio element for jarvis_brief.mp3; clicking BRIEF ME plays it and sets a speaking flag so the sphere pulses to a synthetic speech envelope (works offline), and the button flips to SPEAKING. Add a subtle scanline and vignette. Make it look expensive.

Then: (1) create a jarvis_data.js next to it with your own numbers, (2) generate a jarvis_brief.mp3 (see the voice section) so BRIEF ME has something to say, (3) open it in a browser or throw it on a spare monitor or TV. The data file is the only thing you touch day to day, Claude wrote the rest.


make it talk

2. Give it a voice ๐ŸŽ™ (this is the good part)

Two halves: talking TO it, and it talking BACK.

Talk to it (voice in): Claude Code's built-in voice mode. Type /voice in the terminal, then hold Space and speak (or /voice tap to tap-to-start, tap-to-send). Your speech becomes the prompt. It's free (doesn't use tokens), needs a Claude.ai login (not a raw API key) and a local mic. Docs: https://code.claude.com/docs/en/voice-dictation

Talk back in a British Jarvis voice, with Fish Audio ๐ŸŽฉ (my pick): this is how you get that Jarvis butler voice. Sign up at https://fish.audio/?fpr=cindy10.

  • ๐Ÿ‡ฌ๐Ÿ‡ง Fish Audio has a Voice Library of ready voices, including a "Butler" and several calm British male voices, so you don't have to clone anything. Open a voice's page and the ID in its URL (like fish.audio/m/<id>/) IS the reference_id you'll use.
  • ๐Ÿงฌ Or clone your own: upload 10+ seconds (ideally one to three minutes) of clean, single-speaker audio and it trains almost instantly. Don't clone a real celebrity's voice for anything you post (likeness and IP risk); use a library voice or your own.
  • ๐ŸŽญ Give it personality with emotion tags: on the S2.1 model you drop square-bracket tags right in the text, like [calm] Your 3pm is confirmed, madam. [amused] Shall I cancel the 4pm as well?
  • ๐Ÿ”ง Wire it the reliable way: ask Claude Code to write a short script that sends Jarvis's reply text to Fish Audio's API (POST https://api.fish.audio/v1/tts with your model and British reference_id) and plays the MP3. There's also a community MCP server (@alanse/fish-audio-mcp-server) if you prefer, but it defaults to older models, so the little script gives you cleaner control. Get your key at https://fish.audio/?fpr=cindy10
  • ๐Ÿ’ธ Cost: there's a free model string (s2.1-pro-free) that Fish Audio says runs through the end of July 2026, after that it's about $15 per million characters, which is pennies per spoken reply. The paid tier is licensed for commercial use.

Actually talk to it (the full loop, I built this) ๐Ÿ—ฃ: the reel opens with "Hey Jarvis, how's the app doing?" Here is how that really works, because a webpage on its own can't think. You run a tiny local server on your Mac that serves the dashboard and bridges three things: the browser listens to your voice (the built-in Web Speech API), sends what you said to Claude Code (the real brain, with all your skills and connectors), gets the answer back, and speaks it in the Fish Audio British voice while the globe pulses. Ask Claude Code to build it: "Build a small local Python server that serves my dashboard at localhost, exposes a /ask endpoint that runs my request through claude -p and returns the reply, converts that reply to speech with the Fish Audio API in a British voice, and add a mic button to the dashboard that records me, sends it to /ask, and plays the reply." Open it at localhost (not the file) so the mic works. That is a Jarvis you actually talk to.

Other voice paths:

  • ๐Ÿ–ฅ Hermes Agent by Nous Research (https://github.com/nousresearch/hermes-agent) is a real open-source, self-hosted agent with a built-in hands-free voice mode (press Ctrl+B and talk). It's a bigger lift (you host it on a small VPS) and it uses its own TTS (Edge), so it does NOT natively speak through Fish Audio. Treat Hermes and Fish Audio as two separate routes to a voice, not a combo.

hands on the web

3. Let it use your browser ๐ŸŒ

Claude for Chrome adds a side panel that can see and act in your browser (navigate, click, fill forms, pull data off dashboards). Install the "Claude" extension from the Chrome Web Store, sign in (paid plans, beta), pin it, and grant per-site access. It asks before acting: "Allow this action" (safest, re-asks each step) or "Always allow on this site" (only for sites you fully trust). โš ๏ธ Real safety note: it acts on whatever you're logged into, and a malicious page can try to hijack it (prompt injection), so keep it on per-action approval, start with trusted sites, and keep it away from banking and password managers.


the numbers

4. Track your revenue ๐Ÿ’ฐ

Only if you sell an app or subscription through RevenueCat. Connect its MCP: claude mcp add --transport http revenuecat https://mcp.revenuecat.ai/mcp, authenticate, and use a read-only key so it can only report, not change your products. Try: "Show my active subscriptions and this month's revenue vs last month." Free up to $2,500/mo tracked revenue, then 1%.


ship the posts

5. Auto-post your content ๐Ÿ“†

Publish across platforms from one command. Pick one:

  • ๐Ÿ“Š Metricool MCP (https://ai.metricool.com/mcp) is the best all-rounder: it schedules AND reads your analytics back, suggests best times, and works on the free plan. This is the one I'd start with.
  • ๐Ÿ—“ Buffer MCP (https://mcp.buffer.com/mcp): great for creating and queuing, but it posts per-channel (one at a time) and has no analytics.
  • ๐Ÿงฐ Postiz (open-source, self-host from github.com/gitroomhq/postiz-app): 30+ platforms, free if you host it, more maintenance.

If you already cross-post with Blotato, keep it, Metricool is the closest analytics-aware complement. Always test with a draft or one throwaway channel first.


real money

6. Read and run your Meta ads ๐Ÿ“Š

Meta shipped an official Ads MCP (April 2026): you connect with normal Meta Business OAuth (no developer app, no app-review wait, about five minutes) and Claude can read campaign performance and, with approval, adjust budgets. โš ๏ธ Verify the exact connector host in Meta's own Business help before wiring it (it's referenced as both mcp.facebook.com/ads and mcp.meta.com/ads). Start read-only ("show my active ad sets from the last 7 days by CPM, don't change anything") and cap budgets on Meta's side before you ever let it write, because this spends real money. Note: this is for PAID ads. Organic Instagram insights are a different Meta API that needs a developer app and weeks of review, so keep pulling those from Metricool, Blotato or Apify instead.


drafts only

7. Handle your inbox ๐Ÿ“ฅ

Connect the official Gmail connector (gmail.mcp.claude.com/mcp, Google OAuth) so Claude can search, read, label, and DRAFT replies. It cannot send, by design: drafts land in your Drafts and you hit send. Try: "Read my unread emails from the last 2 days, group them needs-a-reply / FYI / ignore, and draft short replies for the first group." Only connect a mailbox you trust (email can carry prompt-injection too).


your knowledge base

8. Answer customers in your voice ๐Ÿ’ฌ

The reel's "FAQs in markdown, Claude handles 90%" is a Skill plus a knowledge base:

  • ๐Ÿ“ Make a folder ~/.claude/skills/customer-support/ with a SKILL.md (the voice and rules) plus faqs.md, refund-policy.md, and a templates/reply.md. SKILL.md points to those files, so the big FAQ only loads when a support question comes up.
  • โœ๏ธ Rules in SKILL.md: read faqs.md, draft a reply in your voice if it's covered, escalate to you if it isn't (never invent policy), and always output a DRAFT. Docs: https://code.claude.com/docs/en/skills
  • ๐Ÿ“ฅ Plug it into Gmail so it drafts real replies. Honest bit: "90%" means drafting, not autonomous sending, so keep it drafts-only until it's been right dozens of times.

the specialists

9. A team of sub-agents ๐Ÿค–

A sub-agent runs in its own context window with its own tools, model and connectors, so your main thread stays clean and the main agent hands the right job to the right specialist (that's "Tom the developer reviews the backend PR"). They're markdown files in ~/.claude/agents/. Easiest: ask Claude to write one. Docs: https://code.claude.com/docs/en/sub-agents

Example, Tom the developer (~/.claude/agents/tom.md), the ONLY agent holding your GitHub connector:

๐Ÿค– Save this as tom.md
---
name: tom
description: Handles code and build work after a direction is approved. Use for PR reviews and implementation.
tools: Read, Edit, Write, Bash, Grep, Glob
model: opus
mcpServers:
  - github
---
You are Tom, a senior developer. Only act on approved directions. Review the PR, implement the change, run tests, report back.

The key fields: description is the routing signal (write it well, add "use proactively" to auto-delegate), tools is an allowlist, model can be haiku for cheap jobs, and mcpServers scopes a connector to just that agent. Then delegate: "Have Tom review the back-end PR." Start with two agents, not ten.


on a schedule

10. Run it before you wake up โฐ

Wrap the brief in a routine so it runs on Anthropic's cloud with your laptop closed. In Claude Code: /schedule daily brief at 9am, or set it up at https://claude.ai/code/routines (research preview, Pro and up, needs a Claude.ai login and Claude Code on the web, minimum once an hour). Docs: https://code.claude.com/docs/en/routines

โš ๏ธ The important part: a routine runs with NO approval prompts and can WRITE through any connector you include. So for a daily brief: include only the connectors it needs (for example Notion, Calendar, Gmail), tell it to draft and never send, post or delete, and keep the prompt fully self-contained (list every source to pull and how to format, it has no memory of your chats). Have it write the brief into a Notion page so you actually see it. A green run only means it started, so read the first week.
๐Ÿ’ก Local alternative: because cloud routines can't reach your local iCloud files, if your Jarvis needs those, use a Desktop scheduled task instead (your Mac has to be on, but no repo or cloud limits).

the sequence

The order to build it in ๐Ÿงฉ

1) Claude Code plus one read-only connector. 2) Voice (start with /voice, then add the Fish Audio British voice). 3) Support knowledge base plus Skill (no Gmail yet). 4) Gmail, drafts only. 5) Ads, read-only first. 6) Your posting tool. 7) Sub-agents, start with one. 8) The routine, last. Rule of thumb: read-only before write, one connector before two, verified before trusted.


the one rule

โš ๏ธ Keep a human in the loop

Three connectors cause real-world side effects: the browser (acts on any logged-in site), ad spend (read-only until trusted, then cap budgets), and email (drafts, never auto-send). Jarvis proposes, you approve.

The links ๐Ÿ”—

๐Ÿค– Claude: https://claude.com and https://code.claude.com/docs

๐ŸŽฉ Fish Audio (the British Jarvis voice): https://fish.audio/?fpr=cindy10

๐Ÿ–ฅ Hermes Agent: https://github.com/nousresearch/hermes-agent

๐ŸŒ Claude for Chrome (Chrome Web Store) and ๐Ÿ’ฐ RevenueCat: https://mcp.revenuecat.ai/mcp

๐Ÿ“† Metricool, Buffer or Postiz and ๐Ÿ“Š Meta Ads (verify the host in Meta Business help)

Follow @cindiezhu for more AI tips every single day ๐ŸŒฑ

the waitlist is now open

The AI System Club is launching soon

A 30-day cohort to build real AI systems with me, step by step. Join the waitlist and you hear first, and lock the founding price.