mirror of
https://github.com/PrefectHQ/fastmcp.git
synced 2026-08-23 22:14:18 +02:00
243 lines
7.7 KiB
Python
243 lines
7.7 KiB
Python
from typing import TypedDict
|
|
|
|
from prefab_ui.components import (
|
|
Card,
|
|
CardContent,
|
|
Column,
|
|
Grid,
|
|
Heading,
|
|
Metric,
|
|
Muted,
|
|
Row,
|
|
Separator,
|
|
Text,
|
|
)
|
|
from prefab_ui.components.charts import AreaChart, ChartSeries, PieChart
|
|
from prefab_ui.components.data_table import DataTable, DataTableColumn
|
|
|
|
from fastmcp import FastMCP
|
|
|
|
mcp = FastMCP("Sales Dashboard")
|
|
|
|
|
|
class MonthlyRevenue(TypedDict):
|
|
month: str
|
|
new_business: int
|
|
expansion: int
|
|
renewal: int
|
|
|
|
|
|
MONTHLY_REVENUE: list[MonthlyRevenue] = [
|
|
{"month": "Jul", "new_business": 182_000, "expansion": 74_000, "renewal": 210_000},
|
|
{"month": "Aug", "new_business": 195_000, "expansion": 81_000, "renewal": 215_000},
|
|
{"month": "Sep", "new_business": 224_000, "expansion": 93_000, "renewal": 208_000},
|
|
{"month": "Oct", "new_business": 210_000, "expansion": 88_000, "renewal": 222_000},
|
|
{"month": "Nov", "new_business": 248_000, "expansion": 102_000, "renewal": 230_000},
|
|
{"month": "Dec", "new_business": 271_000, "expansion": 115_000, "renewal": 238_000},
|
|
{"month": "Jan", "new_business": 235_000, "expansion": 97_000, "renewal": 241_000},
|
|
{"month": "Feb", "new_business": 262_000, "expansion": 108_000, "renewal": 245_000},
|
|
{"month": "Mar", "new_business": 289_000, "expansion": 121_000, "renewal": 252_000},
|
|
{"month": "Apr", "new_business": 305_000, "expansion": 134_000, "renewal": 258_000},
|
|
{"month": "May", "new_business": 318_000, "expansion": 142_000, "renewal": 263_000},
|
|
{"month": "Jun", "new_business": 342_000, "expansion": 156_000, "renewal": 270_000},
|
|
]
|
|
|
|
REVENUE_BY_SEGMENT = [
|
|
{"segment": "Enterprise", "revenue": 3_840_000},
|
|
{"segment": "Mid-Market", "revenue": 2_160_000},
|
|
{"segment": "SMB", "revenue": 1_440_000},
|
|
{"segment": "Startup", "revenue": 720_000},
|
|
]
|
|
|
|
RECENT_DEALS = [
|
|
{
|
|
"company": "Meridian Health Systems",
|
|
"amount": "$485,000",
|
|
"stage": "Closed Won",
|
|
"rep": "Sarah Chen",
|
|
"close_date": "Jun 12, 2026",
|
|
},
|
|
{
|
|
"company": "Atlas Financial Group",
|
|
"amount": "$372,000",
|
|
"stage": "Closed Won",
|
|
"rep": "Marcus Rivera",
|
|
"close_date": "Jun 10, 2026",
|
|
},
|
|
{
|
|
"company": "Pinnacle Manufacturing",
|
|
"amount": "$298,000",
|
|
"stage": "Negotiation",
|
|
"rep": "Aisha Patel",
|
|
"close_date": "Jun 28, 2026",
|
|
},
|
|
{
|
|
"company": "Crestview Logistics",
|
|
"amount": "$264,000",
|
|
"stage": "Proposal Sent",
|
|
"rep": "James O'Brien",
|
|
"close_date": "Jul 5, 2026",
|
|
},
|
|
{
|
|
"company": "Northstar Retail",
|
|
"amount": "$215,000",
|
|
"stage": "Closed Won",
|
|
"rep": "Sarah Chen",
|
|
"close_date": "Jun 8, 2026",
|
|
},
|
|
{
|
|
"company": "Ironclad Security",
|
|
"amount": "$189,000",
|
|
"stage": "Negotiation",
|
|
"rep": "Lena Kowalski",
|
|
"close_date": "Jul 1, 2026",
|
|
},
|
|
{
|
|
"company": "Summit Analytics",
|
|
"amount": "$176,000",
|
|
"stage": "Closed Won",
|
|
"rep": "Marcus Rivera",
|
|
"close_date": "Jun 5, 2026",
|
|
},
|
|
{
|
|
"company": "Brightpath Education",
|
|
"amount": "$142,000",
|
|
"stage": "Proposal Sent",
|
|
"rep": "Aisha Patel",
|
|
"close_date": "Jul 12, 2026",
|
|
},
|
|
{
|
|
"company": "Vantage Media",
|
|
"amount": "$128,000",
|
|
"stage": "Closed Won",
|
|
"rep": "Lena Kowalski",
|
|
"close_date": "Jun 3, 2026",
|
|
},
|
|
{
|
|
"company": "Redwood Hospitality",
|
|
"amount": "$97,000",
|
|
"stage": "Discovery",
|
|
"rep": "James O'Brien",
|
|
"close_date": "Jul 20, 2026",
|
|
},
|
|
]
|
|
|
|
|
|
@mcp.tool(app=True)
|
|
def sales_dashboard() -> Column:
|
|
"""Company sales dashboard with KPIs, revenue trends, segment breakdown, and recent deals."""
|
|
total_revenue = sum(
|
|
row["new_business"] + row["expansion"] + row["renewal"]
|
|
for row in MONTHLY_REVENUE
|
|
)
|
|
current_quarter = sum(
|
|
row["new_business"] + row["expansion"] + row["renewal"]
|
|
for row in MONTHLY_REVENUE[-3:]
|
|
)
|
|
prior_quarter = sum(
|
|
row["new_business"] + row["expansion"] + row["renewal"]
|
|
for row in MONTHLY_REVENUE[-6:-3]
|
|
)
|
|
growth_pct = (current_quarter - prior_quarter) / prior_quarter * 100
|
|
|
|
with Column(gap=6, css_class="p-6") as view:
|
|
with Row(gap=2, align="center"):
|
|
Heading("Sales Dashboard")
|
|
Muted("FY2026 | Last updated Jun 15, 2026")
|
|
|
|
with Grid(columns=4, gap=4):
|
|
with Card():
|
|
with CardContent():
|
|
Metric(
|
|
label="Total Revenue",
|
|
value=f"${total_revenue / 1_000_000:.1f}M",
|
|
delta="+18.2% YoY",
|
|
trend="up",
|
|
)
|
|
|
|
with Card():
|
|
with CardContent():
|
|
Metric(
|
|
label="Quarterly Growth",
|
|
value=f"{growth_pct:.1f}%",
|
|
delta="+3.8pp vs prior",
|
|
trend="up",
|
|
)
|
|
|
|
with Card():
|
|
with CardContent():
|
|
Metric(
|
|
label="Active Customers",
|
|
value="1,847",
|
|
delta="+124 this quarter",
|
|
trend="up",
|
|
)
|
|
|
|
with Card():
|
|
with CardContent():
|
|
Metric(
|
|
label="Avg Deal Size",
|
|
value="$236K",
|
|
delta="+12% vs H1",
|
|
trend="up",
|
|
)
|
|
|
|
with Grid(columns=3, gap=6):
|
|
with Card(css_class="col-span-2"):
|
|
with CardContent():
|
|
Text(
|
|
"Monthly Revenue",
|
|
css_class="text-sm font-medium text-muted-foreground mb-2",
|
|
)
|
|
AreaChart(
|
|
data=MONTHLY_REVENUE,
|
|
series=[
|
|
ChartSeries(data_key="new_business", label="New Business"),
|
|
ChartSeries(data_key="expansion", label="Expansion"),
|
|
ChartSeries(data_key="renewal", label="Renewal"),
|
|
],
|
|
x_axis="month",
|
|
stacked=True,
|
|
curve="smooth",
|
|
show_legend=True,
|
|
height=280,
|
|
y_axis_format="compact",
|
|
)
|
|
|
|
with Card():
|
|
with CardContent():
|
|
Text(
|
|
"Revenue by Segment",
|
|
css_class="text-sm font-medium text-muted-foreground mb-2",
|
|
)
|
|
PieChart(
|
|
data=REVENUE_BY_SEGMENT,
|
|
data_key="revenue",
|
|
name_key="segment",
|
|
show_legend=True,
|
|
inner_radius=50,
|
|
height=280,
|
|
)
|
|
|
|
Separator()
|
|
|
|
Text("Recent Deals", css_class="text-lg font-semibold")
|
|
|
|
DataTable(
|
|
columns=[
|
|
DataTableColumn(key="company", header="Company", sortable=True),
|
|
DataTableColumn(key="amount", header="Amount", sortable=True),
|
|
DataTableColumn(key="stage", header="Stage", sortable=True),
|
|
DataTableColumn(key="rep", header="Sales Rep", sortable=True),
|
|
DataTableColumn(key="close_date", header="Close Date", sortable=True),
|
|
],
|
|
rows=RECENT_DEALS,
|
|
search=True,
|
|
paginated=True,
|
|
)
|
|
|
|
return view
|
|
|
|
|
|
if __name__ == "__main__":
|
|
mcp.run()
|