sigrank 0.15.3 → 0.15.5
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/README.md +32 -1
- package/package.json +1 -1
- package/tools.mjs +215 -9
package/README.md
CHANGED
|
@@ -11,12 +11,12 @@
|
|
|
11
11
|
For all builders, burners and 10xers.
|
|
12
12
|
|
|
13
13
|
[](https://www.npmjs.com/package/sigrank)
|
|
14
|
-
[](https://www.npmjs.com/package/sigrank)
|
|
15
14
|
[](https://github.com/SunrisesIllNeverSee/sigrank-mcp/actions/workflows/ci.yml)
|
|
16
15
|
[](./LICENSE)
|
|
17
16
|
[](https://nodejs.org)
|
|
18
17
|
[](https://signalaf.com)
|
|
19
18
|
[](https://glama.ai/mcp/servers/SunrisesIllNeverSee/sigrank-mcp)
|
|
19
|
+
[](https://smithery.ai/servers/burnmydays/sigrank-mcp)
|
|
20
20
|
|
|
21
21
|
</div>
|
|
22
22
|
|
|
@@ -73,6 +73,37 @@ sigrank
|
|
|
73
73
|
**Repo:** [`SunrisesIllNeverSee/sigrank-mcp`](https://github.com/SunrisesIllNeverSee/sigrank-mcp)
|
|
74
74
|
**Site:** [signalaf.com](https://signalaf.com)
|
|
75
75
|
**npm:** [sigrank](https://www.npmjs.com/package/sigrank)
|
|
76
|
+
**Smithery:** [smithery.ai/servers/burnmydays/sigrank-mcp](https://smithery.ai/servers/burnmydays/sigrank-mcp)
|
|
77
|
+
**Glama:** [glama.ai/mcp/servers/SunrisesIllNeverSee/sigrank-mcp](https://glama.ai/mcp/servers/SunrisesIllNeverSee/sigrank-mcp)
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## Install via Smithery
|
|
82
|
+
|
|
83
|
+
SigRank is available on [Smithery](https://smithery.ai/servers/burnmydays/sigrank-mcp) as a stdio MCP bundle — one-click install for Claude Desktop, Cursor, and other MCP clients.
|
|
84
|
+
|
|
85
|
+
### Smithery CLI
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
# Install Smithery CLI
|
|
89
|
+
npm install -g smithery
|
|
90
|
+
|
|
91
|
+
# Connect to SigRank (downloads the MCPB bundle locally)
|
|
92
|
+
smithery mcp add burnmydays/sigrank-mcp --id sigrank
|
|
93
|
+
|
|
94
|
+
# List available tools
|
|
95
|
+
smithery tool list sigrank
|
|
96
|
+
|
|
97
|
+
# Call a tool
|
|
98
|
+
smithery tool call sigrank get_leaderboard '{}'
|
|
99
|
+
smithery tool call sigrank rank_paste '{"text": "1000000 500000 50000 800000"}'
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Claude Desktop (via Smithery)
|
|
103
|
+
|
|
104
|
+
1. Go to [smithery.ai/servers/burnmydays/sigrank-mcp](https://smithery.ai/servers/burnmydays/sigrank-mcp)
|
|
105
|
+
2. Click **Install**
|
|
106
|
+
3. Smithery handles the rest — no manual config editing
|
|
76
107
|
|
|
77
108
|
---
|
|
78
109
|
|
package/package.json
CHANGED
package/tools.mjs
CHANGED
|
@@ -165,66 +165,242 @@ export const DEFAULT_FETCH_TIMEOUT = Number(process.env.SIGRANK_FETCH_TIMEOUT) |
|
|
|
165
165
|
* past this is malformed or abusive — reject cleanly before parsing/POSTing (E2 hardening). */
|
|
166
166
|
const MAX_INPUT = 1_000_000
|
|
167
167
|
|
|
168
|
+
// ── Smithery quality: output schemas + annotations ──────────────────────────
|
|
169
|
+
// MCP tool annotations hint to clients about side-effects, read-only status, etc.
|
|
170
|
+
const ANNOTATIONS = {
|
|
171
|
+
readOnlyHint: { readOnlyHint: true },
|
|
172
|
+
destructiveHint: { destructiveHint: false },
|
|
173
|
+
idempotentHint: { idempotentHint: true },
|
|
174
|
+
openWorldHint: { openWorldHint: false },
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Common output schema for cascade results (rank_paste, simulate_change, etc.)
|
|
178
|
+
const CASCADE_OUTPUT = {
|
|
179
|
+
type: 'object',
|
|
180
|
+
properties: {
|
|
181
|
+
yield_: { type: 'number', description: 'Υ Yield — the headline efficiency metric (Cache Reads × Output / Input²)' },
|
|
182
|
+
snr: { type: 'number', description: 'Signal-to-noise ratio' },
|
|
183
|
+
leverage: { type: 'number', description: 'Cr/I — cache reads divided by input' },
|
|
184
|
+
velocity: { type: 'number', description: 'O/I — output divided by input' },
|
|
185
|
+
tenx_dev: { type: 'number', description: '10xDEV score' },
|
|
186
|
+
class: { type: 'string', enum: ['Burner', 'Builder', '10xer'], description: 'Operator class tier' },
|
|
187
|
+
card: { type: 'string', description: 'Deterministic prose summary of the cascade result' },
|
|
188
|
+
warnings: { type: 'array', items: { type: 'string' }, description: 'Parse or data warnings if any' },
|
|
189
|
+
},
|
|
190
|
+
required: ['yield_', 'class'],
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
const LEADERBOARD_OUTPUT = {
|
|
194
|
+
type: 'object',
|
|
195
|
+
properties: {
|
|
196
|
+
operators: {
|
|
197
|
+
type: 'array',
|
|
198
|
+
description: 'Array of ranked operators sorted by yield',
|
|
199
|
+
items: {
|
|
200
|
+
type: 'object',
|
|
201
|
+
properties: {
|
|
202
|
+
codename: { type: 'string', description: 'Public display name' },
|
|
203
|
+
yield_: { type: 'number', description: 'Υ Yield metric' },
|
|
204
|
+
leverage: { type: 'number', description: 'Cr/I ratio' },
|
|
205
|
+
velocity: { type: 'number', description: 'O/I ratio' },
|
|
206
|
+
class: { type: 'string', enum: ['Burner', 'Builder', '10xer'] },
|
|
207
|
+
rank: { type: 'integer', description: '1-based rank position' },
|
|
208
|
+
},
|
|
209
|
+
},
|
|
210
|
+
},
|
|
211
|
+
},
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
const OPERATOR_OUTPUT = {
|
|
215
|
+
type: 'object',
|
|
216
|
+
properties: {
|
|
217
|
+
codename: { type: 'string', description: 'Operator display name' },
|
|
218
|
+
yield_: { type: 'number', description: 'Υ Yield metric' },
|
|
219
|
+
leverage: { type: 'number', description: 'Cr/I ratio' },
|
|
220
|
+
velocity: { type: 'number', description: 'O/I ratio' },
|
|
221
|
+
class: { type: 'string', enum: ['Burner', 'Builder', '10xer'] },
|
|
222
|
+
rank: { type: 'integer', description: '1-based rank position' },
|
|
223
|
+
windows: {
|
|
224
|
+
type: 'array',
|
|
225
|
+
description: 'Per-window breakdowns (7d, 30d, 90d, all-time)',
|
|
226
|
+
items: {
|
|
227
|
+
type: 'object',
|
|
228
|
+
properties: {
|
|
229
|
+
window: { type: 'string', enum: ['7d', '30d', '90d', 'all_time'] },
|
|
230
|
+
pillars: {
|
|
231
|
+
type: 'object',
|
|
232
|
+
properties: {
|
|
233
|
+
input: { type: 'integer' },
|
|
234
|
+
output: { type: 'integer' },
|
|
235
|
+
cacheCreate: { type: 'integer' },
|
|
236
|
+
cacheRead: { type: 'integer' },
|
|
237
|
+
},
|
|
238
|
+
},
|
|
239
|
+
},
|
|
240
|
+
},
|
|
241
|
+
},
|
|
242
|
+
},
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
const SUBMIT_OUTPUT = {
|
|
246
|
+
type: 'object',
|
|
247
|
+
properties: {
|
|
248
|
+
status: { type: 'string', enum: ['ok', 'error', 'skipped'], description: 'Submission status' },
|
|
249
|
+
preview: CASCADE_OUTPUT,
|
|
250
|
+
server_response: { type: 'object', description: 'Server-side response including new rank if accepted' },
|
|
251
|
+
reason: { type: 'string', description: 'Error or skip reason if status is not ok' },
|
|
252
|
+
},
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
const TOKENPULL_OUTPUT = {
|
|
256
|
+
type: 'object',
|
|
257
|
+
properties: {
|
|
258
|
+
platform: { type: 'string', description: 'Source platform name' },
|
|
259
|
+
generatedAt: { type: 'string', description: 'ISO timestamp of the pull' },
|
|
260
|
+
windows: {
|
|
261
|
+
type: 'array',
|
|
262
|
+
description: 'Per-window token usage + cascade results',
|
|
263
|
+
items: {
|
|
264
|
+
type: 'object',
|
|
265
|
+
properties: {
|
|
266
|
+
window: { type: 'string', enum: ['7d', '30d', '90d', 'all'] },
|
|
267
|
+
pillars: {
|
|
268
|
+
type: 'object',
|
|
269
|
+
properties: {
|
|
270
|
+
input: { type: 'integer' },
|
|
271
|
+
output: { type: 'integer' },
|
|
272
|
+
cacheCreate: { type: 'integer' },
|
|
273
|
+
cacheRead: { type: 'integer' },
|
|
274
|
+
},
|
|
275
|
+
},
|
|
276
|
+
messages: { type: 'integer', description: 'Number of messages in window' },
|
|
277
|
+
estimated: { type: 'boolean', description: 'True if cacheCreate was estimated' },
|
|
278
|
+
cascade: CASCADE_OUTPUT,
|
|
279
|
+
},
|
|
280
|
+
},
|
|
281
|
+
},
|
|
282
|
+
},
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
const ENROLL_OUTPUT = {
|
|
286
|
+
type: 'object',
|
|
287
|
+
properties: {
|
|
288
|
+
status: { type: 'string', enum: ['enrolled', 'error'], description: 'Enrollment result' },
|
|
289
|
+
codename: { type: 'string', description: 'Operator codename if enrolled' },
|
|
290
|
+
operator_id: { type: 'string', description: 'Operator ID if enrolled' },
|
|
291
|
+
device_id: { type: 'string', description: 'Local device ID' },
|
|
292
|
+
trust_status: { type: 'string', description: 'Trust level of the device' },
|
|
293
|
+
reason: { type: 'string', description: 'Error reason if status is error' },
|
|
294
|
+
},
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
const COMPARE_OUTPUT = {
|
|
298
|
+
type: 'object',
|
|
299
|
+
properties: {
|
|
300
|
+
platform: { type: 'string' },
|
|
301
|
+
sources: {
|
|
302
|
+
type: 'array',
|
|
303
|
+
description: 'Side-by-side comparison of each token source',
|
|
304
|
+
items: {
|
|
305
|
+
type: 'object',
|
|
306
|
+
properties: {
|
|
307
|
+
source: { type: 'string', description: 'Source name (tokenpull, ccusage, token-dash, tokscale)' },
|
|
308
|
+
pillars: { type: 'object' },
|
|
309
|
+
cascade: CASCADE_OUTPUT,
|
|
310
|
+
delta_pct: { type: 'object', description: 'Delta % vs tokenpull baseline' },
|
|
311
|
+
},
|
|
312
|
+
},
|
|
313
|
+
},
|
|
314
|
+
},
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
const SIMULATE_OUTPUT = {
|
|
318
|
+
type: 'object',
|
|
319
|
+
properties: {
|
|
320
|
+
current: CASCADE_OUTPUT,
|
|
321
|
+
simulated: CASCADE_OUTPUT,
|
|
322
|
+
yield_delta: { type: 'number', description: 'Υ Yield change (simulated - current)' },
|
|
323
|
+
class_change: { type: 'string', description: 'Class tier change description' },
|
|
324
|
+
metric_diffs: { type: 'object', description: 'Per-metric before/after diffs' },
|
|
325
|
+
},
|
|
326
|
+
}
|
|
327
|
+
|
|
168
328
|
export const TOOLS = [
|
|
169
329
|
{
|
|
170
330
|
name: 'rank_paste',
|
|
171
331
|
description:
|
|
172
|
-
'
|
|
332
|
+
'Computes the SigRank yield cascade from a paste of token counts. Parses the input, runs the full cascade math locally (no network calls), and returns: Υ Yield (the headline efficiency metric, Υ = Cache Reads × Output / Input²), SNR (signal-to-noise ratio), Leverage ratio (Cr/I = cache reads divided by input), Velocity (O/I = output divided by input), 10xDEV score, operator class tier (Burner / Builder / 10xer), and a deterministic prose "card" summarizing the result in plain English. Accepts two input formats: (1) JSON object {"input":N,"output":N,"cacheCreate":N,"cacheRead":N} or (2) four whitespace-separated numbers in order: input output cacheCreate cacheRead. Returns an error if the input is malformed or has negative values. Use this for a quick one-off ranking without submitting to the board. Do NOT use this to submit your score — use submit_paste instead, which both ranks and publishes. Do NOT use this if you want to rank all four time windows at once — use rank_windows for that. After calling this, use submit_paste to publish the result if you want to appear on the leaderboard.',
|
|
333
|
+
annotations: { ...ANNOTATIONS.readOnlyHint, ...ANNOTATIONS.destructiveHint, ...ANNOTATIONS.idempotentHint, ...ANNOTATIONS.openWorldHint },
|
|
173
334
|
inputSchema: {
|
|
174
335
|
type: 'object',
|
|
175
336
|
properties: {
|
|
176
337
|
text: {
|
|
177
338
|
type: 'string',
|
|
178
|
-
description: 'Token counts to rank. Two formats accepted: (1) JSON object {"input":N,"output":N,"cacheCreate":N,"cacheRead":N} or (2) four whitespace-separated numbers in order: input output cacheCreate cacheRead. Get these from `ccusage` output, the Claude Max dashboard, or any token reader.',
|
|
339
|
+
description: 'Token counts to rank. Two formats accepted: (1) JSON object {"input":N,"output":N,"cacheCreate":N,"cacheRead":N} where all values are non-negative integers, or (2) four whitespace-separated numbers in order: input output cacheCreate cacheRead. Get these from `ccusage` output, the Claude Max usage dashboard, tokscale, or any token reader. Example valid input: {"input":1000000,"output":500000,"cacheCreate":50000,"cacheRead":800000}',
|
|
179
340
|
},
|
|
180
341
|
},
|
|
181
342
|
required: ['text'],
|
|
343
|
+
description: 'Requires the token counts as a string. No other parameters are accepted.',
|
|
182
344
|
},
|
|
345
|
+
outputSchema: CASCADE_OUTPUT,
|
|
183
346
|
},
|
|
184
347
|
{
|
|
185
348
|
name: 'get_leaderboard',
|
|
186
349
|
description:
|
|
187
|
-
"
|
|
188
|
-
|
|
350
|
+
"Fetches the live public SigRank leaderboard from signalaf.com. Reads all ranked operators sorted by yield (Υ = Cache Reads × Output / Input²) and returns an array of operator summaries. Each entry contains: codename (public display name), yield (Υ, the headline efficiency metric), leverage ratio (Cr/I = cache reads divided by input), velocity (O/I = output divided by input), class tier (Burner / Builder / 10xer), and rank position (integer, 1-based). Returns an empty array if no operators have submitted yet. Use this to see where operators stand overall, to find specific codenames for get_operator lookups, or to display the current rankings. Do NOT use this to check your own rank if you already know your codename — use get_operator instead for a single-operator profile with per-window breakdowns. After calling this, follow up with get_operator to get detailed metrics for any operator of interest.",
|
|
351
|
+
annotations: { ...ANNOTATIONS.readOnlyHint, ...ANNOTATIONS.openWorldHint },
|
|
352
|
+
inputSchema: {
|
|
353
|
+
type: 'object',
|
|
354
|
+
properties: {},
|
|
355
|
+
description: 'This tool takes no parameters. It always fetches the full public leaderboard.',
|
|
356
|
+
},
|
|
357
|
+
outputSchema: LEADERBOARD_OUTPUT,
|
|
189
358
|
},
|
|
190
359
|
{
|
|
191
360
|
name: 'get_operator',
|
|
192
361
|
description:
|
|
193
|
-
"
|
|
362
|
+
"Fetches one operator's live profile from the SigRank board by their codename. Reads the operator's current submission data from signalaf.com and returns their detailed metrics: yield (Υ), leverage ratio (Cr/I), velocity (O/I), class tier (Burner / Builder / 10xer), rank position (integer, 1-based), and per-window breakdowns for each time range (7d, 30d, 90d, all-time) with the four canonical pillars (input, output, cacheCreate, cacheRead) per window. Returns an error if the codename is not found on the board. Use this to look up any operator who has submitted to the board — codenames are public and visible on the leaderboard. Do NOT use this to browse all operators — use get_leaderboard for that. After calling this, you can use simulate_change to model what would happen if the operator adjusted their token mix.",
|
|
363
|
+
annotations: { ...ANNOTATIONS.readOnlyHint, ...ANNOTATIONS.openWorldHint },
|
|
194
364
|
inputSchema: {
|
|
195
365
|
type: 'object',
|
|
196
366
|
properties: {
|
|
197
367
|
codename: {
|
|
198
368
|
type: 'string',
|
|
199
|
-
description: 'The operator\'s public codename as shown on the SigRank leaderboard
|
|
369
|
+
description: 'The operator\'s public codename as shown on the SigRank leaderboard. Case-insensitive — "Ghost Falcon" and "ghost falcon" are equivalent. Must match a codename that exists on the board; returns an error if not found. To discover valid codenames, call get_leaderboard first.',
|
|
200
370
|
},
|
|
201
371
|
},
|
|
202
372
|
required: ['codename'],
|
|
373
|
+
description: 'Requires the operator\'s codename. No other parameters are accepted.',
|
|
203
374
|
},
|
|
375
|
+
outputSchema: OPERATOR_OUTPUT,
|
|
204
376
|
},
|
|
205
377
|
{
|
|
206
378
|
name: 'submit_paste',
|
|
207
379
|
description:
|
|
208
|
-
'
|
|
380
|
+
'Ranks a paste of token counts AND publishes it to the live SigRank board at signalaf.com in one call. First computes the cascade locally for an instant preview (yield, leverage, velocity, class, card), then submits the raw paste to the board\'s web-paste endpoint, which re-parses and re-scores it server-side. The server score is authoritative — it may differ from the local preview if the board applies additional validation. Returns both the local preview and the server response (including the operator\'s new rank if accepted). A codename is required to publish — omit it for a local preview only (no board submission). Token-only, no auth required. Use this when you have token counts from ccusage or a dashboard and want to both see your score and publish it. Do NOT use this if you want to pull your local usage automatically — use tokenpull_submit for the zero-paste flow. Do NOT use this for multi-window dashboard pastes — use rank_windows to rank them first, then submit each window. After calling this, use get_operator with your codename to verify your submission appeared on the board.',
|
|
381
|
+
annotations: { ...ANNOTATIONS.destructiveHint, ...ANNOTATIONS.idempotentHint, ...ANNOTATIONS.openWorldHint },
|
|
209
382
|
inputSchema: {
|
|
210
383
|
type: 'object',
|
|
211
384
|
properties: {
|
|
212
385
|
text: {
|
|
213
386
|
type: 'string',
|
|
214
|
-
description: 'Token counts to rank and submit. Two formats: (1) JSON {"input":N,"output":N,"cacheCreate":N,"cacheRead":N} from ccusage, or (2) four whitespace-separated numbers: input output cacheCreate cacheRead.',
|
|
387
|
+
description: 'Token counts to rank and submit. Two formats: (1) JSON {"input":N,"output":N,"cacheCreate":N,"cacheRead":N} from ccusage (preferred — the board parses this reliably), or (2) four whitespace-separated numbers: input output cacheCreate cacheRead. The 4-number form ranks locally but the board may reject it. Example: {"input":1000000,"output":500000,"cacheCreate":50000,"cacheRead":800000}',
|
|
215
388
|
},
|
|
216
389
|
codename: {
|
|
217
390
|
type: 'string',
|
|
218
|
-
description: 'Operator codename to publish under on the leaderboard (e.g. "Ghost Falcon"). Required to submit — omit for local preview only (no board submission).',
|
|
391
|
+
description: 'Operator codename to publish under on the leaderboard (e.g. "Ghost Falcon"). Required to submit — omit for local preview only (no board submission, just returns the local cascade result). Must be a non-empty string.',
|
|
219
392
|
},
|
|
220
393
|
},
|
|
221
394
|
required: ['text'],
|
|
395
|
+
description: 'Requires token counts (text). Codename is optional but required for board submission — omit it for preview-only mode.',
|
|
222
396
|
},
|
|
397
|
+
outputSchema: SUBMIT_OUTPUT,
|
|
223
398
|
},
|
|
224
399
|
{
|
|
225
400
|
name: 'tokenpull',
|
|
226
401
|
description:
|
|
227
402
|
"Pull your LOCAL token usage from the platform's session logs and rank it across the four windows (7d/30d/90d/all-time) with the cascade — zero paste. Token-only: reads usage counts not message content. The numbers stay on your machine unless you submit them. Some platforms may have partial data (estimated=true when cacheCreate isn't available) or a dataGap note when the log format doesn't expose raw token counts.",
|
|
403
|
+
annotations: { ...ANNOTATIONS.readOnlyHint, ...ANNOTATIONS.openWorldHint },
|
|
228
404
|
inputSchema: {
|
|
229
405
|
type: 'object',
|
|
230
406
|
properties: {
|
|
@@ -235,11 +411,13 @@ export const TOOLS = [
|
|
|
235
411
|
},
|
|
236
412
|
},
|
|
237
413
|
},
|
|
414
|
+
outputSchema: TOKENPULL_OUTPUT,
|
|
238
415
|
},
|
|
239
416
|
{
|
|
240
417
|
name: 'tokenpull_submit',
|
|
241
418
|
description:
|
|
242
419
|
"Pull your LOCAL token usage from session logs AND publish it to the SigRank board in one call — the zero-paste flow. Reads the four canonical pillars (input, output, cacheCreate, cacheRead) per window from your local logs, computes the cascade, and submits each window to the board where it is re-scored server-side and tagged with the source platform. Requires a codename to publish; omit for a local preview only. Token-only — no prompt content is read or transmitted.",
|
|
420
|
+
annotations: { ...ANNOTATIONS.destructiveHint, ...ANNOTATIONS.idempotentHint, ...ANNOTATIONS.openWorldHint },
|
|
243
421
|
inputSchema: {
|
|
244
422
|
type: 'object',
|
|
245
423
|
properties: {
|
|
@@ -259,11 +437,13 @@ export const TOOLS = [
|
|
|
259
437
|
},
|
|
260
438
|
},
|
|
261
439
|
},
|
|
440
|
+
outputSchema: SUBMIT_OUTPUT,
|
|
262
441
|
},
|
|
263
442
|
{
|
|
264
443
|
name: 'rank_windows',
|
|
265
444
|
description:
|
|
266
445
|
'Rank all four time windows (7d/30d/90d/all-time) in one call from a dashboard paste — paste the full table from ccusage, tokscale, or the Claude Max usage dashboard and get the cascade (Υ, SNR, Leverage, Velocity, 10xDEV, class, card) for each window. Each window is parsed and scored independently. Named keys required (input/output/cacheCreate/cacheRead); positional order is NOT safe here (dashboards list cache_read before cache_create — see WINDOWED_PROFILES gotcha). Omit windows you don\'t have — partial input is allowed (1–4 windows). Does NOT submit to the board; use tokenpull_submit for zero-paste publishing.',
|
|
446
|
+
annotations: { ...ANNOTATIONS.readOnlyHint, ...ANNOTATIONS.idempotentHint, ...ANNOTATIONS.openWorldHint },
|
|
267
447
|
inputSchema: {
|
|
268
448
|
type: 'object',
|
|
269
449
|
properties: {
|
|
@@ -276,11 +456,28 @@ export const TOOLS = [
|
|
|
276
456
|
// at least one window paste is required (runtime check backs this up)
|
|
277
457
|
anyOf: [{ required: ['7d'] }, { required: ['30d'] }, { required: ['90d'] }, { required: ['all'] }],
|
|
278
458
|
},
|
|
459
|
+
outputSchema: {
|
|
460
|
+
type: 'object',
|
|
461
|
+
properties: {
|
|
462
|
+
windows: {
|
|
463
|
+
type: 'array',
|
|
464
|
+
description: 'Cascade results per window',
|
|
465
|
+
items: {
|
|
466
|
+
type: 'object',
|
|
467
|
+
properties: {
|
|
468
|
+
window: { type: 'string', enum: ['7d', '30d', '90d', 'all'] },
|
|
469
|
+
...CASCADE_OUTPUT.properties,
|
|
470
|
+
},
|
|
471
|
+
},
|
|
472
|
+
},
|
|
473
|
+
},
|
|
474
|
+
},
|
|
279
475
|
},
|
|
280
476
|
{
|
|
281
477
|
name: 'watch_tokenpull',
|
|
282
478
|
description:
|
|
283
479
|
'One poll per call: pulls your local token logs and returns the current cascade for the watched window — the tool never blocks or loops. Re-call at your desired cadence to watch for changes (interval_s is advisory only and echoed back as poll_interval_s). With submit:true (and an enrolled device) each call may also sign + publish the watched window to the board, rate-limited to once per 5 min per platform+window; default is preview-only (no submit).',
|
|
480
|
+
annotations: { ...ANNOTATIONS.readOnlyHint, ...ANNOTATIONS.idempotentHint, ...ANNOTATIONS.openWorldHint },
|
|
284
481
|
inputSchema: {
|
|
285
482
|
type: 'object',
|
|
286
483
|
properties: {
|
|
@@ -290,11 +487,13 @@ export const TOOLS = [
|
|
|
290
487
|
submit: { type: 'boolean', description: 'auto-submit the watched window to the board as a VERIFIED operator each poll (requires `enroll`; default false = preview only)' },
|
|
291
488
|
},
|
|
292
489
|
},
|
|
490
|
+
outputSchema: TOKENPULL_OUTPUT,
|
|
293
491
|
},
|
|
294
492
|
{
|
|
295
493
|
name: 'tokenpull_compare',
|
|
296
494
|
description:
|
|
297
495
|
'Pull token usage from ALL four local sources in parallel — tokenpull (JSONL canon), ccusage CLI, token-dashboard SQLite, and tokscale report — and return them side-by-side with delta % vs tokenpull as the baseline. Also computes the cascade (Υ, SNR, Leverage, class) for each source so you can see how each verifier scores. Useful for validating your numbers before submitting, or understanding discrepancies between tools. Claude only for token-dash; codex and others use tokenpull + ccusage + tokscale. Token-only, on-device.',
|
|
496
|
+
annotations: { ...ANNOTATIONS.readOnlyHint, ...ANNOTATIONS.openWorldHint },
|
|
298
497
|
inputSchema: {
|
|
299
498
|
type: 'object',
|
|
300
499
|
properties: {
|
|
@@ -305,11 +504,13 @@ export const TOOLS = [
|
|
|
305
504
|
},
|
|
306
505
|
},
|
|
307
506
|
},
|
|
507
|
+
outputSchema: COMPARE_OUTPUT,
|
|
308
508
|
},
|
|
309
509
|
{
|
|
310
510
|
name: 'enroll',
|
|
311
511
|
description:
|
|
312
512
|
'Bind THIS device to your SigRank operator so your signed token runs cascade to the live board. Paste the key from signalaf.com → Settings → "New key" (or "Generate connect code"). On first run it generates + stores a local ed25519 keypair (~/.sigrank-mcp/identity.json); only the PUBLIC key is ever sent. Need a new key? Click "New key" at signalaf.com → Settings, then paste it here.',
|
|
513
|
+
annotations: { ...ANNOTATIONS.destructiveHint, ...ANNOTATIONS.idempotentHint, ...ANNOTATIONS.openWorldHint },
|
|
313
514
|
inputSchema: {
|
|
314
515
|
type: 'object',
|
|
315
516
|
properties: {
|
|
@@ -318,11 +519,13 @@ export const TOOLS = [
|
|
|
318
519
|
},
|
|
319
520
|
required: ['code'],
|
|
320
521
|
},
|
|
522
|
+
outputSchema: ENROLL_OUTPUT,
|
|
321
523
|
},
|
|
322
524
|
{
|
|
323
525
|
name: 'submit_verified',
|
|
324
526
|
description:
|
|
325
527
|
'Publish your LOCAL token runs to the SigRank board as a VERIFIED operator — the enrolled, signed path. Reads your pillars (tokenpull), builds the canonical Schema 1.0 snapshot per window, ed25519-signs it with your device key, and POSTs to /api/v1/snapshots. Requires `npx sigrank-mcp enroll` first (a bound device). Only signed submissions from a trusted device rank on the board. Token-only; the private key never leaves your machine. Pass dry_run:true to inspect the exact signed payload without publishing.',
|
|
528
|
+
annotations: { ...ANNOTATIONS.destructiveHint, ...ANNOTATIONS.idempotentHint, ...ANNOTATIONS.openWorldHint },
|
|
326
529
|
inputSchema: {
|
|
327
530
|
type: 'object',
|
|
328
531
|
properties: {
|
|
@@ -331,11 +534,13 @@ export const TOOLS = [
|
|
|
331
534
|
dry_run: { type: 'boolean', description: 'build + sign but do NOT publish — returns the exact payload that would be POSTed (token counts only), so you can inspect before submitting' },
|
|
332
535
|
},
|
|
333
536
|
},
|
|
537
|
+
outputSchema: SUBMIT_OUTPUT,
|
|
334
538
|
},
|
|
335
539
|
{
|
|
336
540
|
name: 'simulate_change',
|
|
337
541
|
description:
|
|
338
542
|
"The first PRESCRIPTIVE SigRank tool — 'what if I changed my token mix?' Takes your current 4 pillars (input/output/cacheCreate/cacheRead) and one or more proposed changes, runs the canonical cascade on BOTH the current and simulated values, and returns the exact Υ Yield delta, class change, and per-metric diffs. This is the 'show me the payoff before I do the work' primitive: no network, no submission, pure local math. Use it to answer 'would increasing my cache-read by 50k tokens actually move my class?' before you change your workflow. Accepts the current pillars as JSON or 4 numbers (same as rank_paste) plus a `changes` object with any of the 4 pillar names mapped to new absolute values OR relative deltas (e.g. {cacheRead: '+50000'} or {input: 800000}).",
|
|
543
|
+
annotations: { ...ANNOTATIONS.readOnlyHint, ...ANNOTATIONS.idempotentHint, ...ANNOTATIONS.openWorldHint },
|
|
339
544
|
inputSchema: {
|
|
340
545
|
type: 'object',
|
|
341
546
|
properties: {
|
|
@@ -356,6 +561,7 @@ export const TOOLS = [
|
|
|
356
561
|
},
|
|
357
562
|
required: ['text', 'changes'],
|
|
358
563
|
},
|
|
564
|
+
outputSchema: SIMULATE_OUTPUT,
|
|
359
565
|
},
|
|
360
566
|
]
|
|
361
567
|
|