I’ve always wanted my own assistant, like JARVIS from Iron Man. Every year we get closer to JARVIS being possible, but we’re not there yet. Let me show you a simple workflow to create your own agentic AI. What's “agentic”? It runs in a loop, running tools and calling APIs, until it solves the task you gave it.
MCPs suck (for now)
There’s a lot of hype on X about MCPs, aka Anthropic’s Model Context Protocol. MCPs are servers that provide tools for AI assistants. These tools let the AI take actions such as browsing the internet, controlling your computer, or communicating with apps (e.g. Asana, Slack, Stripe) and even other AIs.
You can use them in Claude Desktop, Raycast, VS Code, and many other clients. People have made thousands of MCPs. There’s only one problem though… they’re frustrating to use!
Using MCPs in Claude Desktop requires editing claude_desktop_config.json
. Raycast does it better, providing a keyboard-first polished UI for adding MCP.
If the MCP server starts (big if, most of them are buggy) and if it wasn’t malware (nobody verifies the published packages), then when you try to use it Claude Desktop and Raycast will ask you to confirm every. single. tool. call. Ugh!
Introducing Claude Code
Claude Code is a CLI tool released by Anthropic earlier this year. It runs Claude Sonnet 4 in your terminal, it’s able to download web pages, and it can read your filesystem (with permission, of course).
At Molin AI we’ve adopted Claude Code and found that the more thorough our README, the more Claude helps us. The ROI on our 50k character README is pretty impressive! It can even automate the last mile of human processes, such as managing releases or debugging a customer’s website — see Claude Code does our releases now.
Set up your own Claude
Let’s get started.
First, you need to install Claude Code. These instructions are for macOS, ask your nearest LLM for the equivalent for your OS (more info in the Anthropic docs).
❯ brew install node # install node.js
❯ npm install -g @anthropic-ai/claude-code # install Claude Code
Now we can set up the project. We need a new folder and a single file — our instructions to Claude Code.
❯ mkdir ~/jarvis
❯ cd ~/jarvis
❯ touch CLAUDE.md # just a *touch* of magic
CLAUDE.md
is the same as your typical README.md
, but if you call it CLAUDE.md
then Claude Code will read it and follow it automatically, without you mentioning it.
Now fire up your favourite text editor:
❯ code ~/jarvis/CLAUDE.md
# or
❯ vim ~/jarvis/CLAUDE.md
And paste in this basic template as a starting point:
# Claude
## uv
When I need you to run Python scripts or commands, use `uv`. It can be installed with:
`curl -LsSf https://astral.sh/uv/install.sh | sh`
Run CLI tools without an explicit installation step: `uvx <cli_tool_name> ...`.
Run Python scripts without setting up a Python environment: `uv run --with '<pkg_name>' ...`.
## Retrieve YouTube video transcript
When you need to summarize a YouTube video,
use the `youtube_transcript_api` library to fetch the transcript:
`uvx youtube_transcript_api pGgpGP3swmE`
Make sure to pass only the video ID, not the full URL.
Then start Claude Code and ask it to download your favourite podcast from YouTube:
❯ claude
╭───────────────────────────────────────────────────╮
│ ✻ Welcome to Claude Code! │
╰───────────────────────────────────────────────────╯
> summarize the transcript for https://www.youtube.com/watch?v=chfj7RHA5vM
⏺ I'll extract the video ID and get the transcript to summarize it for you.
⏺ Bash(uvx youtube_transcript_api chfj7RHA5vM)…
⎿ [[{'duration': 4.96,
'start': 0.919,
… +930 lines (ctrl+r to expand)
'text': "are not just uh in insecure they're"},
{'duration': 3.0, 'start': 891.56, 'text': 'insecure'}]]
⏺ This is a podcast transcript discussing AI safety concerns, particularly focusing on:
- AI Deception Capabilities
- Jailbreaking AI Systems
- Biological Weapons Concerns
- Open vs Closed AI Models
[redacted]
And there you go! A self-contained, simple, human readable way to program and personalize Claude for your workflow — if it can be done from the command line, Claude can do it for you.
Make it better
Here are a few more things I’ve taught my Claude to do for me.
I use Things as my to-do list manager. Say I want to see the tasks I did yesterday. I know there’s a Python library that I can use, but I’m too lazy to figure out how. I’ll just tell Claude to read the docs for things.py, et voilà:
## Retrieve my to-do list from Things
Fetch this webpage: https://thingsapi.github.io/things.py/things/api.html
When I ask for data from the Things macOS app, use `uv` scripts and the `things.py` library.
> show my todos (in Things app, not Claude Code built-in todo list) from yesterday
⏺ I'll fetch your to-do list from yesterday using the Things app API.
Let me start by getting the API documentation and then retrieve your todos.
⏺ Fetch(https://thingsapi.github.io/things.py/things/api.html)…
⎿ Received 339.8KB (200 OK)
⏺ Now let me retrieve your todos from yesterday using the Things API:
⏺ Bash(uv run --with 'things.py' python3 -c "…
import things
… (ctrl+r to expand))
⎿ Fetching todos from 2025-05-30...
⏺ Your todos from yesterday (May 30, 2025):
○ Write blog post "Connect AI to your own apps"
- Status: Not completed
- Project: A98JYe99M1gPXHhAwj7cYZ
- Start Date: 2025-05-30
[redacted]
Note: Claude might need a few attempts before it gets the script right. Follow along for a fix.
Handling secrets
Say you want Claude to make authenticated curl
requests for you, sending an API key. If it’s not super sensitive, you can just paste the API key in CLAUDE.md
. More securely, export an env var in your dotfiles (e.g. ~/.zshrc
).
## Save to Instapaper
I have created my own version of Instapaper. You can save articles there like this:
curl -X POST 'https://instapaper.aluxian.com/save' \
-H "CF-Access-Client-Id: $INSTAPAPER_CF_ACCESS_CLIENT_ID" \
-H "CF-Access-Client-Secret: $INSTAPAPER_CF_ACCESS_CLIENT_SECRET" \
-H 'Content-Type: application/json' \
-d '{
"content": "This is the HTML content of the article I want to save.",
"title": "The title of the webpage if you know it already",
"url": "https://website.com/any/url"
}'
You should expect the env vars to be set already.
Now Claude will use curl
without “seeing” (i.e. leaking) your API key.
Self-healing and memory
Claude often messes up a command and tries a few times. Here’s a task that's challenging to get right the first time:
## Use my Safari browser for me
You are allowed to use CLI commands to control my Safari browser.
For example, you can create new tabs, navigate, get page contents, etc.
## X (formerly Twitter)
If I ask you to retrieve data for my account on X, you should use Safari
(because I am likely already logged in).
### Retrieve likes
To retrieve my X likes, navigate to my likes page (https://x.com/aluxian/likes)
and then get the page contents from Safari.
Note: Safari by default does not allow programmatic access. You need to enable Safari’s developer mode and Allow JavaScript:
Let’s try it:
> retrieve my X likes from this week
⏺ I'll retrieve your X likes from this week using Safari.
Let me navigate to your likes page and extract the data.
⏺ Bash(osascript -e 'tell application "Safari" …
make new document with properties {URL:"https://x.com/aluxian/likes"}
… (ctrl+r to expand))
⎿ (No content)
⏺ Bash(osascript -e 'tell application "Safari" to do JavaScript "…
let tweets = [];
… (ctrl+r to expand))
⎿ []
⏺ Let me wait a bit longer for the page to load and try again:
⏺ Bash(sleep 5 && osascript -e 'tell application "Safari" to do JavaScript "…
let tweets = [];
… (ctrl+r to expand))
⎿ (No content)
⏺ Let me try a different approach and check if we can get the page content:
...
5 attempts later, it was still stuck. Hmmm. I know a trick:
> think harder
✽ Thinking… (6s · ↓ 194 tokens · esc to interrupt)
This magic word increases the thinking budget for the model. Claude created a to-do list and took a more systematic approach, and got me my tweets! However, this was slow. Can we learn from our mistakes?
> think hard - from all your attempts, what did you learn? which one worked best?
update CLAUDE.md with brief instructions so next time you achieve this task in 1 shot
Yes, we can! Just ask Claude to update CLAUDE.md
for you. Self-evolving!
Using this for work work
Similarly, you can adopt Claude Code in your work repo. Teach Claude how your project works, what codebase guidelines to follow, how to automate your manual processes, and you’ll use it much more often.
Privacy
You are trusting Anthropic with your data.
Security
You should keep an eye on each command the LLM runs.
Costs
Well...
> /cost
⎿ Total cost: $1.52
Total duration (API): 8m 48.4s
Total duration (wall): 1h 34m 48.9s
Total code changes: 8 lines added, 2 lines removed
Token usage by model:
claude-3-5-haiku: 138.1k input, 2.2k output, 0 cache read, 0 cache write
claude-sonnet: 91 input, 10.8k output, 1.1m cache read, 239.1k cache write
What’s next
I wish I could access this from my phone, but I don’t think there’s anything similar out there yet, unless you code your own agentic loop runner (Claude Code) or run a Linux VM (emulated).
Anthropic did an outstanding job with the terminal UX, but sometimes you want a real UI. That’s when I turn to ChatGPT or Raycast.
You can see my CLAUDE.md. It's constantly evolving as I connect more apps: Oura, Apple Music, Strava, MyFitnessPal, GitHub, Slack, and many others.