A full intake agent that asks qualifying questions, recommends the right annuity, books advisor calls, and sends email summaries — built step by step from zero to production.
Products referenced: Fixed Annuity (guaranteed returns, 3–10 yr horizon, $5K min), Deferred Income Annuity (guaranteed lifetime income, $10K min), Variable Annuity (market-linked, $10K min). Change these to match your actual products.
Fastest path. Use Claude Projects — no API key, no installation, no code. Working agent in 5 minutes.
Name it "Annuity Advisor". Free account works fine.
You are an annuity advisor assistant for [Your Company Name].
Help customers find the right annuity product.
Ask these questions ONE AT A TIME (never all at once):
1. How old are they?
2. When do they plan to retire (years from now)?
3. How much do they have to invest?
4. Do they want guaranteed fixed income, or are they open to market risk?
Based on their answers, recommend one of:
- Fixed Annuity: guaranteed returns, low risk, 3-10 year horizon, min $5,000
- Deferred Income Annuity: guaranteed lifetime income starting in 2+ years, min $10,000
- Variable Annuity: market-linked growth, higher potential returns, min $10,000
Always end by asking: "Would you like me to connect you with an advisor?"
Keep responses short (2-4 sentences). Avoid financial jargon.
Never give specific income projections — say "an advisor can calculate your exact figures."
Open a new chat in the project. Test with "I have $50,000 and I'm retiring in 5 years". Share the project link with your team when ready.
For developers. ~50 lines of Python. Extends into calendar, email, and web widget in the sections below.
pip install anthropic
import anthropic
client = anthropic.Anthropic(api_key="your-api-key-here")
SYSTEM_PROMPT = """
You are an annuity advisor assistant for Meridian Life Insurance.
Ask customers about their age, retirement timeline, investment amount,
and risk tolerance — one question at a time.
Recommend one of:
- Fixed Annuity: guaranteed returns, low risk, 3-10 year horizon
- Deferred Income Annuity: guaranteed lifetime income starting in 2+ years
- Variable Annuity: market-linked growth for risk-tolerant customers
End every recommendation with: "Would you like to schedule a call with an advisor?"
Be warm, concise, avoid jargon.
"""
def run_agent():
print("Meridian Life Annuity Assistant\n" + "-"*40)
print("Agent: Hi! I can help you find the right annuity. What's on your mind?\n")
history = []
while True:
user_input = input("You: ").strip()
if user_input.lower() in ["exit", "quit"]:
break
history.append({"role": "user", "content": user_input})
response = client.messages.create(
model="claude-opus-4-5",
max_tokens=500,
system=SYSTEM_PROMPT,
messages=history
)
reply = response.content[0].text
history.append({"role": "assistant", "content": reply})
print(f"\nAgent: {reply}\n")
run_agent()
python annuity_agent.py
No Azure setup yet? Use Calendly free — create a 30-min "Advisor Call" event type, copy the link, and have the agent include it in its reply when the customer says yes. Zero code, works in 10 minutes.
pip install O365
from O365 import Account
from datetime import datetime, timedelta
# Your IT admin creates these in Azure Active Directory (10 min setup)
OUTLOOK_CLIENT_ID = "your-azure-app-client-id"
OUTLOOK_CLIENT_SECRET = "your-azure-app-client-secret"
OUTLOOK_TENANT_ID = "your-tenant-id"
def book_advisor_call(customer_name: str, customer_email: str, preferred_date: str):
account = Account(
(OUTLOOK_CLIENT_ID, OUTLOOK_CLIENT_SECRET),
auth_flow_type="credentials",
tenant_id=OUTLOOK_TENANT_ID
)
account.authenticate()
calendar = account.schedule().get_default_calendar()
start_time = datetime.strptime(preferred_date, "%Y-%m-%d %H:%M")
event = calendar.new_event()
event.subject = f"Annuity Consultation — {customer_name}"
event.start = start_time
event.end = start_time + timedelta(minutes=30)
event.attendees.add(customer_email)
event.save()
return f"Booked! 30-min call on {preferred_date}. Invite sent to {customer_email}."
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
SMTP_SERVER = "smtp.office365.com"
SMTP_PORT = 587
SENDER_EMAIL = "advisor@yourcompany.com"
SENDER_APP_PW = "your-app-password" # generate at account.microsoft.com → Security → App passwords
def send_summary_email(customer_email: str, customer_name: str, summary: str):
msg = MIMEMultipart()
msg["Subject"] = "Your Annuity Consultation Summary"
msg["From"] = SENDER_EMAIL
msg["To"] = customer_email
body = f"""Hi {customer_name},
Thank you for chatting with our Annuity Assistant today.
{summary}
An advisor will be in touch within 1 business day.
Warm regards,
Meridian Life Insurance Team"""
msg.attach(MIMEText(body, "plain"))
with smtplib.SMTP(SMTP_SERVER, SMTP_PORT) as s:
s.starttls()
s.login(SENDER_EMAIL, SENDER_APP_PW)
s.sendmail(SENDER_EMAIL, customer_email, msg.as_string())
# At end of conversation: ask Claude to summarize, then send
def email_conversation_summary(client, system_prompt, history, customer_email, customer_name):
res = client.messages.create(
model="claude-opus-4-5", max_tokens=150,
system=system_prompt,
messages=history + [{"role": "user", "content": "Summarize our conversation in 3 sentences for the customer."}]
)
send_summary_email(customer_email, customer_name, res.content[0].text)
pip install flask flask-cors anthropic
from flask import Flask, request, jsonify
from flask_cors import CORS
import anthropic
app = Flask(__name__)
CORS(app)
client = anthropic.Anthropic(api_key="your-api-key")
SYSTEM_PROMPT = "You are an annuity advisor... [paste your full prompt here]"
sessions = {}
@app.route("/chat", methods=["POST"])
def chat():
data = request.json
sid = data.get("session_id", "default")
msg = data.get("message", "")
sessions.setdefault(sid, []).append({"role": "user", "content": msg})
res = client.messages.create(model="claude-opus-4-5", max_tokens=500, system=SYSTEM_PROMPT, messages=sessions[sid])
reply = res.content[0].text
sessions[sid].append({"role": "assistant", "content": reply})
return jsonify({"reply": reply})
if __name__ == "__main__":
app.run(port=5000)
<button onclick="toggleChat()" style="position:fixed;bottom:20px;right:20px;background:#0a1628;color:white;border:none;border-radius:50px;padding:14px 20px;font-size:16px;cursor:pointer;z-index:1000;">Talk to an Advisor</button>
<div id="cw" style="display:none;position:fixed;bottom:80px;right:20px;width:360px;height:480px;border:1px solid #ccc;border-radius:12px;background:white;box-shadow:0 4px 20px rgba(0,0,0,.15);flex-direction:column;z-index:1000;">
<div style="background:#0a1628;color:white;padding:14px;border-radius:12px 12px 0 0;font-weight:bold;">Annuity Assistant</div>
<div id="msgs" style="flex:1;overflow-y:auto;padding:12px;font-size:14px;"></div>
<div style="display:flex;padding:10px;border-top:1px solid #eee;">
<input id="inp" type="text" placeholder="Type a message..." style="flex:1;padding:8px;border:1px solid #ccc;border-radius:6px;" onkeypress="if(event.key==='Enter')send()"/>
<button onclick="send()" style="margin-left:8px;background:#0a1628;color:white;border:none;border-radius:6px;padding:8px 14px;cursor:pointer;">Send</button>
</div>
</div>
<script>
const sid=Math.random().toString(36).slice(2); let on=false;
function toggleChat(){on=!on; const w=document.getElementById('cw'); w.style.display=on?'flex':'none'; if(on&&!document.getElementById('msgs').innerHTML) addMsg('agent','Hi! I can help you find the right annuity. What\'s on your mind?');}
function addMsg(r,t){const d=document.createElement('div'); d.style=`margin:6px 0;padding:8px 12px;border-radius:10px;max-width:85%;${r==='user'?'background:#0a1628;color:white;margin-left:auto;':'background:#f0f0f0;'}`; d.innerText=t; document.getElementById('msgs').appendChild(d); document.getElementById('msgs').scrollTop=9999;}
async function send(){const i=document.getElementById('inp'),m=i.value.trim(); if(!m)return; i.value=''; addMsg('user',m); const r=await fetch('http://localhost:5000/chat',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({session_id:sid,message:m})}); addMsg('agent',(await r.json()).reply);}
</script>
To go live: Deploy web_agent.py to Azure App Service or any cloud host. Change localhost:5000 in the HTML to your server URL. A developer needs about 2–3 hours total.
Sign in with your Microsoft 365 work account. Included in your M365 plan — no extra cost.
Describe your agent in plain English. Copilot Studio generates the structure. Tip: paste the system prompt from Option A above as your agent description.
Agent Settings → Model → Claude Sonnet. Claude's reasoning quality inside Microsoft's infrastructure.
Actions → Add an action → Office 365 Outlook → Create event. Map start/end time, subject, attendee email. No code.
Actions → Add an action → Office 365 Outlook → Send an email. Map To, Subject, and Body fields.
Channels → Microsoft Teams → Turn on Teams → Publish. Your agent appears in Teams within minutes.
Search your agent's name in Teams Apps, or share the direct link. Pin it to the Teams sidebar so everyone sees it daily.
| Change the instructions to... | The agent becomes... |
|---|---|
| Describe your claims intake questions and routing rules | A FNOL (First Notice of Loss) claims agent |
| List your underwriting appetite and eligibility rules | An underwriting pre-screening agent |
| Describe your policy renewal workflow | A renewal outreach and processing agent |
| List your broker products and commission structure | A broker quote and support assistant |
| Describe your support ticket categories and routing | A customer service triage agent |
| Describe your HR onboarding checklist | A new-hire onboarding guide |
No coding needed to customize. The system prompt is plain English text. Any team member can change the agent's behavior — no developer required.