An AI agent that makes your to-do list phone calls
Some calls are easy to put off, whether you need to reschedule a dentist appointment, check on a garage part, or book a table. With Memory Notes, you can say them into your phone when they come to mind. A small agent you build can make the calls for you.
Updated October 29, 2026

How the phone call agent works
Save each call as an ordinary note that starts with "Call":
Call Bright Smile Dental and reschedule my cleaning from the 14th to any morning the following week.
Call Dino's Garage and check whether the Civic's brake pads have arrived.
Once a day, your agent asks Memory Notes for new notes starting with "Call" and chooses which ones it can handle. It makes those calls with an AI voice, then saves what happened as a new note in Memory Notes. You can find the results alongside your other notes.
“Call the dentist…”
A normal voice note, starting with “Call”.
Your agent wakes up
Reads new notes with
list_memories.Twilio places the call
An AI voice asks, books or reschedules.
“Called: booked the 21st”
Saved back with
create_memory.
What you need to build the agent
- Memory Notes stores the to-do. The agent uses
list_memoriesto read it andcreate_memoryto save the outcome. It needs a read & write token. - An LLM such as Claude, GPT or another model makes a call plan from the note, including who to call, the number, what to ask and what counts as done.
- Twilio places the call. The talking is handled by Twilio's ConversationRelay or a realtime voice model connected to a Twilio Media Stream.
- A scheduler runs the agent. You can use a cron job, a GitHub Action or a scheduled Claude Code routine.
A TypeScript sketch for the call agent
This sketch is an outline rather than a finished product. It reads the past day's notes, finds calls and saves a result note. The calling step is where you add Twilio.
import { Client, StreamableHTTPClientTransport } from "@modelcontextprotocol/client";
const notes = new Client({ name: "call-agent", version: "1.0.0" });
await notes.connect(
new StreamableHTTPClientTransport(new URL("https://memorynotes.emodino.com/api/mcp"), {
requestInit: {
headers: { Authorization: `Bearer ${process.env.MEMORY_NOTES_TOKEN}` },
},
}),
);
const since = new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString();
const { structuredContent } = await notes.callTool({
name: "list_memories",
arguments: { since, limit: 100 },
});
const calls = structuredContent.memories.filter((m) =>
m.content.trim().toLowerCase().startsWith("call "),
);
for (const note of calls) {
const plan = await planCall(note.content); // your LLM: number, goal, script
if (!plan.number) continue; // no number? leave it for a human
const outcome = await placeCall(plan); // Twilio + a voice model
await notes.callTool({
name: "create_memory",
arguments: { content: `Called ${plan.who}: ${outcome.summary}` },
});
}Take care with automated phone calls
- Begin with a dry run that saves only the plan and makes no calls, such as "I'd call 555-0142 and ask to move the cleaning to the 21st." Review a week of plans before letting the agent dial.
- Have the voice say at the start that it's an AI assistant calling for you. Many places require this, and recording a call often requires everyone's consent.
- Use it for errands such as bookings, questions and rescheduling. Handle calls involving money, health decisions or arguments yourself.
- An agent can't edit or delete Memory Notes notes. It can keep track of handled notes in its own store or check for its "Called ..." notes.
Memory Notes for iPhone and iPad
Record a note by voice in a second or two, then find it by asking a question. Memory Notes answers from your notes and shows you the one it used. For iPhone and iPad.