"""Industry Benchmarking Tool - Compare company metrics to industry averages."""
import logging
import mcp.types as types
from app.service.mcp_server import mcp
from app.service.data import (
get_naics_code,
normalize_region,
fetch_benchmark_data,
prepare_widget_content,
)
logger = logging.getLogger(__name__)
VIEW_URI = "ui://benchmark/view.html"
@mcp.tool(meta={
# MCP Apps standard (Claude)
"ui": {"resourceUri": VIEW_URI},
# ChatGPT compatibility
"openai/outputTemplate": VIEW_URI,
"openai/widgetAccessible": True,
"openai/toolInvocation/invoking": "Generating industry benchmark comparison...",
"openai/toolInvocation/invoked": "Benchmark comparison complete",
})
def benchmark_comparison(
industry: str = "restaurant",
region: str = "California",
metric: str = "profit",
user_value: float = 45000,
time_period: str = "annual",
) -> types.CallToolResult:
"""Compare company metrics against industry benchmarks.
Args:
industry: Industry name (restaurant, retail, healthcare, construction)
region: Geographic region (California, TX, New York, Florida, National)
metric: Metric to compare: revenue, profit, or margin
user_value: Your company's value for the metric
time_period: Time period: annual, monthly, or quarterly
"""
logger.info(f"📊 Benchmarking: {industry} in {region}, {metric}=${user_value}")
naics_code = get_naics_code(industry)
normalized_region = normalize_region(region)
# Adjust for time period
adjusted_value = user_value
if time_period.lower() == "monthly":
adjusted_value = user_value * 12
elif time_period.lower() == "quarterly":
adjusted_value = user_value * 4
# Fetch benchmark data
regional_avg, national_avg, data = fetch_benchmark_data(
naics_code, normalized_region, metric
)
# Prepare structured content for widget
structured_data = prepare_widget_content(
industry_name=data["industry_name"],
region=normalized_region,
metric=data["metric"],
user_value=adjusted_value,
regional_average=regional_avg,
national_average=national_avg,
time_period=time_period,
)
# Calculate comparison for text
vs_regional = structured_data["vsRegionalPercent"]
comparison = "above" if vs_regional > 0 else "below"
# Text summary for LLM context
text_summary = f"""Industry: {data["industry_name"]}
Region: {normalized_region}
Your {data["metric"]}: ${adjusted_value:,.0f}
Regional Average: ${regional_avg:,.0f}
National Average: ${national_avg:,.0f}
Status: {abs(vs_regional):.1f}% {comparison} regional average"""
logger.info(f"✓ Benchmark result: {abs(vs_regional):.1f}% {comparison} regional")
logger.info(f"📦 structuredContent keys: {list(structured_data.keys())}")
# Return CallToolResult with BOTH text content AND structuredContent
return types.CallToolResult(
content=[types.TextContent(type="text", text=text_summary)],
structuredContent=structured_data,
)
logger.info("✓ Benchmarking tool registered")