/**
* MCP Tool: compute_risk_metrics
*
* Compute risk metrics given an equity curve.
*/
import { z } from "zod";
import { computeRiskMetrics as coreComputeRiskMetrics, RiskMetrics } from "@quant-companion/core";
export const computeRiskMetricsSchema = z.object({
equityCurve: z
.array(z.number().positive())
.min(2)
.describe("Array of portfolio values over time (daily)"),
riskFreeRate: z
.number()
.optional()
.default(0.02)
.describe("Annual risk-free rate (default 0.02 for 2%)"),
});
export type ComputeRiskMetricsInput = z.infer<typeof computeRiskMetricsSchema>;
export interface ComputeRiskMetricsOutput extends RiskMetrics {
totalReturnPercent: number;
annualizedReturnPercent: number;
annualizedVolPercent: number;
maxDrawdownPercent: number;
}
export function computeRiskMetrics(
input: ComputeRiskMetricsInput
): ComputeRiskMetricsOutput {
const result = coreComputeRiskMetrics(input.equityCurve, input.riskFreeRate);
return {
...result,
totalReturnPercent: result.totalReturn * 100,
annualizedReturnPercent: result.annualizedReturn * 100,
annualizedVolPercent: result.annualizedVol * 100,
maxDrawdownPercent: result.maxDrawdown * 100,
};
}
export const computeRiskMetricsDefinition = {
name: "compute_risk_metrics",
description:
"Compute comprehensive risk metrics from an equity curve including Sharpe ratio, Sortino ratio, max drawdown, and annualized returns. Use this to analyze the risk-adjusted performance of a portfolio or strategy.",
inputSchema: {
type: "object",
properties: {
equityCurve: {
type: "array",
items: { type: "number" },
description:
"Array of portfolio values over time (daily). E.g., [10000, 10100, 9800, 10500, ...]",
},
riskFreeRate: {
type: "number",
description:
"Annual risk-free rate for Sharpe/Sortino calculations (default 0.02 for 2%)",
},
},
required: ["equityCurve"],
},
};