@general-liquidity/sharpebench-mcp 0.3.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/server.js +32 -0
- package/package.json +2 -2
package/dist/server.js
CHANGED
|
@@ -78,6 +78,38 @@ export function createServer() {
|
|
|
78
78
|
minPeriods: min_periods,
|
|
79
79
|
tieTol: tie_tol,
|
|
80
80
|
})));
|
|
81
|
+
server.tool("percentile_selection", "Rank candidate return streams on a percentile of their bootstrapped utility instead of the point-estimate argmax, so the winner has to be good on most resampled histories rather than on the one that was observed. Names the point winner vs the percentile winner (disagreement is the interesting case) and each candidate's optimism gap: how much of the headline number fails to survive resampling. alpha below 0.3 still computes but sets alpha_warning. Deterministic given (candidates, seed).", {
|
|
82
|
+
candidates: z.array(z.array(z.number())),
|
|
83
|
+
utility: z.enum(["mean_return", "sharpe"]).optional(),
|
|
84
|
+
alpha: z.number().optional(),
|
|
85
|
+
seed: z.number().optional(),
|
|
86
|
+
n_boot: z.number().optional(),
|
|
87
|
+
block_prob: z.number().optional(),
|
|
88
|
+
}, async ({ candidates, utility, alpha, seed, n_boot, block_prob }) => run(() => sb.percentileSelection(candidates, {
|
|
89
|
+
utility,
|
|
90
|
+
alpha,
|
|
91
|
+
seed,
|
|
92
|
+
nBoot: n_boot,
|
|
93
|
+
blockProb: block_prob,
|
|
94
|
+
})));
|
|
95
|
+
server.tool("decompose_uncertainty", "Decompose the uncertainty behind one scored case into three legs, reported side by side and never summed: aleatoric (irreducible outcome noise; more evidence will not reduce it), epistemic (reducible ignorance, from disagreement between independent confidence streams plus evidence thinness), and distributional (unlikeness to a reference return series). Every input is optional; a missing leg reads what it honestly can on no evidence. The epistemic leg is a LOWER BOUND: unanimous or correlated signals understate it, so treat only high readings as informative.", {
|
|
96
|
+
outcomes: z.array(z.union([z.boolean(), z.number()])).optional(),
|
|
97
|
+
signals: z.array(z.array(z.number())).optional(),
|
|
98
|
+
case_returns: z.array(z.number()).optional(),
|
|
99
|
+
reference_returns: z.array(z.number()).optional(),
|
|
100
|
+
}, async ({ outcomes, signals, case_returns, reference_returns }) => run(() => sb.decomposeUncertainty({
|
|
101
|
+
outcomes,
|
|
102
|
+
signals,
|
|
103
|
+
caseReturns: case_returns,
|
|
104
|
+
referenceReturns: reference_returns,
|
|
105
|
+
})));
|
|
106
|
+
server.tool("crowding_half_life", "Expected edge half-life under a crowding decay model: ln2 / (theta + delta_max * adoption^curvature), in periods of the caller's IC series. The output is a model prior, reported never gating: it comes out of a model, not out of a dataset, and nothing should rank on it. All rates are per period and caller-supplied; there is deliberately no default calibration.", {
|
|
107
|
+
adoption: z.number(),
|
|
108
|
+
theta: z.number(),
|
|
109
|
+
delta_max: z.number(),
|
|
110
|
+
curvature: z.number().optional(),
|
|
111
|
+
}, async ({ adoption, theta, delta_max, curvature }) => run(() => sb.crowdingHalfLife(adoption, { theta, deltaMax: delta_max, curvature })));
|
|
112
|
+
server.tool("classify_disqualification", "Name every disqualification/quality signal that fired for each agent in a field of submissions (the same input the score tool takes). Pure legibility over the composite score: five reasons mirror the scorer's hard eligibility gates (failed_pass_k, dsr_below_bar, process_violation, bootstrap_insignificant, mandate_breached); the advisory flags (high_selection_gap, is_rediscovery, oos_decay) never gate. Empty reasons = no signal fired.", { submissions: z.array(z.any()), config: z.any().optional() }, async ({ submissions, config }) => run(() => sb.classifyDisqualification(submissions, config)));
|
|
81
113
|
return server;
|
|
82
114
|
}
|
|
83
115
|
async function main() {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@general-liquidity/sharpebench-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "MCP server exposing the SharpeBench luck-robust scoring kernel as agent-callable tools (deflated Sharpe, pass^k, process discipline, briefing audit, options Greeks).",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"mcp",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"prepublishOnly": "tsc"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@general-liquidity/sharpebench": "^0.
|
|
33
|
+
"@general-liquidity/sharpebench": "^0.5.0",
|
|
34
34
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
35
35
|
"zod": "^4.0.0"
|
|
36
36
|
},
|